xref: /linux/include/trace/events/kmem.h (revision 8804d970fab45726b3c7cd7f240b31122aa94219)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #undef TRACE_SYSTEM
3 #define TRACE_SYSTEM kmem
4 
5 #if !defined(_TRACE_KMEM_H) || defined(TRACE_HEADER_MULTI_READ)
6 #define _TRACE_KMEM_H
7 
8 #include <linux/types.h>
9 #include <linux/tracepoint.h>
10 #include <trace/events/mmflags.h>
11 
12 TRACE_EVENT(kmem_cache_alloc,
13 
14 	TP_PROTO(unsigned long call_site,
15 		 const void *ptr,
16 		 struct kmem_cache *s,
17 		 gfp_t gfp_flags,
18 		 int node),
19 
20 	TP_ARGS(call_site, ptr, s, gfp_flags, node),
21 
22 	TP_STRUCT__entry(
23 		__field(	unsigned long,	call_site	)
24 		__field(	const void *,	ptr		)
25 		__string(	name,		s->name		)
26 		__field(	size_t,		bytes_req	)
27 		__field(	size_t,		bytes_alloc	)
28 		__field(	unsigned long,	gfp_flags	)
29 		__field(	int,		node		)
30 		__field(	bool,		accounted	)
31 	),
32 
33 	TP_fast_assign(
34 		__entry->call_site	= call_site;
35 		__entry->ptr		= ptr;
36 		__assign_str(name);
37 		__entry->bytes_req	= s->object_size;
38 		__entry->bytes_alloc	= s->size;
39 		__entry->gfp_flags	= (__force unsigned long)gfp_flags;
40 		__entry->node		= node;
41 		__entry->accounted	= IS_ENABLED(CONFIG_MEMCG) ?
42 					  ((gfp_flags & __GFP_ACCOUNT) ||
43 					  (s->flags & SLAB_ACCOUNT)) : false;
44 	),
45 
46 	TP_printk("call_site=%pS ptr=%p name=%s bytes_req=%zu bytes_alloc=%zu gfp_flags=%s node=%d accounted=%s",
47 		(void *)__entry->call_site,
48 		__entry->ptr,
49 		__get_str(name),
50 		__entry->bytes_req,
51 		__entry->bytes_alloc,
52 		show_gfp_flags(__entry->gfp_flags),
53 		__entry->node,
54 		__entry->accounted ? "true" : "false")
55 );
56 
57 TRACE_EVENT(kmalloc,
58 
59 	TP_PROTO(unsigned long call_site,
60 		 const void *ptr,
61 		 size_t bytes_req,
62 		 size_t bytes_alloc,
63 		 gfp_t gfp_flags,
64 		 int node),
65 
66 	TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags, node),
67 
68 	TP_STRUCT__entry(
69 		__field(	unsigned long,	call_site	)
70 		__field(	const void *,	ptr		)
71 		__field(	size_t,		bytes_req	)
72 		__field(	size_t,		bytes_alloc	)
73 		__field(	unsigned long,	gfp_flags	)
74 		__field(	int,		node		)
75 	),
76 
77 	TP_fast_assign(
78 		__entry->call_site	= call_site;
79 		__entry->ptr		= ptr;
80 		__entry->bytes_req	= bytes_req;
81 		__entry->bytes_alloc	= bytes_alloc;
82 		__entry->gfp_flags	= (__force unsigned long)gfp_flags;
83 		__entry->node		= node;
84 	),
85 
86 	TP_printk("call_site=%pS ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s node=%d accounted=%s",
87 		(void *)__entry->call_site,
88 		__entry->ptr,
89 		__entry->bytes_req,
90 		__entry->bytes_alloc,
91 		show_gfp_flags(__entry->gfp_flags),
92 		__entry->node,
93 		(IS_ENABLED(CONFIG_MEMCG) &&
94 		 (__entry->gfp_flags & (__force unsigned long)__GFP_ACCOUNT)) ? "true" : "false")
95 );
96 
97 TRACE_EVENT(kfree,
98 
99 	TP_PROTO(unsigned long call_site, const void *ptr),
100 
101 	TP_ARGS(call_site, ptr),
102 
103 	TP_STRUCT__entry(
104 		__field(	unsigned long,	call_site	)
105 		__field(	const void *,	ptr		)
106 	),
107 
108 	TP_fast_assign(
109 		__entry->call_site	= call_site;
110 		__entry->ptr		= ptr;
111 	),
112 
113 	TP_printk("call_site=%pS ptr=%p",
114 		  (void *)__entry->call_site, __entry->ptr)
115 );
116 
117 TRACE_EVENT(kmem_cache_free,
118 
119 	TP_PROTO(unsigned long call_site, const void *ptr, const struct kmem_cache *s),
120 
121 	TP_ARGS(call_site, ptr, s),
122 
123 	TP_STRUCT__entry(
124 		__field(	unsigned long,	call_site	)
125 		__field(	const void *,	ptr		)
126 		__string(	name,		s->name		)
127 	),
128 
129 	TP_fast_assign(
130 		__entry->call_site	= call_site;
131 		__entry->ptr		= ptr;
132 		__assign_str(name);
133 	),
134 
135 	TP_printk("call_site=%pS ptr=%p name=%s",
136 		  (void *)__entry->call_site, __entry->ptr, __get_str(name))
137 );
138 
139 TRACE_EVENT(mm_page_free,
140 
141 	TP_PROTO(struct page *page, unsigned int order),
142 
143 	TP_ARGS(page, order),
144 
145 	TP_STRUCT__entry(
146 		__field(	unsigned long,	pfn		)
147 		__field(	unsigned int,	order		)
148 	),
149 
150 	TP_fast_assign(
151 		__entry->pfn		= page_to_pfn(page);
152 		__entry->order		= order;
153 	),
154 
155 	TP_printk("page=%p pfn=0x%lx order=%d",
156 			pfn_to_page(__entry->pfn),
157 			__entry->pfn,
158 			__entry->order)
159 );
160 
161 TRACE_EVENT(mm_page_free_batched,
162 
163 	TP_PROTO(struct page *page),
164 
165 	TP_ARGS(page),
166 
167 	TP_STRUCT__entry(
168 		__field(	unsigned long,	pfn		)
169 	),
170 
171 	TP_fast_assign(
172 		__entry->pfn		= page_to_pfn(page);
173 	),
174 
175 	TP_printk("page=%p pfn=0x%lx order=0",
176 			pfn_to_page(__entry->pfn),
177 			__entry->pfn)
178 );
179 
180 TRACE_EVENT(mm_page_alloc,
181 
182 	TP_PROTO(struct page *page, unsigned int order,
183 			gfp_t gfp_flags, int migratetype),
184 
185 	TP_ARGS(page, order, gfp_flags, migratetype),
186 
187 	TP_STRUCT__entry(
188 		__field(	unsigned long,	pfn		)
189 		__field(	unsigned int,	order		)
190 		__field(	unsigned long,	gfp_flags	)
191 		__field(	int,		migratetype	)
192 	),
193 
194 	TP_fast_assign(
195 		__entry->pfn		= page ? page_to_pfn(page) : -1UL;
196 		__entry->order		= order;
197 		__entry->gfp_flags	= (__force unsigned long)gfp_flags;
198 		__entry->migratetype	= migratetype;
199 	),
200 
201 	TP_printk("page=%p pfn=0x%lx order=%d migratetype=%d gfp_flags=%s",
202 		__entry->pfn != -1UL ? pfn_to_page(__entry->pfn) : NULL,
203 		__entry->pfn != -1UL ? __entry->pfn : 0,
204 		__entry->order,
205 		__entry->migratetype,
206 		show_gfp_flags(__entry->gfp_flags))
207 );
208 
209 DECLARE_EVENT_CLASS(mm_page,
210 
211 	TP_PROTO(struct page *page, unsigned int order, int migratetype,
212 		 int percpu_refill),
213 
214 	TP_ARGS(page, order, migratetype, percpu_refill),
215 
216 	TP_STRUCT__entry(
217 		__field(	unsigned long,	pfn		)
218 		__field(	unsigned int,	order		)
219 		__field(	int,		migratetype	)
220 		__field(	int,		percpu_refill	)
221 	),
222 
223 	TP_fast_assign(
224 		__entry->pfn		= page ? page_to_pfn(page) : -1UL;
225 		__entry->order		= order;
226 		__entry->migratetype	= migratetype;
227 		__entry->percpu_refill	= percpu_refill;
228 	),
229 
230 	TP_printk("page=%p pfn=0x%lx order=%u migratetype=%d percpu_refill=%d",
231 		__entry->pfn != -1UL ? pfn_to_page(__entry->pfn) : NULL,
232 		__entry->pfn != -1UL ? __entry->pfn : 0,
233 		__entry->order,
234 		__entry->migratetype,
235 		__entry->percpu_refill)
236 );
237 
238 DEFINE_EVENT(mm_page, mm_page_alloc_zone_locked,
239 
240 	TP_PROTO(struct page *page, unsigned int order, int migratetype,
241 		 int percpu_refill),
242 
243 	TP_ARGS(page, order, migratetype, percpu_refill)
244 );
245 
246 TRACE_EVENT(mm_page_pcpu_drain,
247 
248 	TP_PROTO(struct page *page, unsigned int order, int migratetype),
249 
250 	TP_ARGS(page, order, migratetype),
251 
252 	TP_STRUCT__entry(
253 		__field(	unsigned long,	pfn		)
254 		__field(	unsigned int,	order		)
255 		__field(	int,		migratetype	)
256 	),
257 
258 	TP_fast_assign(
259 		__entry->pfn		= page ? page_to_pfn(page) : -1UL;
260 		__entry->order		= order;
261 		__entry->migratetype	= migratetype;
262 	),
263 
264 	TP_printk("page=%p pfn=0x%lx order=%d migratetype=%d",
265 		pfn_to_page(__entry->pfn), __entry->pfn,
266 		__entry->order, __entry->migratetype)
267 );
268 
269 TRACE_EVENT(mm_page_alloc_extfrag,
270 
271 	TP_PROTO(struct page *page,
272 		int alloc_order, int fallback_order,
273 		int alloc_migratetype, int fallback_migratetype),
274 
275 	TP_ARGS(page,
276 		alloc_order, fallback_order,
277 		alloc_migratetype, fallback_migratetype),
278 
279 	TP_STRUCT__entry(
280 		__field(	unsigned long,	pfn			)
281 		__field(	int,		alloc_order		)
282 		__field(	int,		fallback_order		)
283 		__field(	int,		alloc_migratetype	)
284 		__field(	int,		fallback_migratetype	)
285 		__field(	int,		change_ownership	)
286 	),
287 
288 	TP_fast_assign(
289 		__entry->pfn			= page_to_pfn(page);
290 		__entry->alloc_order		= alloc_order;
291 		__entry->fallback_order		= fallback_order;
292 		__entry->alloc_migratetype	= alloc_migratetype;
293 		__entry->fallback_migratetype	= fallback_migratetype;
294 		__entry->change_ownership	= (alloc_migratetype ==
295 					get_pageblock_migratetype(page));
296 	),
297 
298 	TP_printk("page=%p pfn=0x%lx alloc_order=%d fallback_order=%d pageblock_order=%d alloc_migratetype=%d fallback_migratetype=%d fragmenting=%d change_ownership=%d",
299 		pfn_to_page(__entry->pfn),
300 		__entry->pfn,
301 		__entry->alloc_order,
302 		__entry->fallback_order,
303 		pageblock_order,
304 		__entry->alloc_migratetype,
305 		__entry->fallback_migratetype,
306 		__entry->fallback_order < pageblock_order,
307 		__entry->change_ownership)
308 );
309 
310 TRACE_EVENT(mm_setup_per_zone_wmarks,
311 
312 	TP_PROTO(struct zone *zone),
313 
314 	TP_ARGS(zone),
315 
316 	TP_STRUCT__entry(
317 		__field(int, node_id)
318 		__string(name, zone->name)
319 		__field(unsigned long, watermark_min)
320 		__field(unsigned long, watermark_low)
321 		__field(unsigned long, watermark_high)
322 		__field(unsigned long, watermark_promo)
323 	),
324 
325 	TP_fast_assign(
326 		__entry->node_id = zone->zone_pgdat->node_id;
327 		__assign_str(name);
328 		__entry->watermark_min = zone->_watermark[WMARK_MIN];
329 		__entry->watermark_low = zone->_watermark[WMARK_LOW];
330 		__entry->watermark_high = zone->_watermark[WMARK_HIGH];
331 		__entry->watermark_promo = zone->_watermark[WMARK_PROMO];
332 	),
333 
334 	TP_printk("node_id=%d zone name=%s watermark min=%lu low=%lu high=%lu promo=%lu",
335 		  __entry->node_id,
336 		  __get_str(name),
337 		  __entry->watermark_min,
338 		  __entry->watermark_low,
339 		  __entry->watermark_high,
340 		  __entry->watermark_promo)
341 );
342 
343 TRACE_EVENT(mm_setup_per_zone_lowmem_reserve,
344 
345 	TP_PROTO(struct zone *zone, struct zone *upper_zone, long lowmem_reserve),
346 
347 	TP_ARGS(zone, upper_zone, lowmem_reserve),
348 
349 	TP_STRUCT__entry(
350 		__field(int, node_id)
351 		__string(name, zone->name)
352 		__string(upper_name, upper_zone->name)
353 		__field(long, lowmem_reserve)
354 	),
355 
356 	TP_fast_assign(
357 		__entry->node_id = zone->zone_pgdat->node_id;
358 		__assign_str(name);
359 		__assign_str(upper_name);
360 		__entry->lowmem_reserve = lowmem_reserve;
361 	),
362 
363 	TP_printk("node_id=%d zone name=%s upper_zone name=%s lowmem_reserve_pages=%ld",
364 		  __entry->node_id,
365 		  __get_str(name),
366 		  __get_str(upper_name),
367 		  __entry->lowmem_reserve)
368 );
369 
370 TRACE_EVENT(mm_calculate_totalreserve_pages,
371 
372 	TP_PROTO(unsigned long totalreserve_pages),
373 
374 	TP_ARGS(totalreserve_pages),
375 
376 	TP_STRUCT__entry(
377 		__field(unsigned long, totalreserve_pages)
378 	),
379 
380 	TP_fast_assign(
381 		__entry->totalreserve_pages = totalreserve_pages;
382 	),
383 
384 	TP_printk("totalreserve_pages=%lu", __entry->totalreserve_pages)
385 );
386 
387 
388 /*
389  * Required for uniquely and securely identifying mm in rss_stat tracepoint.
390  */
391 #ifndef __PTR_TO_HASHVAL
mm_ptr_to_hash(const void * ptr)392 static unsigned int __maybe_unused mm_ptr_to_hash(const void *ptr)
393 {
394 	int ret;
395 	unsigned long hashval;
396 
397 	ret = ptr_to_hashval(ptr, &hashval);
398 	if (ret)
399 		return 0;
400 
401 	/* The hashed value is only 32-bit */
402 	return (unsigned int)hashval;
403 }
404 #define __PTR_TO_HASHVAL
405 #endif
406 
407 #define TRACE_MM_PAGES		\
408 	EM(MM_FILEPAGES)	\
409 	EM(MM_ANONPAGES)	\
410 	EM(MM_SWAPENTS)		\
411 	EMe(MM_SHMEMPAGES)
412 
413 #undef EM
414 #undef EMe
415 
416 #define EM(a)	TRACE_DEFINE_ENUM(a);
417 #define EMe(a)	TRACE_DEFINE_ENUM(a);
418 
419 TRACE_MM_PAGES
420 
421 #undef EM
422 #undef EMe
423 
424 #define EM(a)	{ a, #a },
425 #define EMe(a)	{ a, #a }
426 
427 TRACE_EVENT(rss_stat,
428 
429 	TP_PROTO(struct mm_struct *mm,
430 		int member),
431 
432 	TP_ARGS(mm, member),
433 
434 	TP_STRUCT__entry(
435 		__field(unsigned int, mm_id)
436 		__field(unsigned int, curr)
437 		__field(int, member)
438 		__field(long, size)
439 	),
440 
441 	TP_fast_assign(
442 		__entry->mm_id = mm_ptr_to_hash(mm);
443 		__entry->curr = !!(current->mm == mm);
444 		__entry->member = member;
445 		__entry->size = (percpu_counter_sum_positive(&mm->rss_stat[member])
446 							    << PAGE_SHIFT);
447 	),
448 
449 	TP_printk("mm_id=%u curr=%d type=%s size=%ldB",
450 		__entry->mm_id,
451 		__entry->curr,
452 		__print_symbolic(__entry->member, TRACE_MM_PAGES),
453 		__entry->size)
454 	);
455 #endif /* _TRACE_KMEM_H */
456 
457 /* This part must be outside protection */
458 #include <trace/define_trace.h>
459