lkml.org 
[lkml]   [2010]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/urgent] x86-32: Allocate irq stacks seperate from percpu area
    Commit-ID:  22d4cd4c4dce6d7b7d9a7e396aa4f87fe7a649b1
    Gitweb: http://git.kernel.org/tip/22d4cd4c4dce6d7b7d9a7e396aa4f87fe7a649b1
    Author: Brian Gerst <brgerst@gmail.com>
    AuthorDate: Wed, 27 Oct 2010 01:43:02 -0400
    Committer: Ingo Molnar <mingo@elte.hu>
    CommitDate: Wed, 27 Oct 2010 17:31:42 +0200

    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>
    ---
    arch/x86/include/asm/irq.h | 2 --
    arch/x86/kernel/irq_32.c | 12 ++----------
    arch/x86/kernel/smpboot.c | 1 -
    3 files changed, 2 insertions(+), 13 deletions(-)

    diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h
    index 0bf5b00..13b0eba 100644
    --- a/arch/x86/include/asm/irq.h
    +++ b/arch/x86/include/asm/irq.h
    @@ -21,10 +21,8 @@ static inline int irq_canonicalize(int irq)

    #ifdef CONFIG_X86_32
    extern void irq_ctx_init(int cpu);
    -extern void irq_ctx_exit(int cpu);
    #else
    # define irq_ctx_init(cpu) do { } while (0)
    -# define irq_ctx_exit(cpu) do { } while (0)
    #endif

    #define __ARCH_HAS_DO_SOFTIRQ
    diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c
    index 50fbbe6..64668db 100644
    --- a/arch/x86/kernel/irq_32.c
    +++ b/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 *, 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)
    {
    asm volatile("xchgl %%ebx,%%esp \n"
    @@ -128,7 +125,7 @@ void __cpuinit irq_ctx_init(int cpu)
    if (per_cpu(hardirq_ctx, cpu))
    return;

    - irqctx = &per_cpu(hardirq_stack, cpu);
    + irqctx = (union irq_ctx *)__get_free_pages(THREAD_FLAGS, THREAD_ORDER);
    irqctx->tinfo.task = NULL;
    irqctx->tinfo.exec_domain = NULL;
    irqctx->tinfo.cpu = cpu;
    @@ -137,7 +134,7 @@ void __cpuinit irq_ctx_init(int cpu)

    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.exec_domain = NULL;
    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));
    }

    -void irq_ctx_exit(int cpu)
    -{
    - per_cpu(hardirq_ctx, cpu) = NULL;
    -}
    -
    asmlinkage void do_softirq(void)
    {
    unsigned long flags;
    diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
    index 6af1185..90baf56 100644
    --- a/arch/x86/kernel/smpboot.c
    +++ b/arch/x86/kernel/smpboot.c
    @@ -1373,7 +1373,6 @@ void play_dead_common(void)
    {
    idle_task_exit();
    reset_lazy_tlbstate();
    - irq_ctx_exit(raw_smp_processor_id());
    c1e_remove_cpu(raw_smp_processor_id());

    mb();

    \
     
     \ /
      Last update: 2010-10-27 18:07    [W:0.039 / U:0.132 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site