| From b977f96d0a414e76d4c544f65791919dde1bc57e Mon Sep 17 00:00:00 2001 |
| From: Michael Jeanson <mjeanson@efficios.com> |
| Date: Mon, 17 Oct 2022 13:49:51 -0400 |
| Subject: [PATCH] fix: mm/slab_common: drop kmem_alloc & avoid dereferencing |
| fields when not using (v6.1) |
| |
| See uptream commit: |
| |
| commit 2c1d697fb8ba6d2d44f914d4268ae1ccdf025f1b |
| Author: Hyeonggon Yoo <42.hyeyoo@gmail.com> |
| Date: Wed Aug 17 19:18:24 2022 +0900 |
| |
| mm/slab_common: drop kmem_alloc & avoid dereferencing fields when not using |
| |
| Drop kmem_alloc event class, and define kmalloc and kmem_cache_alloc |
| using TRACE_EVENT() macro. |
| |
| And then this patch does: |
| - Do not pass pointer to struct kmem_cache to trace_kmalloc. |
| gfp flag is enough to know if it's accounted or not. |
| - Avoid dereferencing s->object_size and s->size when not using kmem_cache_alloc event. |
| - Avoid dereferencing s->name in when not using kmem_cache_free event. |
| - Adjust s->size to SLOB_UNITS(s->size) * SLOB_UNIT in SLOB |
| |
| Upstream-Status: Backport [commit b977f96d0a414e76d4c544f] |
| |
| Change-Id: Icd7925731ed4a737699c3746cb7bb7760a4e8009 |
| Signed-off-by: Michael Jeanson <mjeanson@efficios.com> |
| Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
| --- |
| include/instrumentation/events/kmem.h | 156 ++++++++++++++++++-------- |
| 1 file changed, 111 insertions(+), 45 deletions(-) |
| |
| diff --git a/include/instrumentation/events/kmem.h b/include/instrumentation/events/kmem.h |
| index 219533a1..0f5bd8e6 100644 |
| --- a/include/instrumentation/events/kmem.h |
| +++ b/include/instrumentation/events/kmem.h |
| @@ -10,9 +10,58 @@ |
| #include <lttng/kernel-version.h> |
| |
| #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,0,0)) |
| - |
| #include <../../mm/slab.h> |
| +#endif |
| + |
| +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,1,0)) |
| +LTTNG_TRACEPOINT_EVENT_MAP(kmalloc, |
| + |
| + kmem_kmalloc, |
| + |
| + TP_PROTO(unsigned long call_site, |
| + const void *ptr, |
| + size_t bytes_req, |
| + size_t bytes_alloc, |
| + gfp_t gfp_flags, |
| + int node), |
| + |
| + TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags, node), |
| + |
| + TP_FIELDS( |
| + ctf_integer_hex(unsigned long, call_site, call_site) |
| + ctf_integer_hex(const void *, ptr, ptr) |
| + ctf_integer(size_t, bytes_req, bytes_req) |
| + ctf_integer(size_t, bytes_alloc, bytes_alloc) |
| + ctf_integer(gfp_t, gfp_flags, gfp_flags) |
| + ctf_integer(int, node, node) |
| + ctf_integer(bool, accounted, (IS_ENABLED(CONFIG_MEMCG_KMEM) && |
| + (gfp_flags & __GFP_ACCOUNT) ? true : false)) |
| + ) |
| +) |
| + |
| +LTTNG_TRACEPOINT_EVENT(kmem_cache_alloc, |
| + |
| + TP_PROTO(unsigned long call_site, |
| + const void *ptr, |
| + struct kmem_cache *s, |
| + gfp_t gfp_flags, |
| + int node), |
| + |
| + TP_ARGS(call_site, ptr, s, gfp_flags, node), |
| |
| + TP_FIELDS( |
| + ctf_integer_hex(unsigned long, call_site, call_site) |
| + ctf_integer_hex(const void *, ptr, ptr) |
| + ctf_integer(size_t, bytes_req, s->object_size) |
| + ctf_integer(size_t, bytes_alloc, s->size) |
| + ctf_integer(gfp_t, gfp_flags, gfp_flags) |
| + ctf_integer(int, node, node) |
| + ctf_integer(bool, accounted, IS_ENABLED(CONFIG_MEMCG_KMEM) ? |
| + ((gfp_flags & __GFP_ACCOUNT) || |
| + (s->flags & SLAB_ACCOUNT)) : false) |
| + ) |
| +) |
| +#elif (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,0,0)) |
| LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc, |
| |
| TP_PROTO(unsigned long call_site, |
| @@ -53,18 +102,16 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_alloc, kmem_cache_alloc, |
| |
| TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags) |
| ) |
| - |
| -LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc_node, |
| +#else |
| +LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc, |
| |
| TP_PROTO(unsigned long call_site, |
| const void *ptr, |
| - struct kmem_cache *s, |
| size_t bytes_req, |
| size_t bytes_alloc, |
| - gfp_t gfp_flags, |
| - int node), |
| + gfp_t gfp_flags), |
| |
| - TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node), |
| + TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags), |
| |
| TP_FIELDS( |
| ctf_integer_hex(unsigned long, call_site, call_site) |
| @@ -72,42 +119,40 @@ LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc_node, |
| ctf_integer(size_t, bytes_req, bytes_req) |
| ctf_integer(size_t, bytes_alloc, bytes_alloc) |
| ctf_integer(gfp_t, gfp_flags, gfp_flags) |
| - ctf_integer(int, node, node) |
| - ctf_integer(bool, accounted, IS_ENABLED(CONFIG_MEMCG_KMEM) ? |
| - ((gfp_flags & __GFP_ACCOUNT) || |
| - (s && s->flags & SLAB_ACCOUNT)) : false) |
| ) |
| ) |
| |
| -LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(kmem_alloc_node, kmalloc_node, |
| +LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(kmem_alloc, kmalloc, |
| |
| - kmem_kmalloc_node, |
| + kmem_kmalloc, |
| |
| TP_PROTO(unsigned long call_site, const void *ptr, |
| - struct kmem_cache *s, size_t bytes_req, size_t bytes_alloc, |
| - gfp_t gfp_flags, int node), |
| + size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags), |
| |
| - TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node) |
| + TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags) |
| ) |
| |
| -LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_alloc_node, kmem_cache_alloc_node, |
| +LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_alloc, kmem_cache_alloc, |
| |
| TP_PROTO(unsigned long call_site, const void *ptr, |
| - struct kmem_cache *s, size_t bytes_req, size_t bytes_alloc, |
| - gfp_t gfp_flags, int node), |
| + size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags), |
| |
| - TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node) |
| + TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags) |
| ) |
| -#else |
| -LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc, |
| +#endif |
| + |
| +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,0,0)) |
| +LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc_node, |
| |
| TP_PROTO(unsigned long call_site, |
| const void *ptr, |
| + struct kmem_cache *s, |
| size_t bytes_req, |
| size_t bytes_alloc, |
| - gfp_t gfp_flags), |
| + gfp_t gfp_flags, |
| + int node), |
| |
| - TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags), |
| + TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node), |
| |
| TP_FIELDS( |
| ctf_integer_hex(unsigned long, call_site, call_site) |
| @@ -115,27 +160,33 @@ LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc, |
| ctf_integer(size_t, bytes_req, bytes_req) |
| ctf_integer(size_t, bytes_alloc, bytes_alloc) |
| ctf_integer(gfp_t, gfp_flags, gfp_flags) |
| + ctf_integer(int, node, node) |
| + ctf_integer(bool, accounted, IS_ENABLED(CONFIG_MEMCG_KMEM) ? |
| + ((gfp_flags & __GFP_ACCOUNT) || |
| + (s && s->flags & SLAB_ACCOUNT)) : false) |
| ) |
| ) |
| |
| -LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(kmem_alloc, kmalloc, |
| +LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(kmem_alloc_node, kmalloc_node, |
| |
| - kmem_kmalloc, |
| + kmem_kmalloc_node, |
| |
| TP_PROTO(unsigned long call_site, const void *ptr, |
| - size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags), |
| + struct kmem_cache *s, size_t bytes_req, size_t bytes_alloc, |
| + gfp_t gfp_flags, int node), |
| |
| - TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags) |
| + TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node) |
| ) |
| |
| -LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_alloc, kmem_cache_alloc, |
| +LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_alloc_node, kmem_cache_alloc_node, |
| |
| TP_PROTO(unsigned long call_site, const void *ptr, |
| - size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags), |
| + struct kmem_cache *s, size_t bytes_req, size_t bytes_alloc, |
| + gfp_t gfp_flags, int node), |
| |
| - TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags) |
| + TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node) |
| ) |
| - |
| +#else |
| LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc_node, |
| |
| TP_PROTO(unsigned long call_site, |
| @@ -192,19 +243,6 @@ LTTNG_TRACEPOINT_EVENT_MAP(kfree, |
| ctf_integer_hex(const void *, ptr, ptr) |
| ) |
| ) |
| - |
| -LTTNG_TRACEPOINT_EVENT(kmem_cache_free, |
| - |
| - TP_PROTO(unsigned long call_site, const void *ptr, const char *name), |
| - |
| - TP_ARGS(call_site, ptr, name), |
| - |
| - TP_FIELDS( |
| - ctf_integer_hex(unsigned long, call_site, call_site) |
| - ctf_integer_hex(const void *, ptr, ptr) |
| - ctf_string(name, name) |
| - ) |
| -) |
| #else |
| LTTNG_TRACEPOINT_EVENT_CLASS(kmem_free, |
| |
| @@ -235,6 +273,34 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_free, kmem_cache_free, |
| ) |
| #endif |
| |
| +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,1,0)) |
| +LTTNG_TRACEPOINT_EVENT(kmem_cache_free, |
| + |
| + TP_PROTO(unsigned long call_site, const void *ptr, const struct kmem_cache *s), |
| + |
| + TP_ARGS(call_site, ptr, s), |
| + |
| + TP_FIELDS( |
| + ctf_integer_hex(unsigned long, call_site, call_site) |
| + ctf_integer_hex(const void *, ptr, ptr) |
| + ctf_string(name, s->name) |
| + ) |
| +) |
| +#elif (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,12,0)) |
| +LTTNG_TRACEPOINT_EVENT(kmem_cache_free, |
| + |
| + TP_PROTO(unsigned long call_site, const void *ptr, const char *name), |
| + |
| + TP_ARGS(call_site, ptr, name), |
| + |
| + TP_FIELDS( |
| + ctf_integer_hex(unsigned long, call_site, call_site) |
| + ctf_integer_hex(const void *, ptr, ptr) |
| + ctf_string(name, name) |
| + ) |
| +) |
| +#endif |
| + |
| #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,3,0)) |
| LTTNG_TRACEPOINT_EVENT_MAP(mm_page_free, kmem_mm_page_free, |
| #else |
| -- |
| 2.19.1 |
| |