* [PATCH 0/2] Lumpy Reclaim V6 cleanups @ 2007-04-25 17:09 ` Andy Whitcroft 0 siblings, 0 replies; 6+ messages in thread From: Andy Whitcroft @ 2007-04-25 17:09 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-mm, linux-kernel, Andy Whitcroft, Mel Gorman Following this email are two cleanup patches against lumpy V6 (as contained in v2.6.21-rc7-mm1). These address the review feedback from Andrew Morton, thanks for reviewing. introduce-HIGH_ORDER-delineating-easily-reclaimable-orders-fix: changes the name of the constant to PAGE_ALLOC_COSTLY_ORDER and updates the commentary to better describe it. lumpy-increase-pressure-at-the-end-of-the-inactive-list-cleanups: a large number of cleanups including fully expressing the isolations modes symbolically. Andrew please apply. -apw ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 0/2] Lumpy Reclaim V6 cleanups @ 2007-04-25 17:09 ` Andy Whitcroft 0 siblings, 0 replies; 6+ messages in thread From: Andy Whitcroft @ 2007-04-25 17:09 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-mm, linux-kernel, Andy Whitcroft, Mel Gorman Following this email are two cleanup patches against lumpy V6 (as contained in v2.6.21-rc7-mm1). These address the review feedback from Andrew Morton, thanks for reviewing. introduce-HIGH_ORDER-delineating-easily-reclaimable-orders-fix: changes the name of the constant to PAGE_ALLOC_COSTLY_ORDER and updates the commentary to better describe it. lumpy-increase-pressure-at-the-end-of-the-inactive-list-cleanups: a large number of cleanups including fully expressing the isolations modes symbolically. Andrew please apply. -apw -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] introduce HIGH_ORDER delineating easily reclaimable orders cleanups 2007-04-25 17:09 ` Andy Whitcroft @ 2007-04-25 17:10 ` Andy Whitcroft -1 siblings, 0 replies; 6+ messages in thread From: Andy Whitcroft @ 2007-04-25 17:10 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-mm, linux-kernel, Andy Whitcroft, Mel Gorman Switch from HIGH_ORDER to the more logical and descriptive PAGE_ALLOC_COSTLY_ORDER indicating the boundary between orders easily reclaimed and allocated and those which are not. Signed-off-by: Andy Whitcroft <apw@shadowen.org> Acked-by: Mel Gorman <mel@csn.ul.ie> --- diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index f9d2ced..444851c 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -26,11 +26,12 @@ #define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1)) /* - * The boundary between small and large allocations. That is between - * allocation orders which should colesce naturally under reasonable - * reclaim pressure and those which will not. + * PAGE_ALLOC_COSTLY_ORDER is the order at which allocations are deemed + * costly to service. That is between allocation orders which should + * coelesce naturally under reasonable reclaim pressure and those which + * will not. */ -#define HIGH_ORDER 3 +#define PAGE_ALLOC_COSTLY_ORDER 3 #ifdef CONFIG_PAGE_GROUP_BY_MOBILITY #define MIGRATE_UNMOVABLE 0 diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 44786d9..b7134d2 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1768,7 +1768,8 @@ nofail_alloc: */ do_retry = 0; if (!(gfp_mask & __GFP_NORETRY)) { - if ((order <= HIGH_ORDER) || (gfp_mask & __GFP_REPEAT)) + if ((order <= PAGE_ALLOC_COSTLY_ORDER) || + (gfp_mask & __GFP_REPEAT)) do_retry = 1; if (gfp_mask & __GFP_NOFAIL) do_retry = 1; diff --git a/mm/vmscan.c b/mm/vmscan.c index 79aedcb..ab7f4c0 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -472,7 +472,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, referenced = page_referenced(page, 1); /* In active use or really unfreeable? Activate it. */ - if (sc->order <= HIGH_ORDER && + if (sc->order <= PAGE_ALLOC_COSTLY_ORDER && referenced && page_mapping_inuse(page)) goto activate_locked; @@ -506,7 +506,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, } if (PageDirty(page)) { - if (sc->order <= HIGH_ORDER && referenced) + if (sc->order <= PAGE_ALLOC_COSTLY_ORDER && referenced) goto keep_locked; if (!may_enter_fs) goto keep_locked; @@ -777,7 +777,8 @@ static unsigned long shrink_inactive_list(unsigned long max_scan, nr_taken = isolate_lru_pages(sc->swap_cluster_max, &zone->inactive_list, &page_list, &nr_scan, sc->order, - (sc->order > HIGH_ORDER)? ISOLATE_BOTH : 0); + (sc->order > PAGE_ALLOC_COSTLY_ORDER)? + ISOLATE_BOTH : 0); nr_active = deactivate_pages(&page_list); __mod_zone_page_state(zone, NR_ACTIVE, -nr_active); ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 1/2] introduce HIGH_ORDER delineating easily reclaimable orders cleanups @ 2007-04-25 17:10 ` Andy Whitcroft 0 siblings, 0 replies; 6+ messages in thread From: Andy Whitcroft @ 2007-04-25 17:10 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-mm, linux-kernel, Andy Whitcroft, Mel Gorman Switch from HIGH_ORDER to the more logical and descriptive PAGE_ALLOC_COSTLY_ORDER indicating the boundary between orders easily reclaimed and allocated and those which are not. Signed-off-by: Andy Whitcroft <apw@shadowen.org> Acked-by: Mel Gorman <mel@csn.ul.ie> --- diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index f9d2ced..444851c 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -26,11 +26,12 @@ #define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1)) /* - * The boundary between small and large allocations. That is between - * allocation orders which should colesce naturally under reasonable - * reclaim pressure and those which will not. + * PAGE_ALLOC_COSTLY_ORDER is the order at which allocations are deemed + * costly to service. That is between allocation orders which should + * coelesce naturally under reasonable reclaim pressure and those which + * will not. */ -#define HIGH_ORDER 3 +#define PAGE_ALLOC_COSTLY_ORDER 3 #ifdef CONFIG_PAGE_GROUP_BY_MOBILITY #define MIGRATE_UNMOVABLE 0 diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 44786d9..b7134d2 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1768,7 +1768,8 @@ nofail_alloc: */ do_retry = 0; if (!(gfp_mask & __GFP_NORETRY)) { - if ((order <= HIGH_ORDER) || (gfp_mask & __GFP_REPEAT)) + if ((order <= PAGE_ALLOC_COSTLY_ORDER) || + (gfp_mask & __GFP_REPEAT)) do_retry = 1; if (gfp_mask & __GFP_NOFAIL) do_retry = 1; diff --git a/mm/vmscan.c b/mm/vmscan.c index 79aedcb..ab7f4c0 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -472,7 +472,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, referenced = page_referenced(page, 1); /* In active use or really unfreeable? Activate it. */ - if (sc->order <= HIGH_ORDER && + if (sc->order <= PAGE_ALLOC_COSTLY_ORDER && referenced && page_mapping_inuse(page)) goto activate_locked; @@ -506,7 +506,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, } if (PageDirty(page)) { - if (sc->order <= HIGH_ORDER && referenced) + if (sc->order <= PAGE_ALLOC_COSTLY_ORDER && referenced) goto keep_locked; if (!may_enter_fs) goto keep_locked; @@ -777,7 +777,8 @@ static unsigned long shrink_inactive_list(unsigned long max_scan, nr_taken = isolate_lru_pages(sc->swap_cluster_max, &zone->inactive_list, &page_list, &nr_scan, sc->order, - (sc->order > HIGH_ORDER)? ISOLATE_BOTH : 0); + (sc->order > PAGE_ALLOC_COSTLY_ORDER)? + ISOLATE_BOTH : 0); nr_active = deactivate_pages(&page_list); __mod_zone_page_state(zone, NR_ACTIVE, -nr_active); -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] lumpy: increase pressure at the end of the inactive list cleanups 2007-04-25 17:09 ` Andy Whitcroft @ 2007-04-25 17:10 ` Andy Whitcroft -1 siblings, 0 replies; 6+ messages in thread From: Andy Whitcroft @ 2007-04-25 17:10 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-mm, linux-kernel, Andy Whitcroft, Mel Gorman Cleanups following review feedback for the patch below: lumpy: increase pressure at the end of the inactive list This patch: 1) introduces ISOLATE_[ACTIVE,INACTIVE], 2) changes the name of the deactivate_pages() helper to clear_active_flags(), 3) cleans up and simplifies the checks in __isolate_lru_pages(), and 4) changes the parameter active to mode throughout. Signed-off-by: Andy Whitcroft <apw@shadowen.org> Acked-by: Mel Gorman <mel@csn.ul.ie> --- diff --git a/mm/vmscan.c b/mm/vmscan.c index ab7f4c0..5f3c2bb 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -590,38 +590,46 @@ keep: return nr_reclaimed; } +/* LRU Isolation modes. */ +#define ISOLATE_INACTIVE 0 /* Isolate inactive pages. */ +#define ISOLATE_ACTIVE 1 /* Isolate active pages. */ +#define ISOLATE_BOTH 2 /* Isolate both active and inactive pages. */ + /* * Attempt to remove the specified page from its LRU. Only take this page * if it is of the appropriate PageActive status. Pages which are being * freed elsewhere are also ignored. * * page: page to consider - * active: active/inactive flag only take pages of this type + * mode: one of the LRU isolation modes defined above * * returns 0 on success, -ve errno on failure. */ -#define ISOLATE_BOTH -1 /* Isolate both active and inactive pages. */ -static int __isolate_lru_page(struct page *page, int active) +static int __isolate_lru_page(struct page *page, int mode) { int ret = -EINVAL; + /* Only take pages on the LRU. */ + if (!PageLRU(page)) + return ret; + /* * When checking the active state, we need to be sure we are * dealing with comparible boolean values. Take the logical not * of each. */ - if (PageLRU(page) && (active == ISOLATE_BOTH || - (!PageActive(page) == !active))) { - ret = -EBUSY; - if (likely(get_page_unless_zero(page))) { - /* - * Be careful not to clear PageLRU until after we're - * sure the page is not being freed elsewhere -- the - * page release code relies on it. - */ - ClearPageLRU(page); - ret = 0; - } + if (mode != ISOLATE_BOTH && (!PageActive(page) != !mode)) + return ret; + + ret = -EBUSY; + if (likely(get_page_unless_zero(page))) { + /* + * Be careful not to clear PageLRU until after we're + * sure the page is not being freed elsewhere -- the + * page release code relies on it. + */ + ClearPageLRU(page); + ret = 0; } return ret; @@ -642,13 +650,13 @@ static int __isolate_lru_page(struct page *page, int active) * @dst: The temp list to put pages on to. * @scanned: The number of pages that were scanned. * @order: The caller's attempted allocation order - * @active: The caller's trying to obtain active or inactive pages + * @mode: One of the LRU isolation modes * * returns how many pages were moved onto *@dst. */ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, struct list_head *src, struct list_head *dst, - unsigned long *scanned, int order, int active) + unsigned long *scanned, int order, int mode) { unsigned long nr_taken = 0; unsigned long scan; @@ -665,7 +673,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, VM_BUG_ON(!PageLRU(page)); - switch (__isolate_lru_page(page, active)) { + switch (__isolate_lru_page(page, mode)) { case 0: list_move(&page->lru, dst); nr_taken++; @@ -711,7 +719,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, /* Check that we have not crossed a zone boundary. */ if (unlikely(page_zone_id(cursor_page) != zone_id)) continue; - switch (__isolate_lru_page(cursor_page, active)) { + switch (__isolate_lru_page(cursor_page, mode)) { case 0: list_move(&cursor_page->lru, dst); nr_taken++; @@ -732,21 +740,19 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, } /* - * deactivate_pages() is a helper for shrink_active_list(), it deactivates - * all active pages on the passed list. + * clear_active_flags() is a helper for shrink_active_list(), clearing + * any active bits from the pages in the list. */ -static unsigned long deactivate_pages(struct list_head *page_list) +static unsigned long clear_active_flags(struct list_head *page_list) { int nr_active = 0; - struct list_head *entry; + struct page *page; - list_for_each(entry, page_list) { - struct page *page = list_entry(entry, struct page, lru); + list_for_each_entry(page, page_list, lru) if (PageActive(page)) { ClearPageActive(page); nr_active++; } - } return nr_active; } @@ -778,8 +784,8 @@ static unsigned long shrink_inactive_list(unsigned long max_scan, &zone->inactive_list, &page_list, &nr_scan, sc->order, (sc->order > PAGE_ALLOC_COSTLY_ORDER)? - ISOLATE_BOTH : 0); - nr_active = deactivate_pages(&page_list); + ISOLATE_BOTH : ISOLATE_INACTIVE); + nr_active = clear_active_flags(&page_list); __mod_zone_page_state(zone, NR_ACTIVE, -nr_active); __mod_zone_page_state(zone, NR_INACTIVE, @@ -929,7 +935,7 @@ force_reclaim_mapped: lru_add_drain(); spin_lock_irq(&zone->lru_lock); pgmoved = isolate_lru_pages(nr_pages, &zone->active_list, - &l_hold, &pgscanned, sc->order, 1); + &l_hold, &pgscanned, sc->order, ISOLATE_ACTIVE); zone->pages_scanned += pgscanned; __mod_zone_page_state(zone, NR_ACTIVE, -pgmoved); spin_unlock_irq(&zone->lru_lock); ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] lumpy: increase pressure at the end of the inactive list cleanups @ 2007-04-25 17:10 ` Andy Whitcroft 0 siblings, 0 replies; 6+ messages in thread From: Andy Whitcroft @ 2007-04-25 17:10 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-mm, linux-kernel, Andy Whitcroft, Mel Gorman Cleanups following review feedback for the patch below: lumpy: increase pressure at the end of the inactive list This patch: 1) introduces ISOLATE_[ACTIVE,INACTIVE], 2) changes the name of the deactivate_pages() helper to clear_active_flags(), 3) cleans up and simplifies the checks in __isolate_lru_pages(), and 4) changes the parameter active to mode throughout. Signed-off-by: Andy Whitcroft <apw@shadowen.org> Acked-by: Mel Gorman <mel@csn.ul.ie> --- diff --git a/mm/vmscan.c b/mm/vmscan.c index ab7f4c0..5f3c2bb 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -590,38 +590,46 @@ keep: return nr_reclaimed; } +/* LRU Isolation modes. */ +#define ISOLATE_INACTIVE 0 /* Isolate inactive pages. */ +#define ISOLATE_ACTIVE 1 /* Isolate active pages. */ +#define ISOLATE_BOTH 2 /* Isolate both active and inactive pages. */ + /* * Attempt to remove the specified page from its LRU. Only take this page * if it is of the appropriate PageActive status. Pages which are being * freed elsewhere are also ignored. * * page: page to consider - * active: active/inactive flag only take pages of this type + * mode: one of the LRU isolation modes defined above * * returns 0 on success, -ve errno on failure. */ -#define ISOLATE_BOTH -1 /* Isolate both active and inactive pages. */ -static int __isolate_lru_page(struct page *page, int active) +static int __isolate_lru_page(struct page *page, int mode) { int ret = -EINVAL; + /* Only take pages on the LRU. */ + if (!PageLRU(page)) + return ret; + /* * When checking the active state, we need to be sure we are * dealing with comparible boolean values. Take the logical not * of each. */ - if (PageLRU(page) && (active == ISOLATE_BOTH || - (!PageActive(page) == !active))) { - ret = -EBUSY; - if (likely(get_page_unless_zero(page))) { - /* - * Be careful not to clear PageLRU until after we're - * sure the page is not being freed elsewhere -- the - * page release code relies on it. - */ - ClearPageLRU(page); - ret = 0; - } + if (mode != ISOLATE_BOTH && (!PageActive(page) != !mode)) + return ret; + + ret = -EBUSY; + if (likely(get_page_unless_zero(page))) { + /* + * Be careful not to clear PageLRU until after we're + * sure the page is not being freed elsewhere -- the + * page release code relies on it. + */ + ClearPageLRU(page); + ret = 0; } return ret; @@ -642,13 +650,13 @@ static int __isolate_lru_page(struct page *page, int active) * @dst: The temp list to put pages on to. * @scanned: The number of pages that were scanned. * @order: The caller's attempted allocation order - * @active: The caller's trying to obtain active or inactive pages + * @mode: One of the LRU isolation modes * * returns how many pages were moved onto *@dst. */ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, struct list_head *src, struct list_head *dst, - unsigned long *scanned, int order, int active) + unsigned long *scanned, int order, int mode) { unsigned long nr_taken = 0; unsigned long scan; @@ -665,7 +673,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, VM_BUG_ON(!PageLRU(page)); - switch (__isolate_lru_page(page, active)) { + switch (__isolate_lru_page(page, mode)) { case 0: list_move(&page->lru, dst); nr_taken++; @@ -711,7 +719,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, /* Check that we have not crossed a zone boundary. */ if (unlikely(page_zone_id(cursor_page) != zone_id)) continue; - switch (__isolate_lru_page(cursor_page, active)) { + switch (__isolate_lru_page(cursor_page, mode)) { case 0: list_move(&cursor_page->lru, dst); nr_taken++; @@ -732,21 +740,19 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, } /* - * deactivate_pages() is a helper for shrink_active_list(), it deactivates - * all active pages on the passed list. + * clear_active_flags() is a helper for shrink_active_list(), clearing + * any active bits from the pages in the list. */ -static unsigned long deactivate_pages(struct list_head *page_list) +static unsigned long clear_active_flags(struct list_head *page_list) { int nr_active = 0; - struct list_head *entry; + struct page *page; - list_for_each(entry, page_list) { - struct page *page = list_entry(entry, struct page, lru); + list_for_each_entry(page, page_list, lru) if (PageActive(page)) { ClearPageActive(page); nr_active++; } - } return nr_active; } @@ -778,8 +784,8 @@ static unsigned long shrink_inactive_list(unsigned long max_scan, &zone->inactive_list, &page_list, &nr_scan, sc->order, (sc->order > PAGE_ALLOC_COSTLY_ORDER)? - ISOLATE_BOTH : 0); - nr_active = deactivate_pages(&page_list); + ISOLATE_BOTH : ISOLATE_INACTIVE); + nr_active = clear_active_flags(&page_list); __mod_zone_page_state(zone, NR_ACTIVE, -nr_active); __mod_zone_page_state(zone, NR_INACTIVE, @@ -929,7 +935,7 @@ force_reclaim_mapped: lru_add_drain(); spin_lock_irq(&zone->lru_lock); pgmoved = isolate_lru_pages(nr_pages, &zone->active_list, - &l_hold, &pgscanned, sc->order, 1); + &l_hold, &pgscanned, sc->order, ISOLATE_ACTIVE); zone->pages_scanned += pgscanned; __mod_zone_page_state(zone, NR_ACTIVE, -pgmoved); spin_unlock_irq(&zone->lru_lock); -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2007-04-25 17:10 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2007-04-25 17:09 [PATCH 0/2] Lumpy Reclaim V6 cleanups Andy Whitcroft 2007-04-25 17:09 ` Andy Whitcroft 2007-04-25 17:10 ` [PATCH 1/2] introduce HIGH_ORDER delineating easily reclaimable orders cleanups Andy Whitcroft 2007-04-25 17:10 ` Andy Whitcroft 2007-04-25 17:10 ` [PATCH 2/2] lumpy: increase pressure at the end of the inactive list cleanups Andy Whitcroft 2007-04-25 17:10 ` Andy Whitcroft
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.