diff options
Diffstat (limited to 'arch/ia64/kernel')
-rw-r--r-- | arch/ia64/kernel/time.c | 19 |
1 files changed, 5 insertions, 14 deletions
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index 9702fa92489e..156ad803d5b7 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c | |||
@@ -190,19 +190,10 @@ timer_interrupt (int irq, void *dev_id) | |||
190 | 190 | ||
191 | new_itm += local_cpu_data->itm_delta; | 191 | new_itm += local_cpu_data->itm_delta; |
192 | 192 | ||
193 | if (smp_processor_id() == time_keeper_id) { | 193 | if (smp_processor_id() == time_keeper_id) |
194 | /* | 194 | xtime_update(1); |
195 | * Here we are in the timer irq handler. We have irqs locally | 195 | |
196 | * disabled, but we don't know if the timer_bh is running on | 196 | local_cpu_data->itm_next = new_itm; |
197 | * another CPU. We need to avoid to SMP race by acquiring the | ||
198 | * xtime_lock. | ||
199 | */ | ||
200 | write_seqlock(&xtime_lock); | ||
201 | do_timer(1); | ||
202 | local_cpu_data->itm_next = new_itm; | ||
203 | write_sequnlock(&xtime_lock); | ||
204 | } else | ||
205 | local_cpu_data->itm_next = new_itm; | ||
206 | 197 | ||
207 | if (time_after(new_itm, ia64_get_itc())) | 198 | if (time_after(new_itm, ia64_get_itc())) |
208 | break; | 199 | break; |
@@ -222,7 +213,7 @@ skip_process_time_accounting: | |||
222 | * comfort, we increase the safety margin by | 213 | * comfort, we increase the safety margin by |
223 | * intentionally dropping the next tick(s). We do NOT | 214 | * intentionally dropping the next tick(s). We do NOT |
224 | * update itm.next because that would force us to call | 215 | * update itm.next because that would force us to call |
225 | * do_timer() which in turn would let our clock run | 216 | * xtime_update() which in turn would let our clock run |
226 | * too fast (with the potentially devastating effect | 217 | * too fast (with the potentially devastating effect |
227 | * of losing monotony of time). | 218 | * of losing monotony of time). |
228 | */ | 219 | */ |