All of lore.kernel.org
 help / color / mirror / Atom feed
From: Randy Dunlap <rdunlap@infradead.org>
To: Suren Baghdasaryan <surenb@google.com>, akpm@linux-foundation.org
Cc: kent.overstreet@linux.dev, mhocko@suse.com, vbabka@suse.cz,
	hannes@cmpxchg.org, roman.gushchin@linux.dev, mgorman@suse.de,
	dave@stgolabs.net, willy@infradead.org, liam.howlett@oracle.com,
	penguin-kernel@i-love.sakura.ne.jp, corbet@lwn.net,
	void@manifault.com, peterz@infradead.org, juri.lelli@redhat.com,
	catalin.marinas@arm.com, will@kernel.org, arnd@arndb.de,
	tglx@linutronix.de, mingo@redhat.com,
	dave.hansen@linux.intel.com, x86@kernel.org, peterx@redhat.com,
	david@redhat.com, axboe@kernel.dk, mcgrof@kernel.org,
	masahiroy@kernel.org, nathan@kernel.org, dennis@kernel.org,
	jhubbard@nvidia.com, tj@kernel.org, muchun.song@linux.dev,
	rppt@kernel.org, paulmck@kernel.org, pasha.tatashin@soleen.com,
	yosryahmed@google.com, yuzhao@google.com, dhowells@redhat.com,
	hughd@google.com, andreyknvl@gmail.com, keescook@chromium.org,
	ndesaulniers@google.com, vvvvvv@google.com,
	gregkh@linuxfoundation.org, ebiggers@google.com,
	ytcoode@gmail.com, vincent.guittot@linaro.org,
	dietmar.eggemann@arm.com, rostedt@goodmis.org,
	bsegall@google.com, bristot@redhat.com, vschneid@redhat.com,
	cl@linux.com, penberg@kernel.org, iamjoonsoo.kim@lge.com,
	42.hyeyoo@gmail.com, glider@google.com, elver@google.com,
	dvyukov@google.com, shakeelb@google.com,
	songmuchun@bytedance.com, jbaron@akamai.com,
	aliceryhl@google.com, rientjes@google.com, minchan@google.com,
	kaleshsingh@google.com, kernel-team@android.com,
	linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
	iommu@lists.linux.dev, linux-arch@vger.kernel.org,
	linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
	linux-modules@vger.kernel.org, kasan-dev@googlegroups.com,
	cgroups@vger.kernel.org
Subject: Re: [PATCH v5 37/37] memprofiling: Documentation
Date: Wed, 6 Mar 2024 19:18:57 -0800	[thread overview]
Message-ID: <10a95079-86e4-41bf-8e82-e387936c437d@infradead.org> (raw)
In-Reply-To: <20240306182440.2003814-38-surenb@google.com>

