From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (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 0440B3E7169 for ; Fri, 24 Apr 2026 19:17:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777058228; cv=none; b=YErNFJW5A5OQxzNgHBZZrQ2nJhwMi86976UdVPpl5DpYYMno1Dk7pE1wEfxq0JQaE/IQRRryAgFCduO8bHwzD+4mof1eUb7PgDopHBoyYkRNa3y+piMxU12N80MewpLwP4Lau0Zy9gjpt4kggGCb90IOG85O0IdD7jhIr82vNsY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777058228; c=relaxed/simple; bh=RhALqMblpZH4uENCiafOIg3H3ixsF5M678eBW2fmFrc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ancShQvhJkgPMOUGWYVEhQp/u/FT9oew87FSvbDVSdXADBhHzCAeZmaZabmoWpa2RvNv0sZ5ziCqCpCVLaEyI2Vw2n74hYoxRykGYCtDPkO7JUEDnI7+jOUHP4bKjP4tSSrRoIMU+Bfg7POlvcQlWt41gEjVgdAAI/x53UJBtFo= 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=u6036bLN; arc=none smtp.client-ip=74.125.82.73 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="u6036bLN" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-12dbf4f678eso13754584c88.0 for ; Fri, 24 Apr 2026 12:17:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1777058226; x=1777663026; 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=RwTIWWS6PoMEJey7EJLHssvqaQ5r36vA2Bmz8LkSSZY=; b=u6036bLNzxOeSBknuKPpRLLQA00vuB7jgJmf2nngpAUjjbkXjRdlnrEfmCTjgZyBKL Ui/z2qspBwY1jujRXsEbVFAQf+mLQOyj5hn014XRUGojkw2mtJhH2OzDuC3S1+G+q1rK z0j6UWSlDoLncWMVSoBPOGPJL4yZ/h8DAHqD7ZwCh7ntTYEeM7HsAn70Qu5qkD3FDhob Ri424gjPA3W3b109L0rFuo23IJCHb8na8XMlhSMY6HQYGfQm+bVt420gZlkq3i7pLCd9 RhS1st4uKgNfW0dc7VSGWkmrtLPIiMz0/ySwG6AB7aMyBuGL5NjMhlJuai7CWlTmhIMM VFPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777058226; x=1777663026; 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=RwTIWWS6PoMEJey7EJLHssvqaQ5r36vA2Bmz8LkSSZY=; b=C6AGVYKUHupCUXzI+Kk9Loim+96iGlkLVp7JPrDkifrr32XnXpAypg3JSSAo01saW/ Ba6NmEECj5IwpeTNfGbC5mQK97D/stTJvcSFljoMtDyQtaJecrUIUu0DGjXOF9FvugGh h1y6tTg1TTjtduqurnaMbLrHLEytTdnJy0VIh5/mipo2ItG3TKPiqQHavt73WNDCdzDG QbdIfdEzfQ14RJrQkrjmLCWqN7VKiFOff/xlAeautt+RTDpRlca6k79nlyAI5QVJg79s pmvoxglJMVCxdTozh1SUQPpoful7quYmhifZ4W9e2N53gJK4z+akWD2ZDyo1O6quQtBY Sfuw== X-Forwarded-Encrypted: i=1; AFNElJ9c7GQ/qelbGL1IkpOvFAO+EBtTiAwFjSkVgu5wnsg9yYaZoeiuXSgx27B8mlObbnEQwS3NmR032bLuBEE=@vger.kernel.org X-Gm-Message-State: AOJu0YxjTS8cuAyd0XRBfvlqU7OQXaiiVNCBnxbWisR1cHCilp99s0SW hf2873aF6RLwuttx7kCN842MTtQSJ25iF7fUmF5ZOIAzuz1j5IbeWd2GM+BwY9B0bAZGc5S0KOp 7ypcnWEbZn/BCZA== X-Received: from dled1-n2.prod.google.com ([2002:a05:701b:42c1:20b0:12c:5513:fb7d]) (user=stevensd job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:3d0e:b0:12d:ca31:f19d with SMTP id a92af1059eb24-12dca31f3f7mr1182426c88.28.1777058225702; Fri, 24 Apr 2026 12:17:05 -0700 (PDT) Date: Fri, 24 Apr 2026 12:14:52 -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-10-stevensd@google.com> Subject: [PATCH v2 09/13] fork: Dynamic Kernel Stack accounting 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" From: Pasha Tatashin Add an accounting of the amount of stack pages that have been faulted in and are currently in use. Example use case: $ cat /proc/vmstat | grep stack nr_kernel_stack 18684 nr_dynamic_stacks_faults 156 The above shows that the kernel stacks use total 18684KiB, out of which 156KiB were faulted in. Given that the pre-allocated stacks are 4KiB, we can determine the total number of tasks: tasks = (nr_kernel_stack - nr_dynamic_stacks_faults) / 4 = 4632. The amount of kernel stack memory without dynamic stack on this machine would be: 4632 * 16 KiB = 74,112 KiB Therefore, in this example dynamic stacks save: 55,428 KiB Signed-off-by: Pasha Tatashin [Rebased] Signed-off-by: Linus Walleij [add to memcg stats, fix typos] Signed-off-by: David Stevens --- include/linux/mmzone.h | 3 +++ kernel/fork.c | 12 +++++++++++- mm/memcontrol.c | 10 ++++++++++ mm/vmstat.c | 3 +++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 3e51190a55e4..4458fa7016a1 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -221,6 +221,9 @@ enum node_stat_item { NR_FOLL_PIN_ACQUIRED, /* via: pin_user_page(), gup flag: FOLL_PIN */ NR_FOLL_PIN_RELEASED, /* pages returned via unpin_user_page() */ NR_KERNEL_STACK_KB, /* measured in KiB */ +#ifdef CONFIG_DYNAMIC_STACK + NR_DYNAMIC_STACKS_FAULTS_KB, /* KiB of faulted kernel stack memory */ +#endif #if IS_ENABLED(CONFIG_SHADOW_CALL_STACK) NR_KERNEL_SCS_KB, /* measured in KiB */ #endif diff --git a/kernel/fork.c b/kernel/fork.c index e615ef736dc0..9ac9d23f5f4b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -463,6 +463,8 @@ unsigned long dynamic_stack_accounting(struct task_struct *tsk, bool finalize) mod_lruvec_page_state(page, NR_KERNEL_STACK_KB, PAGE_SIZE / 1024); + mod_lruvec_page_state(page, NR_DYNAMIC_STACKS_FAULTS_KB, + PAGE_SIZE / 1024); } if (finalize) { @@ -811,9 +813,17 @@ static void account_kernel_stack(struct task_struct *tsk, int account) nr_accounted = vm_area->nr_pages; #endif - for (i = 0; i < nr_accounted; i++) + for (i = 0; i < nr_accounted; i++) { mod_lruvec_page_state(vm_area->pages[i], NR_KERNEL_STACK_KB, account * (PAGE_SIZE / 1024)); +#ifdef CONFIG_DYNAMIC_STACK + if (i >= THREAD_PREALLOC_PAGES) { + mod_lruvec_page_state(vm_area->pages[i], + NR_DYNAMIC_STACKS_FAULTS_KB, + account * (PAGE_SIZE / 1024)); + } +#endif + } } else { void *stack = task_stack_page(tsk); diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 772bac21d155..cd2195a735ab 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -318,6 +318,9 @@ static const unsigned int memcg_node_stat_items[] = { NR_FILE_THPS, NR_ANON_THPS, NR_KERNEL_STACK_KB, +#ifdef CONFIG_DYNAMIC_STACK + NR_DYNAMIC_STACKS_FAULTS_KB, +#endif NR_PAGETABLE, NR_SECONDARY_PAGETABLE, #ifdef CONFIG_SWAP @@ -1403,6 +1406,10 @@ static const struct memory_stat memory_stats[] = { #ifdef CONFIG_NUMA_BALANCING { "pgpromote_success", PGPROMOTE_SUCCESS }, #endif + +#ifdef CONFIG_DYNAMIC_STACK + { "dynamic_stack_faults", NR_DYNAMIC_STACKS_FAULTS_KB }, +#endif }; /* The actual unit of the state item, not the same as the output unit */ @@ -1415,6 +1422,9 @@ static int memcg_page_state_unit(int item) case NR_SLAB_UNRECLAIMABLE_B: return 1; case NR_KERNEL_STACK_KB: +#ifdef CONFIG_DYNAMIC_STACK + case NR_DYNAMIC_STACKS_FAULTS_KB: +#endif return SZ_1K; default: return PAGE_SIZE; diff --git a/mm/vmstat.c b/mm/vmstat.c index 86b14b0f77b5..8fa1c7bcbaea 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -1256,6 +1256,9 @@ const char * const vmstat_text[] = { [I(NR_FOLL_PIN_ACQUIRED)] = "nr_foll_pin_acquired", [I(NR_FOLL_PIN_RELEASED)] = "nr_foll_pin_released", [I(NR_KERNEL_STACK_KB)] = "nr_kernel_stack", +#ifdef CONFIG_DYNAMIC_STACK + [I(NR_DYNAMIC_STACKS_FAULTS_KB)] = "nr_dynamic_stacks_faults", +#endif #if IS_ENABLED(CONFIG_SHADOW_CALL_STACK) [I(NR_KERNEL_SCS_KB)] = "nr_shadow_call_stack", #endif -- 2.54.0.rc2.544.gc7ae2d5bb8-goog