@@ -167,7 +167,7 @@ struct arm_ccn_dt {
167
167
struct hrtimer hrtimer ;
168
168
169
169
cpumask_t cpu ;
170
- struct list_head entry ;
170
+ struct hlist_node node ;
171
171
172
172
struct pmu pmu ;
173
173
};
@@ -189,9 +189,6 @@ struct arm_ccn {
189
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
192
static int arm_ccn_node_to_xp (int node )
196
193
{
197
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
1177
unsigned int target ;
1180
1178
1181
- mutex_lock (& arm_ccn_mutex );
1182
- list_for_each_entry (dt , & arm_ccn_list , entry ) {
1183
- struct arm_ccn * ccn = container_of (dt , struct arm_ccn , dt );
1184
-
1185
- if (!cpumask_test_and_clear_cpu (cpu , & dt -> cpu ))
1186
- continue ;
1187
- target = cpumask_any_but (cpu_online_mask , cpu );
1188
- if (target >= nr_cpu_ids )
1189
- continue ;
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 );
1179
+ if (!cpumask_test_and_clear_cpu (cpu , & dt -> cpu ))
1180
+ return 0 ;
1181
+ target = cpumask_any_but (cpu_online_mask , cpu );
1182
+ if (target >= nr_cpu_ids )
1183
+ return 0 ;
1184
+ perf_pmu_migrate_context (& dt -> pmu , cpu , target );
1185
+ cpumask_set_cpu (target , & dt -> cpu );
1186
+ if (ccn -> irq )
1187
+ WARN_ON (irq_set_affinity_hint (ccn -> irq , & dt -> cpu ) != 0 );
1196
1188
return 0 ;
1197
1189
}
1198
1190
1199
-
1200
1191
static DEFINE_IDA (arm_ccn_pmu_ida );
1201
1192
1202
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
1269
if (err )
1279
1270
goto error_pmu_register ;
1280
1271
1281
- mutex_lock (& arm_ccn_mutex );
1282
- list_add (& ccn -> dt .entry , & arm_ccn_list );
1283
- mutex_unlock (& arm_ccn_mutex );
1272
+ cpuhp_state_add_instance_nocalls (CPUHP_AP_PERF_ARM_CCN_ONLINE ,
1273
+ & ccn -> dt .node );
1284
1274
return 0 ;
1285
1275
1286
1276
error_pmu_register :
@@ -1296,10 +1286,8 @@ static void arm_ccn_pmu_cleanup(struct arm_ccn *ccn)
1296
1286
{
1297
1287
int i ;
1298
1288
1299
- mutex_lock (& arm_ccn_mutex );
1300
- list_del (& ccn -> dt .entry );
1301
- mutex_unlock (& arm_ccn_mutex );
1302
-
1289
+ cpuhp_state_remove_instance_nocalls (CPUHP_AP_PERF_ARM_CCN_ONLINE ,
1290
+ & ccn -> dt .node );
1303
1291
if (ccn -> irq )
1304
1292
irq_set_affinity_hint (ccn -> irq , NULL );
1305
1293
for (i = 0 ; i < ccn -> num_xps ; i ++ )
@@ -1527,9 +1515,9 @@ static int __init arm_ccn_init(void)
1527
1515
{
1528
1516
int i , ret ;
1529
1517
1530
- ret = cpuhp_setup_state_nocalls (CPUHP_AP_PERF_ARM_CCN_ONLINE ,
1531
- "AP_PERF_ARM_CCN_ONLINE" , NULL ,
1532
- arm_ccn_pmu_offline_cpu );
1518
+ ret = cpuhp_setup_state_multi (CPUHP_AP_PERF_ARM_CCN_ONLINE ,
1519
+ "AP_PERF_ARM_CCN_ONLINE" , NULL ,
1520
+ arm_ccn_pmu_offline_cpu );
1533
1521
if (ret )
1534
1522
return ret ;
1535
1523
@@ -1541,7 +1529,7 @@ static int __init arm_ccn_init(void)
1541
1529
1542
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
1533
platform_driver_unregister (& arm_ccn_driver );
1546
1534
}
1547
1535
0 commit comments