Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 344804
b: refs/heads/master
c: a8f6077
h: refs/heads/master
v: v3
  • Loading branch information
Mel Gorman committed Dec 11, 2012
1 parent c474950 commit 82620a0
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 2 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: 8177a420ed7c16c171ed3c3aec5b0676db38c247
refs/heads/master: a8f6077213d285ca08dbf6d4a67470787388138b
30 changes: 29 additions & 1 deletion trunk/mm/migrate.c
Original file line number Diff line number Diff line change
Expand Up @@ -1460,13 +1460,22 @@ static struct page *alloc_misplaced_dst_page(struct page *page,
return newpage;
}

/*
* page migration rate limiting control.
* Do not migrate more than @pages_to_migrate in a @migrate_interval_millisecs
* window of time. Default here says do not migrate more than 1280M per second.
*/
static unsigned int migrate_interval_millisecs __read_mostly = 100;
static unsigned int ratelimit_pages __read_mostly = 128 << (20 - PAGE_SHIFT);

/*
* Attempt to migrate a misplaced page to the specified destination
* node. Caller is expected to have an elevated reference count on
* the page that will be dropped by this function before returning.
*/
int migrate_misplaced_page(struct page *page, int node)
{
pg_data_t *pgdat = NODE_DATA(node);
int isolated = 0;
LIST_HEAD(migratepages);

Expand All @@ -1479,8 +1488,27 @@ int migrate_misplaced_page(struct page *page, int node)
goto out;
}

/*
* Rate-limit the amount of data that is being migrated to a node.
* Optimal placement is no good if the memory bus is saturated and
* all the time is being spent migrating!
*/
spin_lock(&pgdat->numabalancing_migrate_lock);
if (time_after(jiffies, pgdat->numabalancing_migrate_next_window)) {
pgdat->numabalancing_migrate_nr_pages = 0;
pgdat->numabalancing_migrate_next_window = jiffies +
msecs_to_jiffies(migrate_interval_millisecs);
}
if (pgdat->numabalancing_migrate_nr_pages > ratelimit_pages) {
spin_unlock(&pgdat->numabalancing_migrate_lock);
put_page(page);
goto out;
}
pgdat->numabalancing_migrate_nr_pages++;
spin_unlock(&pgdat->numabalancing_migrate_lock);

/* Avoid migrating to a node that is nearly full */
if (migrate_balanced_pgdat(NODE_DATA(node), 1)) {
if (migrate_balanced_pgdat(pgdat, 1)) {
int page_lru;

if (isolate_lru_page(page)) {
Expand Down

0 comments on commit 82620a0

Please sign in to comment.