| From nobody Mon Sep 17 00:00:00 2001 |
| From: Lee Schermerhorn <Lee.Schermerhorn@hp.com> |
| Date: Sat, 22 Apr 2006 02:35:48 -0700 |
| Subject: 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| Signed-off-by: Chris Wright <chrisw@sous-sol.org> |
| --- |
| mm/shmem.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- linux-2.6.16.16.orig/mm/shmem.c |
| +++ linux-2.6.16.16/mm/shmem.c |
| @@ -2172,6 +2172,7 @@ static struct address_space_operations s |
| .prepare_write = shmem_prepare_write, |
| .commit_write = simple_commit_write, |
| #endif |
| + .migratepage = migrate_page, |
| }; |
| |
| static struct file_operations shmem_file_operations = { |