Skip to content

Commit

Permalink
ia64: Switch do_timer() to xtime_update()
Browse files Browse the repository at this point in the history
local_cpu_data->itm_next = new_itm; does not need to be protected by
xtime_lock. xtime_update() takes the lock itself.

Signed-off-by: Torben Hohn <torbenh@gmx.de>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: johnstul@us.ibm.com
Cc: hch@infradead.org
Cc: yong.zhang0@gmail.com
LKML-Reference: <20110127145956.23248.49107.stgit@localhost>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Torben Hohn authored and Thomas Gleixner committed Jan 31, 2011
1 parent daad8b5 commit 1aabd67
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 22 deletions.
19 changes: 5 additions & 14 deletions arch/ia64/kernel/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,19 +190,10 @@ timer_interrupt (int irq, void *dev_id)

new_itm += local_cpu_data->itm_delta;

if (smp_processor_id() == time_keeper_id) {
/*
* Here we are in the timer irq handler. We have irqs locally
* disabled, but we don't know if the timer_bh is running on
* another CPU. We need to avoid to SMP race by acquiring the
* xtime_lock.
*/
write_seqlock(&xtime_lock);
do_timer(1);
local_cpu_data->itm_next = new_itm;
write_sequnlock(&xtime_lock);
} else
local_cpu_data->itm_next = new_itm;
if (smp_processor_id() == time_keeper_id)
xtime_update(1);

local_cpu_data->itm_next = new_itm;

if (time_after(new_itm, ia64_get_itc()))
break;
Expand All @@ -222,7 +213,7 @@ timer_interrupt (int irq, void *dev_id)
* comfort, we increase the safety margin by
* intentionally dropping the next tick(s). We do NOT
* update itm.next because that would force us to call
* do_timer() which in turn would let our clock run
* xtime_update() which in turn would let our clock run
* too fast (with the potentially devastating effect
* of losing monotony of time).
*/
Expand Down
13 changes: 5 additions & 8 deletions arch/ia64/xen/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,14 +139,11 @@ consider_steal_time(unsigned long new_itm)
run_posix_cpu_timers(p);
delta_itm += local_cpu_data->itm_delta * (stolen + blocked);

if (cpu == time_keeper_id) {
write_seqlock(&xtime_lock);
do_timer(stolen + blocked);
local_cpu_data->itm_next = delta_itm + new_itm;
write_sequnlock(&xtime_lock);
} else {
local_cpu_data->itm_next = delta_itm + new_itm;
}
if (cpu == time_keeper_id)
xtime_update(stolen + blocked);

local_cpu_data->itm_next = delta_itm + new_itm;

per_cpu(xen_stolen_time, cpu) += NS_PER_TICK * stolen;
per_cpu(xen_blocked_time, cpu) += NS_PER_TICK * blocked;
}
Expand Down

0 comments on commit 1aabd67

Please sign in to comment.