From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf0-f199.google.com (mail-pf0-f199.google.com [209.85.192.199]) by kanga.kvack.org (Postfix) with ESMTP id 168EA6B0033 for ; Thu, 23 Nov 2017 19:05:04 -0500 (EST) Received: by mail-pf0-f199.google.com with SMTP id t77so7443548pfe.10 for ; Thu, 23 Nov 2017 16:05:04 -0800 (PST) Received: from lgeamrelo12.lge.com (LGEAMRELO12.lge.com. [156.147.23.52]) by mx.google.com with ESMTP id l30si17023873plg.363.2017.11.23.16.05.01 for ; Thu, 23 Nov 2017 16:05:02 -0800 (PST) From: Minchan Kim Subject: [PATCH] mm: Do not stall register_shrinker Date: Fri, 24 Nov 2017 09:04:59 +0900 Message-Id: <1511481899-20335-1-git-send-email-minchan@kernel.org> Sender: owner-linux-mm@kvack.org List-ID: To: Andrew Morton Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel-team , Minchan Kim , Michal Hocko , Tetsuo Handa , Shakeel Butt , Johannes Weiner Shakeel Butt reported, he have observed in production system that the job loader gets stuck for 10s of seconds while doing mount operation. It turns out that it was stuck in register_shrinker() and some unrelated job was under memory pressure and spending time in shrink_slab(). Machines have a lot of shrinkers registered and jobs under memory pressure has to traverse all of those memcg-aware shrinkers and do affect unrelated jobs which want to register their own shrinkers. To solve the issue, this patch simply bails out slab shrinking once it found someone want to register shrinker in parallel. A downside is it could cause unfair shrinking between shrinkers. However, it should be rare and we can add compilcated logic once we found it's not enough. Link: http://lkml.kernel.org/r/20171115005602.GB23810@bbox Cc: Michal Hocko Cc: Tetsuo Handa Acked-by: Johannes Weiner Reported-and-tested-by: Shakeel Butt Signed-off-by: Shakeel Butt Signed-off-by: Minchan Kim --- mm/vmscan.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mm/vmscan.c b/mm/vmscan.c index 6a5a72baccd5..6698001787bd 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -486,6 +486,14 @@ static unsigned long shrink_slab(gfp_t gfp_mask, int nid, sc.nid = 0; freed += do_shrink_slab(&sc, shrinker, priority); + /* + * bail out if someone want to register a new shrinker to + * prevent long time stall by parallel ongoing shrinking. + */ + if (rwsem_is_contended(&shrinker_rwsem)) { + freed = freed ? : 1; + break; + } } up_read(&shrinker_rwsem); -- 2.7.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org