Skip to content

Commit 652ffc2

Browse files
gregkhPeter Zijlstra
authored andcommitted
perf/core: Fix narrow startup race when creating the perf nr_addr_filters sysfs file
Signed-off-by: Greg Kroah-Hartman <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Link: https://lkml.kernel.org/r/2023061204-decal-flyable-6090@gregkh
1 parent 5d2d4a9 commit 652ffc2

File tree

1 file changed

+28
-12
lines changed

1 file changed

+28
-12
lines changed

kernel/events/core.c

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11408,9 +11408,32 @@ static DEVICE_ATTR_RW(perf_event_mux_interval_ms);
1140811408
static struct attribute *pmu_dev_attrs[] = {
1140911409
&dev_attr_type.attr,
1141011410
&dev_attr_perf_event_mux_interval_ms.attr,
11411+
&dev_attr_nr_addr_filters.attr,
11412+
NULL,
11413+
};
11414+
11415+
static umode_t pmu_dev_is_visible(struct kobject *kobj, struct attribute *a, int n)
11416+
{
11417+
struct device *dev = kobj_to_dev(kobj);
11418+
struct pmu *pmu = dev_get_drvdata(dev);
11419+
11420+
if (!pmu->nr_addr_filters)
11421+
return 0;
11422+
11423+
return a->mode;
11424+
11425+
return 0;
11426+
}
11427+
11428+
static struct attribute_group pmu_dev_attr_group = {
11429+
.is_visible = pmu_dev_is_visible,
11430+
.attrs = pmu_dev_attrs,
11431+
};
11432+
11433+
static const struct attribute_group *pmu_dev_groups[] = {
11434+
&pmu_dev_attr_group,
1141111435
NULL,
1141211436
};
11413-
ATTRIBUTE_GROUPS(pmu_dev);
1141411437

1141511438
static int pmu_bus_running;
1141611439
static struct bus_type pmu_bus = {
@@ -11447,18 +11470,11 @@ static int pmu_dev_alloc(struct pmu *pmu)
1144711470
if (ret)
1144811471
goto free_dev;
1144911472

11450-
/* For PMUs with address filters, throw in an extra attribute: */
11451-
if (pmu->nr_addr_filters)
11452-
ret = device_create_file(pmu->dev, &dev_attr_nr_addr_filters);
11453-
11454-
if (ret)
11455-
goto del_dev;
11456-
11457-
if (pmu->attr_update)
11473+
if (pmu->attr_update) {
1145811474
ret = sysfs_update_groups(&pmu->dev->kobj, pmu->attr_update);
11459-
11460-
if (ret)
11461-
goto del_dev;
11475+
if (ret)
11476+
goto del_dev;
11477+
}
1146211478

1146311479
out:
1146411480
return ret;

0 commit comments

Comments
 (0)