mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-26 06:33:19 -04:00
mm: do not shrink pages marked for reclaim by MADV_FREE
MADV_FREE clears pte dirty bit and then marks the page lazyfree (clear SwapBacked). PPR increments ISOLATE_FILES count, then isolates page and invokes a reclaim. Inbetween if this lazyfreed page is touched by user then it becomes dirty. PPR in shrink_page_list in try_to_unmap finds the page dirty, marks it back as PageSwapBacked and skips reclaim. As PageSwapBacked set, PPR identifies the page as anon and decrements ISOLATED_ANON, thus creating isolated count mismatch. This results in too_many_isolated() check causing delay in reclaim. Skip reclaiming lazyfreed pages in PPR path. Change-Id: I87223c4fa492c5e373ac48f116384b5de03da9fa Signed-off-by: Prakash Gupta <guptap@codeaurora.org> Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
This commit is contained in:
parent
8543fd31f2
commit
a25275e2bd
1 changed files with 12 additions and 0 deletions
|
|
@ -1742,6 +1742,18 @@ cont:
|
|||
if (isolate_lru_page(compound_head(page)))
|
||||
continue;
|
||||
|
||||
/* MADV_FREE clears pte dirty bit and then marks the page
|
||||
* lazyfree (clear SwapBacked). Inbetween if this lazyfreed page
|
||||
* is touched by user then it becomes dirty. PPR in
|
||||
* shrink_page_list in try_to_unmap finds the page dirty, marks
|
||||
* it back as PageSwapBacked and skips reclaim. This can cause
|
||||
* isolated count mismatch.
|
||||
*/
|
||||
if (PageAnon(page) && !PageSwapBacked(page)) {
|
||||
putback_lru_page(page);
|
||||
continue;
|
||||
}
|
||||
|
||||
list_add(&page->lru, &page_list);
|
||||
inc_node_page_state(page, NR_ISOLATED_ANON +
|
||||
page_is_file_cache(page));
|
||||
|
|
|
|||
Loading…
Reference in a new issue