diff options
author | Steven Rostedt <rostedt@goodmis.org> | 2016-07-14 17:55:21 -0400 |
---|---|---|
committer | Sasha Levin <alexander.levin@verizon.com> | 2016-07-19 15:49:46 -0400 |
commit | 74225a4cbea38034034add5da67a2f7ee23251c0 (patch) | |
tree | e060cfec15639510c27bda9b54807ace01377b81 | |
parent | 62d7a4540e294d77c7c758ce7cd73264ba461fa8 (diff) | |
download | linux-stable-74225a4cbea38034034add5da67a2f7ee23251c0.tar.gz |
4.1.28 Fix bad backport of 8f182270dfec "mm/swap.c: flush lru pvecs on compound page arrival"
When I pulled in 4.1.28 into my stable 4.1-rt tree and ran the tests,
it crashed with a severe OOM killing everything. I then tested 4.1.28
without -rt and it had the same issue. I did a bisect between 4.1.27
and 4.1.28 and found that the bug started at:
commit 8f182270dfec "mm/swap.c: flush lru pvecs on compound page
arrival"
Looking at that patch and what's in mainline, I see that there's a
mismatch in one of the hunks:
Mainline:
@@ -391,9 +391,8 @@ static void __lru_cache_add(struct page *page)
struct pagevec *pvec = &get_cpu_var(lru_add_pvec);
get_page(page);
- if (!pagevec_space(pvec))
+ if (!pagevec_add(pvec, page) || PageCompound(page))
__pagevec_lru_add(pvec);
- pagevec_add(pvec, page);
put_cpu_var(lru_add_pvec);
}
Stable 4.1.28:
@@ -631,9 +631,8 @@ static void __lru_cache_add(struct page *page)
struct pagevec *pvec = &get_cpu_var(lru_add_pvec);
page_cache_get(page);
- if (!pagevec_space(pvec))
+ if (!pagevec_space(pvec) || PageCompound(page))
__pagevec_lru_add(pvec);
- pagevec_add(pvec, page);
put_cpu_var(lru_add_pvec);
}
Where mainline replace pagevec_space() with pagevec_add, and stable did
not.
Fixing this makes the OOM go away.
Note, 3.18 has the same bug.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
-rw-r--r-- | mm/swap.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/mm/swap.c b/mm/swap.c index b523f0a4cbfb..ab3b9c2dd783 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -631,7 +631,7 @@ static void __lru_cache_add(struct page *page) struct pagevec *pvec = &get_cpu_var(lru_add_pvec); page_cache_get(page); - if (!pagevec_space(pvec) || PageCompound(page)) + if (!pagevec_add(pvec, page) || PageCompound(page)) __pagevec_lru_add(pvec); put_cpu_var(lru_add_pvec); } |