On 21/09/18 16:08, Shameer Kolothum wrote: [...]
+ + err = cpuhp_state_add_instance_nocalls(cpuhp_state_num, + &smmu_pmu->node);
In theory a hotplug event could happen as soon as the instance is registered...
+ if (err) { + dev_err(dev, "Error %d registering hotplug, PMU @%pa\n", + err, &res_0->start); + return err; + } + + /* Pick one CPU to be the preferred one to use */ + smmu_pmu->on_cpu = get_cpu();
...so this looks too late, i.e. a race here can result in a bogus call to perf_pmu_migrate_context() with an uninitialised pmu.
Robin.
+ WARN_ON(irq_set_affinity(smmu_pmu->irq, cpumask_of(smmu_pmu->on_cpu))); + + err = perf_pmu_register(&smmu_pmu->pmu, name, -1); + if (err) { + dev_err(dev, "Error %d registering PMU @%pa\n", + err, &res_0->start); + goto out_unregister; + } + + put_cpu();