Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 272111
b: refs/heads/master
c: 0dabec9
h: refs/heads/master
i:
  272109: 1ece0a7
  272107: aeec4a5
  272103: 889225d
  272095: 077e9f2
v: v3
  • Loading branch information
Minchan Kim authored and Linus Torvalds committed Nov 1, 2011
1 parent b2780e0 commit 2801ddf
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 36 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f80c0673610e36ae29d63e3297175e22f70dde5f
refs/heads/master: 0dabec93de633a87adfbbe1d800a4c56cd19d73b
75 changes: 40 additions & 35 deletions trunk/mm/migrate.c
Original file line number Diff line number Diff line change
Expand Up @@ -621,38 +621,18 @@ static int move_to_new_page(struct page *newpage, struct page *page,
return rc;
}

/*
* Obtain the lock on page, remove all ptes and migrate the page
* to the newly allocated page in newpage.
*/
static int unmap_and_move(new_page_t get_new_page, unsigned long private,
struct page *page, int force, bool offlining, bool sync)
static int __unmap_and_move(struct page *page, struct page *newpage,
int force, bool offlining, bool sync)
{
int rc = 0;
int *result = NULL;
struct page *newpage = get_new_page(page, private, &result);
int rc = -EAGAIN;
int remap_swapcache = 1;
int charge = 0;
struct mem_cgroup *mem;
struct anon_vma *anon_vma = NULL;

if (!newpage)
return -ENOMEM;

if (page_count(page) == 1) {
/* page was freed from under us. So we are done. */
goto move_newpage;
}
if (unlikely(PageTransHuge(page)))
if (unlikely(split_huge_page(page)))
goto move_newpage;

/* prepare cgroup just returns 0 or -ENOMEM */
rc = -EAGAIN;

if (!trylock_page(page)) {
if (!force || !sync)
goto move_newpage;
goto out;

/*
* It's not safe for direct compaction to call lock_page.
Expand All @@ -668,7 +648,7 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private,
* altogether.
*/
if (current->flags & PF_MEMALLOC)
goto move_newpage;
goto out;

lock_page(page);
}
Expand Down Expand Up @@ -785,27 +765,52 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private,
mem_cgroup_end_migration(mem, page, newpage, rc == 0);
unlock:
unlock_page(page);
out:
return rc;
}

move_newpage:
/*
* Obtain the lock on page, remove all ptes and migrate the page
* to the newly allocated page in newpage.
*/
static int unmap_and_move(new_page_t get_new_page, unsigned long private,
struct page *page, int force, bool offlining, bool sync)
{
int rc = 0;
int *result = NULL;
struct page *newpage = get_new_page(page, private, &result);

if (!newpage)
return -ENOMEM;

if (page_count(page) == 1) {
/* page was freed from under us. So we are done. */
goto out;
}

if (unlikely(PageTransHuge(page)))
if (unlikely(split_huge_page(page)))
goto out;

rc = __unmap_and_move(page, newpage, force, offlining, sync);
out:
if (rc != -EAGAIN) {
/*
* A page that has been migrated has all references
* removed and will be freed. A page that has not been
* migrated will have kepts its references and be
* restored.
*/
list_del(&page->lru);
/*
* A page that has been migrated has all references
* removed and will be freed. A page that has not been
* migrated will have kepts its references and be
* restored.
*/
list_del(&page->lru);
dec_zone_page_state(page, NR_ISOLATED_ANON +
page_is_file_cache(page));
putback_lru_page(page);
}

/*
* Move the new page to the LRU. If migration was not successful
* then this will free the page.
*/
putback_lru_page(newpage);

if (result) {
if (rc)
*result = rc;
Expand Down

0 comments on commit 2801ddf

Please sign in to comment.