[PATCH v3 46/57] perf: Simplify pmu_dev_alloc()

From: Peter Zijlstra
Date: Mon Jun 12 2023 - 05:59:43 EST



Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
---
kernel/events/core.c | 65 ++++++++++++++++++++++++---------------------------
1 file changed, 31 insertions(+), 34 deletions(-)

--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -11285,49 +11285,46 @@ static void pmu_dev_release(struct devic

static int pmu_dev_alloc(struct pmu *pmu)
{
- int ret = -ENOMEM;
+ int ret;

- pmu->dev = kzalloc(sizeof(struct device), GFP_KERNEL);
- if (!pmu->dev)
- goto out;
+ struct device *dev __free(put_device) =
+ kzalloc(sizeof(struct device), GFP_KERNEL);
+ if (!dev)
+ return -ENOMEM;

- pmu->dev->groups = pmu->attr_groups;
- device_initialize(pmu->dev);
+ dev->groups = pmu->attr_groups;
+ device_initialize(dev);

- dev_set_drvdata(pmu->dev, pmu);
- pmu->dev->bus = &pmu_bus;
- pmu->dev->release = pmu_dev_release;
+ dev_set_drvdata(dev, pmu);
+ dev->bus = &pmu_bus;
+ dev->release = pmu_dev_release;

- ret = dev_set_name(pmu->dev, "%s", pmu->name);
+ ret = dev_set_name(dev, "%s", pmu->name);
if (ret)
- goto free_dev;
+ return ret;

- ret = device_add(pmu->dev);
+ ret = device_add(dev);
if (ret)
- goto free_dev;
+ return ret;

- /* For PMUs with address filters, throw in an extra attribute: */
- if (pmu->nr_addr_filters)
- ret = device_create_file(pmu->dev, &dev_attr_nr_addr_filters);
-
- if (ret)
- goto del_dev;
+ struct device *del __free(device_del) = dev;

- if (pmu->attr_update)
- ret = sysfs_update_groups(&pmu->dev->kobj, pmu->attr_update);
-
- if (ret)
- goto del_dev;
-
-out:
- return ret;
-
-del_dev:
- device_del(pmu->dev);
-
-free_dev:
- put_device(pmu->dev);
- goto out;
+ /* For PMUs with address filters, throw in an extra attribute: */
+ if (pmu->nr_addr_filters) {
+ ret = device_create_file(dev, &dev_attr_nr_addr_filters);
+ if (ret)
+ return ret;
+ }
+
+ if (pmu->attr_update) {
+ ret = sysfs_update_groups(&dev->kobj, pmu->attr_update);
+ if (ret)
+ return ret;
+ }
+
+ no_free_ptr(del);
+ pmu->dev = no_free_ptr(dev);
+ return 0;
}

static struct lock_class_key cpuctx_mutex;