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;