Skip to content

Commit 3dda7f6

Browse files
committed
Merge tag 'ccn/fixes-for-4.15' of git://git.linaro.org/people/pawel.moll/linux into fixes
bus: ARM CCN and CCI PMU driver fixes This is a bunch of fixes CCN and (guest starring this time) CCI drivers. * Check for potential of failed allocation for the driver name string * Manage CPU ID properly at allocation (both CCN and CCI) * Fix module unload warnings related to objects release order * Small improvements like using allocating printfs and proper attributes constification The one fixing potential issues have been cc-ed to stable. * tag 'ccn/fixes-for-4.15' of git://git.linaro.org/people/pawel.moll/linux: bus: arm-ccn: fix module unloading Error: Removing state 147 which has instances left. bus: arm-cci: Fix use of smp_processor_id() in preemptible context bus: arm-ccn: Fix use of smp_processor_id() in preemptible context bus: arm-ccn: Simplify code bus: arm-ccn: Check memory allocation failure bus: arm-ccn: constify attribute_group structures. Signed-off-by: Olof Johansson <[email protected]>
2 parents 69b8df5 + b69f63e commit 3dda7f6

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

drivers/bus/arm-cci.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,14 +1755,17 @@ static int cci_pmu_probe(struct platform_device *pdev)
17551755
raw_spin_lock_init(&cci_pmu->hw_events.pmu_lock);
17561756
mutex_init(&cci_pmu->reserve_mutex);
17571757
atomic_set(&cci_pmu->active_events, 0);
1758-
cpumask_set_cpu(smp_processor_id(), &cci_pmu->cpus);
1758+
cpumask_set_cpu(get_cpu(), &cci_pmu->cpus);
17591759

17601760
ret = cci_pmu_init(cci_pmu, pdev);
1761-
if (ret)
1761+
if (ret) {
1762+
put_cpu();
17621763
return ret;
1764+
}
17631765

17641766
cpuhp_state_add_instance_nocalls(CPUHP_AP_PERF_ARM_CCI_ONLINE,
17651767
&cci_pmu->node);
1768+
put_cpu();
17661769
pr_info("ARM %s PMU driver probed", cci_pmu->model->name);
17671770
return 0;
17681771
}

drivers/bus/arm-ccn.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ static struct attribute *arm_ccn_pmu_format_attrs[] = {
262262
NULL
263263
};
264264

265-
static struct attribute_group arm_ccn_pmu_format_attr_group = {
265+
static const struct attribute_group arm_ccn_pmu_format_attr_group = {
266266
.name = "format",
267267
.attrs = arm_ccn_pmu_format_attrs,
268268
};
@@ -451,7 +451,7 @@ static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = {
451451
static struct attribute
452452
*arm_ccn_pmu_events_attrs[ARRAY_SIZE(arm_ccn_pmu_events) + 1];
453453

454-
static struct attribute_group arm_ccn_pmu_events_attr_group = {
454+
static const struct attribute_group arm_ccn_pmu_events_attr_group = {
455455
.name = "events",
456456
.is_visible = arm_ccn_pmu_events_is_visible,
457457
.attrs = arm_ccn_pmu_events_attrs,
@@ -548,7 +548,7 @@ static struct attribute *arm_ccn_pmu_cmp_mask_attrs[] = {
548548
NULL
549549
};
550550

551-
static struct attribute_group arm_ccn_pmu_cmp_mask_attr_group = {
551+
static const struct attribute_group arm_ccn_pmu_cmp_mask_attr_group = {
552552
.name = "cmp_mask",
553553
.attrs = arm_ccn_pmu_cmp_mask_attrs,
554554
};
@@ -569,7 +569,7 @@ static struct attribute *arm_ccn_pmu_cpumask_attrs[] = {
569569
NULL,
570570
};
571571

572-
static struct attribute_group arm_ccn_pmu_cpumask_attr_group = {
572+
static const struct attribute_group arm_ccn_pmu_cpumask_attr_group = {
573573
.attrs = arm_ccn_pmu_cpumask_attrs,
574574
};
575575

@@ -1268,10 +1268,12 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn)
12681268
if (ccn->dt.id == 0) {
12691269
name = "ccn";
12701270
} else {
1271-
int len = snprintf(NULL, 0, "ccn_%d", ccn->dt.id);
1272-
1273-
name = devm_kzalloc(ccn->dev, len + 1, GFP_KERNEL);
1274-
snprintf(name, len + 1, "ccn_%d", ccn->dt.id);
1271+
name = devm_kasprintf(ccn->dev, GFP_KERNEL, "ccn_%d",
1272+
ccn->dt.id);
1273+
if (!name) {
1274+
err = -ENOMEM;
1275+
goto error_choose_name;
1276+
}
12751277
}
12761278

12771279
/* Perf driver registration */
@@ -1298,7 +1300,7 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn)
12981300
}
12991301

13001302
/* Pick one CPU which we will use to collect data from CCN... */
1301-
cpumask_set_cpu(smp_processor_id(), &ccn->dt.cpu);
1303+
cpumask_set_cpu(get_cpu(), &ccn->dt.cpu);
13021304

13031305
/* Also make sure that the overflow interrupt is handled by this CPU */
13041306
if (ccn->irq) {
@@ -1315,10 +1317,13 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn)
13151317

13161318
cpuhp_state_add_instance_nocalls(CPUHP_AP_PERF_ARM_CCN_ONLINE,
13171319
&ccn->dt.node);
1320+
put_cpu();
13181321
return 0;
13191322

13201323
error_pmu_register:
13211324
error_set_affinity:
1325+
put_cpu();
1326+
error_choose_name:
13221327
ida_simple_remove(&arm_ccn_pmu_ida, ccn->dt.id);
13231328
for (i = 0; i < ccn->num_xps; i++)
13241329
writel(0, ccn->xp[i].base + CCN_XP_DT_CONTROL);
@@ -1581,8 +1586,8 @@ static int __init arm_ccn_init(void)
15811586

15821587
static void __exit arm_ccn_exit(void)
15831588
{
1584-
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_CCN_ONLINE);
15851589
platform_driver_unregister(&arm_ccn_driver);
1590+
cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_CCN_ONLINE);
15861591
}
15871592

15881593
module_init(arm_ccn_init);

0 commit comments

Comments
 (0)