lkml.org 
[lkml]   [2010]   [Oct]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [tip:x86/urgent] x86-32: Restore irq stacks NUMA-aware allocations
    From
    Date
    Le samedi 30 octobre 2010 à 00:28 +0400, Cyrill Gorcunov a écrit :
    > On Fri, Oct 29, 2010 at 08:32:26PM +0200, Peter Zijlstra wrote:
    > > On Fri, 2010-10-29 at 06:43 +0000, tip-bot for Eric Dumazet wrote:
    > > > + irqctx = page_address(alloc_pages_node(cpu_to_node(cpu),
    > > > + THREAD_FLAGS,
    > > > + THREAD_ORDER));
    > >
    > > Shouldn't we be checking for a NULL return from alloc_pages_node()
    > > before calling page_address() on it?
    > > --
    >

    I didnt check for NULL because original code was not either.

    If you cannot allocate memory for the IRQ stack, only choice is to crash
    anyway.

    Adding BUG_ON() is not that helpful in this respect.

    > Something like below I guess, but probably we could try to allocate
    > on appropriate NUMA node first and if it fails -- via old alloc_pages
    > and if it fail in turn -- then we panic.
    >
    > Cyrill
    > ---
    > arch/x86/kernel/irq_32.c | 17 +++++++++++------
    > 1 file changed, 11 insertions(+), 6 deletions(-)
    >
    > Index: linux-2.6.git/arch/x86/kernel/irq_32.c
    > =====================================================================
    > --- linux-2.6.git.orig/arch/x86/kernel/irq_32.c
    > +++ linux-2.6.git/arch/x86/kernel/irq_32.c
    > @@ -122,13 +122,16 @@ execute_on_irq_stack(int overflow, struc
    > void __cpuinit irq_ctx_init(int cpu)
    > {
    > union irq_ctx *irqctx;
    > + struct page *page;
    >
    > if (per_cpu(hardirq_ctx, cpu))
    > return;
    >
    > - irqctx = page_address(alloc_pages_node(cpu_to_node(cpu),
    > - THREAD_FLAGS,
    > - THREAD_ORDER));
    > + page = alloc_pages_node(cpu_to_node(cpu),
    > + THREAD_FLAGS, THREAD_ORDER);
    > + BUG_ON(!page);
    > +
    > + irqctx = page_address(page);
    > irqctx->tinfo.task = NULL;
    > irqctx->tinfo.exec_domain = NULL;
    > irqctx->tinfo.cpu = cpu;
    > @@ -137,9 +140,11 @@ void __cpuinit irq_ctx_init(int cpu)
    >
    > per_cpu(hardirq_ctx, cpu) = irqctx;
    >
    > - irqctx = page_address(alloc_pages_node(cpu_to_node(cpu),
    > - THREAD_FLAGS,
    > - THREAD_ORDER));
    > + page = alloc_pages_node(cpu_to_node(cpu),
    > + THREAD_FLAGS, THREAD_ORDER);
    > + BUG_ON(!page);
    > +
    > + irqctx = page_address(page);
    > irqctx->tinfo.task = NULL;
    > irqctx->tinfo.exec_domain = NULL;
    > irqctx->tinfo.cpu = cpu;


    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2010-10-29 22:55    [W:0.025 / U:59.216 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site