fix: mm/slab_common: drop kmem_alloc & avoid dereferencing fields when not using...
authorMichael Jeanson <mjeanson@efficios.com>
Mon, 17 Oct 2022 17:49:51 +0000 (13:49 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 24 Oct 2022 15:18:23 +0000 (11:18 -0400)
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

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

index 219533a1ed12e74e9441137044b3dda3a2181239..0f5bd8e64225d7c784b9147fe30d96fba2900920 100644 (file)
 #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
This page took 0.031073 seconds and 4 git commands to generate.