diff options
| -rw-r--r-- | kernel/time/tick-broadcast.c | 13 | ||||
| -rw-r--r-- | kernel/time/tick-common.c | 4 | 
2 files changed, 8 insertions, 9 deletions
| diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index acf15b49e55b..298bc7c6f09f 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -64,8 +64,9 @@ static void tick_broadcast_start_periodic(struct clock_event_device *bc)   */  int tick_check_broadcast_device(struct clock_event_device *dev)  { -	if (tick_broadcast_device.evtdev || -	    (dev->features & CLOCK_EVT_FEAT_C3STOP)) +	if ((tick_broadcast_device.evtdev && +	     tick_broadcast_device.evtdev->rating >= dev->rating) || +	     (dev->features & CLOCK_EVT_FEAT_C3STOP))  		return 0;  	clockevents_exchange_device(NULL, dev); @@ -513,11 +514,9 @@ static void tick_broadcast_clear_oneshot(int cpu)   */  void tick_broadcast_setup_oneshot(struct clock_event_device *bc)  { -	if (bc->mode != CLOCK_EVT_MODE_ONESHOT) { -		bc->event_handler = tick_handle_oneshot_broadcast; -		clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); -		bc->next_event.tv64 = KTIME_MAX; -	} +	bc->event_handler = tick_handle_oneshot_broadcast; +	clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); +	bc->next_event.tv64 = KTIME_MAX;  }  /* diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 77a21abc8716..3f3ae3907830 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c @@ -200,7 +200,7 @@ static int tick_check_new_device(struct clock_event_device *newdev)  	cpu = smp_processor_id();  	if (!cpu_isset(cpu, newdev->cpumask)) -		goto out; +		goto out_bc;  	td = &per_cpu(tick_cpu_device, cpu);  	curdev = td->evtdev; @@ -265,7 +265,7 @@ out_bc:  	 */  	if (tick_check_broadcast_device(newdev))  		ret = NOTIFY_STOP; -out: +  	spin_unlock_irqrestore(&tick_device_lock, flags);  	return ret; | 
