lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 14 Mar 2014 15:37:46 +0900 From: Minchan Kim <minchan@...nel.org> To: Andrew Morton <akpm@...ux-foundation.org> Cc: Rik van Riel <riel@...hat.com>, Mel Gorman <mgorman@...e.de>, Hugh Dickins <hughd@...gle.com>, Dave Hansen <dave.hansen@...el.com>, Johannes Weiner <hannes@...xchg.org>, KOSAKI Motohiro <kosaki.motohiro@...fujitsu.com>, linux-mm@...ck.org, linux-kernel@...r.kernel.org, John Stultz <john.stultz@...aro.org>, Jason Evans <je@...com>, Minchan Kim <minchan@...nel.org> Subject: [RFC 2/6] mm: work deactivate_page with anon pages Now, deactivate_page works for file page but MADV_FREE will use it to move lazyfree pages to inactive LRU's tail so this patch makes deactivate_page work with anon pages as well as file pages. Signed-off-by: Minchan Kim <minchan@...nel.org> --- include/linux/mm_inline.h | 9 +++++++++ mm/swap.c | 20 ++++++++++---------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index cf55945c83fb..0503caafd532 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h @@ -22,6 +22,15 @@ static inline int page_is_file_cache(struct page *page) return !PageSwapBacked(page); } +static __always_inline void add_page_to_lru_list_tail(struct page *page, + struct lruvec *lruvec, enum lru_list lru) +{ + int nr_pages = hpage_nr_pages(page); + mem_cgroup_update_lru_size(lruvec, lru, nr_pages); + list_add_tail(&page->lru, &lruvec->lists[lru]); + __mod_zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru, nr_pages); +} + static __always_inline void add_page_to_lru_list(struct page *page, struct lruvec *lruvec, enum lru_list lru) { diff --git a/mm/swap.c b/mm/swap.c index 0092097b3f4c..ac13714b5d8b 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -643,14 +643,11 @@ void add_page_to_unevictable_list(struct page *page) * If the page isn't page_mapped and dirty/writeback, the page * could reclaim asap using PG_reclaim. * - * 1. active, mapped page -> none - * 2. active, dirty/writeback page -> inactive, head, PG_reclaim - * 3. inactive, mapped page -> none - * 4. inactive, dirty/writeback page -> inactive, head, PG_reclaim - * 5. inactive, clean -> inactive, tail - * 6. Others -> none + * 1. file mapped page -> none + * 2. dirty/writeback page -> head of inactive with PG_reclaim + * 3. inactive, clean -> tail of inactive * - * In 4, why it moves inactive's head, the VM expects the page would + * In 2, why it moves inactive's head, the VM expects the page would * be write it out by flusher threads as this is much more effective * than the single-page writeout from reclaim. */ @@ -667,7 +664,7 @@ static void lru_deactivate_fn(struct page *page, struct lruvec *lruvec, return; /* Some processes are using the page */ - if (page_mapped(page)) + if (!PageAnon(page) && page_mapped(page)) return; active = PageActive(page); @@ -677,7 +674,6 @@ static void lru_deactivate_fn(struct page *page, struct lruvec *lruvec, del_page_from_lru_list(page, lruvec, lru + active); ClearPageActive(page); ClearPageReferenced(page); - add_page_to_lru_list(page, lruvec, lru); if (PageWriteback(page) || PageDirty(page)) { /* @@ -686,12 +682,16 @@ static void lru_deactivate_fn(struct page *page, struct lruvec *lruvec, * is _really_ small and it's non-critical problem. */ SetPageReclaim(page); + add_page_to_lru_list(page, lruvec, lru); } else { /* * The page's writeback ends up during pagevec * We moves tha page into tail of inactive. + * + * The lazyfree page move into lru's tail to + * discard easily. */ - list_move_tail(&page->lru, &lruvec->lists[lru]); + add_page_to_lru_list_tail(page, lruvec, lru); __count_vm_event(PGROTATED); } -- 1.9.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists