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>
This commit is contained in:
parent
610470ce80
commit
22d4cd4c4d
3 changed files with 2 additions and 13 deletions
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue