diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-02-27 11:33:51 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-02-27 11:33:51 -0500 |
commit | dbfedbb98145375106cee7ec7269611d553819dc (patch) | |
tree | 81d2a6de51b1bb3c704e5385dbc90ca79efa69bc /mm/mempolicy.c | |
parent | 7b0386921db20add25afd8678ed34a9253e512fc (diff) | |
parent | e95a9ec1bb66e07b138861c743192f06e7b3e4de (diff) | |
download | op-kernel-dev-dbfedbb98145375106cee7ec7269611d553819dc.zip op-kernel-dev-dbfedbb98145375106cee7ec7269611d553819dc.tar.gz |
Merge branch 'master'
Diffstat (limited to 'mm/mempolicy.c')
-rw-r--r-- | mm/mempolicy.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 880831b..67af4ce 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -552,7 +552,7 @@ static void migrate_page_add(struct page *page, struct list_head *pagelist, */ if ((flags & MPOL_MF_MOVE_ALL) || page_mapcount(page) == 1) { if (isolate_lru_page(page)) - list_add(&page->lru, pagelist); + list_add_tail(&page->lru, pagelist); } } @@ -569,6 +569,7 @@ static int migrate_pages_to(struct list_head *pagelist, LIST_HEAD(moved); LIST_HEAD(failed); int err = 0; + unsigned long offset = 0; int nr_pages; struct page *page; struct list_head *p; @@ -576,8 +577,21 @@ static int migrate_pages_to(struct list_head *pagelist, redo: nr_pages = 0; list_for_each(p, pagelist) { - if (vma) - page = alloc_page_vma(GFP_HIGHUSER, vma, vma->vm_start); + if (vma) { + /* + * The address passed to alloc_page_vma is used to + * generate the proper interleave behavior. We fake + * the address here by an increasing offset in order + * to get the proper distribution of pages. + * + * No decision has been made as to which page + * a certain old page is moved to so we cannot + * specify the correct address. + */ + page = alloc_page_vma(GFP_HIGHUSER, vma, + offset + vma->vm_start); + offset += PAGE_SIZE; + } else page = alloc_pages_node(dest, GFP_HIGHUSER, 0); @@ -585,7 +599,7 @@ redo: err = -ENOMEM; goto out; } - list_add(&page->lru, &newlist); + list_add_tail(&page->lru, &newlist); nr_pages++; if (nr_pages > MIGRATE_CHUNK_SIZE) break; |