lkml.org 
[lkml]   [2011]   [Jun]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] ksm: fix race between ksmd and exiting task
    On Thu, Jun 02, 2011 at 10:35:49AM -0700, Chris Wright wrote:
    > Andrea Righi reported a case where an exiting task can race against
    > ksmd.
    >
    > ksm_scan.mm_slot == the only registered mm
    > CPU 1 (bug program) CPU 2 (ksmd)
    > list_empty() is false
    > lock
    > ksm_scan.mm_slot
    > list_del
    > unlock
    > slot == &ksm_mm_head (but list is now empty_)
    >
    > Close this race by revalidating that the new slot is not simply the list
    > head again.

    I confirm this fixes the problem on my side.

    Tested-by: Andrea Righi <andrea@betterlinux.com>

    >
    > Reported-by: Andrea Righi <andrea@betterlinux.com>
    > Cc: Hugh Dickins <hughd@google.com>
    > Cc: Andrea Arcangeli <aarcange@redhat.com>
    > Signed-off-by: Chris Wright <chrisw@sous-sol.org>
    > ---
    > mm/ksm.c | 3 +++
    > 1 files changed, 3 insertions(+), 0 deletions(-)
    >
    > diff --git a/mm/ksm.c b/mm/ksm.c
    > index 942dfc7..0373ce4 100644
    > --- a/mm/ksm.c
    > +++ b/mm/ksm.c
    > @@ -1301,6 +1301,9 @@ static struct rmap_item *scan_get_next_rmap_item(struct page **page)
    > slot = list_entry(slot->mm_list.next, struct mm_slot, mm_list);
    > ksm_scan.mm_slot = slot;
    > spin_unlock(&ksm_mmlist_lock);
    > + /* We raced against exit of last slot on the list */
    > + if (slot == &ksm_mm_head)
    > + return NULL;
    > next_mm:
    > ksm_scan.address = 0;
    > ksm_scan.rmap_list = &slot->rmap_list;


    \
     
     \ /
      Last update: 2011-06-02 22:15    [W:2.318 / U:0.324 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site