Skip to content

Commit 324c7e6

Browse files
hdellerKyle McMartin
authored andcommitted
[PARISC] disable cr16 clocksource when multiple CPUs are online
Signed-off-by: Helge Deller <deller@gmx.de> Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
1 parent 12df29b commit 324c7e6

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

arch/parisc/kernel/time.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
183185
static 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

Comments
 (0)