diff options
50 files changed, 55 insertions, 275 deletions
diff --git a/arch/alpha/include/asm/thread_info.h b/arch/alpha/include/asm/thread_info.h index 52cd2a4a3ff4..453597b91f3a 100644 --- a/arch/alpha/include/asm/thread_info.h +++ b/arch/alpha/include/asm/thread_info.h | |||
@@ -58,8 +58,6 @@ register struct thread_info *__current_thread_info __asm__("$8"); | |||
58 | #define THREAD_SIZE_ORDER 1 | 58 | #define THREAD_SIZE_ORDER 1 |
59 | #define THREAD_SIZE (2*PAGE_SIZE) | 59 | #define THREAD_SIZE (2*PAGE_SIZE) |
60 | 60 | ||
61 | #define PREEMPT_ACTIVE 0x40000000 | ||
62 | |||
63 | /* | 61 | /* |
64 | * Thread information flags: | 62 | * Thread information flags: |
65 | * - these are process state flags and used from assembly | 63 | * - these are process state flags and used from assembly |
diff --git a/arch/arc/include/asm/thread_info.h b/arch/arc/include/asm/thread_info.h index 2d50a4cdd7f3..45be21672011 100644 --- a/arch/arc/include/asm/thread_info.h +++ b/arch/arc/include/asm/thread_info.h | |||
@@ -80,8 +80,6 @@ static inline __attribute_const__ struct thread_info *current_thread_info(void) | |||
80 | 80 | ||
81 | #endif /* !__ASSEMBLY__ */ | 81 | #endif /* !__ASSEMBLY__ */ |
82 | 82 | ||
83 | #define PREEMPT_ACTIVE 0x10000000 | ||
84 | |||
85 | /* | 83 | /* |
86 | * thread information flags | 84 | * thread information flags |
87 | * - these are process state flags that various assembly files may need to | 85 | * - these are process state flags that various assembly files may need to |
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h index df5e13d64f2c..71a06b293489 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h | |||
@@ -141,12 +141,6 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, | |||
141 | #endif | 141 | #endif |
142 | 142 | ||
143 | /* | 143 | /* |
144 | * We use bit 30 of the preempt_count to indicate that kernel | ||
145 | * preemption is occurring. See <asm/hardirq.h>. | ||
146 | */ | ||
147 | #define PREEMPT_ACTIVE 0x40000000 | ||
148 | |||
149 | /* | ||
150 | * thread information flags: | 144 | * thread information flags: |
151 | * TIF_SYSCALL_TRACE - syscall trace active | 145 | * TIF_SYSCALL_TRACE - syscall trace active |
152 | * TIF_SYSCAL_AUDIT - syscall auditing active | 146 | * TIF_SYSCAL_AUDIT - syscall auditing active |
diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index 23a3c4791d86..720e70b66ffd 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h | |||
@@ -89,12 +89,6 @@ static inline struct thread_info *current_thread_info(void) | |||
89 | #endif | 89 | #endif |
90 | 90 | ||
91 | /* | 91 | /* |
92 | * We use bit 30 of the preempt_count to indicate that kernel | ||
93 | * preemption is occurring. See <asm/hardirq.h>. | ||
94 | */ | ||
95 | #define PREEMPT_ACTIVE 0x40000000 | ||
96 | |||
97 | /* | ||
98 | * thread information flags: | 92 | * thread information flags: |
99 | * TIF_SYSCALL_TRACE - syscall trace active | 93 | * TIF_SYSCALL_TRACE - syscall trace active |
100 | * TIF_SIGPENDING - signal pending | 94 | * TIF_SIGPENDING - signal pending |
diff --git a/arch/avr32/include/asm/thread_info.h b/arch/avr32/include/asm/thread_info.h index 6dc62e1f94c7..a978f3fe7c25 100644 --- a/arch/avr32/include/asm/thread_info.h +++ b/arch/avr32/include/asm/thread_info.h | |||
@@ -66,8 +66,6 @@ static inline struct thread_info *current_thread_info(void) | |||
66 | 66 | ||
67 | #endif /* !__ASSEMBLY__ */ | 67 | #endif /* !__ASSEMBLY__ */ |
68 | 68 | ||
69 | #define PREEMPT_ACTIVE 0x40000000 | ||
70 | |||
71 | /* | 69 | /* |
72 | * Thread information flags | 70 | * Thread information flags |
73 | * - these are process state flags that various assembly files may need to access | 71 | * - these are process state flags that various assembly files may need to access |
diff --git a/arch/blackfin/include/asm/hardirq.h b/arch/blackfin/include/asm/hardirq.h index c078dd78d998..58b54a6d5a16 100644 --- a/arch/blackfin/include/asm/hardirq.h +++ b/arch/blackfin/include/asm/hardirq.h | |||
@@ -12,9 +12,6 @@ | |||
12 | extern void ack_bad_irq(unsigned int irq); | 12 | extern void ack_bad_irq(unsigned int irq); |
13 | #define ack_bad_irq ack_bad_irq | 13 | #define ack_bad_irq ack_bad_irq |
14 | 14 | ||
15 | /* Define until common code gets sane defaults */ | ||
16 | #define HARDIRQ_BITS 9 | ||
17 | |||
18 | #include <asm-generic/hardirq.h> | 15 | #include <asm-generic/hardirq.h> |
19 | 16 | ||
20 | #endif | 17 | #endif |
diff --git a/arch/blackfin/include/asm/thread_info.h b/arch/blackfin/include/asm/thread_info.h index 3894005337ba..55f473bdad36 100644 --- a/arch/blackfin/include/asm/thread_info.h +++ b/arch/blackfin/include/asm/thread_info.h | |||
@@ -88,8 +88,6 @@ static inline struct thread_info *current_thread_info(void) | |||
88 | #define TI_CPU 12 | 88 | #define TI_CPU 12 |
89 | #define TI_PREEMPT 16 | 89 | #define TI_PREEMPT 16 |
90 | 90 | ||
91 | #define PREEMPT_ACTIVE 0x4000000 | ||
92 | |||
93 | /* | 91 | /* |
94 | * thread information flag bit numbers | 92 | * thread information flag bit numbers |
95 | */ | 93 | */ |
diff --git a/arch/c6x/include/asm/thread_info.h b/arch/c6x/include/asm/thread_info.h index 4c8dc562bd90..d4e9ef87076d 100644 --- a/arch/c6x/include/asm/thread_info.h +++ b/arch/c6x/include/asm/thread_info.h | |||
@@ -84,8 +84,6 @@ struct thread_info *current_thread_info(void) | |||
84 | #define put_thread_info(ti) put_task_struct((ti)->task) | 84 | #define put_thread_info(ti) put_task_struct((ti)->task) |
85 | #endif /* __ASSEMBLY__ */ | 85 | #endif /* __ASSEMBLY__ */ |
86 | 86 | ||
87 | #define PREEMPT_ACTIVE 0x10000000 | ||
88 | |||
89 | /* | 87 | /* |
90 | * thread information flag bit numbers | 88 | * thread information flag bit numbers |
91 | * - pending work-to-be-done flags are in LSW | 89 | * - pending work-to-be-done flags are in LSW |
diff --git a/arch/cris/include/asm/hardirq.h b/arch/cris/include/asm/hardirq.h index 17bb12d760b2..04126f7bfab2 100644 --- a/arch/cris/include/asm/hardirq.h +++ b/arch/cris/include/asm/hardirq.h | |||
@@ -2,18 +2,6 @@ | |||
2 | #define __ASM_HARDIRQ_H | 2 | #define __ASM_HARDIRQ_H |
3 | 3 | ||
4 | #include <asm/irq.h> | 4 | #include <asm/irq.h> |
5 | |||
6 | #define HARDIRQ_BITS 8 | ||
7 | |||
8 | /* | ||
9 | * The hardirq mask has to be large enough to have | ||
10 | * space for potentially all IRQ sources in the system | ||
11 | * nesting on a single CPU: | ||
12 | */ | ||
13 | #if (1 << HARDIRQ_BITS) < NR_IRQS | ||
14 | # error HARDIRQ_BITS is too low! | ||
15 | #endif | ||
16 | |||
17 | #include <asm-generic/hardirq.h> | 5 | #include <asm-generic/hardirq.h> |
18 | 6 | ||
19 | #endif /* __ASM_HARDIRQ_H */ | 7 | #endif /* __ASM_HARDIRQ_H */ |
diff --git a/arch/cris/include/asm/thread_info.h b/arch/cris/include/asm/thread_info.h index 07c8c40c52b3..55dede18c032 100644 --- a/arch/cris/include/asm/thread_info.h +++ b/arch/cris/include/asm/thread_info.h | |||
@@ -44,8 +44,6 @@ struct thread_info { | |||
44 | 44 | ||
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | #define PREEMPT_ACTIVE 0x10000000 | ||
48 | |||
49 | /* | 47 | /* |
50 | * macros/functions for gaining access to the thread information structure | 48 | * macros/functions for gaining access to the thread information structure |
51 | */ | 49 | */ |
diff --git a/arch/frv/include/asm/thread_info.h b/arch/frv/include/asm/thread_info.h index bebd7eadc772..af29e17c0181 100644 --- a/arch/frv/include/asm/thread_info.h +++ b/arch/frv/include/asm/thread_info.h | |||
@@ -52,8 +52,6 @@ struct thread_info { | |||
52 | 52 | ||
53 | #endif | 53 | #endif |
54 | 54 | ||
55 | #define PREEMPT_ACTIVE 0x10000000 | ||
56 | |||
57 | /* | 55 | /* |
58 | * macros/functions for gaining access to the thread information structure | 56 | * macros/functions for gaining access to the thread information structure |
59 | */ | 57 | */ |
diff --git a/arch/hexagon/include/asm/thread_info.h b/arch/hexagon/include/asm/thread_info.h index f7c32406a711..a59dad3b3695 100644 --- a/arch/hexagon/include/asm/thread_info.h +++ b/arch/hexagon/include/asm/thread_info.h | |||
@@ -73,10 +73,6 @@ struct thread_info { | |||
73 | 73 | ||
74 | #endif /* __ASSEMBLY__ */ | 74 | #endif /* __ASSEMBLY__ */ |
75 | 75 | ||
76 | /* looks like "linux/hardirq.h" uses this. */ | ||
77 | |||
78 | #define PREEMPT_ACTIVE 0x10000000 | ||
79 | |||
80 | #ifndef __ASSEMBLY__ | 76 | #ifndef __ASSEMBLY__ |
81 | 77 | ||
82 | #define INIT_THREAD_INFO(tsk) \ | 78 | #define INIT_THREAD_INFO(tsk) \ |
diff --git a/arch/ia64/include/asm/thread_info.h b/arch/ia64/include/asm/thread_info.h index cade13dd0299..5957cf61f898 100644 --- a/arch/ia64/include/asm/thread_info.h +++ b/arch/ia64/include/asm/thread_info.h | |||
@@ -11,9 +11,6 @@ | |||
11 | #include <asm/processor.h> | 11 | #include <asm/processor.h> |
12 | #include <asm/ptrace.h> | 12 | #include <asm/ptrace.h> |
13 | 13 | ||
14 | #define PREEMPT_ACTIVE_BIT 30 | ||
15 | #define PREEMPT_ACTIVE (1 << PREEMPT_ACTIVE_BIT) | ||
16 | |||
17 | #ifndef __ASSEMBLY__ | 14 | #ifndef __ASSEMBLY__ |
18 | 15 | ||
19 | /* | 16 | /* |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 7a53530f22c2..ddea607f948a 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -1169,21 +1169,8 @@ skip_rbs_switch: | |||
1169 | .work_pending: | 1169 | .work_pending: |
1170 | tbit.z p6,p0=r31,TIF_NEED_RESCHED // is resched not needed? | 1170 | tbit.z p6,p0=r31,TIF_NEED_RESCHED // is resched not needed? |
1171 | (p6) br.cond.sptk.few .notify | 1171 | (p6) br.cond.sptk.few .notify |
1172 | #ifdef CONFIG_PREEMPT | 1172 | br.call.spnt.many rp=preempt_schedule_irq |
1173 | (pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1 | ||
1174 | ;; | ||
1175 | (pKStk) st4 [r20]=r21 | ||
1176 | #endif | ||
1177 | SSM_PSR_I(p0, p6, r2) // enable interrupts | ||
1178 | br.call.spnt.many rp=schedule | ||
1179 | .ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 (re-check) | 1173 | .ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 (re-check) |
1180 | RSM_PSR_I(p0, r2, r20) // disable interrupts | ||
1181 | ;; | ||
1182 | #ifdef CONFIG_PREEMPT | ||
1183 | (pKStk) adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13 | ||
1184 | ;; | ||
1185 | (pKStk) st4 [r20]=r0 // preempt_count() <- 0 | ||
1186 | #endif | ||
1187 | (pLvSys)br.cond.sptk.few __paravirt_pending_syscall_end | 1174 | (pLvSys)br.cond.sptk.few __paravirt_pending_syscall_end |
1188 | br.cond.sptk.many .work_processed_kernel | 1175 | br.cond.sptk.many .work_processed_kernel |
1189 | 1176 | ||
diff --git a/arch/m32r/include/asm/hardirq.h b/arch/m32r/include/asm/hardirq.h index 4c31c0ae215e..5f2ac4f64ddf 100644 --- a/arch/m32r/include/asm/hardirq.h +++ b/arch/m32r/include/asm/hardirq.h | |||
@@ -3,22 +3,6 @@ | |||
3 | #define __ASM_HARDIRQ_H | 3 | #define __ASM_HARDIRQ_H |
4 | 4 | ||
5 | #include <asm/irq.h> | 5 | #include <asm/irq.h> |
6 | |||
7 | #if NR_IRQS > 256 | ||
8 | #define HARDIRQ_BITS 9 | ||
9 | #else | ||
10 | #define HARDIRQ_BITS 8 | ||
11 | #endif | ||
12 | |||
13 | /* | ||
14 | * The hardirq mask has to be large enough to have | ||
15 | * space for potentially all IRQ sources in the system | ||
16 | * nesting on a single CPU: | ||
17 | */ | ||
18 | #if (1 << HARDIRQ_BITS) < NR_IRQS | ||
19 | # error HARDIRQ_BITS is too low! | ||
20 | #endif | ||
21 | |||
22 | #include <asm-generic/hardirq.h> | 6 | #include <asm-generic/hardirq.h> |
23 | 7 | ||
24 | #endif /* __ASM_HARDIRQ_H */ | 8 | #endif /* __ASM_HARDIRQ_H */ |
diff --git a/arch/m32r/include/asm/thread_info.h b/arch/m32r/include/asm/thread_info.h index c074f4c2e858..00171703402f 100644 --- a/arch/m32r/include/asm/thread_info.h +++ b/arch/m32r/include/asm/thread_info.h | |||
@@ -53,8 +53,6 @@ struct thread_info { | |||
53 | 53 | ||
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | #define PREEMPT_ACTIVE 0x10000000 | ||
57 | |||
58 | #define THREAD_SIZE (PAGE_SIZE << 1) | 56 | #define THREAD_SIZE (PAGE_SIZE << 1) |
59 | #define THREAD_SIZE_ORDER 1 | 57 | #define THREAD_SIZE_ORDER 1 |
60 | /* | 58 | /* |
diff --git a/arch/m32r/kernel/entry.S b/arch/m32r/kernel/entry.S index 0c01543f10cd..7c3db9940ce1 100644 --- a/arch/m32r/kernel/entry.S +++ b/arch/m32r/kernel/entry.S | |||
@@ -182,13 +182,7 @@ need_resched: | |||
182 | ld r4, PSW(sp) ; interrupts off (exception path) ? | 182 | ld r4, PSW(sp) ; interrupts off (exception path) ? |
183 | and3 r4, r4, #0x4000 | 183 | and3 r4, r4, #0x4000 |
184 | beqz r4, restore_all | 184 | beqz r4, restore_all |
185 | LDIMM (r4, PREEMPT_ACTIVE) | 185 | bl preempt_schedule_irq |
186 | st r4, @(TI_PRE_COUNT, r8) | ||
187 | ENABLE_INTERRUPTS(r4) | ||
188 | bl schedule | ||
189 | ldi r4, #0 | ||
190 | st r4, @(TI_PRE_COUNT, r8) | ||
191 | DISABLE_INTERRUPTS(r4) | ||
192 | bra need_resched | 186 | bra need_resched |
193 | #endif | 187 | #endif |
194 | 188 | ||
diff --git a/arch/m68k/include/asm/hardirq.h b/arch/m68k/include/asm/hardirq.h index db30ed276878..6c618529d9b9 100644 --- a/arch/m68k/include/asm/hardirq.h +++ b/arch/m68k/include/asm/hardirq.h | |||
@@ -5,17 +5,6 @@ | |||
5 | #include <linux/cache.h> | 5 | #include <linux/cache.h> |
6 | #include <asm/irq.h> | 6 | #include <asm/irq.h> |
7 | 7 | ||
8 | #define HARDIRQ_BITS 8 | ||
9 | |||
10 | /* | ||
11 | * The hardirq mask has to be large enough to have | ||
12 | * space for potentially all IRQ sources in the system | ||
13 | * nesting on a single CPU: | ||
14 | */ | ||
15 | #if (1 << HARDIRQ_BITS) < NR_IRQS | ||
16 | # error HARDIRQ_BITS is too low! | ||
17 | #endif | ||
18 | |||
19 | #ifdef CONFIG_MMU | 8 | #ifdef CONFIG_MMU |
20 | 9 | ||
21 | static inline void ack_bad_irq(unsigned int irq) | 10 | static inline void ack_bad_irq(unsigned int irq) |
diff --git a/arch/m68k/include/asm/thread_info.h b/arch/m68k/include/asm/thread_info.h index 126131f94a2c..21a4784ca5a1 100644 --- a/arch/m68k/include/asm/thread_info.h +++ b/arch/m68k/include/asm/thread_info.h | |||
@@ -35,8 +35,6 @@ struct thread_info { | |||
35 | }; | 35 | }; |
36 | #endif /* __ASSEMBLY__ */ | 36 | #endif /* __ASSEMBLY__ */ |
37 | 37 | ||
38 | #define PREEMPT_ACTIVE 0x4000000 | ||
39 | |||
40 | #define INIT_THREAD_INFO(tsk) \ | 38 | #define INIT_THREAD_INFO(tsk) \ |
41 | { \ | 39 | { \ |
42 | .task = &tsk, \ | 40 | .task = &tsk, \ |
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S index a78f5649e8de..b54ac7aba850 100644 --- a/arch/m68k/kernel/entry.S +++ b/arch/m68k/kernel/entry.S | |||
@@ -45,7 +45,7 @@ | |||
45 | .globl system_call, buserr, trap, resume | 45 | .globl system_call, buserr, trap, resume |
46 | .globl sys_call_table | 46 | .globl sys_call_table |
47 | .globl __sys_fork, __sys_clone, __sys_vfork | 47 | .globl __sys_fork, __sys_clone, __sys_vfork |
48 | .globl ret_from_interrupt, bad_interrupt | 48 | .globl bad_interrupt |
49 | .globl auto_irqhandler_fixup | 49 | .globl auto_irqhandler_fixup |
50 | .globl user_irqvec_fixup | 50 | .globl user_irqvec_fixup |
51 | 51 | ||
@@ -275,8 +275,6 @@ do_delayed_trace: | |||
275 | ENTRY(auto_inthandler) | 275 | ENTRY(auto_inthandler) |
276 | SAVE_ALL_INT | 276 | SAVE_ALL_INT |
277 | GET_CURRENT(%d0) | 277 | GET_CURRENT(%d0) |
278 | movel %d0,%a1 | ||
279 | addqb #1,%a1@(TINFO_PREEMPT+1) | ||
280 | | put exception # in d0 | 278 | | put exception # in d0 |
281 | bfextu %sp@(PT_OFF_FORMATVEC){#4,#10},%d0 | 279 | bfextu %sp@(PT_OFF_FORMATVEC){#4,#10},%d0 |
282 | subw #VEC_SPUR,%d0 | 280 | subw #VEC_SPUR,%d0 |
@@ -286,32 +284,13 @@ ENTRY(auto_inthandler) | |||
286 | auto_irqhandler_fixup = . + 2 | 284 | auto_irqhandler_fixup = . + 2 |
287 | jsr do_IRQ | process the IRQ | 285 | jsr do_IRQ | process the IRQ |
288 | addql #8,%sp | pop parameters off stack | 286 | addql #8,%sp | pop parameters off stack |
289 | 287 | jra ret_from_exception | |
290 | ret_from_interrupt: | ||
291 | movel %curptr@(TASK_STACK),%a1 | ||
292 | subqb #1,%a1@(TINFO_PREEMPT+1) | ||
293 | jeq ret_from_last_interrupt | ||
294 | 2: RESTORE_ALL | ||
295 | |||
296 | ALIGN | ||
297 | ret_from_last_interrupt: | ||
298 | moveq #(~ALLOWINT>>8)&0xff,%d0 | ||
299 | andb %sp@(PT_OFF_SR),%d0 | ||
300 | jne 2b | ||
301 | |||
302 | /* check if we need to do software interrupts */ | ||
303 | tstl irq_stat+CPUSTAT_SOFTIRQ_PENDING | ||
304 | jeq .Lret_from_exception | ||
305 | pea ret_from_exception | ||
306 | jra do_softirq | ||
307 | 288 | ||
308 | /* Handler for user defined interrupt vectors */ | 289 | /* Handler for user defined interrupt vectors */ |
309 | 290 | ||
310 | ENTRY(user_inthandler) | 291 | ENTRY(user_inthandler) |
311 | SAVE_ALL_INT | 292 | SAVE_ALL_INT |
312 | GET_CURRENT(%d0) | 293 | GET_CURRENT(%d0) |
313 | movel %d0,%a1 | ||
314 | addqb #1,%a1@(TINFO_PREEMPT+1) | ||
315 | | put exception # in d0 | 294 | | put exception # in d0 |
316 | bfextu %sp@(PT_OFF_FORMATVEC){#4,#10},%d0 | 295 | bfextu %sp@(PT_OFF_FORMATVEC){#4,#10},%d0 |
317 | user_irqvec_fixup = . + 2 | 296 | user_irqvec_fixup = . + 2 |
@@ -321,29 +300,18 @@ user_irqvec_fixup = . + 2 | |||
321 | movel %d0,%sp@- | put vector # on stack | 300 | movel %d0,%sp@- | put vector # on stack |
322 | jsr do_IRQ | process the IRQ | 301 | jsr do_IRQ | process the IRQ |
323 | addql #8,%sp | pop parameters off stack | 302 | addql #8,%sp | pop parameters off stack |
324 | 303 | jra ret_from_exception | |
325 | movel %curptr@(TASK_STACK),%a1 | ||
326 | subqb #1,%a1@(TINFO_PREEMPT+1) | ||
327 | jeq ret_from_last_interrupt | ||
328 | RESTORE_ALL | ||
329 | 304 | ||
330 | /* Handler for uninitialized and spurious interrupts */ | 305 | /* Handler for uninitialized and spurious interrupts */ |
331 | 306 | ||
332 | ENTRY(bad_inthandler) | 307 | ENTRY(bad_inthandler) |
333 | SAVE_ALL_INT | 308 | SAVE_ALL_INT |
334 | GET_CURRENT(%d0) | 309 | GET_CURRENT(%d0) |
335 | movel %d0,%a1 | ||
336 | addqb #1,%a1@(TINFO_PREEMPT+1) | ||
337 | 310 | ||
338 | movel %sp,%sp@- | 311 | movel %sp,%sp@- |
339 | jsr handle_badint | 312 | jsr handle_badint |
340 | addql #4,%sp | 313 | addql #4,%sp |
341 | 314 | jra ret_from_exception | |
342 | movel %curptr@(TASK_STACK),%a1 | ||
343 | subqb #1,%a1@(TINFO_PREEMPT+1) | ||
344 | jeq ret_from_last_interrupt | ||
345 | RESTORE_ALL | ||
346 | |||
347 | 315 | ||
348 | resume: | 316 | resume: |
349 | /* | 317 | /* |
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c index 4d7da384eea0..077d3a70fed1 100644 --- a/arch/m68k/kernel/ints.c +++ b/arch/m68k/kernel/ints.c | |||
@@ -58,12 +58,6 @@ void __init init_IRQ(void) | |||
58 | { | 58 | { |
59 | int i; | 59 | int i; |
60 | 60 | ||
61 | /* assembly irq entry code relies on this... */ | ||
62 | if (HARDIRQ_MASK != 0x00ff0000) { | ||
63 | extern void hardirq_mask_is_broken(void); | ||
64 | hardirq_mask_is_broken(); | ||
65 | } | ||
66 | |||
67 | for (i = IRQ_AUTO_1; i <= IRQ_AUTO_7; i++) | 61 | for (i = IRQ_AUTO_1; i <= IRQ_AUTO_7; i++) |
68 | irq_set_chip_and_handler(i, &auto_irq_chip, handle_simple_irq); | 62 | irq_set_chip_and_handler(i, &auto_irq_chip, handle_simple_irq); |
69 | 63 | ||
diff --git a/arch/m68k/platform/68000/entry.S b/arch/m68k/platform/68000/entry.S index 7f91c2fde509..23ac054c6e1a 100644 --- a/arch/m68k/platform/68000/entry.S +++ b/arch/m68k/platform/68000/entry.S | |||
@@ -27,7 +27,6 @@ | |||
27 | .globl ret_from_exception | 27 | .globl ret_from_exception |
28 | .globl ret_from_signal | 28 | .globl ret_from_signal |
29 | .globl sys_call_table | 29 | .globl sys_call_table |
30 | .globl ret_from_interrupt | ||
31 | .globl bad_interrupt | 30 | .globl bad_interrupt |
32 | .globl inthandler1 | 31 | .globl inthandler1 |
33 | .globl inthandler2 | 32 | .globl inthandler2 |
@@ -137,7 +136,7 @@ inthandler1: | |||
137 | movel #65,%sp@- /* put vector # on stack*/ | 136 | movel #65,%sp@- /* put vector # on stack*/ |
138 | jbsr process_int /* process the IRQ*/ | 137 | jbsr process_int /* process the IRQ*/ |
139 | 3: addql #8,%sp /* pop parameters off stack*/ | 138 | 3: addql #8,%sp /* pop parameters off stack*/ |
140 | bra ret_from_interrupt | 139 | bra ret_from_exception |
141 | 140 | ||
142 | inthandler2: | 141 | inthandler2: |
143 | SAVE_ALL_INT | 142 | SAVE_ALL_INT |
@@ -148,7 +147,7 @@ inthandler2: | |||
148 | movel #66,%sp@- /* put vector # on stack*/ | 147 | movel #66,%sp@- /* put vector # on stack*/ |
149 | jbsr process_int /* process the IRQ*/ | 148 | jbsr process_int /* process the IRQ*/ |
150 | 3: addql #8,%sp /* pop parameters off stack*/ | 149 | 3: addql #8,%sp /* pop parameters off stack*/ |
151 | bra ret_from_interrupt | 150 | bra ret_from_exception |
152 | 151 | ||
153 | inthandler3: | 152 | inthandler3: |
154 | SAVE_ALL_INT | 153 | SAVE_ALL_INT |
@@ -159,7 +158,7 @@ inthandler3: | |||
159 | movel #67,%sp@- /* put vector # on stack*/ | 158 | movel #67,%sp@- /* put vector # on stack*/ |
160 | jbsr process_int /* process the IRQ*/ | 159 | jbsr process_int /* process the IRQ*/ |
161 | 3: addql #8,%sp /* pop parameters off stack*/ | 160 | 3: addql #8,%sp /* pop parameters off stack*/ |
162 | bra ret_from_interrupt | 161 | bra ret_from_exception |
163 | 162 | ||
164 | inthandler4: | 163 | inthandler4: |
165 | SAVE_ALL_INT | 164 | SAVE_ALL_INT |
@@ -170,7 +169,7 @@ inthandler4: | |||
170 | movel #68,%sp@- /* put vector # on stack*/ | 169 | movel #68,%sp@- /* put vector # on stack*/ |
171 | jbsr process_int /* process the IRQ*/ | 170 | jbsr process_int /* process the IRQ*/ |
172 | 3: addql #8,%sp /* pop parameters off stack*/ | 171 | 3: addql #8,%sp /* pop parameters off stack*/ |
173 | bra ret_from_interrupt | 172 | bra ret_from_exception |
174 | 173 | ||
175 | inthandler5: | 174 | inthandler5: |
176 | SAVE_ALL_INT | 175 | SAVE_ALL_INT |
@@ -181,7 +180,7 @@ inthandler5: | |||
181 | movel #69,%sp@- /* put vector # on stack*/ | 180 | movel #69,%sp@- /* put vector # on stack*/ |
182 | jbsr process_int /* process the IRQ*/ | 181 | jbsr process_int /* process the IRQ*/ |
183 | 3: addql #8,%sp /* pop parameters off stack*/ | 182 | 3: addql #8,%sp /* pop parameters off stack*/ |
184 | bra ret_from_interrupt | 183 | bra ret_from_exception |
185 | 184 | ||
186 | inthandler6: | 185 | inthandler6: |
187 | SAVE_ALL_INT | 186 | SAVE_ALL_INT |
@@ -192,7 +191,7 @@ inthandler6: | |||
192 | movel #70,%sp@- /* put vector # on stack*/ | 191 | movel #70,%sp@- /* put vector # on stack*/ |
193 | jbsr process_int /* process the IRQ*/ | 192 | jbsr process_int /* process the IRQ*/ |
194 | 3: addql #8,%sp /* pop parameters off stack*/ | 193 | 3: addql #8,%sp /* pop parameters off stack*/ |
195 | bra ret_from_interrupt | 194 | bra ret_from_exception |
196 | 195 | ||
197 | inthandler7: | 196 | inthandler7: |
198 | SAVE_ALL_INT | 197 | SAVE_ALL_INT |
@@ -203,7 +202,7 @@ inthandler7: | |||
203 | movel #71,%sp@- /* put vector # on stack*/ | 202 | movel #71,%sp@- /* put vector # on stack*/ |
204 | jbsr process_int /* process the IRQ*/ | 203 | jbsr process_int /* process the IRQ*/ |
205 | 3: addql #8,%sp /* pop parameters off stack*/ | 204 | 3: addql #8,%sp /* pop parameters off stack*/ |
206 | bra ret_from_interrupt | 205 | bra ret_from_exception |
207 | 206 | ||
208 | inthandler: | 207 | inthandler: |
209 | SAVE_ALL_INT | 208 | SAVE_ALL_INT |
@@ -214,23 +213,7 @@ inthandler: | |||
214 | movel %d0,%sp@- /* put vector # on stack*/ | 213 | movel %d0,%sp@- /* put vector # on stack*/ |
215 | jbsr process_int /* process the IRQ*/ | 214 | jbsr process_int /* process the IRQ*/ |
216 | 3: addql #8,%sp /* pop parameters off stack*/ | 215 | 3: addql #8,%sp /* pop parameters off stack*/ |
217 | bra ret_from_interrupt | 216 | bra ret_from_exception |
218 | |||
219 | ret_from_interrupt: | ||
220 | jeq 1f | ||
221 | 2: | ||
222 | RESTORE_ALL | ||
223 | 1: | ||
224 | moveb %sp@(PT_OFF_SR), %d0 | ||
225 | and #7, %d0 | ||
226 | jhi 2b | ||
227 | |||
228 | /* check if we need to do software interrupts */ | ||
229 | jeq ret_from_exception | ||
230 | |||
231 | pea ret_from_exception | ||
232 | jra do_softirq | ||
233 | |||
234 | 217 | ||
235 | /* | 218 | /* |
236 | * Handler for uninitialized and spurious interrupts. | 219 | * Handler for uninitialized and spurious interrupts. |
diff --git a/arch/m68k/platform/68360/entry.S b/arch/m68k/platform/68360/entry.S index 904fd9a4af4e..447c33ef37fd 100644 --- a/arch/m68k/platform/68360/entry.S +++ b/arch/m68k/platform/68360/entry.S | |||
@@ -29,7 +29,6 @@ | |||
29 | .globl ret_from_exception | 29 | .globl ret_from_exception |
30 | .globl ret_from_signal | 30 | .globl ret_from_signal |
31 | .globl sys_call_table | 31 | .globl sys_call_table |
32 | .globl ret_from_interrupt | ||
33 | .globl bad_interrupt | 32 | .globl bad_interrupt |
34 | .globl inthandler | 33 | .globl inthandler |
35 | 34 | ||
@@ -132,26 +131,9 @@ inthandler: | |||
132 | 131 | ||
133 | movel %sp,%sp@- | 132 | movel %sp,%sp@- |
134 | movel %d0,%sp@- /* put vector # on stack*/ | 133 | movel %d0,%sp@- /* put vector # on stack*/ |
135 | jbsr do_IRQ /* process the IRQ*/ | 134 | jbsr do_IRQ /* process the IRQ */ |
136 | 3: addql #8,%sp /* pop parameters off stack*/ | 135 | addql #8,%sp /* pop parameters off stack*/ |
137 | bra ret_from_interrupt | 136 | jra ret_from_exception |
138 | |||
139 | ret_from_interrupt: | ||
140 | jeq 1f | ||
141 | 2: | ||
142 | RESTORE_ALL | ||
143 | 1: | ||
144 | moveb %sp@(PT_OFF_SR), %d0 | ||
145 | and #7, %d0 | ||
146 | jhi 2b | ||
147 | /* check if we need to do software interrupts */ | ||
148 | |||
149 | movel irq_stat+CPUSTAT_SOFTIRQ_PENDING,%d0 | ||
150 | jeq ret_from_exception | ||
151 | |||
152 | pea ret_from_exception | ||
153 | jra do_softirq | ||
154 | |||
155 | 137 | ||
156 | /* | 138 | /* |
157 | * Handler for uninitialized and spurious interrupts. | 139 | * Handler for uninitialized and spurious interrupts. |
diff --git a/arch/metag/include/asm/thread_info.h b/arch/metag/include/asm/thread_info.h index 7c4a33006142..b19e9c588a16 100644 --- a/arch/metag/include/asm/thread_info.h +++ b/arch/metag/include/asm/thread_info.h | |||
@@ -46,8 +46,6 @@ struct thread_info { | |||
46 | 46 | ||
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | #define PREEMPT_ACTIVE 0x10000000 | ||
50 | |||
51 | #ifdef CONFIG_4KSTACKS | 49 | #ifdef CONFIG_4KSTACKS |
52 | #define THREAD_SHIFT 12 | 50 | #define THREAD_SHIFT 12 |
53 | #else | 51 | #else |
diff --git a/arch/microblaze/include/asm/thread_info.h b/arch/microblaze/include/asm/thread_info.h index de26ea6373de..8c9d36591a03 100644 --- a/arch/microblaze/include/asm/thread_info.h +++ b/arch/microblaze/include/asm/thread_info.h | |||
@@ -106,8 +106,6 @@ static inline struct thread_info *current_thread_info(void) | |||
106 | /* thread information allocation */ | 106 | /* thread information allocation */ |
107 | #endif /* __ASSEMBLY__ */ | 107 | #endif /* __ASSEMBLY__ */ |
108 | 108 | ||
109 | #define PREEMPT_ACTIVE 0x10000000 | ||
110 | |||
111 | /* | 109 | /* |
112 | * thread information flags | 110 | * thread information flags |
113 | * - these are process state flags that various assembly files may | 111 | * - these are process state flags that various assembly files may |
diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h index f9b24bfbdbae..4f58ef6d0eed 100644 --- a/arch/mips/include/asm/thread_info.h +++ b/arch/mips/include/asm/thread_info.h | |||
@@ -92,8 +92,6 @@ static inline struct thread_info *current_thread_info(void) | |||
92 | 92 | ||
93 | #define STACK_WARN (THREAD_SIZE / 8) | 93 | #define STACK_WARN (THREAD_SIZE / 8) |
94 | 94 | ||
95 | #define PREEMPT_ACTIVE 0x10000000 | ||
96 | |||
97 | /* | 95 | /* |
98 | * thread information flags | 96 | * thread information flags |
99 | * - these are process state flags that various assembly files may need to | 97 | * - these are process state flags that various assembly files may need to |
diff --git a/arch/mn10300/include/asm/thread_info.h b/arch/mn10300/include/asm/thread_info.h index 224b4262486d..bf280eaccd36 100644 --- a/arch/mn10300/include/asm/thread_info.h +++ b/arch/mn10300/include/asm/thread_info.h | |||
@@ -16,8 +16,6 @@ | |||
16 | 16 | ||
17 | #include <asm/page.h> | 17 | #include <asm/page.h> |
18 | 18 | ||
19 | #define PREEMPT_ACTIVE 0x10000000 | ||
20 | |||
21 | #ifdef CONFIG_4KSTACKS | 19 | #ifdef CONFIG_4KSTACKS |
22 | #define THREAD_SIZE (4096) | 20 | #define THREAD_SIZE (4096) |
23 | #define THREAD_SIZE_ORDER (0) | 21 | #define THREAD_SIZE_ORDER (0) |
diff --git a/arch/parisc/include/asm/thread_info.h b/arch/parisc/include/asm/thread_info.h index bc7cf120106b..d5f97ea3a4e1 100644 --- a/arch/parisc/include/asm/thread_info.h +++ b/arch/parisc/include/asm/thread_info.h | |||
@@ -46,9 +46,6 @@ struct thread_info { | |||
46 | #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) | 46 | #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) |
47 | #define THREAD_SHIFT (PAGE_SHIFT + THREAD_SIZE_ORDER) | 47 | #define THREAD_SHIFT (PAGE_SHIFT + THREAD_SIZE_ORDER) |
48 | 48 | ||
49 | #define PREEMPT_ACTIVE_BIT 28 | ||
50 | #define PREEMPT_ACTIVE (1 << PREEMPT_ACTIVE_BIT) | ||
51 | |||
52 | /* | 49 | /* |
53 | * thread information flags | 50 | * thread information flags |
54 | */ | 51 | */ |
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index ba7b1973866e..8fd6cf6dcee8 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h | |||
@@ -82,8 +82,6 @@ static inline struct thread_info *current_thread_info(void) | |||
82 | 82 | ||
83 | #endif /* __ASSEMBLY__ */ | 83 | #endif /* __ASSEMBLY__ */ |
84 | 84 | ||
85 | #define PREEMPT_ACTIVE 0x10000000 | ||
86 | |||
87 | /* | 85 | /* |
88 | * thread information flag bit numbers | 86 | * thread information flag bit numbers |
89 | */ | 87 | */ |
diff --git a/arch/s390/include/asm/hardirq.h b/arch/s390/include/asm/hardirq.h index a908d2941c5d..b7eabaaeffbd 100644 --- a/arch/s390/include/asm/hardirq.h +++ b/arch/s390/include/asm/hardirq.h | |||
@@ -18,8 +18,6 @@ | |||
18 | #define __ARCH_HAS_DO_SOFTIRQ | 18 | #define __ARCH_HAS_DO_SOFTIRQ |
19 | #define __ARCH_IRQ_EXIT_IRQS_DISABLED | 19 | #define __ARCH_IRQ_EXIT_IRQS_DISABLED |
20 | 20 | ||
21 | #define HARDIRQ_BITS 8 | ||
22 | |||
23 | static inline void ack_bad_irq(unsigned int irq) | 21 | static inline void ack_bad_irq(unsigned int irq) |
24 | { | 22 | { |
25 | printk(KERN_CRIT "unexpected IRQ trap at vector %02x\n", irq); | 23 | printk(KERN_CRIT "unexpected IRQ trap at vector %02x\n", irq); |
diff --git a/arch/s390/include/asm/thread_info.h b/arch/s390/include/asm/thread_info.h index eb5f64d26d06..10e0fcd3633d 100644 --- a/arch/s390/include/asm/thread_info.h +++ b/arch/s390/include/asm/thread_info.h | |||
@@ -111,6 +111,4 @@ static inline struct thread_info *current_thread_info(void) | |||
111 | #define is_32bit_task() (1) | 111 | #define is_32bit_task() (1) |
112 | #endif | 112 | #endif |
113 | 113 | ||
114 | #define PREEMPT_ACTIVE 0x4000000 | ||
115 | |||
116 | #endif /* _ASM_THREAD_INFO_H */ | 114 | #endif /* _ASM_THREAD_INFO_H */ |
diff --git a/arch/score/include/asm/thread_info.h b/arch/score/include/asm/thread_info.h index 1425cc034872..656b7ada9326 100644 --- a/arch/score/include/asm/thread_info.h +++ b/arch/score/include/asm/thread_info.h | |||
@@ -72,8 +72,6 @@ register struct thread_info *__current_thread_info __asm__("r28"); | |||
72 | 72 | ||
73 | #endif /* !__ASSEMBLY__ */ | 73 | #endif /* !__ASSEMBLY__ */ |
74 | 74 | ||
75 | #define PREEMPT_ACTIVE 0x10000000 | ||
76 | |||
77 | /* | 75 | /* |
78 | * thread information flags | 76 | * thread information flags |
79 | * - these are process state flags that various assembly files may need to | 77 | * - these are process state flags that various assembly files may need to |
diff --git a/arch/sh/include/asm/thread_info.h b/arch/sh/include/asm/thread_info.h index 45a93669289d..ad27ffa65e2e 100644 --- a/arch/sh/include/asm/thread_info.h +++ b/arch/sh/include/asm/thread_info.h | |||
@@ -41,8 +41,6 @@ struct thread_info { | |||
41 | 41 | ||
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | #define PREEMPT_ACTIVE 0x10000000 | ||
45 | |||
46 | #if defined(CONFIG_4KSTACKS) | 44 | #if defined(CONFIG_4KSTACKS) |
47 | #define THREAD_SHIFT 12 | 45 | #define THREAD_SHIFT 12 |
48 | #else | 46 | #else |
diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S index 9b6e4beeb296..ca46834294b7 100644 --- a/arch/sh/kernel/entry-common.S +++ b/arch/sh/kernel/entry-common.S | |||
@@ -108,7 +108,7 @@ need_resched: | |||
108 | and #(0xf0>>1), r0 ! interrupts off (exception path)? | 108 | and #(0xf0>>1), r0 ! interrupts off (exception path)? |
109 | cmp/eq #(0xf0>>1), r0 | 109 | cmp/eq #(0xf0>>1), r0 |
110 | bt noresched | 110 | bt noresched |
111 | mov.l 3f, r0 | 111 | mov.l 1f, r0 |
112 | jsr @r0 ! call preempt_schedule_irq | 112 | jsr @r0 ! call preempt_schedule_irq |
113 | nop | 113 | nop |
114 | bra need_resched | 114 | bra need_resched |
@@ -119,9 +119,7 @@ noresched: | |||
119 | nop | 119 | nop |
120 | 120 | ||
121 | .align 2 | 121 | .align 2 |
122 | 1: .long PREEMPT_ACTIVE | 122 | 1: .long preempt_schedule_irq |
123 | 2: .long schedule | ||
124 | 3: .long preempt_schedule_irq | ||
125 | #endif | 123 | #endif |
126 | 124 | ||
127 | ENTRY(resume_userspace) | 125 | ENTRY(resume_userspace) |
diff --git a/arch/sparc/include/asm/hardirq_32.h b/arch/sparc/include/asm/hardirq_32.h index 162007643cdc..ee93923b7f82 100644 --- a/arch/sparc/include/asm/hardirq_32.h +++ b/arch/sparc/include/asm/hardirq_32.h | |||
@@ -7,7 +7,6 @@ | |||
7 | #ifndef __SPARC_HARDIRQ_H | 7 | #ifndef __SPARC_HARDIRQ_H |
8 | #define __SPARC_HARDIRQ_H | 8 | #define __SPARC_HARDIRQ_H |
9 | 9 | ||
10 | #define HARDIRQ_BITS 8 | ||
11 | #include <asm-generic/hardirq.h> | 10 | #include <asm-generic/hardirq.h> |
12 | 11 | ||
13 | #endif /* __SPARC_HARDIRQ_H */ | 12 | #endif /* __SPARC_HARDIRQ_H */ |
diff --git a/arch/sparc/include/asm/hardirq_64.h b/arch/sparc/include/asm/hardirq_64.h index 7c29fd1a87aa..f478ff1ddd02 100644 --- a/arch/sparc/include/asm/hardirq_64.h +++ b/arch/sparc/include/asm/hardirq_64.h | |||
@@ -14,6 +14,4 @@ | |||
14 | 14 | ||
15 | void ack_bad_irq(unsigned int irq); | 15 | void ack_bad_irq(unsigned int irq); |
16 | 16 | ||
17 | #define HARDIRQ_BITS 8 | ||
18 | |||
19 | #endif /* !(__SPARC64_HARDIRQ_H) */ | 17 | #endif /* !(__SPARC64_HARDIRQ_H) */ |
diff --git a/arch/sparc/include/asm/thread_info_32.h b/arch/sparc/include/asm/thread_info_32.h index dd3807599bb9..96efa7adc223 100644 --- a/arch/sparc/include/asm/thread_info_32.h +++ b/arch/sparc/include/asm/thread_info_32.h | |||
@@ -105,8 +105,6 @@ register struct thread_info *current_thread_info_reg asm("g6"); | |||
105 | #define TI_W_SAVED 0x250 | 105 | #define TI_W_SAVED 0x250 |
106 | /* #define TI_RESTART_BLOCK 0x25n */ /* Nobody cares */ | 106 | /* #define TI_RESTART_BLOCK 0x25n */ /* Nobody cares */ |
107 | 107 | ||
108 | #define PREEMPT_ACTIVE 0x4000000 | ||
109 | |||
110 | /* | 108 | /* |
111 | * thread information flag bit numbers | 109 | * thread information flag bit numbers |
112 | */ | 110 | */ |
diff --git a/arch/sparc/include/asm/thread_info_64.h b/arch/sparc/include/asm/thread_info_64.h index 5d9292ab1077..a5f01ac6d0f1 100644 --- a/arch/sparc/include/asm/thread_info_64.h +++ b/arch/sparc/include/asm/thread_info_64.h | |||
@@ -111,8 +111,6 @@ struct thread_info { | |||
111 | #define THREAD_SHIFT PAGE_SHIFT | 111 | #define THREAD_SHIFT PAGE_SHIFT |
112 | #endif /* PAGE_SHIFT == 13 */ | 112 | #endif /* PAGE_SHIFT == 13 */ |
113 | 113 | ||
114 | #define PREEMPT_ACTIVE 0x10000000 | ||
115 | |||
116 | /* | 114 | /* |
117 | * macros/functions for gaining access to the thread information structure | 115 | * macros/functions for gaining access to the thread information structure |
118 | */ | 116 | */ |
diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S index a954eb81881b..39f0c662f4c8 100644 --- a/arch/sparc/kernel/rtrap_64.S +++ b/arch/sparc/kernel/rtrap_64.S | |||
@@ -312,12 +312,10 @@ to_kernel: | |||
312 | nop | 312 | nop |
313 | cmp %l4, 0 | 313 | cmp %l4, 0 |
314 | bne,pn %xcc, kern_fpucheck | 314 | bne,pn %xcc, kern_fpucheck |
315 | sethi %hi(PREEMPT_ACTIVE), %l6 | 315 | nop |
316 | stw %l6, [%g6 + TI_PRE_COUNT] | 316 | call preempt_schedule_irq |
317 | call schedule | ||
318 | nop | 317 | nop |
319 | ba,pt %xcc, rtrap | 318 | ba,pt %xcc, rtrap |
320 | stw %g0, [%g6 + TI_PRE_COUNT] | ||
321 | #endif | 319 | #endif |
322 | kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5 | 320 | kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5 |
323 | brz,pt %l5, rt_continue | 321 | brz,pt %l5, rt_continue |
diff --git a/arch/tile/include/asm/hardirq.h b/arch/tile/include/asm/hardirq.h index 822390f9a154..54110af23985 100644 --- a/arch/tile/include/asm/hardirq.h +++ b/arch/tile/include/asm/hardirq.h | |||
@@ -42,6 +42,4 @@ DECLARE_PER_CPU(irq_cpustat_t, irq_stat); | |||
42 | 42 | ||
43 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ | 43 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ |
44 | 44 | ||
45 | #define HARDIRQ_BITS 8 | ||
46 | |||
47 | #endif /* _ASM_TILE_HARDIRQ_H */ | 45 | #endif /* _ASM_TILE_HARDIRQ_H */ |
diff --git a/arch/tile/include/asm/thread_info.h b/arch/tile/include/asm/thread_info.h index b8aa6df3e102..729aa107f64e 100644 --- a/arch/tile/include/asm/thread_info.h +++ b/arch/tile/include/asm/thread_info.h | |||
@@ -113,8 +113,6 @@ extern void _cpu_idle(void); | |||
113 | 113 | ||
114 | #endif /* !__ASSEMBLY__ */ | 114 | #endif /* !__ASSEMBLY__ */ |
115 | 115 | ||
116 | #define PREEMPT_ACTIVE 0x10000000 | ||
117 | |||
118 | /* | 116 | /* |
119 | * Thread information flags that various assembly files may need to access. | 117 | * Thread information flags that various assembly files may need to access. |
120 | * Keep flags accessed frequently in low bits, particular since it makes | 118 | * Keep flags accessed frequently in low bits, particular since it makes |
diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h index 2c8eeb2df8b4..1c5b2a83046a 100644 --- a/arch/um/include/asm/thread_info.h +++ b/arch/um/include/asm/thread_info.h | |||
@@ -60,8 +60,6 @@ static inline struct thread_info *current_thread_info(void) | |||
60 | 60 | ||
61 | #endif | 61 | #endif |
62 | 62 | ||
63 | #define PREEMPT_ACTIVE 0x10000000 | ||
64 | |||
65 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ | 63 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ |
66 | #define TIF_SIGPENDING 1 /* signal pending */ | 64 | #define TIF_SIGPENDING 1 /* signal pending */ |
67 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ | 65 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ |
diff --git a/arch/unicore32/include/asm/thread_info.h b/arch/unicore32/include/asm/thread_info.h index 818b4a1edb5b..af36d8eabdf1 100644 --- a/arch/unicore32/include/asm/thread_info.h +++ b/arch/unicore32/include/asm/thread_info.h | |||
@@ -118,12 +118,6 @@ static inline struct thread_info *current_thread_info(void) | |||
118 | #endif | 118 | #endif |
119 | 119 | ||
120 | /* | 120 | /* |
121 | * We use bit 30 of the preempt_count to indicate that kernel | ||
122 | * preemption is occurring. See <asm/hardirq.h>. | ||
123 | */ | ||
124 | #define PREEMPT_ACTIVE 0x40000000 | ||
125 | |||
126 | /* | ||
127 | * thread information flags: | 121 | * thread information flags: |
128 | * TIF_SYSCALL_TRACE - syscall trace active | 122 | * TIF_SYSCALL_TRACE - syscall trace active |
129 | * TIF_SIGPENDING - signal pending | 123 | * TIF_SIGPENDING - signal pending |
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index c46a46be1ec6..3ba3de457d05 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
@@ -153,8 +153,6 @@ struct thread_info { | |||
153 | #define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY) | 153 | #define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY) |
154 | #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW) | 154 | #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW) |
155 | 155 | ||
156 | #define PREEMPT_ACTIVE 0x10000000 | ||
157 | |||
158 | #ifdef CONFIG_X86_32 | 156 | #ifdef CONFIG_X86_32 |
159 | 157 | ||
160 | #define STACK_WARN (THREAD_SIZE/8) | 158 | #define STACK_WARN (THREAD_SIZE/8) |
diff --git a/arch/xtensa/include/asm/thread_info.h b/arch/xtensa/include/asm/thread_info.h index 9481004ac119..470153e8547c 100644 --- a/arch/xtensa/include/asm/thread_info.h +++ b/arch/xtensa/include/asm/thread_info.h | |||
@@ -76,8 +76,6 @@ struct thread_info { | |||
76 | 76 | ||
77 | #endif | 77 | #endif |
78 | 78 | ||
79 | #define PREEMPT_ACTIVE 0x10000000 | ||
80 | |||
81 | /* | 79 | /* |
82 | * macros/functions for gaining access to the thread information structure | 80 | * macros/functions for gaining access to the thread information structure |
83 | */ | 81 | */ |
diff --git a/include/linux/irq.h b/include/linux/irq.h index 56bb0dc8b7d4..7dc10036eff5 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -70,6 +70,9 @@ typedef void (*irq_preflow_handler_t)(struct irq_data *data); | |||
70 | * IRQ_MOVE_PCNTXT - Interrupt can be migrated from process context | 70 | * IRQ_MOVE_PCNTXT - Interrupt can be migrated from process context |
71 | * IRQ_NESTED_TRHEAD - Interrupt nests into another thread | 71 | * IRQ_NESTED_TRHEAD - Interrupt nests into another thread |
72 | * IRQ_PER_CPU_DEVID - Dev_id is a per-cpu variable | 72 | * IRQ_PER_CPU_DEVID - Dev_id is a per-cpu variable |
73 | * IRQ_IS_POLLED - Always polled by another interrupt. Exclude | ||
74 | * it from the spurious interrupt detection | ||
75 | * mechanism and from core side polling. | ||
73 | */ | 76 | */ |
74 | enum { | 77 | enum { |
75 | IRQ_TYPE_NONE = 0x00000000, | 78 | IRQ_TYPE_NONE = 0x00000000, |
@@ -94,12 +97,14 @@ enum { | |||
94 | IRQ_NESTED_THREAD = (1 << 15), | 97 | IRQ_NESTED_THREAD = (1 << 15), |
95 | IRQ_NOTHREAD = (1 << 16), | 98 | IRQ_NOTHREAD = (1 << 16), |
96 | IRQ_PER_CPU_DEVID = (1 << 17), | 99 | IRQ_PER_CPU_DEVID = (1 << 17), |
100 | IRQ_IS_POLLED = (1 << 18), | ||
97 | }; | 101 | }; |
98 | 102 | ||
99 | #define IRQF_MODIFY_MASK \ | 103 | #define IRQF_MODIFY_MASK \ |
100 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ | 104 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ |
101 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ | 105 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ |
102 | IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID) | 106 | IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID | \ |
107 | IRQ_IS_POLLED) | ||
103 | 108 | ||
104 | #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) | 109 | #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) |
105 | 110 | ||
diff --git a/include/linux/preempt_mask.h b/include/linux/preempt_mask.h index 931bc616219f..d169820203dd 100644 --- a/include/linux/preempt_mask.h +++ b/include/linux/preempt_mask.h | |||
@@ -11,36 +11,23 @@ | |||
11 | * - bits 0-7 are the preemption count (max preemption depth: 256) | 11 | * - bits 0-7 are the preemption count (max preemption depth: 256) |
12 | * - bits 8-15 are the softirq count (max # of softirqs: 256) | 12 | * - bits 8-15 are the softirq count (max # of softirqs: 256) |
13 | * | 13 | * |
14 | * The hardirq count can in theory reach the same as NR_IRQS. | 14 | * The hardirq count could in theory be the same as the number of |
15 | * In reality, the number of nested IRQS is limited to the stack | 15 | * interrupts in the system, but we run all interrupt handlers with |
16 | * size as well. For archs with over 1000 IRQS it is not practical | 16 | * interrupts disabled, so we cannot have nesting interrupts. Though |
17 | * to expect that they will all nest. We give a max of 10 bits for | 17 | * there are a few palaeontologic drivers which reenable interrupts in |
18 | * hardirq nesting. An arch may choose to give less than 10 bits. | 18 | * the handler, so we need more than one bit here. |
19 | * m68k expects it to be 8. | ||
20 | * | 19 | * |
21 | * - bits 16-25 are the hardirq count (max # of nested hardirqs: 1024) | 20 | * PREEMPT_MASK: 0x000000ff |
22 | * - bit 26 is the NMI_MASK | 21 | * SOFTIRQ_MASK: 0x0000ff00 |
23 | * - bit 27 is the PREEMPT_ACTIVE flag | 22 | * HARDIRQ_MASK: 0x000f0000 |
24 | * | 23 | * NMI_MASK: 0x00100000 |
25 | * PREEMPT_MASK: 0x000000ff | 24 | * PREEMPT_ACTIVE: 0x00200000 |
26 | * SOFTIRQ_MASK: 0x0000ff00 | ||
27 | * HARDIRQ_MASK: 0x03ff0000 | ||
28 | * NMI_MASK: 0x04000000 | ||
29 | */ | 25 | */ |
30 | #define PREEMPT_BITS 8 | 26 | #define PREEMPT_BITS 8 |
31 | #define SOFTIRQ_BITS 8 | 27 | #define SOFTIRQ_BITS 8 |
28 | #define HARDIRQ_BITS 4 | ||
32 | #define NMI_BITS 1 | 29 | #define NMI_BITS 1 |
33 | 30 | ||
34 | #define MAX_HARDIRQ_BITS 10 | ||
35 | |||
36 | #ifndef HARDIRQ_BITS | ||
37 | # define HARDIRQ_BITS MAX_HARDIRQ_BITS | ||
38 | #endif | ||
39 | |||
40 | #if HARDIRQ_BITS > MAX_HARDIRQ_BITS | ||
41 | #error HARDIRQ_BITS too high! | ||
42 | #endif | ||
43 | |||
44 | #define PREEMPT_SHIFT 0 | 31 | #define PREEMPT_SHIFT 0 |
45 | #define SOFTIRQ_SHIFT (PREEMPT_SHIFT + PREEMPT_BITS) | 32 | #define SOFTIRQ_SHIFT (PREEMPT_SHIFT + PREEMPT_BITS) |
46 | #define HARDIRQ_SHIFT (SOFTIRQ_SHIFT + SOFTIRQ_BITS) | 33 | #define HARDIRQ_SHIFT (SOFTIRQ_SHIFT + SOFTIRQ_BITS) |
@@ -60,15 +47,9 @@ | |||
60 | 47 | ||
61 | #define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) | 48 | #define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) |
62 | 49 | ||
63 | #ifndef PREEMPT_ACTIVE | ||
64 | #define PREEMPT_ACTIVE_BITS 1 | 50 | #define PREEMPT_ACTIVE_BITS 1 |
65 | #define PREEMPT_ACTIVE_SHIFT (NMI_SHIFT + NMI_BITS) | 51 | #define PREEMPT_ACTIVE_SHIFT (NMI_SHIFT + NMI_BITS) |
66 | #define PREEMPT_ACTIVE (__IRQ_MASK(PREEMPT_ACTIVE_BITS) << PREEMPT_ACTIVE_SHIFT) | 52 | #define PREEMPT_ACTIVE (__IRQ_MASK(PREEMPT_ACTIVE_BITS) << PREEMPT_ACTIVE_SHIFT) |
67 | #endif | ||
68 | |||
69 | #if PREEMPT_ACTIVE < (1 << (NMI_SHIFT + NMI_BITS)) | ||
70 | #error PREEMPT_ACTIVE is too low! | ||
71 | #endif | ||
72 | 53 | ||
73 | #define hardirq_count() (preempt_count() & HARDIRQ_MASK) | 54 | #define hardirq_count() (preempt_count() & HARDIRQ_MASK) |
74 | #define softirq_count() (preempt_count() & SOFTIRQ_MASK) | 55 | #define softirq_count() (preempt_count() & SOFTIRQ_MASK) |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 6f7ffa460089..7e35d4b9e14a 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -22,7 +22,7 @@ struct sched_param { | |||
22 | #include <linux/errno.h> | 22 | #include <linux/errno.h> |
23 | #include <linux/nodemask.h> | 23 | #include <linux/nodemask.h> |
24 | #include <linux/mm_types.h> | 24 | #include <linux/mm_types.h> |
25 | #include <linux/preempt.h> | 25 | #include <linux/preempt_mask.h> |
26 | 26 | ||
27 | #include <asm/page.h> | 27 | #include <asm/page.h> |
28 | #include <asm/ptrace.h> | 28 | #include <asm/ptrace.h> |
diff --git a/kernel/irq/settings.h b/kernel/irq/settings.h index 1162f1030f18..3320b84cc60f 100644 --- a/kernel/irq/settings.h +++ b/kernel/irq/settings.h | |||
@@ -14,6 +14,7 @@ enum { | |||
14 | _IRQ_NO_BALANCING = IRQ_NO_BALANCING, | 14 | _IRQ_NO_BALANCING = IRQ_NO_BALANCING, |
15 | _IRQ_NESTED_THREAD = IRQ_NESTED_THREAD, | 15 | _IRQ_NESTED_THREAD = IRQ_NESTED_THREAD, |
16 | _IRQ_PER_CPU_DEVID = IRQ_PER_CPU_DEVID, | 16 | _IRQ_PER_CPU_DEVID = IRQ_PER_CPU_DEVID, |
17 | _IRQ_IS_POLLED = IRQ_IS_POLLED, | ||
17 | _IRQF_MODIFY_MASK = IRQF_MODIFY_MASK, | 18 | _IRQF_MODIFY_MASK = IRQF_MODIFY_MASK, |
18 | }; | 19 | }; |
19 | 20 | ||
@@ -26,6 +27,7 @@ enum { | |||
26 | #define IRQ_NOAUTOEN GOT_YOU_MORON | 27 | #define IRQ_NOAUTOEN GOT_YOU_MORON |
27 | #define IRQ_NESTED_THREAD GOT_YOU_MORON | 28 | #define IRQ_NESTED_THREAD GOT_YOU_MORON |
28 | #define IRQ_PER_CPU_DEVID GOT_YOU_MORON | 29 | #define IRQ_PER_CPU_DEVID GOT_YOU_MORON |
30 | #define IRQ_IS_POLLED GOT_YOU_MORON | ||
29 | #undef IRQF_MODIFY_MASK | 31 | #undef IRQF_MODIFY_MASK |
30 | #define IRQF_MODIFY_MASK GOT_YOU_MORON | 32 | #define IRQF_MODIFY_MASK GOT_YOU_MORON |
31 | 33 | ||
@@ -147,3 +149,8 @@ static inline bool irq_settings_is_nested_thread(struct irq_desc *desc) | |||
147 | { | 149 | { |
148 | return desc->status_use_accessors & _IRQ_NESTED_THREAD; | 150 | return desc->status_use_accessors & _IRQ_NESTED_THREAD; |
149 | } | 151 | } |
152 | |||
153 | static inline bool irq_settings_is_polled(struct irq_desc *desc) | ||
154 | { | ||
155 | return desc->status_use_accessors & _IRQ_IS_POLLED; | ||
156 | } | ||
diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index 7b5f012bde9d..a1d8cc63b56e 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c | |||
@@ -67,8 +67,13 @@ static int try_one_irq(int irq, struct irq_desc *desc, bool force) | |||
67 | 67 | ||
68 | raw_spin_lock(&desc->lock); | 68 | raw_spin_lock(&desc->lock); |
69 | 69 | ||
70 | /* PER_CPU and nested thread interrupts are never polled */ | 70 | /* |
71 | if (irq_settings_is_per_cpu(desc) || irq_settings_is_nested_thread(desc)) | 71 | * PER_CPU, nested thread interrupts and interrupts explicitely |
72 | * marked polled are excluded from polling. | ||
73 | */ | ||
74 | if (irq_settings_is_per_cpu(desc) || | ||
75 | irq_settings_is_nested_thread(desc) || | ||
76 | irq_settings_is_polled(desc)) | ||
72 | goto out; | 77 | goto out; |
73 | 78 | ||
74 | /* | 79 | /* |
@@ -268,7 +273,8 @@ try_misrouted_irq(unsigned int irq, struct irq_desc *desc, | |||
268 | void note_interrupt(unsigned int irq, struct irq_desc *desc, | 273 | void note_interrupt(unsigned int irq, struct irq_desc *desc, |
269 | irqreturn_t action_ret) | 274 | irqreturn_t action_ret) |
270 | { | 275 | { |
271 | if (desc->istate & IRQS_POLL_INPROGRESS) | 276 | if (desc->istate & IRQS_POLL_INPROGRESS || |
277 | irq_settings_is_polled(desc)) | ||
272 | return; | 278 | return; |
273 | 279 | ||
274 | /* we get here again via the threaded handler */ | 280 | /* we get here again via the threaded handler */ |