On 2023/3/29 0:51, Jonathan Cameron wrote: > On Wed, 15 Mar 2023 17:43:14 +0800 > Yicong Yang <yangyicong@xxxxxxxxxx> wrote: > >> From: Yicong Yang <yangyicong@xxxxxxxxxxxxx> >> >> The PCIe devices supported by the PTT trace can be removed/rescanned by >> hotplug or through sysfs. Add support for dynamically updating the >> available filter list by registering a PCI bus notifier block. Then user >> can always get latest information about available tracing filters and >> driver can block the invalid filters of which related devices no longer >> exist in the system. >> >> Signed-off-by: Yicong Yang <yangyicong@xxxxxxxxxxxxx> >> --- > > Just a few trivial comments on this. > > With those tidied up > Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> Thanks for the comment, will fix in next version. > > > > ... > >> diff --git a/drivers/hwtracing/ptt/hisi_ptt.c b/drivers/hwtracing/ptt/hisi_ptt.c >> index 0a10c7ec46ad..010cdbc3c172 100644 >> --- a/drivers/hwtracing/ptt/hisi_ptt.c >> +++ b/drivers/hwtracing/ptt/hisi_ptt.c > >> +/* >> + * A PCI bus notifier is used here for dynamically updating the filter >> + * list. >> + */ >> +static int hisi_ptt_notifier_call(struct notifier_block *nb, unsigned long action, >> + void *data) >> +{ >> + struct hisi_ptt *hisi_ptt = container_of(nb, struct hisi_ptt, hisi_ptt_nb); >> + struct hisi_ptt_filter_update_info info; >> + struct device *dev = data; >> + struct pci_dev *pdev = to_pci_dev(dev); > > This local variable doesn't add anything over > > info.pdev = to_pci_dev(dev); > ok, will drop it. > > >> + >> + info.pdev = pdev; >> + >> + switch (action) { >> + case BUS_NOTIFY_ADD_DEVICE: >> + info.is_add = true; >> + break; >> + case BUS_NOTIFY_DEL_DEVICE: >> + info.is_add = false; >> + break; >> + default: >> + return 0; >> + } >> + >> + hisi_ptt_update_fifo_in(hisi_ptt, &info); >> + >> + return 0; >> +} >> + > >> diff --git a/drivers/hwtracing/ptt/hisi_ptt.h b/drivers/hwtracing/ptt/hisi_ptt.h >> index 5beb1648c93a..b1ba638fe7ea 100644 >> --- a/drivers/hwtracing/ptt/hisi_ptt.h >> +++ b/drivers/hwtracing/ptt/hisi_ptt.h >> @@ -11,12 +11,15 @@ > >> /** >> * struct hisi_ptt_pmu_buf - Descriptor of the AUX buffer of PTT trace >> * @length: size of the AUX buffer >> @@ -170,10 +188,15 @@ struct hisi_ptt_pmu_buf { >> * @lower_bdf: the lower BDF range of the PCI devices managed by this PTT device >> * @port_filters: the filter list of root ports >> * @req_filters: the filter list of requester ID >> + * @filter_lock: lock to protect the filters >> * @port_mask: port mask of the managed root ports >> + * @work: delayed work for filter updating >> + * @filter_update_lock: spinlock to protect the filter update fifo >> + * @filter_update_fifo: fifo of the filters waiting to update the filter list >> */ >> struct hisi_ptt { >> struct hisi_ptt_trace_ctrl trace_ctrl; >> + struct notifier_block hisi_ptt_nb; > > Docs update for this one? > sorry for missing this. will fix. Thanks, Yicong >> struct hlist_node hotplug_node; >> struct pmu hisi_ptt_pmu; >> void __iomem *iobase; >> @@ -192,7 +215,19 @@ struct hisi_ptt { >> */ >> struct list_head port_filters; >> struct list_head req_filters; >> + struct mutex filter_lock; >> u16 port_mask; >> + >> + /* >> + * We use a delayed work here to avoid indefinitely waiting for >> + * the hisi_ptt->mutex which protecting the filter list. The >> + * work will be delayed only if the mutex can not be held, >> + * otherwise no delay will be applied. >> + */ >> + struct delayed_work work; >> + spinlock_t filter_update_lock; >> + DECLARE_KFIFO(filter_update_kfifo, struct hisi_ptt_filter_update_info, >> + HISI_PTT_FILTER_UPDATE_FIFO_SIZE); >> }; >> >> #define to_hisi_ptt(pmu) container_of(pmu, struct hisi_ptt, hisi_ptt_pmu) > > . >