From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f65.google.com ([74.125.82.65]:35570 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751756AbcGOGzI (ORCPT ); Fri, 15 Jul 2016 02:55:08 -0400 Received: by mail-wm0-f65.google.com with SMTP id i5so1139418wmg.2 for ; Thu, 14 Jul 2016 23:55:07 -0700 (PDT) Date: Fri, 15 Jul 2016 08:55:05 +0200 From: Michal Hocko To: Steven Rostedt Cc: Sasha Levin , stable , Andrew Morton Subject: Re: [PATCH] 4.1.28 Fix bad backport of 8f182270dfec "mm/swap.c: flush lru pvecs on compound page arrival" Message-ID: <20160715065504.GA11811@dhcp22.suse.cz> References: <20160714175521.3675e3d6@gandalf.local.home> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160714175521.3675e3d6@gandalf.local.home> Sender: stable-owner@vger.kernel.org List-ID: On Thu 14-07-16 17:55:21, Steven Rostedt wrote: > 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); > } Heh, I've made the same mistake when backporting this to our older SLES based kernel initially. I was lucky the system even didn't boot. Sorry that I didn't find time to review the stable backport. > 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 Acked-by: Michal Hocko > --- > 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); > } -- Michal Hocko SUSE Labs