monotonic seqlock for cyclone timer
PATCH 1/1 monotonic seqlock for cyclone timer
Replace read/write lock used for cyclone timer monotonic_lock with seqlock. Similar to locking used on xtime and monotonic_lock in timers/timer_tsc.c
It builds and runs, but I don't have hardware with cyclone support to test. Not a big deal (yet) since only hangcheck timer uses monotonic clock so far.
arch/i386/kernel/timers/timer_cyclone.c +10 -7
@@ -35,7 +35,7 @@static u32 last_cyclone_low;static u32 last_cyclone_high;static unsigned long long monotonic_base; -static rwlock_t monotonic_lock =RW_LOCK_UNLOCKED ; +static seqlock_t monotonic_lock =SEQLOCK_UNLOCKED ;/* helper macro to atomically read both cyclone counter registers */ #define read_cyclone_counter (low,high) \
@@ -51,7 +51,7 @@int count;unsigned long long this_offset, last_offset; -write_lock (&monotonic_lock); +write_seqlock (&monotonic_lock); last_offset = ((unsigned long long )last_cyclone_high<<32 )|last_cyclone_low;spin_lock (&i8253_lock);
@@ -76,7 +76,7 @@/* update the monotonic base value */ this_offset = ((unsigned long long )last_cyclone_high<<32 )|last_cyclone_low; monotonic_base += (this_offset - last_offset) &CYCLONE_TIMER_MASK ; -write_unlock (&monotonic_lock); +write_sequnlock (&monotonic_lock);/* calculate delay_at_last_interrupt */ count = ((LATCH -1 ) - count) *TICK_SIZE ;
@@ -117,12 +117,15 @@u32 now_low, now_high;unsigned long long last_offset, this_offset, base;unsigned long long ret; +unsigned seq;/* atomically read monotonic base & last_offset */ -read_lock_irq (&monotonic_lock); - last_offset = ((unsigned long long )last_cyclone_high<<32 )|last_cyclone_low; - base = monotonic_base; -read_unlock_irq (&monotonic_lock); +do { + seq =read_seqbegin (&monotonic_lock); + last_offset = ((unsigned long long )last_cyclone_high<<32 )|last_cyclone_low; + base = monotonic_base; + }while (read_seqretry (&monotonic_lock, seq)); +/* Read the cyclone counter */ read_cyclone_counter (now_low,now_high);
Quoted 5 lines · Stephen Hemminger
Replace read/write lock used for cyclone timer
monotonic_lockwith seqlock. Similar to locking used on xtime andmonotonic_lockintimers/timer_tsc.cIt builds and runs, but I don't have hardware with cyclone support to test. Not a big deal (yet) since only hangcheck timer uses monotonic clock so far.
I use to run w/ almost the exact same patch on cyclone hardware. Looks good to me.
thanks for sending this out
-john