lkml.org 
[lkml]   [2009]   [Jul]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH] kmemleak: Fix scheduling-while-atomic bug
    From
    Date
    On Wed, 2009-07-01 at 11:30 +0200, Ingo Molnar wrote:
    > * Catalin Marinas <catalin.marinas@arm.com> wrote:
    >
    > > > The minimal fix below removes scan_yield() and adds a
    > > > cond_resched() to the outmost (safe) place of the scanning
    > > > thread. This solves the regression.
    > >
    > > With CONFIG_PREEMPT disabled it won't reschedule during the bss
    > > scanning but I don't see this as a real issue (task stacks
    > > scanning probably takes longer anyway).
    >
    > Yeah. I suspect one more cond_resched() could be added - i just
    > didnt see an obvious place for it, given that scan_block() is being
    > called with asymetric held-locks contexts.

    Now that your patch was merged, I propose adding a few more
    cond_resched() calls, useful for the !PREEMPT case:


    kmemleak: Add more cond_resched() calls in the scanning thread

    From: Catalin Marinas <catalin.marinas@arm.com>

    Following recent patch to no longer reschedule in the scan_block()
    function, we need a few more cond_resched() calls in the kmemleak_scan()
    function (useful if PREEMPT is disabled).

    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    ---
    mm/kmemleak.c | 7 ++++++-
    1 files changed, 6 insertions(+), 1 deletions(-)

    diff --git a/mm/kmemleak.c b/mm/kmemleak.c
    index 013f188..b4f675e 100644
    --- a/mm/kmemleak.c
    +++ b/mm/kmemleak.c
    @@ -932,13 +932,16 @@ static void kmemleak_scan(void)

    /* data/bss scanning */
    scan_block(_sdata, _edata, NULL);
    + cond_resched();
    scan_block(__bss_start, __bss_stop, NULL);

    #ifdef CONFIG_SMP
    /* per-cpu sections scanning */
    - for_each_possible_cpu(i)
    + for_each_possible_cpu(i) {
    + cond_resched();
    scan_block(__per_cpu_start + per_cpu_offset(i),
    __per_cpu_end + per_cpu_offset(i), NULL);
    + }
    #endif

    /*
    @@ -960,6 +963,7 @@ static void kmemleak_scan(void)
    /* only scan if page is in use */
    if (page_count(page) == 0)
    continue;
    + cond_resched();
    scan_block(page, page + 1, NULL);
    }
    }
    @@ -969,6 +973,7 @@ static void kmemleak_scan(void)
    * not enabled by default.
    */
    if (kmemleak_stack_scan) {
    + cond_resched();
    read_lock(&tasklist_lock);
    for_each_process(task)
    scan_block(task_stack_page(task),

    --
    Catalin



    \
     
     \ /
      Last update: 2009-07-02 11:51    [W:0.025 / U:0.736 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site