From patchwork Thu Sep 14 15:21:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Weiner X-Patchwork-Id: 13385611 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 51FB6EEAA52 for ; Thu, 14 Sep 2023 15:21:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 955AF6B0281; Thu, 14 Sep 2023 11:21:44 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9059E6B02BA; Thu, 14 Sep 2023 11:21:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7A6336B02BC; Thu, 14 Sep 2023 11:21:44 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 670B66B0281 for ; Thu, 14 Sep 2023 11:21:44 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 340AB1C9ED5 for ; Thu, 14 Sep 2023 15:21:44 +0000 (UTC) X-FDA: 81235567728.13.B157F18 Received: from mail-qk1-f177.google.com (mail-qk1-f177.google.com [209.85.222.177]) by imf01.hostedemail.com (Postfix) with ESMTP id 58EED4001A for ; Thu, 14 Sep 2023 15:21:41 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=cmpxchg-org.20230601.gappssmtp.com header.s=20230601 header.b=hw8JjtB2; dmarc=pass (policy=none) header.from=cmpxchg.org; spf=pass (imf01.hostedemail.com: domain of hannes@cmpxchg.org designates 209.85.222.177 as permitted sender) smtp.mailfrom=hannes@cmpxchg.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1694704901; 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:references:dkim-signature; bh=a5AAJjTPKJrbM2I7UYPlK+5KUhbVO5e1/2BSYEunOT4=; b=BMPMDOa6EEA+H0bIBScDCJpL/PbmTYvZdvTJ6mrxcc3wEkiFFzAOPwkX7xKcRPu+gLfuFV pn5Fxjty8OURaGFtKs5ljkNNG0Zp7j3NJOJp1mUt37Npovf6uTlPOrrfSD0m4t983Hb70l hl0rR413+NL2ohRanu7YgJPf2DuBVyo= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=cmpxchg-org.20230601.gappssmtp.com header.s=20230601 header.b=hw8JjtB2; dmarc=pass (policy=none) header.from=cmpxchg.org; spf=pass (imf01.hostedemail.com: domain of hannes@cmpxchg.org designates 209.85.222.177 as permitted sender) smtp.mailfrom=hannes@cmpxchg.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694704901; a=rsa-sha256; cv=none; b=bD61WfGzV+GnhH34jSwPA+TUEyf8CDy1GRl2opiW6QvNItd5LDCKy9eWi3xJvl63ekJaFD l3lM1HSBED2nOt/MNcFCpiwF0kQCY5GK2E+E87wSVWPI8LMxq/8ZjpKRqe3adRqghLsCjA Zjfz+SXQtnCTqYHt/KZKBixHlZs1xeM= Received: by mail-qk1-f177.google.com with SMTP id af79cd13be357-77386822cfbso50268085a.0 for ; Thu, 14 Sep 2023 08:21:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cmpxchg-org.20230601.gappssmtp.com; s=20230601; t=1694704900; x=1695309700; darn=kvack.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=a5AAJjTPKJrbM2I7UYPlK+5KUhbVO5e1/2BSYEunOT4=; b=hw8JjtB2d1jRtprRdn5gnudw5UF7NS60LEfeIns2Rg1SX5savATt6L8G9iBt3s2DXj /MidYQhlXioqpjL+sxpM1jZ0YtG7a6LamB5LqjcsmgdraXtjrc5m5x9i3HOugklJEvLM /Ryrd7Eh9KpPTaRYSTliKNhf5eLCnZXn7atwgalHKQkNV6MIzpKiJuCdZjvWSFSGCBi7 i4jmCNYBoGD2hnI/ZVVro0K2Y9CTOB6ZGQikKylyc5eTp4su8rQnMKcqeULH8jnH7pHo BXGcIPRWj1in/G2N0V2YOuOtPdEQ4i0uy1uhyk1bC6mcTbzAdINiYV6SAxefuJ+2CbiK Sypw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694704900; x=1695309700; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=a5AAJjTPKJrbM2I7UYPlK+5KUhbVO5e1/2BSYEunOT4=; b=AiRHrdJErb3k7D+qc/iPQEodXxWvxcOk6qGsy74Er4sUXxfKlnoc5xEKfG10oYNt/z M97bsD/v3k2Xh4e6voVW8SeG5FeBHtXkS2H5zZLHPka1jkMqVX9FRFXoyUmcu6ChwVSz DGWnDmNt4y4SVi65BZ/pFS9KdoNp2VbXNbmAeGBbhIERwHFUrJPaaCRZxVxsSsGJyyFs g4YbI8x9vAHzBonB8Aoipqn76KmjexdpAF4TbFn625yx9ZVO6jIC20LQFZbudxZF0rSM f33eC84/g98JiK88187x8EqnJABA22WKj2PdkqaKUPutgmMcD8wAxv0zrkHd/+H5CCfY x3Bw== X-Gm-Message-State: AOJu0YzIXGlKJkevsaYCVdYIIIbMsZi+DRL/5BYzXmat4ITRR8B9hicr bP/cGlTqG9vIH5b1DiIfHCRTvg== X-Google-Smtp-Source: AGHT+IHgtk6WfW2S9wNIgrLhLx0aGlhPzs87X2FNRaKA/uPvD9Pcu8aQedVeuRULw1Fcn3jL1s7COw== X-Received: by 2002:a05:620a:404b:b0:76e:f279:4c36 with SMTP id i11-20020a05620a404b00b0076ef2794c36mr7068909qko.29.1694704900315; Thu, 14 Sep 2023 08:21:40 -0700 (PDT) Received: from localhost ([2620:10d:c091:400::5:35bb]) by smtp.gmail.com with ESMTPSA id ou19-20020a05620a621300b0076cf49bcb50sm543795qkn.37.2023.09.14.08.21.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Sep 2023 08:21:40 -0700 (PDT) From: Johannes Weiner To: Andrew Morton Cc: Shakeel Butt , Breno Leitao , Josef Bacik , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH] mm: memcontrol: fix GFP_NOFS recursion in memory.high enforcement Date: Thu, 14 Sep 2023 11:21:39 -0400 Message-ID: <20230914152139.100822-1-hannes@cmpxchg.org> X-Mailer: git-send-email 2.42.0 MIME-Version: 1.0 X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 58EED4001A X-Stat-Signature: gp5qrrcmn9bi4wafo17ajwwugs7r9teo X-Rspam-User: X-HE-Tag: 1694704901-938580 X-HE-Meta: U2FsdGVkX19BUIF4k+pXzB/XLnDY2Im6bNdbjFy8S/yq0zcDSEqTxm6G2pqVIF8XMHYUUxb3mrDioP28sSxWZspV77js1EreB/kAYrSG2WBY9jTUu1iqktKA6LaoPXOV1CqEHL3tyLWRnrBhMPDbQ1TVGBe7O7g2uHDY1+xEjrA/OoeUeNFr/OyCDOT9LujJnOqa/h+yV8Ecq9N7ZTEhCyLXrQDqH+y4bHLFtCZDwEP/G5IsiODfMV6z5GOqjtJjVXvRve7FzYNqice0unKdgluxhweTwojDaYBIWtQTqSXS856P5FEDYIoOxEcHxyDlvlTpKW7mSi+vKCvoJN3fdc/wPer0KmjhbwIae+Z3+mBE1RgbVIeS0zWz/QUD2C10NVVWOI89cPhUJ1Gu8ZK/N3mYdxkW2vvWnqM9varlAxLjEB0dGk2QVTAWYlHH/BQGEOxyJmQne6csQdZf4Y99x1kK5NWBByTSv+0HNTe4mKOkwyeMXc1PSblc94bXcaT9j5EHZ/khqildtsMEdhTdlYIuZcSEx2OSgI4s24cTQ8NBUeYUuAF3+z6wBy04VXPugSynwIOKlhumTzO0WfnuBToVkJQyIaeSER+uSoYMdn0b6MPnTX/eekWnyDJcIZgs6RY/+0K47kZgFjtU8oGBjgkzkB5t8xhobFmnAoF3jbzxuv7/4A262yPEQ68ht9hfRmVbspL2aOqxVO2DAOxMweDVZZE6b/9ir+hFSkj3214bVYGus0IAVs9OFiJ9Ymn2s+SfgASlWrWOYYloARyk6MF8mpX5gcc1YTZ9J1HaFtCsp6Pj5p50IRhTOAEkHFzF/SPJvyO1Hr6xRPPPoakJV3m4Si3+ebJ6oyVvn2J0b+LfR7ohazuL7i8S9rH0KiltJ1dy3cw9qRaqEQF2mgi/6cySAFu7zAeXuuP9zz+Bv34TYXVbFkvb9JUm+A4fbIcteJEldtN8aAzaLyAgqng VIezCgfx 83gJ8BYxzSOb1GBUGNyzqigZ1jx8cJ5MQZHRUM4b0bWmVttedOtXmzYocqIboBlxMUC8l1Gpp4lImXMRwk5B3Es0FVhOlEORiERJYeSJlZOt6f0zKlHozPpqOdW3qLikbAHAQvH54IZOPq+m64wLhHAfN/7wjSu+86fGQ434kSf825owYyGTO/g4xCQOokt4r43hEsQd4Fo6icH52o/P02pN3CLRfWdDVHpmtTpy6Tl4s7phoXSYSglH0zDreBNMCJ1x3ed0ZfFN1lBHeQyJuU1hLLu+dZv4zaJeccFZ3SK2gv4rfl1QArhO2pbBR7J7fK4aH6tMt+nKXF+kBo5APHcWiMdOuHuf6NV1BBny+AvIc0M1ygAXsJZQJ5HsOsG/rMxkwIMjq2Y8K5EHqyvGuw3FiqodtCXfbiUBJGOyipoO70rplrJoIVHAR1Ynp5GehOIB2r41h5DG4gayg4g9Wo0Ej1kP9urnXpPu69TI55gBTLJt/gKqCMKtHDyB06lJ1EXZgfsbZe+zvLuOwoDv7k+Itmd5vh6IgmaixO7FNVeerOAHi2JvZ367vR2l/jCQ8eNco61QJ3mUC8JmIBluaz+teB8RaTAPpD0e6Aq24fa22/DUXWZWzx/MmVOObaK0IMAoUw6mvOBnRfNF1rK26cFpRV6FXunib43x2PxfGwsoNY47Qpqkr95oi3fobDLyF5Yyk 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: Breno and Josef report a deadlock scenario from cgroup reclaim re-entering the filesystem: [ 361.546690] ====================================================== [ 361.559210] WARNING: possible circular locking dependency detected [ 361.571703] 6.5.0-0_fbk700_debug_rc0_kbuilder_13159_gbf787a128001 #1 Tainted: G S E [ 361.589704] ------------------------------------------------------ [ 361.602277] find/9315 is trying to acquire lock: [ 361.611625] ffff88837ba140c0 (&delayed_node->mutex){+.+.}-{4:4}, at: __btrfs_release_delayed_node+0x68/0x4f0 [ 361.631437] [ 361.631437] but task is already holding lock: [ 361.643243] ffff8881765b8678 (btrfs-tree-01){++++}-{4:4}, at: btrfs_tree_read_lock+0x1e/0x40 [ 362.904457] mutex_lock_nested+0x1c/0x30 [ 362.912414] __btrfs_release_delayed_node+0x68/0x4f0 [ 362.922460] btrfs_evict_inode+0x301/0x770 [ 362.982726] evict+0x17c/0x380 [ 362.988944] prune_icache_sb+0x100/0x1d0 [ 363.005559] super_cache_scan+0x1f8/0x260 [ 363.013695] do_shrink_slab+0x2a2/0x540 [ 363.021489] shrink_slab_memcg+0x237/0x3d0 [ 363.050606] shrink_slab+0xa7/0x240 [ 363.083382] shrink_node_memcgs+0x262/0x3b0 [ 363.091870] shrink_node+0x1a4/0x720 [ 363.099150] shrink_zones+0x1f6/0x5d0 [ 363.148798] do_try_to_free_pages+0x19b/0x5e0 [ 363.157633] try_to_free_mem_cgroup_pages+0x266/0x370 [ 363.190575] reclaim_high+0x16f/0x1f0 [ 363.208409] mem_cgroup_handle_over_high+0x10b/0x270 [ 363.246678] try_charge_memcg+0xaf2/0xc70 [ 363.304151] charge_memcg+0xf0/0x350 [ 363.320070] __mem_cgroup_charge+0x28/0x40 [ 363.328371] __filemap_add_folio+0x870/0xd50 [ 363.371303] filemap_add_folio+0xdd/0x310 [ 363.399696] __filemap_get_folio+0x2fc/0x7d0 [ 363.419086] pagecache_get_page+0xe/0x30 [ 363.427048] alloc_extent_buffer+0x1cd/0x6a0 [ 363.435704] read_tree_block+0x43/0xc0 [ 363.443316] read_block_for_search+0x361/0x510 [ 363.466690] btrfs_search_slot+0xc8c/0x1520 This is caused by the mem_cgroup_handle_over_high() not respecting the gfp_mask of the allocation context. We used to only call this function on resume to userspace, where no locks were held. But c9afe31ec443 ("memcg: synchronously enforce memory.high for large overcharges") added a call from the allocation context without considering the gfp. Reported-by: Breno Leitao Reported-by: Josef Bacik Fixes: c9afe31ec443 ("memcg: synchronously enforce memory.high for large overcharges") Cc: stable@vger.kernel.org # 5.17+ Signed-off-by: Johannes Weiner Acked-by: Shakeel Butt Acked-by: Michal Hocko --- include/linux/memcontrol.h | 4 ++-- include/linux/resume_user_mode.h | 2 +- mm/memcontrol.c | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index ab94ad4597d0..e4e24da16d2c 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -920,7 +920,7 @@ unsigned long mem_cgroup_get_zone_lru_size(struct lruvec *lruvec, return READ_ONCE(mz->lru_zone_size[zone_idx][lru]); } -void mem_cgroup_handle_over_high(void); +void mem_cgroup_handle_over_high(gfp_t gfp_mask); unsigned long mem_cgroup_get_max(struct mem_cgroup *memcg); @@ -1458,7 +1458,7 @@ static inline void mem_cgroup_unlock_pages(void) rcu_read_unlock(); } -static inline void mem_cgroup_handle_over_high(void) +static inline void mem_cgroup_handle_over_high(gfp_t gfp_mask) { } diff --git a/include/linux/resume_user_mode.h b/include/linux/resume_user_mode.h index 285189454449..f8f3e958e9cf 100644 --- a/include/linux/resume_user_mode.h +++ b/include/linux/resume_user_mode.h @@ -55,7 +55,7 @@ static inline void resume_user_mode_work(struct pt_regs *regs) } #endif - mem_cgroup_handle_over_high(); + mem_cgroup_handle_over_high(GFP_KERNEL); blkcg_maybe_throttle_current(); rseq_handle_notify_resume(NULL, regs); diff --git a/mm/memcontrol.c b/mm/memcontrol.c index a4d3282493b6..d13dde2f8b56 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2555,7 +2555,7 @@ static unsigned long calculate_high_delay(struct mem_cgroup *memcg, * Scheduled by try_charge() to be executed from the userland return path * and reclaims memory over the high limit. */ -void mem_cgroup_handle_over_high(void) +void mem_cgroup_handle_over_high(gfp_t gfp_mask) { unsigned long penalty_jiffies; unsigned long pflags; @@ -2583,7 +2583,7 @@ void mem_cgroup_handle_over_high(void) */ nr_reclaimed = reclaim_high(memcg, in_retry ? SWAP_CLUSTER_MAX : nr_pages, - GFP_KERNEL); + gfp_mask); /* * memory.high is breached and reclaim is unable to keep up. Throttle @@ -2819,7 +2819,7 @@ static int try_charge_memcg(struct mem_cgroup *memcg, gfp_t gfp_mask, if (current->memcg_nr_pages_over_high > MEMCG_CHARGE_BATCH && !(current->flags & PF_MEMALLOC) && gfpflags_allow_blocking(gfp_mask)) { - mem_cgroup_handle_over_high(); + mem_cgroup_handle_over_high(gfp_mask); } return 0; }