From patchwork Mon Apr 14 22:22:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joanne Koong X-Patchwork-Id: 14051091 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6760AC369B2 for ; Mon, 14 Apr 2025 22:22:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id AF63E2800A5; Mon, 14 Apr 2025 18:22:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AB561280099; Mon, 14 Apr 2025 18:22:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 94ACC2800A5; Mon, 14 Apr 2025 18:22:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 6DAFC280099 for ; Mon, 14 Apr 2025 18:22:35 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 51167C0793 for ; Mon, 14 Apr 2025 22:22:36 +0000 (UTC) X-FDA: 83334074712.09.BEFD774 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) by imf16.hostedemail.com (Postfix) with ESMTP id 356A0180004 for ; Mon, 14 Apr 2025 22:22:34 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=MY2Y3BTz; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf16.hostedemail.com: domain of joannelkoong@gmail.com designates 209.85.214.172 as permitted sender) smtp.mailfrom=joannelkoong@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744669354; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=+oWkQQZCAOmznqdU/77/ScxMiLxoOGJqTV4LeWuhZ1M=; b=4sloDb+Aye4bF5N+pWZ65QgdNwt0W+2QCCn/zRL3rU93ilpYUQFCBT7Og/AfNVJyV8mGKg dN1x8eE+9HNI7Jn0Z6JjTZn09p5Ace9I906DvSe67qXtaFyeqHENzeyyyJt/60ji3KpGK1 7uAbWkA1eQCy05DVGbmuJ5M4FG39Cp8= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=MY2Y3BTz; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf16.hostedemail.com: domain of joannelkoong@gmail.com designates 209.85.214.172 as permitted sender) smtp.mailfrom=joannelkoong@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744669354; a=rsa-sha256; cv=none; b=ptkNsZMqmXnToFdRQeL9n+1Laq0ZQ7uMk5eYEabTDVxzEO4Kl1bt8odgmRaCMv+aRovZSF WzVPtUyUKksYIBDxSXPr8Bk9VcQ69E2kr1L+GRul06bkykzlHJQp2Nd3kG80pr68iHIqqA fij3XEBHl4PH4XvH1ikFW0lVZNhPaYA= Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-224341bbc1dso42915795ad.3 for ; Mon, 14 Apr 2025 15:22:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744669353; x=1745274153; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+oWkQQZCAOmznqdU/77/ScxMiLxoOGJqTV4LeWuhZ1M=; b=MY2Y3BTzLlMk2V2j+KfZnTT18/pbxo2McEkYuxjvk6B+Rcl7K5c7Tmbkf1eNX5cgi8 ErhyrOOYOW/Ut9YEkZ3chwy3O/A7bL33DU+iUgjcS1/fT0D8fpw/0xkTzTDc07rLmKw9 zurR2Ylug19cqpZqu/tj8vbRwvDsVU1qv+AjrreuIOwn7kfspxrBgFQqfGBqLYasa/Qv JKgoiGsP2nTqWS9NI2An3OdboAlb5DydetjD97H5basDqF78tQ29CfX9LGDPGrZqWIoJ eIFpBCO5CA5e63ZELjKksQT3Amt5cIMcEDcVKnxEhyUzeVhyXzpoYdqMhWOMLceVAAY3 pQKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744669353; x=1745274153; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+oWkQQZCAOmznqdU/77/ScxMiLxoOGJqTV4LeWuhZ1M=; b=n0kNHMGf7n/bYXIR/BZY+xbYGtuGJoFHAJHbBvZiNgweNwCnJJNurAHmoBX2wT7I6n UuqxNP8V40v9RPoQYgi4aDLwf6IvBSUWe436JOUfP76Ysg7WLk3gVGRTwLzfl+Oyj/YC /MQLnOlBamqFzjgwUgYFaDhxBv+9ZEstQLhat32rKFzarf/OoXeWNAEmx6GavCYCN903 AxjtlriJH32WqCy9Bc20PoYDzgnJfHM0zik5snYWHKJUvyHMulcWF6qLtTOR+sxIN7Ed B+YPnsFB57ABAeYKzKalRvpNngX3YeDi3q3XEc3vq/wXwWDjVuixPt0oAWTHtPpBaoLX dy1A== X-Forwarded-Encrypted: i=1; AJvYcCXyPO3VzGJmMlA7k1k1K5+z54/QJjXNsjQdSeDyzSsucQa8pX9H0aPKhqInLTfGdSo7nE/hqwZVaQ==@kvack.org X-Gm-Message-State: AOJu0YzcGIcRYb/bsT8TUMfVHRkqgP4YjXlkTkITeWrEjYxNXT0LOA5z /o6/1Oh+lpcZSjRTnN7uAtd8SvkE56Xr0kOYto+3d1OPYXbB0XqI X-Gm-Gg: ASbGncsx7ebqZySVpcMiVQHz5StqqbU07eedRGVc7u2xEBX8unrR1zVluEjQGOVlkTy ys951Ub5rqRwePX6HPCVOJdgKfAtABbIet97MylEQI6gUNO6WPtJcipQ07tpn5nUirKFLyQr1VO 5FnyaEw5PLqPRsnbWdbfRMsuy4ws6EQbeazBo5XMxs6yVz9AkLEkabKCB+wZdm/ZZWgoKsdXV+j elNURkH2ZT7UxH0HusU+lEFzTLt3w6V9jAyIysCLG/+XtXKx4exMMZm171KMqdYRlSL+1zADVVx AQJCiRE5a3EHOcgQYmOiUKZhTCjJL4EEFoxt X-Google-Smtp-Source: AGHT+IHEGRK/+NruAidysEEd0d6+/ry3wrbvhjNA81WN8QlEjydKcUEb/SGYslzu/JsgG0cqfHY9dA== X-Received: by 2002:a17:902:fc4b:b0:223:5e56:a1ce with SMTP id d9443c01a7336-22bea4f26afmr196339345ad.32.1744669352990; Mon, 14 Apr 2025 15:22:32 -0700 (PDT) Received: from localhost ([2a03:2880:ff:72::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22ac7b8afe3sm104279825ad.75.2025.04.14.15.22.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 15:22:32 -0700 (PDT) From: Joanne Koong To: miklos@szeredi.hu, akpm@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Cc: jefflexu@linux.alibaba.com, shakeel.butt@linux.dev, david@redhat.com, bernd.schubert@fastmail.fm, ziy@nvidia.com, jlayton@kernel.org, kernel-team@meta.com, Miklos Szeredi Subject: [PATCH v8 1/2] mm: skip folio reclaim in legacy memcg contexts for deadlockable mappings Date: Mon, 14 Apr 2025 15:22:09 -0700 Message-ID: <20250414222210.3995795-2-joannelkoong@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250414222210.3995795-1-joannelkoong@gmail.com> References: <20250414222210.3995795-1-joannelkoong@gmail.com> MIME-Version: 1.0 X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: 356A0180004 X-Stat-Signature: 9db9pypa1dk14zyfezwc1jbkwer8hmi1 X-Rspam-User: X-HE-Tag: 1744669354-41147 X-HE-Meta: U2FsdGVkX1+JEPlAMxtoW2qDkFHVcNnZK/zK200HV6G0bKelHKinyGl9Ma9xK9C+Vg9ZrtD7WGjkvb3OpBOfNyrmigq17P2gyXntkwd6kxtI3LN/qWL20LQ0Rp6rLYKTh84Y5YK3FyjZog5vH5SbtBaGeHvRY/e8rro+lLb66OVipOpXFFNbUidjgsDCEPLhHcBHop1mHz8/J/vUEXm64d4uV9W81WBS9GtfIsvxmFYcAoSto53N6krRbkRcxe1aiEjTqEBpjgvXUh4Tl4K4ibXpHYLMVOZrl+GFA39/yMv59bgXc9N8Z3gLNqOdjxmAiGoeicVuqmzJLHnSoMLAGJ8gQ4HLMze4njDSe/5PYFzHX61TvSy1/jYOOyJNCIZomZ7uByZSWbzyx7YkociwgDVBpksuzB+vSOfNGMd/A8LXoRyeptdFedRa/YTzqFvXZGCaIKh1hNiCdBMF4CfI25LxHDPTSfyOZsLdXGcdv9CtuD2jYTwmI+a6v5F8BzJfhE3vAVGbGPlL6LLDG/UFuDce2adeporijj80cdw1ghTqJcTZUEqcAcmS09WHyHudlJYFhwYJmVS/OBu7MASmweHWUkcfxKuGfJ+qRMF/oI6v/no0LXt0Ao9rXMRX3Nh2PqCaA1lInhSY6tPrcljKTMsrDjkQ/WL7SBTz4MEsHBGrjxYG2ucJ47qtUSNaLCfKCgE6HNwOyoIsS8QuHyIM+P9vh/JlbhpujBS5X6eijlwXx3DjLyEGkZfV7OSB14PovD7phx0tacdveyzFXZU00loerRxLnTE4FSwwRoh4ev+tWy9dwiRIy4swTuWUuug2ICcN5yeK4M4b+MOqRCiyn1wa6676eObFtGFGzKxUS1lE7g7BASNs11oiPiAEoB5VxJDMk301FSQ87wrfVeICzEbdJn6JZZV3O9Riw5U39Axh+JeXREAf6eRcU68uB2rUF0fRNpnj28qv7FnecrQ a3lUtq6E KRIrzy4VlJSxUk3Y9zjllDeh7VMjtnxDiJxw2UBF3u9BuwFbdZSprUqlfaTL31VP7DHVHa1lIXC5GjRdGeg9mJMg7Zi5/lWWO4kEDbqTzWbcPhTTgwbKN6B92OhaBD3o3sSX1/Vr6JO5BVJXZzvm/Iy+loa9kAPwql7dz6vRUNA98y0I+IiF2p94QFT2lFrzLVLK2zQLtlP951FFXY8xaZtinbWnhVdhkViu+8lsXLmpQz+y7brf8evPAfvIbKSUuS0oHndGZRk6zxU7Pe5C7bgFBByD3m9wN6f5HcwiqZJZ5afymArbvUjPZLI58dQlGmY/FFJLP2Fg73vgs/FSoLz0HctkuGBNlWi6tX/4Jw9RffT1xkI4ciXEpKABUWkUQj8KJd+63By9FTBOQ+OfGeH8IsydQvpCg33ArCx2ab1id7T2nYIGDh6Got5r0QhhZn1g1wEFDxiKleZjFSJ9rdY4geULmKXX7Gtr0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Currently in shrink_folio_list(), reclaim for folios under writeback falls into 3 different cases: 1) Reclaim is encountering an excessive number of folios under writeback and this folio has both the writeback and reclaim flags set 2) Dirty throttling is enabled (this happens if reclaim through cgroup is not enabled, if reclaim through cgroupv2 memcg is enabled, or if reclaim is on the root cgroup), or if the folio is not marked for immediate reclaim, or if the caller does not have __GFP_FS (or __GFP_IO if it's going to swap) set 3) Legacy cgroupv1 encounters a folio that already has the reclaim flag set and the caller did not have __GFP_FS (or __GFP_IO if swap) set In cases 1) and 2), we activate the folio and skip reclaiming it while in case 3), we wait for writeback to finish on the folio and then try to reclaim the folio again. In case 3, we wait on writeback because cgroupv1 does not have dirty folio throttling, as such this is a mitigation against the case where there are too many folios in writeback with nothing else to reclaim. If a filesystem (eg fuse) may deadlock due to reclaim waiting on writeback, then the filesystem needs to add inefficient messy workarounds to prevent this. To improve the performance of these filesystems, this commit adds two things: a) a AS_WRITEBACK_MAY_DEADLOCK_ON_RECLAIM mapping flag that filesystems may set to indicate that reclaim should not wait on writeback b) if legacy memcg encounters a folio with this AS_WRITEBACK_MAY_DEADLOCK_ON_RECLAIM flag set (eg case 3), the folio will be activated and skip reclaim (eg default to behavior in case 2) instead. Signed-off-by: Joanne Koong Reviewed-by: Shakeel Butt Acked-by: Miklos Szeredi Reviewed-by: Jeff Layton Acked-by: David Hildenbrand --- include/linux/pagemap.h | 11 +++++++++++ mm/vmscan.c | 12 +++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 47bfc6b1b632..14c17279333f 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -210,6 +210,7 @@ enum mapping_flags { AS_STABLE_WRITES = 7, /* must wait for writeback before modifying folio contents */ AS_INACCESSIBLE = 8, /* Do not attempt direct R/W access to the mapping */ + AS_WRITEBACK_MAY_DEADLOCK_ON_RECLAIM = 9, /* Bits 16-25 are used for FOLIO_ORDER */ AS_FOLIO_ORDER_BITS = 5, AS_FOLIO_ORDER_MIN = 16, @@ -335,6 +336,16 @@ static inline bool mapping_inaccessible(struct address_space *mapping) return test_bit(AS_INACCESSIBLE, &mapping->flags); } +static inline void mapping_set_writeback_may_deadlock_on_reclaim(struct address_space *mapping) +{ + set_bit(AS_WRITEBACK_MAY_DEADLOCK_ON_RECLAIM, &mapping->flags); +} + +static inline bool mapping_writeback_may_deadlock_on_reclaim(struct address_space *mapping) +{ + return test_bit(AS_WRITEBACK_MAY_DEADLOCK_ON_RECLAIM, &mapping->flags); +} + static inline gfp_t mapping_gfp_mask(struct address_space * mapping) { return mapping->gfp_mask; diff --git a/mm/vmscan.c b/mm/vmscan.c index c767d71c43d7..977ae68b6d5d 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1165,8 +1165,10 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, * 2) Global or new memcg reclaim encounters a folio that is * not marked for immediate reclaim, or the caller does not * have __GFP_FS (or __GFP_IO if it's simply going to swap, - * not to fs). In this case mark the folio for immediate - * reclaim and continue scanning. + * not to fs), or the folio belongs to a mapping where + * waiting on writeback during reclaim may lead to a deadlock. + * In this case mark the folio for immediate reclaim and + * continue scanning. * * Require may_enter_fs() because we would wait on fs, which * may not have submitted I/O yet. And the loop driver might @@ -1191,6 +1193,8 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, * takes to write them to disk. */ if (folio_test_writeback(folio)) { + mapping = folio_mapping(folio); + /* Case 1 above */ if (current_is_kswapd() && folio_test_reclaim(folio) && @@ -1201,7 +1205,9 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, /* Case 2 above */ } else if (writeback_throttling_sane(sc) || !folio_test_reclaim(folio) || - !may_enter_fs(folio, sc->gfp_mask)) { + !may_enter_fs(folio, sc->gfp_mask) || + (mapping && + mapping_writeback_may_deadlock_on_reclaim(mapping))) { /* * This is slightly racy - * folio_end_writeback() might have