lkml.org 
[lkml]   [2009]   [Feb]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: Need to take mmap_sem lock in move_pages.
    On Wed, 4 Feb 2009 01:02:35 -0800
    "Swamy Gowda" <swamy@virident.com> wrote:

    > Hi,
    >
    >
    >
    > I believe that migrate_pages related race conditions were fixed as part
    > of rcu_read_lock in unmap_and_move. But it seems we are still taking the
    > mmap_sem lock in do_move_pages function, is this really required? If it
    > is so why it is not needed in hot remove path?
    >

    Hmm , CC: to Christoph and Brice.

    My understanding is following.

    1. do_move_page_to_node_array() at el. needs mmap_sem (read-side) because it
    scans page table and vma. While we have to scan vmas to find pages for
    migration, it needs mmap_sem.

    So, this part,
    == do_move_page_to_node_array()
    903 err = 0;
    904 if (!list_empty(&pagelist))
    905 err = migrate_pages(&pagelist, new_page_node,
    906 (unsigned long)pm);
    907
    908 up_read(&mm->mmap_sem);
    ==
    can be
    ==
    903 err = 0;
    904 up_read(&mm->mmap_sem);
    905 if (!list_empty(&pagelist))
    906 err = migrate_pages(&pagelist, new_page_node,
    907 (unsigned long)pm);
    908
    ==
    ?

    But, by above move of semaphore, reliability of sys_migrate_page() goes down.
    Assume 2 threads. Thread1 calls sys_move_pages(), thread2 does page fault,
    touches pte under migraton.
    ==
    Thread 1 Thread2

    up_read(&mm->mmap_sem)
    page fault => map new page.
    end of migration.
    ==

    What a user expects is move all pages within [start, end) moves to nodes specified.
    And, if the page doesn't exist, "err = -ENOENT" is set to status buffer.

    But, in above case, the page exists but not in place the user expected.
    So, there are trade offs.

    Pros.
    up_read(&mmap_sem) before migration will reduce period of lock.
    Cons.
    sys_migrate_pages() at el. are not atomic anymore and return code is not
    reliable.

    2. memory hotplug's migrate_page() finds the page by physical memory's memmap.
    NO scans to any mm_struct or vmas. So, not necessary to take mmap_sem.
    (The logic is same as to vmscan.c's logic)
    It also moves pages which is not mapped.

    Thanks,
    -Kame




    \
     
     \ /
      Last update: 2009-02-04 10:39    [W:0.024 / U:31.912 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site