diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2008-01-28 05:16:37 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-01-28 05:17:12 -0500 |
commit | 193c3cc12583344be01206078d9ad3fec5dbc397 (patch) | |
tree | 97eb5d6ec88969d21fbf0c5815e3b77e8e1f4aaf | |
parent | 6232be32afa121628c72291ce7eaa24a639905c2 (diff) |
[ARM] Fix timer damage from d3d74453c34f8fd87674a8cf5b8a327c68f22e99
Move the xtime write mode seqlock into timer_tick(), so it only
surrounds the call to do_timer().
This avoids a deadlock in update_process_times() ...
hrtimer_get_softirq_time() which tries to get a read mode seqlock
on xtime, thereby preventing booting.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | arch/arm/kernel/time.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-aaec2000/core.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-clps711x/time.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-clps7500/core.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-ebsa110/core.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-ep93xx/core.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-footbridge/dc21285-timer.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-footbridge/isa-timer.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-h720x/cpu-h7201.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-h720x/cpu-h7202.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-integrator/core.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-ixp2000/core.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-ks8695/time.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-lh7a40x/time.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-mx3/time.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-netx/time.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/timer-gp.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-pnx4008/time.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-realview/core.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-sa1100/time.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-shark/core.c | 2 |
21 files changed, 2 insertions, 71 deletions
diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c index e59b5b84168d..b5867eca1d0b 100644 --- a/arch/arm/kernel/time.c +++ b/arch/arm/kernel/time.c | |||
@@ -325,7 +325,9 @@ void timer_tick(void) | |||
325 | profile_tick(CPU_PROFILING); | 325 | profile_tick(CPU_PROFILING); |
326 | do_leds(); | 326 | do_leds(); |
327 | do_set_rtc(); | 327 | do_set_rtc(); |
328 | write_seqlock(&xtime_lock); | ||
328 | do_timer(1); | 329 | do_timer(1); |
330 | write_sequnlock(&xtime_lock); | ||
329 | #ifndef CONFIG_SMP | 331 | #ifndef CONFIG_SMP |
330 | update_process_times(user_mode(get_irq_regs())); | 332 | update_process_times(user_mode(get_irq_regs())); |
331 | #endif | 333 | #endif |
diff --git a/arch/arm/mach-aaec2000/core.c b/arch/arm/mach-aaec2000/core.c index 0446ef2f5bd6..b016be2b0e35 100644 --- a/arch/arm/mach-aaec2000/core.c +++ b/arch/arm/mach-aaec2000/core.c | |||
@@ -130,13 +130,9 @@ static irqreturn_t | |||
130 | aaec2000_timer_interrupt(int irq, void *dev_id) | 130 | aaec2000_timer_interrupt(int irq, void *dev_id) |
131 | { | 131 | { |
132 | /* TODO: Check timer accuracy */ | 132 | /* TODO: Check timer accuracy */ |
133 | write_seqlock(&xtime_lock); | ||
134 | |||
135 | timer_tick(); | 133 | timer_tick(); |
136 | TIMER1_CLEAR = 1; | 134 | TIMER1_CLEAR = 1; |
137 | 135 | ||
138 | write_sequnlock(&xtime_lock); | ||
139 | |||
140 | return IRQ_HANDLED; | 136 | return IRQ_HANDLED; |
141 | } | 137 | } |
142 | 138 | ||
diff --git a/arch/arm/mach-clps711x/time.c b/arch/arm/mach-clps711x/time.c index f428af7545b4..e5dc33f1f95c 100644 --- a/arch/arm/mach-clps711x/time.c +++ b/arch/arm/mach-clps711x/time.c | |||
@@ -50,9 +50,7 @@ static unsigned long clps711x_gettimeoffset(void) | |||
50 | static irqreturn_t | 50 | static irqreturn_t |
51 | p720t_timer_interrupt(int irq, void *dev_id) | 51 | p720t_timer_interrupt(int irq, void *dev_id) |
52 | { | 52 | { |
53 | write_seqlock(&xtime_lock); | ||
54 | timer_tick(); | 53 | timer_tick(); |
55 | write_sequnlock(&xtime_lock); | ||
56 | return IRQ_HANDLED; | 54 | return IRQ_HANDLED; |
57 | } | 55 | } |
58 | 56 | ||
diff --git a/arch/arm/mach-clps7500/core.c b/arch/arm/mach-clps7500/core.c index 986205ec9269..2ac63671ea5f 100644 --- a/arch/arm/mach-clps7500/core.c +++ b/arch/arm/mach-clps7500/core.c | |||
@@ -298,8 +298,6 @@ extern unsigned long ioc_timer_gettimeoffset(void); | |||
298 | static irqreturn_t | 298 | static irqreturn_t |
299 | clps7500_timer_interrupt(int irq, void *dev_id) | 299 | clps7500_timer_interrupt(int irq, void *dev_id) |
300 | { | 300 | { |
301 | write_seqlock(&xtime_lock); | ||
302 | |||
303 | timer_tick(); | 301 | timer_tick(); |
304 | 302 | ||
305 | /* Why not using do_leds interface?? */ | 303 | /* Why not using do_leds interface?? */ |
@@ -313,8 +311,6 @@ clps7500_timer_interrupt(int irq, void *dev_id) | |||
313 | } | 311 | } |
314 | } | 312 | } |
315 | 313 | ||
316 | write_sequnlock(&xtime_lock); | ||
317 | |||
318 | return IRQ_HANDLED; | 314 | return IRQ_HANDLED; |
319 | } | 315 | } |
320 | 316 | ||
diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c index 8c1b5690dfe8..7710e14b5268 100644 --- a/arch/arm/mach-ebsa110/core.c +++ b/arch/arm/mach-ebsa110/core.c | |||
@@ -178,8 +178,6 @@ ebsa110_timer_interrupt(int irq, void *dev_id) | |||
178 | { | 178 | { |
179 | u32 count; | 179 | u32 count; |
180 | 180 | ||
181 | write_seqlock(&xtime_lock); | ||
182 | |||
183 | /* latch and read timer 1 */ | 181 | /* latch and read timer 1 */ |
184 | __raw_writeb(0x40, PIT_CTRL); | 182 | __raw_writeb(0x40, PIT_CTRL); |
185 | count = __raw_readb(PIT_T1); | 183 | count = __raw_readb(PIT_T1); |
@@ -192,8 +190,6 @@ ebsa110_timer_interrupt(int irq, void *dev_id) | |||
192 | 190 | ||
193 | timer_tick(); | 191 | timer_tick(); |
194 | 192 | ||
195 | write_sequnlock(&xtime_lock); | ||
196 | |||
197 | return IRQ_HANDLED; | 193 | return IRQ_HANDLED; |
198 | } | 194 | } |
199 | 195 | ||
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 70b2c7801110..f1074ff02fdb 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c | |||
@@ -99,8 +99,6 @@ static unsigned int last_jiffy_time; | |||
99 | 99 | ||
100 | static int ep93xx_timer_interrupt(int irq, void *dev_id) | 100 | static int ep93xx_timer_interrupt(int irq, void *dev_id) |
101 | { | 101 | { |
102 | write_seqlock(&xtime_lock); | ||
103 | |||
104 | __raw_writel(1, EP93XX_TIMER1_CLEAR); | 102 | __raw_writel(1, EP93XX_TIMER1_CLEAR); |
105 | while ((signed long) | 103 | while ((signed long) |
106 | (__raw_readl(EP93XX_TIMER4_VALUE_LOW) - last_jiffy_time) | 104 | (__raw_readl(EP93XX_TIMER4_VALUE_LOW) - last_jiffy_time) |
@@ -109,8 +107,6 @@ static int ep93xx_timer_interrupt(int irq, void *dev_id) | |||
109 | timer_tick(); | 107 | timer_tick(); |
110 | } | 108 | } |
111 | 109 | ||
112 | write_sequnlock(&xtime_lock); | ||
113 | |||
114 | return IRQ_HANDLED; | 110 | return IRQ_HANDLED; |
115 | } | 111 | } |
116 | 112 | ||
diff --git a/arch/arm/mach-footbridge/dc21285-timer.c b/arch/arm/mach-footbridge/dc21285-timer.c index 3a63941d43be..b2a21189dd81 100644 --- a/arch/arm/mach-footbridge/dc21285-timer.c +++ b/arch/arm/mach-footbridge/dc21285-timer.c | |||
@@ -30,14 +30,10 @@ static unsigned long timer1_gettimeoffset (void) | |||
30 | static irqreturn_t | 30 | static irqreturn_t |
31 | timer1_interrupt(int irq, void *dev_id) | 31 | timer1_interrupt(int irq, void *dev_id) |
32 | { | 32 | { |
33 | write_seqlock(&xtime_lock); | ||
34 | |||
35 | *CSR_TIMER1_CLR = 0; | 33 | *CSR_TIMER1_CLR = 0; |
36 | 34 | ||
37 | timer_tick(); | 35 | timer_tick(); |
38 | 36 | ||
39 | write_sequnlock(&xtime_lock); | ||
40 | |||
41 | return IRQ_HANDLED; | 37 | return IRQ_HANDLED; |
42 | } | 38 | } |
43 | 39 | ||
diff --git a/arch/arm/mach-footbridge/isa-timer.c b/arch/arm/mach-footbridge/isa-timer.c index d08d64139d00..a764e01d3573 100644 --- a/arch/arm/mach-footbridge/isa-timer.c +++ b/arch/arm/mach-footbridge/isa-timer.c | |||
@@ -64,9 +64,7 @@ static unsigned long isa_gettimeoffset(void) | |||
64 | static irqreturn_t | 64 | static irqreturn_t |
65 | isa_timer_interrupt(int irq, void *dev_id) | 65 | isa_timer_interrupt(int irq, void *dev_id) |
66 | { | 66 | { |
67 | write_seqlock(&xtime_lock); | ||
68 | timer_tick(); | 67 | timer_tick(); |
69 | write_sequnlock(&xtime_lock); | ||
70 | return IRQ_HANDLED; | 68 | return IRQ_HANDLED; |
71 | } | 69 | } |
72 | 70 | ||
diff --git a/arch/arm/mach-h720x/cpu-h7201.c b/arch/arm/mach-h720x/cpu-h7201.c index 9107b8e2ad6e..c2a431f482f0 100644 --- a/arch/arm/mach-h720x/cpu-h7201.c +++ b/arch/arm/mach-h720x/cpu-h7201.c | |||
@@ -29,13 +29,9 @@ | |||
29 | static irqreturn_t | 29 | static irqreturn_t |
30 | h7201_timer_interrupt(int irq, void *dev_id) | 30 | h7201_timer_interrupt(int irq, void *dev_id) |
31 | { | 31 | { |
32 | write_seqlock(&xtime_lock); | ||
33 | |||
34 | CPU_REG (TIMER_VIRT, TIMER_TOPSTAT); | 32 | CPU_REG (TIMER_VIRT, TIMER_TOPSTAT); |
35 | timer_tick(); | 33 | timer_tick(); |
36 | 34 | ||
37 | write_sequnlock(&xtime_lock); | ||
38 | |||
39 | return IRQ_HANDLED; | 35 | return IRQ_HANDLED; |
40 | } | 36 | } |
41 | 37 | ||
diff --git a/arch/arm/mach-h720x/cpu-h7202.c b/arch/arm/mach-h720x/cpu-h7202.c index 0a1a25fb8ba8..c627fa124eb3 100644 --- a/arch/arm/mach-h720x/cpu-h7202.c +++ b/arch/arm/mach-h720x/cpu-h7202.c | |||
@@ -113,9 +113,7 @@ h7202_timerx_demux_handler(unsigned int irq_unused, struct irq_desc *desc) | |||
113 | mask = CPU_REG (TIMER_VIRT, TIMER_TOPSTAT); | 113 | mask = CPU_REG (TIMER_VIRT, TIMER_TOPSTAT); |
114 | 114 | ||
115 | if ( mask & TSTAT_T0INT ) { | 115 | if ( mask & TSTAT_T0INT ) { |
116 | write_seqlock(&xtime_lock); | ||
117 | timer_tick(); | 116 | timer_tick(); |
118 | write_sequnlock(&xtime_lock); | ||
119 | if( mask == TSTAT_T0INT ) | 117 | if( mask == TSTAT_T0INT ) |
120 | return; | 118 | return; |
121 | } | 119 | } |
diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index e9c82deb791d..7fbbc17f8e8b 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c | |||
@@ -250,8 +250,6 @@ unsigned long integrator_gettimeoffset(void) | |||
250 | static irqreturn_t | 250 | static irqreturn_t |
251 | integrator_timer_interrupt(int irq, void *dev_id) | 251 | integrator_timer_interrupt(int irq, void *dev_id) |
252 | { | 252 | { |
253 | write_seqlock(&xtime_lock); | ||
254 | |||
255 | /* | 253 | /* |
256 | * clear the interrupt | 254 | * clear the interrupt |
257 | */ | 255 | */ |
@@ -259,8 +257,6 @@ integrator_timer_interrupt(int irq, void *dev_id) | |||
259 | 257 | ||
260 | timer_tick(); | 258 | timer_tick(); |
261 | 259 | ||
262 | write_sequnlock(&xtime_lock); | ||
263 | |||
264 | return IRQ_HANDLED; | 260 | return IRQ_HANDLED; |
265 | } | 261 | } |
266 | 262 | ||
diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c index cb6ad211887a..81cdc8267206 100644 --- a/arch/arm/mach-ixp2000/core.c +++ b/arch/arm/mach-ixp2000/core.c | |||
@@ -206,8 +206,6 @@ unsigned long ixp2000_gettimeoffset (void) | |||
206 | 206 | ||
207 | static int ixp2000_timer_interrupt(int irq, void *dev_id) | 207 | static int ixp2000_timer_interrupt(int irq, void *dev_id) |
208 | { | 208 | { |
209 | write_seqlock(&xtime_lock); | ||
210 | |||
211 | /* clear timer 1 */ | 209 | /* clear timer 1 */ |
212 | ixp2000_reg_wrb(IXP2000_T1_CLR, 1); | 210 | ixp2000_reg_wrb(IXP2000_T1_CLR, 1); |
213 | 211 | ||
@@ -217,8 +215,6 @@ static int ixp2000_timer_interrupt(int irq, void *dev_id) | |||
217 | next_jiffy_time -= ticks_per_jiffy; | 215 | next_jiffy_time -= ticks_per_jiffy; |
218 | } | 216 | } |
219 | 217 | ||
220 | write_sequnlock(&xtime_lock); | ||
221 | |||
222 | return IRQ_HANDLED; | 218 | return IRQ_HANDLED; |
223 | } | 219 | } |
224 | 220 | ||
diff --git a/arch/arm/mach-ks8695/time.c b/arch/arm/mach-ks8695/time.c index d2c86e4a72eb..02f766b3121d 100644 --- a/arch/arm/mach-ks8695/time.c +++ b/arch/arm/mach-ks8695/time.c | |||
@@ -70,10 +70,7 @@ static unsigned long ks8695_gettimeoffset (void) | |||
70 | */ | 70 | */ |
71 | static irqreturn_t ks8695_timer_interrupt(int irq, void *dev_id) | 71 | static irqreturn_t ks8695_timer_interrupt(int irq, void *dev_id) |
72 | { | 72 | { |
73 | write_seqlock(&xtime_lock); | ||
74 | timer_tick(); | 73 | timer_tick(); |
75 | write_sequnlock(&xtime_lock); | ||
76 | |||
77 | return IRQ_HANDLED; | 74 | return IRQ_HANDLED; |
78 | } | 75 | } |
79 | 76 | ||
diff --git a/arch/arm/mach-lh7a40x/time.c b/arch/arm/mach-lh7a40x/time.c index c25316d02537..e50e60b33851 100644 --- a/arch/arm/mach-lh7a40x/time.c +++ b/arch/arm/mach-lh7a40x/time.c | |||
@@ -41,13 +41,9 @@ | |||
41 | static irqreturn_t | 41 | static irqreturn_t |
42 | lh7a40x_timer_interrupt(int irq, void *dev_id) | 42 | lh7a40x_timer_interrupt(int irq, void *dev_id) |
43 | { | 43 | { |
44 | write_seqlock(&xtime_lock); | ||
45 | |||
46 | TIMER_EOI = 0; | 44 | TIMER_EOI = 0; |
47 | timer_tick(); | 45 | timer_tick(); |
48 | 46 | ||
49 | write_sequnlock(&xtime_lock); | ||
50 | |||
51 | return IRQ_HANDLED; | 47 | return IRQ_HANDLED; |
52 | } | 48 | } |
53 | 49 | ||
diff --git a/arch/arm/mach-mx3/time.c b/arch/arm/mach-mx3/time.c index e81fb5c5d7c3..fb565c98dbfb 100644 --- a/arch/arm/mach-mx3/time.c +++ b/arch/arm/mach-mx3/time.c | |||
@@ -45,8 +45,6 @@ static irqreturn_t mxc_timer_interrupt(int irq, void *dev_id) | |||
45 | { | 45 | { |
46 | unsigned int next_match; | 46 | unsigned int next_match; |
47 | 47 | ||
48 | write_seqlock(&xtime_lock); | ||
49 | |||
50 | if (__raw_readl(MXC_GPT_GPTSR) & GPTSR_OF1) { | 48 | if (__raw_readl(MXC_GPT_GPTSR) & GPTSR_OF1) { |
51 | do { | 49 | do { |
52 | timer_tick(); | 50 | timer_tick(); |
@@ -57,8 +55,6 @@ static irqreturn_t mxc_timer_interrupt(int irq, void *dev_id) | |||
57 | __raw_readl(MXC_GPT_GPTCNT)) <= 0); | 55 | __raw_readl(MXC_GPT_GPTCNT)) <= 0); |
58 | } | 56 | } |
59 | 57 | ||
60 | write_sequnlock(&xtime_lock); | ||
61 | |||
62 | return IRQ_HANDLED; | 58 | return IRQ_HANDLED; |
63 | } | 59 | } |
64 | 60 | ||
diff --git a/arch/arm/mach-netx/time.c b/arch/arm/mach-netx/time.c index 4762e207b0bf..ea07b54afa59 100644 --- a/arch/arm/mach-netx/time.c +++ b/arch/arm/mach-netx/time.c | |||
@@ -33,12 +33,8 @@ | |||
33 | static irqreturn_t | 33 | static irqreturn_t |
34 | netx_timer_interrupt(int irq, void *dev_id) | 34 | netx_timer_interrupt(int irq, void *dev_id) |
35 | { | 35 | { |
36 | write_seqlock(&xtime_lock); | ||
37 | |||
38 | timer_tick(); | 36 | timer_tick(); |
39 | 37 | ||
40 | write_sequnlock(&xtime_lock); | ||
41 | |||
42 | /* acknowledge interrupt */ | 38 | /* acknowledge interrupt */ |
43 | writel(COUNTER_BIT(0), NETX_GPIO_IRQ); | 39 | writel(COUNTER_BIT(0), NETX_GPIO_IRQ); |
44 | 40 | ||
diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c index 8d322c20ccae..3234deedb946 100644 --- a/arch/arm/mach-omap2/timer-gp.c +++ b/arch/arm/mach-omap2/timer-gp.c | |||
@@ -40,13 +40,9 @@ static inline void omap2_gp_timer_start(unsigned long load_val) | |||
40 | 40 | ||
41 | static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id) | 41 | static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id) |
42 | { | 42 | { |
43 | write_seqlock(&xtime_lock); | ||
44 | |||
45 | omap_dm_timer_write_status(gptimer, OMAP_TIMER_INT_OVERFLOW); | 43 | omap_dm_timer_write_status(gptimer, OMAP_TIMER_INT_OVERFLOW); |
46 | timer_tick(); | 44 | timer_tick(); |
47 | 45 | ||
48 | write_sequnlock(&xtime_lock); | ||
49 | |||
50 | return IRQ_HANDLED; | 46 | return IRQ_HANDLED; |
51 | } | 47 | } |
52 | 48 | ||
diff --git a/arch/arm/mach-pnx4008/time.c b/arch/arm/mach-pnx4008/time.c index 67e05f005a6b..6d4ca8fc0cb4 100644 --- a/arch/arm/mach-pnx4008/time.c +++ b/arch/arm/mach-pnx4008/time.c | |||
@@ -51,8 +51,6 @@ static irqreturn_t pnx4008_timer_interrupt(int irq, void *dev_id) | |||
51 | { | 51 | { |
52 | if (__raw_readl(HSTIM_INT) & MATCH0_INT) { | 52 | if (__raw_readl(HSTIM_INT) & MATCH0_INT) { |
53 | 53 | ||
54 | write_seqlock(&xtime_lock); | ||
55 | |||
56 | do { | 54 | do { |
57 | timer_tick(); | 55 | timer_tick(); |
58 | 56 | ||
@@ -73,8 +71,6 @@ static irqreturn_t pnx4008_timer_interrupt(int irq, void *dev_id) | |||
73 | } while ((signed) | 71 | } while ((signed) |
74 | (__raw_readl(HSTIM_MATCH0) - | 72 | (__raw_readl(HSTIM_MATCH0) - |
75 | __raw_readl(HSTIM_COUNTER)) < 0); | 73 | __raw_readl(HSTIM_COUNTER)) < 0); |
76 | |||
77 | write_sequnlock(&xtime_lock); | ||
78 | } | 74 | } |
79 | 75 | ||
80 | return IRQ_HANDLED; | 76 | return IRQ_HANDLED; |
diff --git a/arch/arm/mach-realview/core.c b/arch/arm/mach-realview/core.c index c7f1b44da40d..61d70218f1e8 100644 --- a/arch/arm/mach-realview/core.c +++ b/arch/arm/mach-realview/core.c | |||
@@ -530,8 +530,6 @@ static unsigned long realview_gettimeoffset(void) | |||
530 | */ | 530 | */ |
531 | static irqreturn_t realview_timer_interrupt(int irq, void *dev_id) | 531 | static irqreturn_t realview_timer_interrupt(int irq, void *dev_id) |
532 | { | 532 | { |
533 | write_seqlock(&xtime_lock); | ||
534 | |||
535 | // ...clear the interrupt | 533 | // ...clear the interrupt |
536 | writel(1, TIMER0_VA_BASE + TIMER_INTCLR); | 534 | writel(1, TIMER0_VA_BASE + TIMER_INTCLR); |
537 | 535 | ||
@@ -542,8 +540,6 @@ static irqreturn_t realview_timer_interrupt(int irq, void *dev_id) | |||
542 | update_process_times(user_mode(get_irq_regs())); | 540 | update_process_times(user_mode(get_irq_regs())); |
543 | #endif | 541 | #endif |
544 | 542 | ||
545 | write_sequnlock(&xtime_lock); | ||
546 | |||
547 | return IRQ_HANDLED; | 543 | return IRQ_HANDLED; |
548 | } | 544 | } |
549 | 545 | ||
diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c index fdf7b016e7ad..47f8640438e6 100644 --- a/arch/arm/mach-sa1100/time.c +++ b/arch/arm/mach-sa1100/time.c | |||
@@ -62,8 +62,6 @@ sa1100_timer_interrupt(int irq, void *dev_id) | |||
62 | { | 62 | { |
63 | unsigned int next_match; | 63 | unsigned int next_match; |
64 | 64 | ||
65 | write_seqlock(&xtime_lock); | ||
66 | |||
67 | #ifdef CONFIG_NO_IDLE_HZ | 65 | #ifdef CONFIG_NO_IDLE_HZ |
68 | if (match_posponed) { | 66 | if (match_posponed) { |
69 | match_posponed = 0; | 67 | match_posponed = 0; |
@@ -85,8 +83,6 @@ sa1100_timer_interrupt(int irq, void *dev_id) | |||
85 | next_match = (OSMR0 += LATCH); | 83 | next_match = (OSMR0 += LATCH); |
86 | } while ((signed long)(next_match - OSCR) <= 0); | 84 | } while ((signed long)(next_match - OSCR) <= 0); |
87 | 85 | ||
88 | write_sequnlock(&xtime_lock); | ||
89 | |||
90 | return IRQ_HANDLED; | 86 | return IRQ_HANDLED; |
91 | } | 87 | } |
92 | 88 | ||
diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c index a0545db2a34f..09d9f33d4072 100644 --- a/arch/arm/mach-shark/core.c +++ b/arch/arm/mach-shark/core.c | |||
@@ -82,9 +82,7 @@ static void __init shark_map_io(void) | |||
82 | static irqreturn_t | 82 | static irqreturn_t |
83 | shark_timer_interrupt(int irq, void *dev_id) | 83 | shark_timer_interrupt(int irq, void *dev_id) |
84 | { | 84 | { |
85 | write_seqlock(&xtime_lock); | ||
86 | timer_tick(); | 85 | timer_tick(); |
87 | write_sequnlock(&xtime_lock); | ||
88 | return IRQ_HANDLED; | 86 | return IRQ_HANDLED; |
89 | } | 87 | } |
90 | 88 | ||