From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dy1-f201.google.com (mail-dy1-f201.google.com [74.125.82.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A886136403B for ; Fri, 24 Apr 2026 19:17:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777058224; cv=none; b=VTzu+k9mZbWt3rsWW71z3my9G6V2KY7UbPvc8IXxZTElfmRnNVIzY4hh4TbCqkw/q2K5vYnihGbWt6bxjzl59CLdcvAvpjMODE58ttSQFm4ZdzQeYKW7kaHPc65jZlFNcDXcCsSqPOLsSpOZXWXoNkXQYz9woTR992wFopeFHrw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777058224; c=relaxed/simple; bh=tNuwyKpalaIl3acwaoWFy9weySepbDKU/1IbYZVQRVA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Ib6i7IwnO2bnimrIDrBVO0CWcM38Xxf5zvXriVQgOwxX/FJf9HQFHcFlOFtYjBqS0tT1j5QTYb3pGobGhE8U4sXqeSrhWGaEvRmTZgROX5Gb/f4626NzYPBMt9BbfUiJroCN4dgWu32wW1G0/pVlxNek0WKX4M5q73SWag5wmpU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--stevensd.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=P8b2jLMC; arc=none smtp.client-ip=74.125.82.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--stevensd.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="P8b2jLMC" Received: by mail-dy1-f201.google.com with SMTP id 5a478bee46e88-2bdf6fe90a9so11988007eec.1 for ; Fri, 24 Apr 2026 12:17:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1777058220; x=1777663020; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=/N+N4eCtpYxHixfaIFLv9JBOjdUyGT3kJeE3HTW8Oq0=; b=P8b2jLMCNaAA0VqZQ2YUEU0Y1s5VdbeYDj1Ie1ixAtzF6z6qlSDMRZw2BipyE5ogNx +wBaS007xmsbx5Ixc4GtBGhNf+gN9IUGQcy6H1h8AyECeHmkf60836nxOpZ+uBGasbYX u5x+TNgsa4x7aQL1P90wStIKxGkka9i3o/S/1iVIsCCabpHplY5D7Ndl7uzWc2YDz72f pkf+2eXwquhz9pkZWL02lTpDoWalaxfNT45gFDVwvKbEP0OdP0fkb69dQhpSQX1EsilF WqWcXHp4BeW1qOZkZTyFbXCTyb+QF+vFLLFmpemxlKfDQv02p71NrIJxgu/D+hx23vkN lyfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777058220; x=1777663020; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=/N+N4eCtpYxHixfaIFLv9JBOjdUyGT3kJeE3HTW8Oq0=; b=lMuhwrL2bIyA0QWBAELOyhzzGuimBIrGEOGtTsBxPmcxWzzUzmj9DVM+bEX2hHh1G3 4dCRhqs1zvWklesGvm/mDTwZDAJRczIaBmCMEVwtn7A88Ix90xayjhW29oD4dKKjc8om okCTUb88gtPoOVJoo5M2F6Ygg+a8C5HMDwQV4KELJdPrRxsmOQjzAcjr2s5dKTB/XsR+ ZIirtfSw36kfIhZEAECuN/38wZFrkKM/h92htZj2sltfL13pkwY4e2EXmapXYidD7WyV GxXyWiOlh/m+k4DLsYEgPqQMwId1XcHaJ7b9RQwaYilLui1eCzObKgTlv8DzKIzhk10h k1JQ== X-Forwarded-Encrypted: i=1; AFNElJ8q3BHyHIw2uWLC8HhHZ/uoqnjGE5HoAJbPdEHAdtV9VjJrqm3Q7Zcm8LMlUKPmJ7ikGnHqjm0U5tG09Z8=@vger.kernel.org X-Gm-Message-State: AOJu0YxbSl0+RfpgBX3Q3sHe7DhqgbcLe0YIirR+if27IBAsV7pAhF6/ FXdVXuEcZ1FwHMkxm/JbrIoAbGbL+1csQf1Xx64/D80RNO/u6Modpz8olQrNKKNb8FMbaJM8tKH /NXkKtQvY08nkvQ== X-Received: from dly15-n1.prod.google.com ([2002:a05:701b:204f:10b0:12a:83c5:a16f]) (user=stevensd job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:50d:b0:12a:747e:5b5c with SMTP id a92af1059eb24-12c73fa3af3mr17422533c88.24.1777058219493; Fri, 24 Apr 2026 12:16:59 -0700 (PDT) Date: Fri, 24 Apr 2026 12:14:49 -0700 In-Reply-To: <20260424191456.2679717-1-stevensd@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260424191456.2679717-1-stevensd@google.com> X-Mailer: git-send-email 2.54.0.rc2.544.gc7ae2d5bb8-goog Message-ID: <20260424191456.2679717-7-stevensd@google.com> Subject: [PATCH v2 06/13] fork: Move vmap stack freeing to work queue From: David Stevens To: Pasha Tatashin , Linus Walleij , Will Deacon , Quentin Perret , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Andy Lutomirski , Xin Li , Peter Zijlstra , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Uladzislau Rezki , Kees Cook Cc: David Stevens , linux-kernel@vger.kernel.org, linux-mm@kvack.org Content-Type: text/plain; charset="UTF-8" For vmap stacks not immediately released into the stack cache, free them in a workqueue instead of via call_rcu(). In an RCU context, vfree already schedules the actual freeing on the per-cpu system workqueue, so this change only affects when exactly the second attempt to put the stack into the stack cache occurs. Moving freeing to a workqueue will allow for freeing dynamic stacks in a sleepable context (for remove_vm_area), rather than relying on vfree dispatching to a workqueue via vfree_atomic. Signed-off-by: David Stevens --- kernel/fork.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/kernel/fork.c b/kernel/fork.c index 8bf32815f422..01e0bf4f4b02 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -205,7 +205,7 @@ static DEFINE_PER_CPU(struct vm_struct *, cached_stacks[NR_CACHED_STACKS]); #define GFP_VMAP_STACK (GFP_KERNEL | __GFP_ZERO) struct vm_stack { - struct rcu_head rcu; + struct rcu_work work; struct vm_struct *stack_vm_area; }; @@ -284,9 +284,9 @@ static inline void free_vmap_stack(struct vm_struct *vm_area) vfree(vm_area->addr); } -static void thread_stack_free_rcu(struct rcu_head *rh) +static void thread_stack_free_work(struct work_struct *work) { - struct vm_stack *vm_stack = container_of(rh, struct vm_stack, rcu); + struct vm_stack *vm_stack = container_of(to_rcu_work(work), struct vm_stack, work); struct vm_struct *vm_area = vm_stack->stack_vm_area; if (try_release_thread_stack_to_cache(vm_stack->stack_vm_area)) @@ -305,7 +305,8 @@ static void thread_stack_delayed_free(struct task_struct *tsk) vm_stack = tsk->stack + THREAD_SIZE - sizeof(*vm_stack); vm_stack->stack_vm_area = tsk->stack_vm_area; - call_rcu(&vm_stack->rcu, thread_stack_free_rcu); + INIT_RCU_WORK(&vm_stack->work, thread_stack_free_work); + queue_rcu_work(system_wq, &vm_stack->work); } static int free_vm_stack_cache(unsigned int cpu) -- 2.54.0.rc2.544.gc7ae2d5bb8-goog