diff options
| author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2016-08-12 13:49:42 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2016-09-02 14:05:06 -0400 |
| commit | 8df038725ad5351a9730759e0a24a5c5d96be661 (patch) | |
| tree | 72b45867371ab20f734dfbd05e6f840daf3c803d /drivers/bus | |
| parent | b230f0db913136f465a951806f2978b179df95d5 (diff) | |
bus/arm-ccn: Use cpu-hp's multi instance support instead custom list
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Pawel Moll <pawel.moll@arm.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Will Deacon <will.deacon@arm.com>
Cc: rt@linutronix.de
Link: http://lkml.kernel.org/r/1471024183-12666-6-git-send-email-bigeasy@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/bus')
| -rw-r--r-- | drivers/bus/arm-ccn.c | 54 |
1 files changed, 21 insertions, 33 deletions
diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c index 97a9185af433..e0ad47534126 100644 --- a/drivers/bus/arm-ccn.c +++ b/drivers/bus/arm-ccn.c | |||
| @@ -167,7 +167,7 @@ struct arm_ccn_dt { | |||
| 167 | struct hrtimer hrtimer; | 167 | struct hrtimer hrtimer; |
| 168 | 168 | ||
| 169 | cpumask_t cpu; | 169 | cpumask_t cpu; |
| 170 | struct list_head entry; | 170 | struct hlist_node node; |
| 171 | 171 | ||
| 172 | struct pmu pmu; | 172 | struct pmu pmu; |
| 173 | }; | 173 | }; |
| @@ -189,9 +189,6 @@ struct arm_ccn { | |||
| 189 | struct arm_ccn_dt dt; | 189 | struct arm_ccn_dt dt; |
| 190 | }; | 190 | }; |
| 191 | 191 | ||
| 192 | static DEFINE_MUTEX(arm_ccn_mutex); | ||
| 193 | static LIST_HEAD(arm_ccn_list); | ||
| 194 | |||
| 195 | static int arm_ccn_node_to_xp(int node) | 192 | static int arm_ccn_node_to_xp(int node) |
| 196 | { | 193 | { |
| 197 | return node / CCN_NUM_XP_PORTS; | 194 | return node / CCN_NUM_XP_PORTS; |
| @@ -1173,30 +1170,24 @@ static enum hrtimer_restart arm_ccn_pmu_timer_handler(struct hrtimer *hrtimer) | |||
| 1173 | } | 1170 | } |
| 1174 | 1171 | ||
| 1175 | 1172 | ||
| 1176 | static int arm_ccn_pmu_offline_cpu(unsigned int cpu) | 1173 | static int arm_ccn_pmu_offline_cpu(unsigned int cpu, struct hlist_node *node) |
| 1177 | { | 1174 | { |
| 1178 | struct arm_ccn_dt *dt; | 1175 | struct arm_ccn_dt *dt = hlist_entry_safe(node, struct arm_ccn_dt, node); |
| 1176 | struct arm_ccn *ccn = container_of(dt, struct arm_ccn, dt); | ||
| 1179 | unsigned int target; | 1177 | unsigned int target; |
| 1180 | 1178 | ||
| 1181 | mutex_lock(&arm_ccn_mutex); | 1179 | if (!cpumask_test_and_clear_cpu(cpu, &dt->cpu)) |
| 1182 | list_for_each_entry(dt, &arm_ccn_list, entry) { | 1180 | return 0; |
| 1183 | struct arm_ccn *ccn = container_of(dt, struct arm_ccn, dt); | 1181 | target = cpumask_any_but(cpu_online_mask, cpu); |
| 1184 | 1182 | if (target >= nr_cpu_ids) | |
| 1185 | if (!cpumask_test_and_clear_cpu(cpu, &dt->cpu)) | 1183 | return 0; |
| 1186 | continue; | 1184 | perf_pmu_migrate_context(&dt->pmu, cpu, target); |
| 1187 | target = cpumask_any_but(cpu_online_mask, cpu); | 1185 | cpumask_set_cpu(target, &dt->cpu); |
| 1188 | if (target >= nr_cpu_ids) | 1186 | if (ccn->irq) |
| 1189 | continue; | 1187 | WARN_ON(irq_set_affinity_hint(ccn->irq, &dt->cpu) != 0); |
| 1190 | perf_pmu_migrate_context(&dt->pmu, cpu, target); | ||
| 1191 | cpumask_set_cpu(target, &dt->cpu); | ||
| 1192 | if (ccn->irq) | ||
| 1193 | WARN_ON(irq_set_affinity_hint(ccn->irq, &dt->cpu) != 0); | ||
| 1194 | } | ||
| 1195 | mutex_unlock(&arm_ccn_mutex); | ||
| 1196 | return 0; | 1188 | return 0; |
| 1197 | } | 1189 | } |
| 1198 | 1190 | ||
| 1199 | |||
| 1200 | static DEFINE_IDA(arm_ccn_pmu_ida); | 1191 | static DEFINE_IDA(arm_ccn_pmu_ida); |
| 1201 | 1192 | ||
| 1202 | static int arm_ccn_pmu_init(struct arm_ccn *ccn) | 1193 | static int arm_ccn_pmu_init(struct arm_ccn *ccn) |
| @@ -1278,9 +1269,8 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn) | |||
| 1278 | if (err) | 1269 | if (err) |
| 1279 | goto error_pmu_register; | 1270 | goto error_pmu_register; |
| 1280 | 1271 | ||
| 1281 | mutex_lock(&arm_ccn_mutex); | 1272 | cpuhp_state_add_instance_nocalls(CPUHP_AP_PERF_ARM_CCN_ONLINE, |
| 1282 | list_add(&ccn->dt.entry, &arm_ccn_list); | 1273 | &ccn->dt.node); |
| 1283 | mutex_unlock(&arm_ccn_mutex); | ||
| 1284 | return 0; | 1274 | return 0; |
| 1285 | 1275 | ||
| 1286 | error_pmu_register: | 1276 | error_pmu_register: |
| @@ -1296,10 +1286,8 @@ static void arm_ccn_pmu_cleanup(struct arm_ccn *ccn) | |||
| 1296 | { | 1286 | { |
| 1297 | int i; | 1287 | int i; |
| 1298 | 1288 | ||
| 1299 | mutex_lock(&arm_ccn_mutex); | 1289 | cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_CCN_ONLINE, |
| 1300 | list_del(&ccn->dt.entry); | 1290 | &ccn->dt.node); |
| 1301 | mutex_unlock(&arm_ccn_mutex); | ||
| 1302 | |||
| 1303 | if (ccn->irq) | 1291 | if (ccn->irq) |
| 1304 | irq_set_affinity_hint(ccn->irq, NULL); | 1292 | irq_set_affinity_hint(ccn->irq, NULL); |
| 1305 | for (i = 0; i < ccn->num_xps; i++) | 1293 | for (i = 0; i < ccn->num_xps; i++) |
| @@ -1527,9 +1515,9 @@ static int __init arm_ccn_init(void) | |||
| 1527 | { | 1515 | { |
| 1528 | int i, ret; | 1516 | int i, ret; |
| 1529 | 1517 | ||
| 1530 | ret = cpuhp_setup_state_nocalls(CPUHP_AP_PERF_ARM_CCN_ONLINE, | 1518 | ret = cpuhp_setup_state_multi(CPUHP_AP_PERF_ARM_CCN_ONLINE, |
| 1531 | "AP_PERF_ARM_CCN_ONLINE", NULL, | 1519 | "AP_PERF_ARM_CCN_ONLINE", NULL, |
| 1532 | arm_ccn_pmu_offline_cpu); | 1520 | arm_ccn_pmu_offline_cpu); |
| 1533 | if (ret) | 1521 | if (ret) |
| 1534 | return ret; | 1522 | return ret; |
| 1535 | 1523 | ||
| @@ -1541,7 +1529,7 @@ static int __init arm_ccn_init(void) | |||
| 1541 | 1529 | ||
| 1542 | static void __exit arm_ccn_exit(void) | 1530 | static void __exit arm_ccn_exit(void) |
| 1543 | { | 1531 | { |
| 1544 | cpuhp_remove_state_nocalls(CPUHP_AP_PERF_ARM_CCN_ONLINE); | 1532 | cpuhp_remove_multi_state(CPUHP_AP_PERF_ARM_CCN_ONLINE); |
| 1545 | platform_driver_unregister(&arm_ccn_driver); | 1533 | platform_driver_unregister(&arm_ccn_driver); |
| 1546 | } | 1534 | } |
| 1547 | 1535 | ||
