hwtracing: hisi_ptt: Factor out filter allocation and release operation
authorYicong Yang <yangyicong@hisilicon.com>
Wed, 21 Jun 2023 09:28:00 +0000 (17:28 +0800)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Wed, 21 Jun 2023 10:52:05 +0000 (11:52 +0100)
Factor out the allocation and release of filters. This will make it easier
to extend and manage the function of the filter.

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20230621092804.15120-2-yangyicong@huawei.com
drivers/hwtracing/ptt/hisi_ptt.c

index 30f1525..548cfef 100644 (file)
@@ -354,6 +354,39 @@ static int hisi_ptt_register_irq(struct hisi_ptt *hisi_ptt)
        return 0;
 }
 
+static void hisi_ptt_del_free_filter(struct hisi_ptt *hisi_ptt,
+                                     struct hisi_ptt_filter_desc *filter)
+{
+       list_del(&filter->list);
+       kfree(filter);
+}
+
+static struct hisi_ptt_filter_desc *
+hisi_ptt_alloc_add_filter(struct hisi_ptt *hisi_ptt, struct pci_dev *pdev)
+{
+       struct hisi_ptt_filter_desc *filter;
+
+       filter = kzalloc(sizeof(*filter), GFP_KERNEL);
+       if (!filter) {
+               pci_err(hisi_ptt->pdev, "failed to add filter for %s\n",
+                       pci_name(pdev));
+               return NULL;
+       }
+
+       filter->devid = PCI_DEVID(pdev->bus->number, pdev->devfn);
+       filter->is_port = pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT;
+       if (filter->is_port) {
+               list_add_tail(&filter->list, &hisi_ptt->port_filters);
+
+               /* Update the available port mask */
+               hisi_ptt->port_mask |= hisi_ptt_get_filter_val(filter->devid, true);
+       } else {
+               list_add_tail(&filter->list, &hisi_ptt->req_filters);
+       }
+
+       return filter;
+}
+
 static int hisi_ptt_init_filters(struct pci_dev *pdev, void *data)
 {
        struct pci_dev *root_port = pcie_find_root_port(pdev);
@@ -374,23 +407,9 @@ static int hisi_ptt_init_filters(struct pci_dev *pdev, void *data)
         * should be partial initialized and users would know which filter fails
         * through the log. Other functions of PTT device are still available.
         */
-       filter = kzalloc(sizeof(*filter), GFP_KERNEL);
-       if (!filter) {
-               pci_err(hisi_ptt->pdev, "failed to add filter %s\n", pci_name(pdev));
+       filter = hisi_ptt_alloc_add_filter(hisi_ptt, pdev);
+       if (!filter)
                return -ENOMEM;
-       }
-
-       filter->devid = PCI_DEVID(pdev->bus->number, pdev->devfn);
-
-       if (pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT) {
-               filter->is_port = true;
-               list_add_tail(&filter->list, &hisi_ptt->port_filters);
-
-               /* Update the available port mask */
-               hisi_ptt->port_mask |= hisi_ptt_get_filter_val(filter->devid, true);
-       } else {
-               list_add_tail(&filter->list, &hisi_ptt->req_filters);
-       }
 
        return 0;
 }
@@ -400,15 +419,11 @@ static void hisi_ptt_release_filters(void *data)
        struct hisi_ptt_filter_desc *filter, *tmp;
        struct hisi_ptt *hisi_ptt = data;
 
-       list_for_each_entry_safe(filter, tmp, &hisi_ptt->req_filters, list) {
-               list_del(&filter->list);
-               kfree(filter);
-       }
+       list_for_each_entry_safe(filter, tmp, &hisi_ptt->req_filters, list)
+               hisi_ptt_del_free_filter(hisi_ptt, filter);
 
-       list_for_each_entry_safe(filter, tmp, &hisi_ptt->port_filters, list) {
-               list_del(&filter->list);
-               kfree(filter);
-       }
+       list_for_each_entry_safe(filter, tmp, &hisi_ptt->port_filters, list)
+               hisi_ptt_del_free_filter(hisi_ptt, filter);
 }
 
 static int hisi_ptt_config_trace_buf(struct hisi_ptt *hisi_ptt)