1 From b977f96d0a414e76d4c544f65791919dde1bc57e Mon Sep 17 00:00:00 2001
2 From: Michael Jeanson <mjeanson@efficios.com>
3 Date: Mon, 17 Oct 2022 13:49:51 -0400
4 Subject: [PATCH] fix: mm/slab_common: drop kmem_alloc & avoid dereferencing
5 fields when not using (v6.1)
9 commit 2c1d697fb8ba6d2d44f914d4268ae1ccdf025f1b
10 Author: Hyeonggon Yoo <42.hyeyoo@gmail.com>
11 Date: Wed Aug 17 19:18:24 2022 +0900
13 mm/slab_common: drop kmem_alloc & avoid dereferencing fields when not using
15 Drop kmem_alloc event class, and define kmalloc and kmem_cache_alloc
16 using TRACE_EVENT() macro.
18 And then this patch does:
19 - Do not pass pointer to struct kmem_cache to trace_kmalloc.
20 gfp flag is enough to know if it's accounted or not.
21 - Avoid dereferencing s->object_size and s->size when not using kmem_cache_alloc event.
22 - Avoid dereferencing s->name in when not using kmem_cache_free event.
23 - Adjust s->size to SLOB_UNITS(s->size) * SLOB_UNIT in SLOB
25 Upstream-Status: Backport [commit b977f96d0a414e76d4c544f]
27 Change-Id: Icd7925731ed4a737699c3746cb7bb7760a4e8009
28 Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
29 Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
31 include/instrumentation/events/kmem.h | 156 ++++++++++++++++++--------
32 1 file changed, 111 insertions(+), 45 deletions(-)
34 diff --git a/include/instrumentation/events/kmem.h b/include/instrumentation/events/kmem.h
35 index 219533a1..0f5bd8e6 100644
36 --- a/include/instrumentation/events/kmem.h
37 +++ b/include/instrumentation/events/kmem.h
39 #include <lttng/kernel-version.h>
41 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,0,0))
43 #include <../../mm/slab.h>
46 +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,1,0))
47 +LTTNG_TRACEPOINT_EVENT_MAP(kmalloc,
51 + TP_PROTO(unsigned long call_site,
58 + TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags, node),
61 + ctf_integer_hex(unsigned long, call_site, call_site)
62 + ctf_integer_hex(const void *, ptr, ptr)
63 + ctf_integer(size_t, bytes_req, bytes_req)
64 + ctf_integer(size_t, bytes_alloc, bytes_alloc)
65 + ctf_integer(gfp_t, gfp_flags, gfp_flags)
66 + ctf_integer(int, node, node)
67 + ctf_integer(bool, accounted, (IS_ENABLED(CONFIG_MEMCG_KMEM) &&
68 + (gfp_flags & __GFP_ACCOUNT) ? true : false))
72 +LTTNG_TRACEPOINT_EVENT(kmem_cache_alloc,
74 + TP_PROTO(unsigned long call_site,
76 + struct kmem_cache *s,
80 + TP_ARGS(call_site, ptr, s, gfp_flags, node),
83 + ctf_integer_hex(unsigned long, call_site, call_site)
84 + ctf_integer_hex(const void *, ptr, ptr)
85 + ctf_integer(size_t, bytes_req, s->object_size)
86 + ctf_integer(size_t, bytes_alloc, s->size)
87 + ctf_integer(gfp_t, gfp_flags, gfp_flags)
88 + ctf_integer(int, node, node)
89 + ctf_integer(bool, accounted, IS_ENABLED(CONFIG_MEMCG_KMEM) ?
90 + ((gfp_flags & __GFP_ACCOUNT) ||
91 + (s->flags & SLAB_ACCOUNT)) : false)
94 +#elif (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,0,0))
95 LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc,
97 TP_PROTO(unsigned long call_site,
98 @@ -53,18 +102,16 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_alloc, kmem_cache_alloc,
100 TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags)
103 -LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc_node,
105 +LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc,
107 TP_PROTO(unsigned long call_site,
109 - struct kmem_cache *s,
116 - TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node),
117 + TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags),
120 ctf_integer_hex(unsigned long, call_site, call_site)
121 @@ -72,42 +119,40 @@ LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc_node,
122 ctf_integer(size_t, bytes_req, bytes_req)
123 ctf_integer(size_t, bytes_alloc, bytes_alloc)
124 ctf_integer(gfp_t, gfp_flags, gfp_flags)
125 - ctf_integer(int, node, node)
126 - ctf_integer(bool, accounted, IS_ENABLED(CONFIG_MEMCG_KMEM) ?
127 - ((gfp_flags & __GFP_ACCOUNT) ||
128 - (s && s->flags & SLAB_ACCOUNT)) : false)
132 -LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(kmem_alloc_node, kmalloc_node,
133 +LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(kmem_alloc, kmalloc,
138 TP_PROTO(unsigned long call_site, const void *ptr,
139 - struct kmem_cache *s, size_t bytes_req, size_t bytes_alloc,
140 - gfp_t gfp_flags, int node),
141 + size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags),
143 - TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node)
144 + TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags)
147 -LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_alloc_node, kmem_cache_alloc_node,
148 +LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_alloc, kmem_cache_alloc,
150 TP_PROTO(unsigned long call_site, const void *ptr,
151 - struct kmem_cache *s, size_t bytes_req, size_t bytes_alloc,
152 - gfp_t gfp_flags, int node),
153 + size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags),
155 - TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node)
156 + TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags)
159 -LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc,
162 +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,0,0))
163 +LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc_node,
165 TP_PROTO(unsigned long call_site,
167 + struct kmem_cache *s,
174 - TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags),
175 + TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node),
178 ctf_integer_hex(unsigned long, call_site, call_site)
179 @@ -115,27 +160,33 @@ LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc,
180 ctf_integer(size_t, bytes_req, bytes_req)
181 ctf_integer(size_t, bytes_alloc, bytes_alloc)
182 ctf_integer(gfp_t, gfp_flags, gfp_flags)
183 + ctf_integer(int, node, node)
184 + ctf_integer(bool, accounted, IS_ENABLED(CONFIG_MEMCG_KMEM) ?
185 + ((gfp_flags & __GFP_ACCOUNT) ||
186 + (s && s->flags & SLAB_ACCOUNT)) : false)
190 -LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(kmem_alloc, kmalloc,
191 +LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(kmem_alloc_node, kmalloc_node,
196 TP_PROTO(unsigned long call_site, const void *ptr,
197 - size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags),
198 + struct kmem_cache *s, size_t bytes_req, size_t bytes_alloc,
199 + gfp_t gfp_flags, int node),
201 - TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags)
202 + TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node)
205 -LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_alloc, kmem_cache_alloc,
206 +LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_alloc_node, kmem_cache_alloc_node,
208 TP_PROTO(unsigned long call_site, const void *ptr,
209 - size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags),
210 + struct kmem_cache *s, size_t bytes_req, size_t bytes_alloc,
211 + gfp_t gfp_flags, int node),
213 - TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags)
214 + TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node)
218 LTTNG_TRACEPOINT_EVENT_CLASS(kmem_alloc_node,
220 TP_PROTO(unsigned long call_site,
221 @@ -192,19 +243,6 @@ LTTNG_TRACEPOINT_EVENT_MAP(kfree,
222 ctf_integer_hex(const void *, ptr, ptr)
226 -LTTNG_TRACEPOINT_EVENT(kmem_cache_free,
228 - TP_PROTO(unsigned long call_site, const void *ptr, const char *name),
230 - TP_ARGS(call_site, ptr, name),
233 - ctf_integer_hex(unsigned long, call_site, call_site)
234 - ctf_integer_hex(const void *, ptr, ptr)
235 - ctf_string(name, name)
239 LTTNG_TRACEPOINT_EVENT_CLASS(kmem_free,
241 @@ -235,6 +273,34 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE(kmem_free, kmem_cache_free,
245 +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,1,0))
246 +LTTNG_TRACEPOINT_EVENT(kmem_cache_free,
248 + TP_PROTO(unsigned long call_site, const void *ptr, const struct kmem_cache *s),
250 + TP_ARGS(call_site, ptr, s),
253 + ctf_integer_hex(unsigned long, call_site, call_site)
254 + ctf_integer_hex(const void *, ptr, ptr)
255 + ctf_string(name, s->name)
258 +#elif (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,12,0))
259 +LTTNG_TRACEPOINT_EVENT(kmem_cache_free,
261 + TP_PROTO(unsigned long call_site, const void *ptr, const char *name),
263 + TP_ARGS(call_site, ptr, name),
266 + ctf_integer_hex(unsigned long, call_site, call_site)
267 + ctf_integer_hex(const void *, ptr, ptr)
268 + ctf_string(name, name)
273 #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,3,0))
274 LTTNG_TRACEPOINT_EVENT_MAP(mm_page_free, kmem_mm_page_free,