[-- Attachment #1: Type: text/plain, Size: 5488 bytes --]

Hi,
This includes some editing suggestions and some doc build fixes.


On 3/6/24 10:24, Suren Baghdasaryan wrote:
> From: Kent Overstreet <kent.overstreet@linux.dev>
> 
> Provide documentation for memory allocation profiling.
> 
> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
> Signed-off-by: Suren Baghdasaryan <surenb@google.com>
> ---
>  Documentation/mm/allocation-profiling.rst | 91 +++++++++++++++++++++++
>  1 file changed, 91 insertions(+)
>  create mode 100644 Documentation/mm/allocation-profiling.rst
> 
> diff --git a/Documentation/mm/allocation-profiling.rst b/Documentation/mm/allocation-profiling.rst
> new file mode 100644
> index 000000000000..8a862c7d3aab
> --- /dev/null
> +++ b/Documentation/mm/allocation-profiling.rst
> @@ -0,0 +1,91 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +===========================
> +MEMORY ALLOCATION PROFILING
> +===========================
> +
> +Low overhead (suitable for production) accounting of all memory allocations,
> +tracked by file and line number.
> +
> +Usage:
> +kconfig options:
> + - CONFIG_MEM_ALLOC_PROFILING
> + - CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT
> + - CONFIG_MEM_ALLOC_PROFILING_DEBUG
> +   adds warnings for allocations that weren't accounted because of a
> +   missing annotation
> +
> +Boot parameter:
> +  sysctl.vm.mem_profiling=0|1|never
> +
> +  When set to "never", memory allocation profiling overheads is minimized and it

                                                      overhead is

> +  cannot be enabled at runtime (sysctl becomes read-only).
> +  When CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT=y, default value is "1".
> +  When CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT=n, default value is "never".
> +
> +sysctl:
> +  /proc/sys/vm/mem_profiling
> +
> +Runtime info:
> +  /proc/allocinfo
> +
> +Example output:
> +  root@moria-kvm:~# sort -g /proc/allocinfo|tail|numfmt --to=iec
> +        2.8M    22648 fs/kernfs/dir.c:615 func:__kernfs_new_node
> +        3.8M      953 mm/memory.c:4214 func:alloc_anon_folio
> +        4.0M     1010 drivers/staging/ctagmod/ctagmod.c:20 [ctagmod] func:ctagmod_start
> +        4.1M        4 net/netfilter/nf_conntrack_core.c:2567 func:nf_ct_alloc_hashtable
> +        6.0M     1532 mm/filemap.c:1919 func:__filemap_get_folio
> +        8.8M     2785 kernel/fork.c:307 func:alloc_thread_stack_node
> +         13M      234 block/blk-mq.c:3421 func:blk_mq_alloc_rqs
> +         14M     3520 mm/mm_init.c:2530 func:alloc_large_system_hash
> +         15M     3656 mm/readahead.c:247 func:page_cache_ra_unbounded
> +         55M     4887 mm/slub.c:2259 func:alloc_slab_page
> +        122M    31168 mm/page_ext.c:270 func:alloc_page_ext
> +===================
> +Theory of operation
> +===================
> +
> +Memory allocation profiling builds off of code tagging, which is a library for
> +declaring static structs (that typcially describe a file and line number in

                                  typically

> +some way, hence code tagging) and then finding and operating on them at runtime

                                                                        at runtime,

> +- i.e. iterating over them to print them in debugfs/procfs.

  i.e., iterating

> +
> +To add accounting for an allocation call, we replace it with a macro
> +invocation, alloc_hooks(), that
> + - declares a code tag
> + - stashes a pointer to it in task_struct
> + - calls the real allocation function
> + - and finally, restores the task_struct alloc tag pointer to its previous value.
> +
> +This allows for alloc_hooks() calls to be nested, with the most recent one
> +taking effect. This is important for allocations internal to the mm/ code that
> +do not properly belong to the outer allocation context and should be counted
> +separately: for example, slab object extension vectors, or when the slab
> +allocates pages from the page allocator.
> +
> +Thus, proper usage requires determining which function in an allocation call
> +stack should be tagged. There are many helper functions that essentially wrap
> +e.g. kmalloc() and do a little more work, then are called in multiple places;
> +we'll generally want the accounting to happen in the callers of these helpers,
> +not in the helpers themselves.
> +
> +To fix up a given helper, for example foo(), do the following:
> + - switch its allocation call to the _noprof() version, e.g. kmalloc_noprof()
> + - rename it to foo_noprof()
> + - define a macro version of foo() like so:
> +   #define foo(...) alloc_hooks(foo_noprof(__VA_ARGS__))
> +
> +It's also possible to stash a pointer to an alloc tag in your own data structures.
> +
> +Do this when you're implementing a generic data structure that does allocations
> +"on behalf of" some other code - for example, the rhashtable code. This way,
> +instead of seeing a large line in /proc/allocinfo for rhashtable.c, we can
> +break it out by rhashtable type.
> +
> +To do so:
> + - Hook your data structure's init function, like any other allocation function

maybe end the line above with a '.' like the following line.

> + - Within your init function, use the convenience macro alloc_tag_record() to
> +   record alloc tag in your data structure.
> + - Then, use the following form for your allocations:
> +   alloc_hooks_tag(ht->your_saved_tag, kmalloc_noprof(...))


Finally, there are a number of documentation build warnings in this patch.
I'm no ReST expert, but the attached patch fixes them for me.

-- 
#Randy

[-- Attachment #2: docum-mm-alloc-profiling-fix403.patch --]
[-- Type: text/x-patch, Size: 2965 bytes --]

Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
---
 Documentation/mm/allocation-profiling.rst |   28 ++++++++++----------
 Documentation/mm/index.rst                |    1 
 2 files changed, 16 insertions(+), 13 deletions(-)

diff -- a/Documentation/mm/allocation-profiling.rst b/Documentation/mm/allocation-profiling.rst
--- a/Documentation/mm/allocation-profiling.rst
+++ b/Documentation/mm/allocation-profiling.rst
@@ -9,11 +9,11 @@ tracked by file and line number.
 
 Usage:
 kconfig options:
- - CONFIG_MEM_ALLOC_PROFILING
- - CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT
- - CONFIG_MEM_ALLOC_PROFILING_DEBUG
-   adds warnings for allocations that weren't accounted because of a
-   missing annotation
+- CONFIG_MEM_ALLOC_PROFILING
+- CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT
+- CONFIG_MEM_ALLOC_PROFILING_DEBUG
+adds warnings for allocations that weren't accounted because of a
+missing annotation
 
 Boot parameter:
   sysctl.vm.mem_profiling=0|1|never
@@ -29,7 +29,8 @@ sysctl:
 Runtime info:
   /proc/allocinfo
 
-Example output:
+Example output::
+
   root@moria-kvm:~# sort -g /proc/allocinfo|tail|numfmt --to=iec
         2.8M    22648 fs/kernfs/dir.c:615 func:__kernfs_new_node
         3.8M      953 mm/memory.c:4214 func:alloc_anon_folio
@@ -42,21 +43,22 @@ Example output:
          15M     3656 mm/readahead.c:247 func:page_cache_ra_unbounded
          55M     4887 mm/slub.c:2259 func:alloc_slab_page
         122M    31168 mm/page_ext.c:270 func:alloc_page_ext
+
 ===================
 Theory of operation
 ===================
 
 Memory allocation profiling builds off of code tagging, which is a library for
 declaring static structs (that typcially describe a file and line number in
-some way, hence code tagging) and then finding and operating on them at runtime
-- i.e. iterating over them to print them in debugfs/procfs.
+some way, hence code tagging) and then finding and operating on them at runtime,
+i.e., iterating over them to print them in debugfs/procfs.
 
 To add accounting for an allocation call, we replace it with a macro
-invocation, alloc_hooks(), that
- - declares a code tag
- - stashes a pointer to it in task_struct
- - calls the real allocation function
- - and finally, restores the task_struct alloc tag pointer to its previous value.
+invocation, alloc_hooks(), that:
+- declares a code tag
+- stashes a pointer to it in task_struct
+- calls the real allocation function
+- and finally, restores the task_struct alloc tag pointer to its previous value.
 
 This allows for alloc_hooks() calls to be nested, with the most recent one
 taking effect. This is important for allocations internal to the mm/ code that
diff -- a/Documentation/mm/index.rst b/Documentation/mm/index.rst
--- a/Documentation/mm/index.rst
+++ b/Documentation/mm/index.rst
@@ -26,6 +26,7 @@ see the :doc:`admin guide <../admin-guid
    page_cache
    shmfs
    oom
+   allocation-profiling
 
 Legacy Documentation
 ====================

  reply	other threads:[~2024-03-07  3:19 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-06 18:23 [PATCH v5 00/37] Memory allocation profiling Suren Baghdasaryan
2024-03-06 18:23 ` [PATCH v5 01/37] fix missing vmalloc.h includes Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 02/37] asm-generic/io.h: Kill vmalloc.h dependency Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 03/37] mm/slub: Mark slab_free_freelist_hook() __always_inline Suren Baghdasaryan
2024-03-13 13:53   ` Vlastimil Babka
2024-03-06 18:24 ` [PATCH v5 04/37] scripts/kallysms: Always include __start and __stop symbols Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 05/37] fs: Convert alloc_inode_sb() to a macro Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 06/37] mm: introduce slabobj_ext to support slab object extensions Suren Baghdasaryan
2024-03-13 13:59   ` Vlastimil Babka
2024-03-06 18:24 ` [PATCH v5 07/37] mm: introduce __GFP_NO_OBJ_EXT flag to selectively prevent slabobj_ext creation Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 08/37] mm/slab: introduce SLAB_NO_OBJ_EXT to avoid obj_ext creation Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 09/37] slab: objext: introduce objext_flags as extension to page_memcg_data_flags Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 10/37] lib: code tagging framework Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 11/37] lib: code tagging module support Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 12/37] lib: prevent module unloading if memory is not freed Suren Baghdasaryan
2024-03-12 18:22   ` Luis Chamberlain
2024-03-12 18:41     ` Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 13/37] lib: add allocation tagging support for memory allocation profiling Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 14/37] lib: introduce support for page allocation tagging Suren Baghdasaryan
2024-03-15 14:24   ` Matthew Wilcox
2024-03-15 15:47     ` Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 15/37] lib: introduce early boot parameter to avoid page_ext memory overhead Suren Baghdasaryan
2024-03-13 14:35   ` Vlastimil Babka
2024-03-06 18:24 ` [PATCH v5 16/37] mm: percpu: increase PERCPU_MODULE_RESERVE to accommodate allocation tags Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 17/37] change alloc_pages name in dma_map_ops to avoid name conflicts Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 18/37] mm: enable page allocation tagging Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 19/37] mm: create new codetag references during page splitting Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 20/37] mm: fix non-compound multi-order memory accounting in __free_pages Suren Baghdasaryan
2024-03-13 14:44   ` Vlastimil Babka
2024-03-13 15:04   ` Matthew Wilcox
2024-03-13 15:31     ` Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 21/37] mm/page_ext: enable early_page_ext when CONFIG_MEM_ALLOC_PROFILING_DEBUG=y Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 22/37] lib: add codetag reference into slabobj_ext Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 23/37] mm/slab: add allocation accounting into slab allocation and free paths Suren Baghdasaryan
2024-03-15 10:58   ` Vlastimil Babka
2024-03-15 15:43     ` Suren Baghdasaryan
2024-03-15 16:52       ` Vlastimil Babka
2024-03-15 17:06         ` Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 24/37] rust: Add a rust helper for krealloc() Suren Baghdasaryan
2024-03-08 15:23   ` Miguel Ojeda
2024-03-06 18:24 ` [PATCH v5 25/37] mm/slab: enable slab allocation tagging for kmalloc and friends Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 26/37] mempool: Hook up to memory allocation profiling Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 27/37] mm: percpu: Introduce pcpuobj_ext Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 28/37] mm: percpu: Add codetag reference into pcpuobj_ext Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 29/37] mm: percpu: enable per-cpu allocation tagging Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 30/37] mm: vmalloc: Enable memory allocation profiling Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 31/37] rhashtable: Plumb through alloc tag Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 32/37] lib: add memory allocations report in show_mem() Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 33/37] codetag: debug: skip objext checking when it's for objext itself Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 34/37] codetag: debug: mark codetags for reserved pages as empty Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 35/37] codetag: debug: introduce OBJEXTS_ALLOC_FAIL to mark failed slab_ext allocations Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 36/37] MAINTAINERS: Add entries for code tagging and memory allocation profiling Suren Baghdasaryan
2024-03-06 18:24 ` [PATCH v5 37/37] memprofiling: Documentation Suren Baghdasaryan
2024-03-07  3:18   ` Randy Dunlap [this message]
2024-03-07 16:51     ` Suren Baghdasaryan
2024-03-07 19:58       ` Randy Dunlap
2024-03-07 18:17     ` Kent Overstreet
2024-03-07 20:03       ` Randy Dunlap
2024-03-07 20:15         ` John Hubbard
2024-03-07 20:53           ` Randy Dunlap

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=10a95079-86e4-41bf-8e82-e387936c437d@infradead.org \
    --to=rdunlap@infradead.org \
    --cc=42.hyeyoo@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=aliceryhl@google.com \
    --cc=andreyknvl@gmail.com \
    --cc=arnd@arndb.de \
    --cc=axboe@kernel.dk \
    --cc=bristot@redhat.com \
    --cc=bsegall@google.com \
    --cc=catalin.marinas@arm.com \
    --cc=cgroups@vger.kernel.org \
    --cc=cl@linux.com \
    --cc=corbet@lwn.net \
    --cc=dave.hansen@linux.intel.com \
    --cc=dave@stgolabs.net \
    --cc=david@redhat.com \
    --cc=dennis@kernel.org \
    --cc=dhowells@redhat.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=dvyukov@google.com \
    --cc=ebiggers@google.com \
    --cc=elver@google.com \
    --cc=glider@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hannes@cmpxchg.org \
    --cc=hughd@google.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=iommu@lists.linux.dev \
    --cc=jbaron@akamai.com \
    --cc=jhubbard@nvidia.com \
    --cc=juri.lelli@redhat.com \
    --cc=kaleshsingh@google.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=keescook@chromium.org \
    --cc=kent.overstreet@linux.dev \
    --cc=kernel-team@android.com \
    --cc=liam.howlett@oracle.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-modules@vger.kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=mcgrof@kernel.org \
    --cc=mgorman@suse.de \
    --cc=mhocko@suse.com \
    --cc=minchan@google.com \
    --cc=mingo@redhat.com \
    --cc=muchun.song@linux.dev \
    --cc=nathan@kernel.org \
    --cc=ndesaulniers@google.com \
    --cc=pasha.tatashin@soleen.com \
    --cc=paulmck@kernel.org \
    --cc=penberg@kernel.org \
    --cc=penguin-kernel@i-love.sakura.ne.jp \
    --cc=peterx@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rientjes@google.com \
    --cc=roman.gushchin@linux.dev \
    --cc=rostedt@goodmis.org \
    --cc=rppt@kernel.org \
    --cc=shakeelb@google.com \
    --cc=songmuchun@bytedance.com \
    --cc=surenb@google.com \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=vbabka@suse.cz \
    --cc=vincent.guittot@linaro.org \
    --cc=void@manifault.com \
    --cc=vschneid@redhat.com \
    --cc=vvvvvv@google.com \
    --cc=will@kernel.org \
    --cc=willy@infradead.org \
    --cc=x86@kernel.org \
    --cc=yosryahmed@google.com \
    --cc=ytcoode@gmail.com \
    --cc=yuzhao@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.