• Lee Schermerhorn's avatar
    [PATCH] add migratepage address space op to shmem · 304dbdb7
    Lee Schermerhorn authored
    Basic problem: pages of a shared memory segment can only be migrated once.
    
    In 2.6.16 through 2.6.17-rc1, shared memory mappings do not have a
    migratepage address space op.  Therefore, migrate_pages() falls back to
    default processing.  In this path, it will try to pageout() dirty pages.
    Once a shared memory page has been migrated it becomes dirty, so
    migrate_pages() will try to page it out.  However, because the page count
    is 3 [cache + current + pte], pageout() will return PAGE_KEEP because
    is_page_cache_freeable() returns false.  This will abort all subsequent
    migrations.
    
    This patch adds a migratepage address space op to shared memory segments to
    avoid taking the default path.  We use the "migrate_page()" function
    because it knows how to migrate dirty pages.  This allows shared memory
    segment pages to migrate, subject to other conditions such as # pte's
    referencing the page [page_mapcount(page)], when requested.
    
    I think this is safe.  If we're migrating a shared memory page, then we
    found the page via a page table, so it must be in memory.
    
    Can be verified with memtoy and the shmem-mbind-test script, both
    available at:  http://free.linux.hp.com/~lts/Tools/Signed-off-by: default avatarLee Schermerhorn <lee.schermerhorn@hp.com>
    Acked-by: default avatarChristoph Lameter <clameter@sgi.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    304dbdb7
shmem.c 58.6 KB