Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp934709pxu; Wed, 2 Dec 2020 07:05:59 -0800 (PST) X-Google-Smtp-Source: ABdhPJzK7s/BkTmarHkKyC2Tc6MPjByp7/D0uzVnkmJvVSWbUIEzuiiRzcr6VabAdhW+KKC1g1Cx X-Received: by 2002:a50:cdc8:: with SMTP id h8mr304155edj.37.1606921558736; Wed, 02 Dec 2020 07:05:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606921558; cv=none; d=google.com; s=arc-20160816; b=H2KeNIpLmib2RYMJ2jbrN1fIZkw/n6DdZRnoyGxAOdk4ne39/MwqqwX5hOgDevm7pC rLqsohFVarZXGMyRh3f4d7j/JtTgnnb1b2TAfoadw/1+Bb0XKqVYYOgg0kkmJ9ZJPq3w G5rv6at6hAjl7xtnhrrd5aB9AaF/4JlmYmQTUpKKv06Hc9swXPtbpvXSjdFRL5podYEh eRZQYy3498TsMuMd1qLjWTPIYqR1rIIJgG/xjvebjYp+4lUkLGeXxeOEtTv2GH8iS04a 7eOxr0bKd9bhFJWnMCVLksG71MQrYdF3/GNHS4JU/tXF0ugGPvFoNsZyFZYhYdwZUuXH poqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=+AY9trJkRf9cxwS80EFbb5/8Q9oqK1NT5wAK/bAfyuA=; b=wqqgKnJwgzcXI6+U2Ptjuey+FkAPtsLhf7okR6vBwE0ILZqdrCB1WgmUpxy78j9KDT HBJBSDShnoeeCmb0fsYe1xIsaVqAl0sYeK12sjmcMDPvwOGKcDSo/Eb6NFwa4groEUuy k/+ZU2eUUFTg54sTwVWciMIhKAdHvQ8RHP8F9v0jq8rc4hwZhRk5vgvMxXUon4t7d7FS GKvlE1TEDDAhV0XqzQ/4yXXta2ExAboMB7b9tIVlVqkAFJX4MIcFLdct2DXqHflkWwtn ZE9sjgmR1sYoIJVn2B/e3dlHD4zSkb4QV0g+ArttaIm+DK3fHHASWB49x/qC5TDASDk/ OLcQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=hHA2aVTI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d16si121512ejm.152.2020.12.02.07.05.34; Wed, 02 Dec 2020 07:05:58 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=hHA2aVTI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727415AbgLBPB4 (ORCPT + 99 others); Wed, 2 Dec 2020 10:01:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47598 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726620AbgLBPB4 (ORCPT ); Wed, 2 Dec 2020 10:01:56 -0500 Received: from mail-lj1-x235.google.com (mail-lj1-x235.google.com [IPv6:2a00:1450:4864:20::235]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1C73BC0613D6 for ; Wed, 2 Dec 2020 07:01:10 -0800 (PST) Received: by mail-lj1-x235.google.com with SMTP id y10so4085804ljc.7 for ; Wed, 02 Dec 2020 07:01:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=+AY9trJkRf9cxwS80EFbb5/8Q9oqK1NT5wAK/bAfyuA=; b=hHA2aVTI1aAvsxPGY7CXBZa7EJEfdZXG9AAhz0Nk13+0/vviSbyGTsSFlI83PX2W/A 9EsuDVKyc8xiQWKiDtM8DET2BvFmo6Wy8cxFwVp0JYcKHURDgVCKP/heXChSAG3UpKG4 xXnGshxq35QveZnKgL0IIrTyxR/N4NMxQBgK91eo1dEXELFUxibZtmlsiWYa04ArX7Bp lp+Dtk4KOj8SMtS114AM94kpYaaJ6rD3CoD8YAdNRASkUmfXneFJmB5sLRlBysAZ8Ac2 4daGWY4A54FU0CWuRVRGoaSAUPKVHqQnKzVSqUEy3kklbK839ZH2GgbD/eoc0bD/iDs5 o1PQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=+AY9trJkRf9cxwS80EFbb5/8Q9oqK1NT5wAK/bAfyuA=; b=TV+OnH26e/dMW352Nna2SjvqH+Esr9SFGUebOIKRaTvS+B9TX0JD4noiaPcQ4vAKdG XtXbRnbr/YJXp/ph2Z+VaOw+BhCoaJW9AfIL8WtoP+tg/msHI1zIXZps31Lx/gUZ3nnf Ab49N2w+LtAiJqewwCvUiaFbUKhLmsX1S+hP11iXwV3hIvC0f3BRBB2BMyqM2mdlkJph hoHySsGm0EcKCdP6nK66LexnUsQyHShNyhdgNtIRF6VLWY+dBnj6AGPWYP+ts4ExzKsN wD45vnJGkXHuicQx6MA7pH8LqQQ6oBRHxSJ3vWIM+cu5qG0Iawi/Xj10IM7aSEsD1YQJ fLZw== X-Gm-Message-State: AOAM5320KPrsuKTIn5xrjBu4qju+A5ZkPb+snk+eijA/rVi2kAeAXiIN 6PsxZN3Z4b//UtokzCWqy7A8au1KK6Oba/RiJErROg== X-Received: by 2002:a2e:9746:: with SMTP id f6mr1273915ljj.270.1606921267017; Wed, 02 Dec 2020 07:01:07 -0800 (PST) MIME-Version: 1.0 References: <20201201212553.52164-1-shy828301@gmail.com> In-Reply-To: <20201201212553.52164-1-shy828301@gmail.com> From: Shakeel Butt Date: Wed, 2 Dec 2020 07:00:55 -0800 Message-ID: Subject: Re: [v3 PATCH] mm: list_lru: set shrinker map bit when child nr_items is not zero To: Yang Shi Cc: Roman Gushchin , Kirill Tkhai , Vladimir Davydov , Andrew Morton , Linux MM , LKML , stable@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Dec 1, 2020 at 1:25 PM Yang Shi wrote: > > When investigating a slab cache bloat problem, significant amount of > negative dentry cache was seen, but confusingly they neither got shrunk > by reclaimer (the host has very tight memory) nor be shrunk by dropping > cache. The vmcore shows there are over 14M negative dentry objects on lru, > but tracing result shows they were even not scanned at all. The further > investigation shows the memcg's vfs shrinker_map bit is not set. So the > reclaimer or dropping cache just skip calling vfs shrinker. So we have > to reboot the hosts to get the memory back. > > I didn't manage to come up with a reproducer in test environment, and the > problem can't be reproduced after rebooting. But it seems there is race > between shrinker map bit clear and reparenting by code inspection. The > hypothesis is elaborated as below. > > The memcg hierarchy on our production environment looks like: > root > / \ > system user > > The main workloads are running under user slice's children, and it creates > and removes memcg frequently. So reparenting happens very often under user > slice, but no task is under user slice directly. > > So with the frequent reparenting and tight memory pressure, the below > hypothetical race condition may happen: > > CPU A CPU B > reparent > dst->nr_items == 0 > shrinker: > total_objects == 0 > add src->nr_items to dst > set_bit > retrun SHRINK_EMPTY return > clear_bit > child memcg offline > replace child's kmemcg_id to with > parent's (in memcg_offline_kmem()) > list_lru_del() between shrinker runs > see parent's kmemcg_id > dec dst->nr_items > reparent again > dst->nr_items may go negative > due to concurrent list_lru_del() > > The second run of shrinker: > read nr_items without any > synchronization, so it may > see intermediate negative > nr_items then total_objects > may return 0 conincidently coincidently > > keep the bit cleared > dst->nr_items != 0 > skip set_bit > add scr->nr_item to dst > > After this point dst->nr_item may never go zero, so reparenting will not > set shrinker_map bit anymore. And since there is no task under user > slice directly, so no new object will be added to its lru to set the > shrinker map bit either. That bit is kept cleared forever. > > How does list_lru_del() race with reparenting? It is because > reparenting replaces childen's kmemcg_id to parent's without protecting children's > from nlru->lock, so list_lru_del() may see parent's kmemcg_id but > actually deleting items from child's lru, but dec'ing parent's nr_items, > so the parent's nr_items may go negative as commit > 2788cf0c401c268b4819c5407493a8769b7007aa ("memcg: reparent list_lrus and > free kmemcg_id on css offline") says. > > Since it is impossible that dst->nr_items goes negative and > src->nr_items goes zero at the same time, so it seems we could set the > shrinker map bit iff src->nr_items != 0. We could synchronize > list_lru_count_one() and reparenting with nlru->lock, but it seems > checking src->nr_items in reparenting is the simplest and avoids lock > contention. > > Fixes: fae91d6d8be5 ("mm/list_lru.c: set bit in memcg shrinker bitmap on first list_lru item appearance") > Suggested-by: Roman Gushchin > Reviewed-by: Roman Gushchin > Cc: Vladimir Davydov > Cc: Kirill Tkhai > Cc: Shakeel Butt > Cc: v4.19+ > Signed-off-by: Yang Shi Reviewed-by: Shakeel Butt