aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bus
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2016-08-12 13:49:42 -0400
committerThomas Gleixner <tglx@linutronix.de>2016-09-02 14:05:06 -0400
commit8df038725ad5351a9730759e0a24a5c5d96be661 (patch)
tree72b45867371ab20f734dfbd05e6f840daf3c803d /drivers/bus
parentb230f0db913136f465a951806f2978b179df95d5 (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.c54
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
192static DEFINE_MUTEX(arm_ccn_mutex);
193static LIST_HEAD(arm_ccn_list);
194
195static int arm_ccn_node_to_xp(int node) 192static 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
1176static int arm_ccn_pmu_offline_cpu(unsigned int cpu) 1173static 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
1200static DEFINE_IDA(arm_ccn_pmu_ida); 1191static DEFINE_IDA(arm_ccn_pmu_ida);
1201 1192
1202static int arm_ccn_pmu_init(struct arm_ccn *ccn) 1193static 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
1286error_pmu_register: 1276error_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
1542static void __exit arm_ccn_exit(void) 1530static 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