mirror of https://gitee.com/openkylin/linux.git
[PATCH] add migratepage address space op to shmem
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: Lee Schermerhorn <lee.schermerhorn@hp.com> Acked-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
3b5fd59fdd
commit
304dbdb7a4
|
@ -46,6 +46,8 @@
|
|||
#include <linux/mempolicy.h>
|
||||
#include <linux/namei.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/migrate.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
@ -2173,6 +2175,7 @@ static struct address_space_operations shmem_aops = {
|
|||
.prepare_write = shmem_prepare_write,
|
||||
.commit_write = simple_commit_write,
|
||||
#endif
|
||||
.migratepage = migrate_page,
|
||||
};
|
||||
|
||||
static struct file_operations shmem_file_operations = {
|
||||
|
|
Loading…
Reference in New Issue