From 27b7e3a0539887fabc9e17c906537865f76fbada Mon Sep 17 00:00:00 2001 From: Christoph Lameter Date: Sun, 25 Jun 2006 05:46:48 -0700 Subject: [PATCH] --- yaml --- r: 29631 b: refs/heads/master c: 7b2259b3e53f128c10a9fded0965e69d4a949847 h: refs/heads/master i: 29629: 105b5ca82f80856f7c4f7bc344b7056fc84c64df 29627: 1b146fd4b1bf124465094107f3eb2aef715cb98c 29623: 97c9fc70d5da7b4fd8eca05d9afe1da2c319c56e 29615: 966dbeb0c219958a576dd3e47caf90c6a33fdba4 29599: 590a7d6d5d57e0168b1ee9f6cb3ecfcda08f91dd 29567: b0e398123b9345faf6d01855aa621af0815ad497 v: v3 --- [refs] | 2 +- trunk/include/linux/migrate.h | 11 ++++++++++- trunk/include/linux/mm.h | 2 ++ trunk/mm/mempolicy.c | 6 +++++- trunk/mm/migrate.c | 20 ++++++++++++++++++++ 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index dba969af1c68..5de019fcd1e9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 68402ddc677005ed1b1359bbc1f279548cfc0928 +refs/heads/master: 7b2259b3e53f128c10a9fded0965e69d4a949847 diff --git a/trunk/include/linux/migrate.h b/trunk/include/linux/migrate.h index 5dba23a1c0d0..48148e0cdbd1 100644 --- a/trunk/include/linux/migrate.h +++ b/trunk/include/linux/migrate.h @@ -16,7 +16,9 @@ extern int fail_migrate_page(struct address_space *, struct page *, struct page *); extern int migrate_prep(void); - +extern int migrate_vmas(struct mm_struct *mm, + const nodemask_t *from, const nodemask_t *to, + unsigned long flags); #else static inline int isolate_lru_page(struct page *p, struct list_head *list) @@ -30,6 +32,13 @@ static inline int migrate_pages_to(struct list_head *pagelist, static inline int migrate_prep(void) { return -ENOSYS; } +static inline int migrate_vmas(struct mm_struct *mm, + const nodemask_t *from, const nodemask_t *to, + unsigned long flags) +{ + return -ENOSYS; +} + /* Possible settings for the migrate_page() method in address_operations */ #define migrate_page NULL #define fail_migrate_page NULL diff --git a/trunk/include/linux/mm.h b/trunk/include/linux/mm.h index 71c5d2f667ed..a929ea197e48 100644 --- a/trunk/include/linux/mm.h +++ b/trunk/include/linux/mm.h @@ -206,6 +206,8 @@ struct vm_operations_struct { int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new); struct mempolicy *(*get_policy)(struct vm_area_struct *vma, unsigned long addr); + int (*migrate)(struct vm_area_struct *vma, const nodemask_t *from, + const nodemask_t *to, unsigned long flags); #endif }; diff --git a/trunk/mm/mempolicy.c b/trunk/mm/mempolicy.c index ec4a1a950df9..73e0f23b7f51 100644 --- a/trunk/mm/mempolicy.c +++ b/trunk/mm/mempolicy.c @@ -632,6 +632,10 @@ int do_migrate_pages(struct mm_struct *mm, down_read(&mm->mmap_sem); + err = migrate_vmas(mm, from_nodes, to_nodes, flags); + if (err) + goto out; + /* * Find a 'source' bit set in 'tmp' whose corresponding 'dest' * bit in 'to' is not also set in 'tmp'. Clear the found 'source' @@ -691,7 +695,7 @@ int do_migrate_pages(struct mm_struct *mm, if (err < 0) break; } - +out: up_read(&mm->mmap_sem); if (err < 0) return err; diff --git a/trunk/mm/migrate.c b/trunk/mm/migrate.c index 1c2a71aa05cd..0576c0535988 100644 --- a/trunk/mm/migrate.c +++ b/trunk/mm/migrate.c @@ -976,3 +976,23 @@ asmlinkage long sys_move_pages(pid_t pid, unsigned long nr_pages, } #endif +/* + * Call migration functions in the vma_ops that may prepare + * memory in a vm for migration. migration functions may perform + * the migration for vmas that do not have an underlying page struct. + */ +int migrate_vmas(struct mm_struct *mm, const nodemask_t *to, + const nodemask_t *from, unsigned long flags) +{ + struct vm_area_struct *vma; + int err = 0; + + for(vma = mm->mmap; vma->vm_next && !err; vma = vma->vm_next) { + if (vma->vm_ops && vma->vm_ops->migrate) { + err = vma->vm_ops->migrate(vma, to, from, flags); + if (err) + break; + } + } + return err; +}