[PATCH] mm/percpu: avoid IO dependency in alloc_percpu
From: Khazhismel Kumykov
Date: Mon Jun 15 2026 - 21:25:16 EST
percpu_alloc users within noio context may block on other percpu_alloc
users doing IO due to the shared pcpu_alloc_mutex. pcpu_balance_workfn
already grabs under noio context - update remaining holders to also run
under noio.
Lockdep reported this as a circular locking dependency, with one caller
having entered fs_reclaim holding pcpu_alloc_mutex, and the second
caller (elevator init) grabbing pcpu_alloc_mutex in noio context.
Fixes: 9a5b183941b5 ("mm, percpu: do not consider sleepable allocations atomic")
Signed-off-by: Khazhismel Kumykov <khazhy@xxxxxxxxxx>
---
mm/percpu.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/mm/percpu.c b/mm/percpu.c
index b0676b8054ed..50057403ae79 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -1749,8 +1749,13 @@ void __percpu *pcpu_alloc_noprof(size_t size, size_t align, bool reserved,
size_t bits, bit_align;
gfp = current_gfp_context(gfp);
- /* whitelisted flags that can be passed to the backing allocators */
- pcpu_gfp = gfp & (GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN);
+ /*
+ * whitelisted flags that can be passed to the backing allocators.
+ *
+ * Allocations must be GFP_NOIO, else users in noio/nofs contexts may
+ * form dependency through pcpu_alloc_mutex
+ */
+ pcpu_gfp = gfp & (GFP_NOIO | __GFP_NORETRY | __GFP_NOWARN);
is_atomic = !gfpflags_allow_blocking(gfp);
do_warn = !(gfp & __GFP_NOWARN);
--
2.54.0.1189.g8c84645362-goog