From mboxrd@z Thu Jan 1 00:00:00 1970 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 5FC57C54791 for ; Wed, 13 Mar 2024 03:39:48 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DF67594000C; Tue, 12 Mar 2024 23:39:47 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D7F65940009; Tue, 12 Mar 2024 23:39:47 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BAADF94000C; Tue, 12 Mar 2024 23:39:47 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id A4241940009 for ; Tue, 12 Mar 2024 23:39:47 -0400 (EDT) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 331B6A0FEB for ; Wed, 13 Mar 2024 03:39:47 +0000 (UTC) X-FDA: 81890611614.06.C364EC3 Received: from mail-qt1-f175.google.com (mail-qt1-f175.google.com [209.85.160.175]) by imf08.hostedemail.com (Postfix) with ESMTP id 9364B160015 for ; Wed, 13 Mar 2024 03:39:45 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=soleen-com.20230601.gappssmtp.com header.s=20230601 header.b=kW2Bew9M; dmarc=pass (policy=none) header.from=soleen.com; spf=pass (imf08.hostedemail.com: domain of pasha.tatashin@soleen.com designates 209.85.160.175 as permitted sender) smtp.mailfrom=pasha.tatashin@soleen.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1710301185; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=C+cVQJVLwoiO9g0DaXnniEXx29wxNY/O5V/frLtrtm8=; b=hdICIdlws4F4FCwAACJN9mXNUPLOU5irqJeUKMBQ+i/ByWo+2fNmTXftjQkMMiyN0D/sP2 vqpTFRpNNkS6A3ltAj2rchjjsub1CKSZz8pDdTqi2PENJjBPK9TKmDXvDXVECQ4VT+rQTp /Eqs9MUPoxPwN15M3ynp5g0P4Zno8Us= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=soleen-com.20230601.gappssmtp.com header.s=20230601 header.b=kW2Bew9M; dmarc=pass (policy=none) header.from=soleen.com; spf=pass (imf08.hostedemail.com: domain of pasha.tatashin@soleen.com designates 209.85.160.175 as permitted sender) smtp.mailfrom=pasha.tatashin@soleen.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1710301185; a=rsa-sha256; cv=none; b=SD3JitYSp5Rt4Bhm5hlWYJtmuCWs+/V/b9QfI67sRw3dTGzWOJHs60AIWONTHdAzqCM1fX yVPADwEOIj833w93I4uhsov5QnLa6PwziDLLH/Q3VhrmKUY3m18SgA0yTFyyeFYpxCZBLP d4IH+PYBuH/hSUWrSp/qj9QC73HEw1w= Received: by mail-qt1-f175.google.com with SMTP id d75a77b69052e-42e323a2e39so4423561cf.1 for ; Tue, 12 Mar 2024 20:39:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=soleen-com.20230601.gappssmtp.com; s=20230601; t=1710301184; x=1710905984; darn=kvack.org; h=content-transfer-encoding:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=C+cVQJVLwoiO9g0DaXnniEXx29wxNY/O5V/frLtrtm8=; b=kW2Bew9M14ieqwaBWXIEfmFChk4y3684+YaGRLXPKrGGTpXNQbjSmAGlCm5xUhgJR7 NGBL73MDZQJXlydQpQZcEzwVGvEcJ9h37CS5uB4xASx3fT+jDHLEWINx4RH7N+m6ZHE5 /8XN9k/djJdB2Lsl1pSmlb9aaEeSbt/DwsHnXmCy1bsINVk9gbv6MWr4RQrGX/m8+gaw gLOrxpcibbmUn1d5mRRtGZsFetFhtduSv1AKNJJhW4kUIbA4ImLtYVon+isLJNorjMyJ 2fEp0gG2fahuhaYb7GgjC/E0Wx8zK+qxTAZ/x6ZPjmpsXGFL7uG+NKI+/H1tqWDyKqxE 2toQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710301184; x=1710905984; h=content-transfer-encoding:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=C+cVQJVLwoiO9g0DaXnniEXx29wxNY/O5V/frLtrtm8=; b=bvhdSglMX7Ge2nDeKyQ1FAf+rQvvBlCuU1xxvT0jhb6/66VFSHAfTzvcP5BbqC4q9M WUDBPCg+5DsxxmBM3MR+6jc9iKrza4Nw3amdeGu8/uRQT5H6etkIehSup7CbO7pe5Ba2 zMDs1OMr6vy/+FcIeniwKY1mjmF2ztGpIxPV/mNe0T09cJ5bQO6ZuSCOFufsZ3MfP5rT 0DmVktvTXm/laPXt3O1StK4FE7EuN7noJbyLUOlUS88OwHqPEqeiiH/wBGqeH4Rf1bxN Fk7qRAfQcuEjgSCmiX3ANE6nLw50wDRSCZM4oxydH3eb/RXjocoGfDYM5O1M1B8iClr4 9EMw== X-Forwarded-Encrypted: i=1; AJvYcCV/mdO3+S166AkQgXCy8SbNL7g2T8K+jb9YXV53cLKlDg9VlXM5sIlFmftipUuT09cbIvQAtTGmRJ/aKEYeUE9DqXc= X-Gm-Message-State: AOJu0YyGbKsUZ5v4yrdf25SuBBCnuQUAhbMcEPdBqA4FvFrTi7grwi2+ cJBCwiGmQsCbuyPvoLNlJWxLS7TPqzh4BCwjIRzf9BIUaq9acqQpOG8ctgeJlfPESl2TQ7NsUA+ ljkzsUtjSJ4p05DNAEBCDVZw9Cl/WIBAhoSD/2Q== X-Google-Smtp-Source: AGHT+IGY7KAmRSDaJZ7t69yb+cZb/GwQoFC/JMjFLgVO91JAfe0Rat47i12z63cZZfmHJNirPYbEbMyIO6I1QRCeQhA= X-Received: by 2002:a05:622a:1483:b0:42e:b90d:40b1 with SMTP id t3-20020a05622a148300b0042eb90d40b1mr2752273qtx.21.1710301184660; Tue, 12 Mar 2024 20:39:44 -0700 (PDT) MIME-Version: 1.0 References: <20240313033417.447216-1-pasha.tatashin@soleen.com> In-Reply-To: <20240313033417.447216-1-pasha.tatashin@soleen.com> From: Pasha Tatashin Date: Tue, 12 Mar 2024 23:39:07 -0400 Message-ID: Subject: Re: [PATCH] vmstat: Keep count of the maximum page reached by the kernel stack To: akpm@linux-foundation.org, jpoimboe@kernel.org, pasha.tatashin@soleen.com, kent.overstreet@linux.dev, peterz@infradead.org, nphamcs@gmail.com, cerasuolodomenico@gmail.com, surenb@google.com, lizhijian@fujitsu.com, willy@infradead.org, shakeel.butt@linux.dev, vbabka@suse.cz, ziy@nvidia.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: 9364B160015 X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: j7diagtdqc383o3zocegctdeqt4dpkhz X-HE-Tag: 1710301185-612238 X-HE-Meta: U2FsdGVkX1+kyBW9wxM9eIOgpN6UzgOHWary523fhTbHuZMSVmE13l/nJ9ENso9kP+CSh23LScDXS8kzbUyJQHMMk/98a3PNofsyYEcL++uCTaZTIy7ul1vD/LQmyI8Dx+ZbucMZJlsrUPaFQbDW3h+jMn6B+Mw/kAuROdH0d/D+eYrXi7mjaswUUo3Rhbx/j3QKIK5PQltl/AAVg+twWFtMyQzoSaZXqtz6hKbDzn/KWTLzRyspd5pskoR7pY8kbjxykvapriYbJ/wn24EsyQEslnL4gXgVZ+IRfWUj045dni01gSJFhizKrBMOKe5ww1QZYUJDPW2S0O+i68ZMckNbGriUjrRYWDda/10XmIn2gM5tHn3r46KEFATewGmVDHJQGJy43HCfQ/3acaVaa6fjHFRWzdRTW+7IxYYMl6ofELkELidadwY7zDzDRqx8v6XXplIPTYLD5xupRsLJRlABP5PkZNRAyeCWY53K1DSWnklnU3P10QHUUTDKAElGjsMZh7GC/iPE9ahT1icpg1tXg18JSPQKGMghQTj06dF7zGdI57bHraVKRDobFRgN3y1W0/N67XPV73wFsJBTVMo/k/cJiAO2tdrLmSdovfD+1IISzHOaRtir65/HRVYYpW26YMSgFksmY2bSV1CJdin0wPYKCDi8lAl6bK0rdNWm8DMBSHn+J1s6YMYAQcxLcvfCayms1Z3O75NGNIQHLpI/JnLWLpFeW9Nd04U2n4v9WWmc98LmD6eS63Srmpuzo53DKM54VHuIsO2YTPGOWZFglUvwlvRN1+CrIb6ldN5kL5Zx0ibkp95nMOq9QZhvnQfv2FiEOIp+94Pu1to9muGImIF6mCVsoRe6pPMao++MMmUs8AioWe/bgjIu1aT/hSoD/VSXZwT8JrMP9alkseXAUNX+/YjjD6QidSVk0aNhv72kK4qHCfLU1z+sFbkcW1AV6Pdx3VVFsnyGS53 XScVhZwe 5dp2E2CqRBJJ47xDXhdhzfabRg7NzsIqfeLP/O/XopDvGDW0ViMMB+Xp4Eg== 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: On Tue, Mar 12, 2024 at 11:34=E2=80=AFPM Pasha Tatashin wrote: > > CONFIG_DEBUG_STACK_USAGE provides a mechanism to know the minimum amount > of memory that was left in stack. Every time the new anti-record is > reached a message is printed to the console. > > However, this is not useful to know how much each page within stack was > actually used. Provide a mechanism to count the number of time each > stack page was reached throughout the live of the stack: > > $ grep kstack /proc/vmstat > kstack_page_1 19974 > kstack_page_2 94 > kstack_page_3 0 > kstack_page_4 0 > > In the above example only out of ~20K threads that ever exited on that > machine only 94 touched second page of the stack, and none touched > pages three and four. > > Signed-off-by: Pasha Tatashin > --- > include/linux/sched/task_stack.h | 39 ++++++++++++++++++++++++++++++-- > include/linux/vm_event_item.h | 29 ++++++++++++++++++++++++ > include/linux/vmstat.h | 16 ------------- > mm/vmstat.c | 11 +++++++++ > 4 files changed, 77 insertions(+), 18 deletions(-) > > diff --git a/include/linux/sched/task_stack.h b/include/linux/sched/task_= stack.h > index ccd72b978e1f..7ff7f9997266 100644 > --- a/include/linux/sched/task_stack.h > +++ b/include/linux/sched/task_stack.h > @@ -95,9 +95,41 @@ static inline int object_is_on_stack(const void *obj) > extern void thread_stack_cache_init(void); > > #ifdef CONFIG_DEBUG_STACK_USAGE > +#ifdef CONFIG_VM_EVENT_COUNTERS > +#include > + > +/* Count the maximum pages reached in kernel stacks */ > +static inline void count_kstack_page(int stack_max_page) > +{ > + switch (stack_max_page) { > + case 1: > + this_cpu_inc(vm_event_states.event[KSTACK_PAGE_1]); > + break; > + case 2: > + this_cpu_inc(vm_event_states.event[KSTACK_PAGE_2]); > + break; > +#if THREAD_SIZE >=3D (4 * PAGE_SIZE) > + case 3: > + this_cpu_inc(vm_event_states.event[KSTACK_PAGE_3]); > + break; > + case 4: > + this_cpu_inc(vm_event_states.event[KSTACK_PAGE_4]); > + break; > +#endif > +#if THREAD_SIZE > (4 * PAGE_SIZE) > + default: > + this_cpu_inc(vm_event_states.event[KSTACK_PAGE_5]); It should: this_cpu_inc(vm_event_states.event[KSTACK_PAGE_REST]); Will fix it in the next version. > +#endif > + } > +} > +#else /* !CONFIG_VM_EVENT_COUNTERS */ > +static inline void count_kstack_page(int stack_max_page) {} > +#endif /* CONFIG_VM_EVENT_COUNTERS */ > + > static inline unsigned long stack_not_used(struct task_struct *p) > { > unsigned long *n =3D end_of_stack(p); > + unsigned long unused_stack; > > do { /* Skip over canary */ > # ifdef CONFIG_STACK_GROWSUP > @@ -108,10 +140,13 @@ static inline unsigned long stack_not_used(struct t= ask_struct *p) > } while (!*n); > > # ifdef CONFIG_STACK_GROWSUP > - return (unsigned long)end_of_stack(p) - (unsigned long)n; > + unused_stack =3D (unsigned long)end_of_stack(p) - (unsigned long)= n; > # else > - return (unsigned long)n - (unsigned long)end_of_stack(p); > + unused_stack =3D (unsigned long)n - (unsigned long)end_of_stack(p= ); > # endif > + count_kstack_page(((THREAD_SIZE - unused_stack) >> PAGE_SHIFT) + = 1); > + > + return unused_stack; > } > #endif > extern void set_task_stack_end_magic(struct task_struct *tsk); > diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.= h > index 747943bc8cc2..1dbfe47ff048 100644 > --- a/include/linux/vm_event_item.h > +++ b/include/linux/vm_event_item.h > @@ -153,10 +153,39 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPO= UT, > VMA_LOCK_ABORT, > VMA_LOCK_RETRY, > VMA_LOCK_MISS, > +#endif > +#ifdef CONFIG_DEBUG_STACK_USAGE > + KSTACK_PAGE_1, > + KSTACK_PAGE_2, > +#if THREAD_SIZE >=3D (4 * PAGE_SIZE) > + KSTACK_PAGE_3, > + KSTACK_PAGE_4, > +#endif > +#if THREAD_SIZE > (4 * PAGE_SIZE) > + KSTACK_PAGE_REST, > +#endif > #endif > NR_VM_EVENT_ITEMS > }; > > +#ifdef CONFIG_VM_EVENT_COUNTERS > +/* > + * Light weight per cpu counter implementation. > + * > + * Counters should only be incremented and no critical kernel component > + * should rely on the counter values. > + * > + * Counters are handled completely inline. On many platforms the code > + * generated will simply be the increment of a global address. > + */ > + > +struct vm_event_state { > + unsigned long event[NR_VM_EVENT_ITEMS]; > +}; > + > +DECLARE_PER_CPU(struct vm_event_state, vm_event_states); > +#endif > + > #ifndef CONFIG_TRANSPARENT_HUGEPAGE > #define THP_FILE_ALLOC ({ BUILD_BUG(); 0; }) > #define THP_FILE_FALLBACK ({ BUILD_BUG(); 0; }) > diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h > index 343906a98d6e..18d4a97d3afd 100644 > --- a/include/linux/vmstat.h > +++ b/include/linux/vmstat.h > @@ -41,22 +41,6 @@ enum writeback_stat_item { > }; > > #ifdef CONFIG_VM_EVENT_COUNTERS > -/* > - * Light weight per cpu counter implementation. > - * > - * Counters should only be incremented and no critical kernel component > - * should rely on the counter values. > - * > - * Counters are handled completely inline. On many platforms the code > - * generated will simply be the increment of a global address. > - */ > - > -struct vm_event_state { > - unsigned long event[NR_VM_EVENT_ITEMS]; > -}; > - > -DECLARE_PER_CPU(struct vm_event_state, vm_event_states); > - > /* > * vm counters are allowed to be racy. Use raw_cpu_ops to avoid the > * local_irq_disable overhead. > diff --git a/mm/vmstat.c b/mm/vmstat.c > index db79935e4a54..737c85689251 100644 > --- a/mm/vmstat.c > +++ b/mm/vmstat.c > @@ -1413,6 +1413,17 @@ const char * const vmstat_text[] =3D { > "vma_lock_retry", > "vma_lock_miss", > #endif > +#ifdef CONFIG_DEBUG_STACK_USAGE > + "kstack_page_1", > + "kstack_page_2", > +#if THREAD_SIZE >=3D (4 * PAGE_SIZE) > + "kstack_page_3", > + "kstack_page_4", > +#endif > +#if THREAD_SIZE > (4 * PAGE_SIZE) > + "kstack_page_rest", > +#endif > +#endif > #endif /* CONFIG_VM_EVENT_COUNTERS || CONFIG_MEMCG */ > }; > #endif /* CONFIG_PROC_FS || CONFIG_SYSFS || CONFIG_NUMA || CONFIG_MEMCG = */ > -- > 2.44.0.278.ge034bb2e1d-goog >