Browse Source

x86-32: Allocate irq stacks seperate from percpu area

The percpu allocator cannot handle alignments larger than one
page. Allocate the irq stacks seperately, and only keep the
pointers as percpu data.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: tj@kernel.org
LKML-Reference: <1288158182-1753-1-git-send-email-brgerst@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Brian Gerst 14 years ago
parent
commit
22d4cd4c4d
3 changed files with 2 additions and 13 deletions
  1. 0 2
      arch/x86/include/asm/irq.h
  2. 2 10
      arch/x86/kernel/irq_32.c
  3. 0 1
      arch/x86/kernel/smpboot.c

+ 0 - 2
arch/x86/include/asm/irq.h

@@ -21,10 +21,8 @@ static inline int irq_canonicalize(int irq)
 
 
 #ifdef CONFIG_X86_32
 #ifdef CONFIG_X86_32
 extern void irq_ctx_init(int cpu);
 extern void irq_ctx_init(int cpu);
-extern void irq_ctx_exit(int cpu);
 #else
 #else
 # define irq_ctx_init(cpu) do { } while (0)
 # define irq_ctx_init(cpu) do { } while (0)
-# define irq_ctx_exit(cpu) do { } while (0)
 #endif
 #endif
 
 
 #define __ARCH_HAS_DO_SOFTIRQ
 #define __ARCH_HAS_DO_SOFTIRQ

+ 2 - 10
arch/x86/kernel/irq_32.c

@@ -60,9 +60,6 @@ union irq_ctx {
 static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx);
 static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx);
 static DEFINE_PER_CPU(union irq_ctx *, softirq_ctx);
 static DEFINE_PER_CPU(union irq_ctx *, softirq_ctx);
 
 
-static DEFINE_PER_CPU_MULTIPAGE_ALIGNED(union irq_ctx, hardirq_stack, THREAD_SIZE);
-static DEFINE_PER_CPU_MULTIPAGE_ALIGNED(union irq_ctx, softirq_stack, THREAD_SIZE);
-
 static void call_on_stack(void *func, void *stack)
 static void call_on_stack(void *func, void *stack)
 {
 {
 	asm volatile("xchgl	%%ebx,%%esp	\n"
 	asm volatile("xchgl	%%ebx,%%esp	\n"
@@ -128,7 +125,7 @@ void __cpuinit irq_ctx_init(int cpu)
 	if (per_cpu(hardirq_ctx, cpu))
 	if (per_cpu(hardirq_ctx, cpu))
 		return;
 		return;
 
 
-	irqctx = &per_cpu(hardirq_stack, cpu);
+	irqctx = (union irq_ctx *)__get_free_pages(THREAD_FLAGS, THREAD_ORDER);
 	irqctx->tinfo.task		= NULL;
 	irqctx->tinfo.task		= NULL;
 	irqctx->tinfo.exec_domain	= NULL;
 	irqctx->tinfo.exec_domain	= NULL;
 	irqctx->tinfo.cpu		= cpu;
 	irqctx->tinfo.cpu		= cpu;
@@ -137,7 +134,7 @@ void __cpuinit irq_ctx_init(int cpu)
 
 
 	per_cpu(hardirq_ctx, cpu) = irqctx;
 	per_cpu(hardirq_ctx, cpu) = irqctx;
 
 
-	irqctx = &per_cpu(softirq_stack, cpu);
+	irqctx = (union irq_ctx *)__get_free_pages(THREAD_FLAGS, THREAD_ORDER);
 	irqctx->tinfo.task		= NULL;
 	irqctx->tinfo.task		= NULL;
 	irqctx->tinfo.exec_domain	= NULL;
 	irqctx->tinfo.exec_domain	= NULL;
 	irqctx->tinfo.cpu		= cpu;
 	irqctx->tinfo.cpu		= cpu;
@@ -150,11 +147,6 @@ void __cpuinit irq_ctx_init(int cpu)
 	       cpu, per_cpu(hardirq_ctx, cpu),  per_cpu(softirq_ctx, cpu));
 	       cpu, per_cpu(hardirq_ctx, cpu),  per_cpu(softirq_ctx, cpu));
 }
 }
 
 
-void irq_ctx_exit(int cpu)
-{
-	per_cpu(hardirq_ctx, cpu) = NULL;
-}
-
 asmlinkage void do_softirq(void)
 asmlinkage void do_softirq(void)
 {
 {
 	unsigned long flags;
 	unsigned long flags;

+ 0 - 1
arch/x86/kernel/smpboot.c

@@ -1373,7 +1373,6 @@ void play_dead_common(void)
 {
 {
 	idle_task_exit();
 	idle_task_exit();
 	reset_lazy_tlbstate();
 	reset_lazy_tlbstate();
-	irq_ctx_exit(raw_smp_processor_id());
 	c1e_remove_cpu(raw_smp_processor_id());
 	c1e_remove_cpu(raw_smp_processor_id());
 
 
 	mb();
 	mb();