diff options
Diffstat (limited to 'kernel/time/tick-broadcast.c')
| -rw-r--r-- | kernel/time/tick-broadcast.c | 13 | 
1 files changed, 6 insertions, 7 deletions
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index bf57abdc7bd..f113755695e 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -346,7 +346,8 @@ int tick_resume_broadcast(void)  						     tick_get_broadcast_mask());  			break;  		case TICKDEV_MODE_ONESHOT: -			broadcast = tick_resume_broadcast_oneshot(bc); +			if (!cpumask_empty(tick_get_broadcast_mask())) +				broadcast = tick_resume_broadcast_oneshot(bc);  			break;  		}  	} @@ -373,6 +374,9 @@ static int tick_broadcast_set_event(ktime_t expires, int force)  {  	struct clock_event_device *bc = tick_broadcast_device.evtdev; +	if (bc->mode != CLOCK_EVT_MODE_ONESHOT) +		clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); +  	return clockevents_program_event(bc, expires, force);  } @@ -531,7 +535,6 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc)  		int was_periodic = bc->mode == CLOCK_EVT_MODE_PERIODIC;  		bc->event_handler = tick_handle_oneshot_broadcast; -		clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);  		/* Take the do_timer update */  		tick_do_timer_cpu = cpu; @@ -549,6 +552,7 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc)  			   to_cpumask(tmpmask));  		if (was_periodic && !cpumask_empty(to_cpumask(tmpmask))) { +			clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);  			tick_broadcast_init_next_event(to_cpumask(tmpmask),  						       tick_next_period);  			tick_broadcast_set_event(tick_next_period, 1); @@ -577,15 +581,10 @@ void tick_broadcast_switch_to_oneshot(void)  	raw_spin_lock_irqsave(&tick_broadcast_lock, flags);  	tick_broadcast_device.mode = TICKDEV_MODE_ONESHOT; - -	if (cpumask_empty(tick_get_broadcast_mask())) -		goto end; -  	bc = tick_broadcast_device.evtdev;  	if (bc)  		tick_broadcast_setup_oneshot(bc); -end:  	raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);  }  |