summaryrefslogtreecommitdiffstats
path: root/meta/recipes-kernel/lttng/lttng-modules/0001-fix-mm-slab_common-drop-kmem_alloc-avoid-dereferenci.patch
blob: 99402ea5e9650f2e5d492c3e2b9e46bea358eaea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
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