diff options
author | Kirill A. Shutemov <kirill@shutemov.name> | 2019-11-30 17:57:15 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-12-01 12:59:09 -0800 |
commit | f1fe80d4ae3396cf3665bd6dc77f4004c1c2e9f8 (patch) | |
tree | 0c016f5ea0da2e28754532129a7b417b4df2a36f /mm | |
parent | 74d4a5797b89048a5b20746da7e80af1e73b8547 (diff) | |
download | linux-f1fe80d4ae3396cf3665bd6dc77f4004c1c2e9f8.tar.gz linux-f1fe80d4ae3396cf3665bd6dc77f4004c1c2e9f8.tar.bz2 linux-f1fe80d4ae3396cf3665bd6dc77f4004c1c2e9f8.zip |
mm, thp: do not queue fully unmapped pages for deferred split
Adding fully unmapped pages into deferred split queue is not productive:
these pages are about to be freed or they are pinned and cannot be split
anyway.
Link: http://lkml.kernel.org/r/20190913091849.11151-1-kirill.shutemov@linux.intel.com
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Reviewed-by: Yang Shi <yang.shi@linux.alibaba.com>
Cc: Michal Hocko <mhocko@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/rmap.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/mm/rmap.c b/mm/rmap.c index 72a3280b982e..b3e381919835 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -1292,12 +1292,20 @@ static void page_remove_anon_compound_rmap(struct page *page) if (TestClearPageDoubleMap(page)) { /* * Subpages can be mapped with PTEs too. Check how many of - * themi are still mapped. + * them are still mapped. */ for (i = 0, nr = 0; i < HPAGE_PMD_NR; i++) { if (atomic_add_negative(-1, &page[i]._mapcount)) nr++; } + + /* + * Queue the page for deferred split if at least one small + * page of the compound page is unmapped, but at least one + * small page is still mapped. + */ + if (nr && nr < HPAGE_PMD_NR) + deferred_split_huge_page(page); } else { nr = HPAGE_PMD_NR; } @@ -1305,10 +1313,8 @@ static void page_remove_anon_compound_rmap(struct page *page) if (unlikely(PageMlocked(page))) clear_page_mlock(page); - if (nr) { + if (nr) __mod_node_page_state(page_pgdat(page), NR_ANON_MAPPED, -nr); - deferred_split_huge_page(page); - } } /** |