@@ -99,7 +99,7 @@ irqreturn_t timer_interrupt(int irq, void *dev_id)
9999 * cycles after the IT fires. But it's arbitrary how much time passes
100100 * before we call it "late". I've picked one second.
101101 */
102- if (ticks_elapsed > HZ ) {
102+ if (unlikely ( ticks_elapsed > HZ ) ) {
103103 /* Scenario 3: very long delay? bad in any case */
104104 printk (KERN_CRIT "timer_interrupt(CPU %d): delayed!"
105105 " cycles %lX rem %lX "
@@ -180,16 +180,34 @@ static cycle_t read_cr16(void)
180180 return get_cycles ();
181181}
182182
183+ static int cr16_update_callback (void );
184+
183185static struct clocksource clocksource_cr16 = {
184186 .name = "cr16" ,
185187 .rating = 300 ,
186188 .read = read_cr16 ,
187189 .mask = CLOCKSOURCE_MASK (BITS_PER_LONG ),
188190 .mult = 0 , /* to be set */
189191 .shift = 22 ,
192+ .update_callback = cr16_update_callback ,
190193 .is_continuous = 1 ,
191194};
192195
196+ static int cr16_update_callback (void )
197+ {
198+ int change = 0 ;
199+
200+ /* since the cr16 cycle counters are not syncronized across CPUs,
201+ we'll check if we should switch to a safe clocksource: */
202+ if (clocksource_cr16 .rating != 0 && num_online_cpus () > 1 ) {
203+ clocksource_cr16 .rating = 0 ;
204+ clocksource_reselect ();
205+ change = 1 ;
206+ }
207+
208+ return change ;
209+ }
210+
193211
194212/*
195213 * XXX: We can do better than this.
@@ -225,10 +243,6 @@ void __init time_init(void)
225243 current_cr16_khz = PAGE0 -> mem_10msec /10 ; /* kHz */
226244 clocksource_cr16 .mult = clocksource_khz2mult (current_cr16_khz ,
227245 clocksource_cr16 .shift );
228- /* lower the rating if we already know its unstable: */
229- if (num_online_cpus ()> 1 )
230- clocksource_cr16 .rating = 200 ;
231-
232246 clocksource_register (& clocksource_cr16 );
233247
234248 if (pdc_tod_read (& tod_data ) == 0 ) {
0 commit comments