28
28
*/
29
29
30
30
static struct tick_device tick_broadcast_device ;
31
- /* FIXME: Use cpumask_var_t. */
32
- static DECLARE_BITMAP (tick_broadcast_mask , NR_CPUS ) ;
33
- static DECLARE_BITMAP (tmpmask , NR_CPUS ) ;
31
+ static cpumask_var_t tick_broadcast_mask ;
32
+ static cpumask_var_t tmpmask ;
34
33
static DEFINE_RAW_SPINLOCK (tick_broadcast_lock );
35
34
static int tick_broadcast_force ;
36
35
@@ -50,7 +49,7 @@ struct tick_device *tick_get_broadcast_device(void)
50
49
51
50
struct cpumask * tick_get_broadcast_mask (void )
52
51
{
53
- return to_cpumask ( tick_broadcast_mask ) ;
52
+ return tick_broadcast_mask ;
54
53
}
55
54
56
55
/*
@@ -74,7 +73,7 @@ int tick_check_broadcast_device(struct clock_event_device *dev)
74
73
75
74
clockevents_exchange_device (tick_broadcast_device .evtdev , dev );
76
75
tick_broadcast_device .evtdev = dev ;
77
- if (!cpumask_empty (tick_get_broadcast_mask () ))
76
+ if (!cpumask_empty (tick_broadcast_mask ))
78
77
tick_broadcast_start_periodic (dev );
79
78
return 1 ;
80
79
}
@@ -123,7 +122,7 @@ int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu)
123
122
if (!tick_device_is_functional (dev )) {
124
123
dev -> event_handler = tick_handle_periodic ;
125
124
tick_device_setup_broadcast_func (dev );
126
- cpumask_set_cpu (cpu , tick_get_broadcast_mask () );
125
+ cpumask_set_cpu (cpu , tick_broadcast_mask );
127
126
tick_broadcast_start_periodic (tick_broadcast_device .evtdev );
128
127
ret = 1 ;
129
128
} else {
@@ -134,7 +133,7 @@ int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu)
134
133
*/
135
134
if (!(dev -> features & CLOCK_EVT_FEAT_C3STOP )) {
136
135
int cpu = smp_processor_id ();
137
- cpumask_clear_cpu (cpu , tick_get_broadcast_mask () );
136
+ cpumask_clear_cpu (cpu , tick_broadcast_mask );
138
137
tick_broadcast_clear_oneshot (cpu );
139
138
} else {
140
139
tick_device_setup_broadcast_func (dev );
@@ -198,9 +197,8 @@ static void tick_do_periodic_broadcast(void)
198
197
{
199
198
raw_spin_lock (& tick_broadcast_lock );
200
199
201
- cpumask_and (to_cpumask (tmpmask ),
202
- cpu_online_mask , tick_get_broadcast_mask ());
203
- tick_do_broadcast (to_cpumask (tmpmask ));
200
+ cpumask_and (tmpmask , cpu_online_mask , tick_broadcast_mask );
201
+ tick_do_broadcast (tmpmask );
204
202
205
203
raw_spin_unlock (& tick_broadcast_lock );
206
204
}
@@ -263,13 +261,12 @@ static void tick_do_broadcast_on_off(unsigned long *reason)
263
261
if (!tick_device_is_functional (dev ))
264
262
goto out ;
265
263
266
- bc_stopped = cpumask_empty (tick_get_broadcast_mask () );
264
+ bc_stopped = cpumask_empty (tick_broadcast_mask );
267
265
268
266
switch (* reason ) {
269
267
case CLOCK_EVT_NOTIFY_BROADCAST_ON :
270
268
case CLOCK_EVT_NOTIFY_BROADCAST_FORCE :
271
- if (!cpumask_test_cpu (cpu , tick_get_broadcast_mask ())) {
272
- cpumask_set_cpu (cpu , tick_get_broadcast_mask ());
269
+ if (!cpumask_test_and_set_cpu (cpu , tick_broadcast_mask )) {
273
270
if (tick_broadcast_device .mode ==
274
271
TICKDEV_MODE_PERIODIC )
275
272
clockevents_shutdown (dev );
@@ -279,16 +276,15 @@ static void tick_do_broadcast_on_off(unsigned long *reason)
279
276
break ;
280
277
case CLOCK_EVT_NOTIFY_BROADCAST_OFF :
281
278
if (!tick_broadcast_force &&
282
- cpumask_test_cpu (cpu , tick_get_broadcast_mask ())) {
283
- cpumask_clear_cpu (cpu , tick_get_broadcast_mask ());
279
+ cpumask_test_and_clear_cpu (cpu , tick_broadcast_mask )) {
284
280
if (tick_broadcast_device .mode ==
285
281
TICKDEV_MODE_PERIODIC )
286
282
tick_setup_periodic (dev , 0 );
287
283
}
288
284
break ;
289
285
}
290
286
291
- if (cpumask_empty (tick_get_broadcast_mask () )) {
287
+ if (cpumask_empty (tick_broadcast_mask )) {
292
288
if (!bc_stopped )
293
289
clockevents_shutdown (bc );
294
290
} else if (bc_stopped ) {
@@ -337,10 +333,10 @@ void tick_shutdown_broadcast(unsigned int *cpup)
337
333
raw_spin_lock_irqsave (& tick_broadcast_lock , flags );
338
334
339
335
bc = tick_broadcast_device .evtdev ;
340
- cpumask_clear_cpu (cpu , tick_get_broadcast_mask () );
336
+ cpumask_clear_cpu (cpu , tick_broadcast_mask );
341
337
342
338
if (tick_broadcast_device .mode == TICKDEV_MODE_PERIODIC ) {
343
- if (bc && cpumask_empty (tick_get_broadcast_mask () ))
339
+ if (bc && cpumask_empty (tick_broadcast_mask ))
344
340
clockevents_shutdown (bc );
345
341
}
346
342
@@ -376,13 +372,13 @@ int tick_resume_broadcast(void)
376
372
377
373
switch (tick_broadcast_device .mode ) {
378
374
case TICKDEV_MODE_PERIODIC :
379
- if (!cpumask_empty (tick_get_broadcast_mask () ))
375
+ if (!cpumask_empty (tick_broadcast_mask ))
380
376
tick_broadcast_start_periodic (bc );
381
377
broadcast = cpumask_test_cpu (smp_processor_id (),
382
- tick_get_broadcast_mask () );
378
+ tick_broadcast_mask );
383
379
break ;
384
380
case TICKDEV_MODE_ONESHOT :
385
- if (!cpumask_empty (tick_get_broadcast_mask () ))
381
+ if (!cpumask_empty (tick_broadcast_mask ))
386
382
broadcast = tick_resume_broadcast_oneshot (bc );
387
383
break ;
388
384
}
@@ -395,15 +391,14 @@ int tick_resume_broadcast(void)
395
391
396
392
#ifdef CONFIG_TICK_ONESHOT
397
393
398
- /* FIXME: use cpumask_var_t. */
399
- static DECLARE_BITMAP (tick_broadcast_oneshot_mask , NR_CPUS ) ;
394
+ static cpumask_var_t tick_broadcast_oneshot_mask ;
400
395
401
396
/*
402
397
* Exposed for debugging: see timer_list.c
403
398
*/
404
399
struct cpumask * tick_get_broadcast_oneshot_mask (void )
405
400
{
406
- return to_cpumask ( tick_broadcast_oneshot_mask ) ;
401
+ return tick_broadcast_oneshot_mask ;
407
402
}
408
403
409
404
static int tick_broadcast_set_event (ktime_t expires , int force )
@@ -428,7 +423,7 @@ int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
428
423
*/
429
424
void tick_check_oneshot_broadcast (int cpu )
430
425
{
431
- if (cpumask_test_cpu (cpu , to_cpumask ( tick_broadcast_oneshot_mask ) )) {
426
+ if (cpumask_test_cpu (cpu , tick_broadcast_oneshot_mask )) {
432
427
struct tick_device * td = & per_cpu (tick_cpu_device , cpu );
433
428
434
429
clockevents_set_mode (td -> evtdev , CLOCK_EVT_MODE_ONESHOT );
@@ -448,21 +443,21 @@ static void tick_handle_oneshot_broadcast(struct clock_event_device *dev)
448
443
again :
449
444
dev -> next_event .tv64 = KTIME_MAX ;
450
445
next_event .tv64 = KTIME_MAX ;
451
- cpumask_clear (to_cpumask ( tmpmask ) );
446
+ cpumask_clear (tmpmask );
452
447
now = ktime_get ();
453
448
/* Find all expired events */
454
- for_each_cpu (cpu , tick_get_broadcast_oneshot_mask () ) {
449
+ for_each_cpu (cpu , tick_broadcast_oneshot_mask ) {
455
450
td = & per_cpu (tick_cpu_device , cpu );
456
451
if (td -> evtdev -> next_event .tv64 <= now .tv64 )
457
- cpumask_set_cpu (cpu , to_cpumask ( tmpmask ) );
452
+ cpumask_set_cpu (cpu , tmpmask );
458
453
else if (td -> evtdev -> next_event .tv64 < next_event .tv64 )
459
454
next_event .tv64 = td -> evtdev -> next_event .tv64 ;
460
455
}
461
456
462
457
/*
463
458
* Wakeup the cpus which have an expired event.
464
459
*/
465
- tick_do_broadcast (to_cpumask ( tmpmask ) );
460
+ tick_do_broadcast (tmpmask );
466
461
467
462
/*
468
463
* Two reasons for reprogram:
@@ -518,16 +513,13 @@ void tick_broadcast_oneshot_control(unsigned long reason)
518
513
519
514
raw_spin_lock_irqsave (& tick_broadcast_lock , flags );
520
515
if (reason == CLOCK_EVT_NOTIFY_BROADCAST_ENTER ) {
521
- if (!cpumask_test_cpu (cpu , tick_get_broadcast_oneshot_mask ())) {
522
- cpumask_set_cpu (cpu , tick_get_broadcast_oneshot_mask ());
516
+ if (!cpumask_test_and_set_cpu (cpu , tick_broadcast_oneshot_mask )) {
523
517
clockevents_set_mode (dev , CLOCK_EVT_MODE_SHUTDOWN );
524
518
if (dev -> next_event .tv64 < bc -> next_event .tv64 )
525
519
tick_broadcast_set_event (dev -> next_event , 1 );
526
520
}
527
521
} else {
528
- if (cpumask_test_cpu (cpu , tick_get_broadcast_oneshot_mask ())) {
529
- cpumask_clear_cpu (cpu ,
530
- tick_get_broadcast_oneshot_mask ());
522
+ if (cpumask_test_and_clear_cpu (cpu , tick_broadcast_oneshot_mask )) {
531
523
clockevents_set_mode (dev , CLOCK_EVT_MODE_ONESHOT );
532
524
if (dev -> next_event .tv64 != KTIME_MAX )
533
525
tick_program_event (dev -> next_event , 1 );
@@ -543,7 +535,7 @@ void tick_broadcast_oneshot_control(unsigned long reason)
543
535
*/
544
536
static void tick_broadcast_clear_oneshot (int cpu )
545
537
{
546
- cpumask_clear_cpu (cpu , tick_get_broadcast_oneshot_mask () );
538
+ cpumask_clear_cpu (cpu , tick_broadcast_oneshot_mask );
547
539
}
548
540
549
541
static void tick_broadcast_init_next_event (struct cpumask * mask ,
@@ -581,15 +573,14 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
581
573
* oneshot_mask bits for those and program the
582
574
* broadcast device to fire.
583
575
*/
584
- cpumask_copy (to_cpumask (tmpmask ), tick_get_broadcast_mask ());
585
- cpumask_clear_cpu (cpu , to_cpumask (tmpmask ));
586
- cpumask_or (tick_get_broadcast_oneshot_mask (),
587
- tick_get_broadcast_oneshot_mask (),
588
- to_cpumask (tmpmask ));
576
+ cpumask_copy (tmpmask , tick_broadcast_mask );
577
+ cpumask_clear_cpu (cpu , tmpmask );
578
+ cpumask_or (tick_broadcast_oneshot_mask ,
579
+ tick_broadcast_oneshot_mask , tmpmask );
589
580
590
- if (was_periodic && !cpumask_empty (to_cpumask ( tmpmask ) )) {
581
+ if (was_periodic && !cpumask_empty (tmpmask )) {
591
582
clockevents_set_mode (bc , CLOCK_EVT_MODE_ONESHOT );
592
- tick_broadcast_init_next_event (to_cpumask ( tmpmask ) ,
583
+ tick_broadcast_init_next_event (tmpmask ,
593
584
tick_next_period );
594
585
tick_broadcast_set_event (tick_next_period , 1 );
595
586
} else
@@ -639,7 +630,7 @@ void tick_shutdown_broadcast_oneshot(unsigned int *cpup)
639
630
* Clear the broadcast mask flag for the dead cpu, but do not
640
631
* stop the broadcast device!
641
632
*/
642
- cpumask_clear_cpu (cpu , tick_get_broadcast_oneshot_mask () );
633
+ cpumask_clear_cpu (cpu , tick_broadcast_oneshot_mask );
643
634
644
635
raw_spin_unlock_irqrestore (& tick_broadcast_lock , flags );
645
636
}
@@ -663,3 +654,12 @@ bool tick_broadcast_oneshot_available(void)
663
654
}
664
655
665
656
#endif
657
+
658
+ void __init tick_broadcast_init (void )
659
+ {
660
+ alloc_cpumask_var (& tick_broadcast_mask , GFP_NOWAIT );
661
+ alloc_cpumask_var (& tmpmask , GFP_NOWAIT );
662
+ #ifdef CONFIG_TICK_ONESHOT
663
+ alloc_cpumask_var (& tick_broadcast_oneshot_mask , GFP_NOWAIT );
664
+ #endif
665
+ }
0 commit comments