mirror of https://gitee.com/openkylin/linux.git
[PATCH] SwapMig: CONFIG_MIGRATION fixes
Move move_to_lru, putback_lru_pages and isolate_lru in section surrounded by CONFIG_MIGRATION saving some codesize for single processor kernels. Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
39743889aa
commit
8419c31810
|
@ -175,10 +175,9 @@ extern int try_to_free_pages(struct zone **, gfp_t);
|
|||
extern int shrink_all_memory(int);
|
||||
extern int vm_swappiness;
|
||||
|
||||
#ifdef CONFIG_MIGRATION
|
||||
extern int isolate_lru_page(struct page *p);
|
||||
extern int putback_lru_pages(struct list_head *l);
|
||||
|
||||
#ifdef CONFIG_MIGRATION
|
||||
extern int migrate_pages(struct list_head *l, struct list_head *t);
|
||||
#endif
|
||||
|
||||
|
|
152
mm/vmscan.c
152
mm/vmscan.c
|
@ -569,6 +569,40 @@ static int shrink_list(struct list_head *page_list, struct scan_control *sc)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_MIGRATION
|
||||
static inline void move_to_lru(struct page *page)
|
||||
{
|
||||
list_del(&page->lru);
|
||||
if (PageActive(page)) {
|
||||
/*
|
||||
* lru_cache_add_active checks that
|
||||
* the PG_active bit is off.
|
||||
*/
|
||||
ClearPageActive(page);
|
||||
lru_cache_add_active(page);
|
||||
} else {
|
||||
lru_cache_add(page);
|
||||
}
|
||||
put_page(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add isolated pages on the list back to the LRU
|
||||
*
|
||||
* returns the number of pages put back.
|
||||
*/
|
||||
int putback_lru_pages(struct list_head *l)
|
||||
{
|
||||
struct page *page;
|
||||
struct page *page2;
|
||||
int count = 0;
|
||||
|
||||
list_for_each_entry_safe(page, page2, l, lru) {
|
||||
move_to_lru(page);
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
/*
|
||||
* swapout a single page
|
||||
* page is locked upon entry, unlocked on exit
|
||||
|
@ -709,6 +743,48 @@ int migrate_pages(struct list_head *l, struct list_head *t)
|
|||
|
||||
return nr_failed + retry;
|
||||
}
|
||||
|
||||
static void lru_add_drain_per_cpu(void *dummy)
|
||||
{
|
||||
lru_add_drain();
|
||||
}
|
||||
|
||||
/*
|
||||
* Isolate one page from the LRU lists and put it on the
|
||||
* indicated list. Do necessary cache draining if the
|
||||
* page is not on the LRU lists yet.
|
||||
*
|
||||
* Result:
|
||||
* 0 = page not on LRU list
|
||||
* 1 = page removed from LRU list and added to the specified list.
|
||||
* -ENOENT = page is being freed elsewhere.
|
||||
*/
|
||||
int isolate_lru_page(struct page *page)
|
||||
{
|
||||
int rc = 0;
|
||||
struct zone *zone = page_zone(page);
|
||||
|
||||
redo:
|
||||
spin_lock_irq(&zone->lru_lock);
|
||||
rc = __isolate_lru_page(page);
|
||||
if (rc == 1) {
|
||||
if (PageActive(page))
|
||||
del_page_from_active_list(zone, page);
|
||||
else
|
||||
del_page_from_inactive_list(zone, page);
|
||||
}
|
||||
spin_unlock_irq(&zone->lru_lock);
|
||||
if (rc == 0) {
|
||||
/*
|
||||
* Maybe this page is still waiting for a cpu to drain it
|
||||
* from one of the lru lists?
|
||||
*/
|
||||
rc = schedule_on_each_cpu(lru_add_drain_per_cpu, NULL);
|
||||
if (rc == 0 && PageLRU(page))
|
||||
goto redo;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -758,48 +834,6 @@ static int isolate_lru_pages(int nr_to_scan, struct list_head *src,
|
|||
return nr_taken;
|
||||
}
|
||||
|
||||
static void lru_add_drain_per_cpu(void *dummy)
|
||||
{
|
||||
lru_add_drain();
|
||||
}
|
||||
|
||||
/*
|
||||
* Isolate one page from the LRU lists and put it on the
|
||||
* indicated list. Do necessary cache draining if the
|
||||
* page is not on the LRU lists yet.
|
||||
*
|
||||
* Result:
|
||||
* 0 = page not on LRU list
|
||||
* 1 = page removed from LRU list and added to the specified list.
|
||||
* -ENOENT = page is being freed elsewhere.
|
||||
*/
|
||||
int isolate_lru_page(struct page *page)
|
||||
{
|
||||
int rc = 0;
|
||||
struct zone *zone = page_zone(page);
|
||||
|
||||
redo:
|
||||
spin_lock_irq(&zone->lru_lock);
|
||||
rc = __isolate_lru_page(page);
|
||||
if (rc == 1) {
|
||||
if (PageActive(page))
|
||||
del_page_from_active_list(zone, page);
|
||||
else
|
||||
del_page_from_inactive_list(zone, page);
|
||||
}
|
||||
spin_unlock_irq(&zone->lru_lock);
|
||||
if (rc == 0) {
|
||||
/*
|
||||
* Maybe this page is still waiting for a cpu to drain it
|
||||
* from one of the lru lists?
|
||||
*/
|
||||
rc = schedule_on_each_cpu(lru_add_drain_per_cpu, NULL);
|
||||
if (rc == 0 && PageLRU(page))
|
||||
goto redo;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* shrink_cache() adds the number of pages reclaimed to sc->nr_reclaimed
|
||||
*/
|
||||
|
@ -865,40 +899,6 @@ static void shrink_cache(struct zone *zone, struct scan_control *sc)
|
|||
pagevec_release(&pvec);
|
||||
}
|
||||
|
||||
static inline void move_to_lru(struct page *page)
|
||||
{
|
||||
list_del(&page->lru);
|
||||
if (PageActive(page)) {
|
||||
/*
|
||||
* lru_cache_add_active checks that
|
||||
* the PG_active bit is off.
|
||||
*/
|
||||
ClearPageActive(page);
|
||||
lru_cache_add_active(page);
|
||||
} else {
|
||||
lru_cache_add(page);
|
||||
}
|
||||
put_page(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add isolated pages on the list back to the LRU
|
||||
*
|
||||
* returns the number of pages put back.
|
||||
*/
|
||||
int putback_lru_pages(struct list_head *l)
|
||||
{
|
||||
struct page *page;
|
||||
struct page *page2;
|
||||
int count = 0;
|
||||
|
||||
list_for_each_entry_safe(page, page2, l, lru) {
|
||||
move_to_lru(page);
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
/*
|
||||
* This moves pages from the active list to the inactive list.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue