1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #undef TRACE_SYSTEM |
3 | #define TRACE_SYSTEM ksm |
4 | |
5 | #if !defined(_TRACE_KSM_H) || defined(TRACE_HEADER_MULTI_READ) |
6 | #define _TRACE_KSM_H |
7 | |
8 | #include <linux/tracepoint.h> |
9 | |
10 | /** |
11 | * ksm_scan_template - called for start / stop scan |
12 | * |
13 | * @seq: sequence number of scan |
14 | * @rmap_entries: actual number of rmap entries |
15 | * |
16 | * Allows to trace the start / stop of a ksm scan. |
17 | */ |
18 | DECLARE_EVENT_CLASS(ksm_scan_template, |
19 | |
20 | TP_PROTO(int seq, u32 rmap_entries), |
21 | |
22 | TP_ARGS(seq, rmap_entries), |
23 | |
24 | TP_STRUCT__entry( |
25 | __field(int, seq) |
26 | __field(u32, rmap_entries) |
27 | ), |
28 | |
29 | TP_fast_assign( |
30 | __entry->seq = seq; |
31 | __entry->rmap_entries = rmap_entries; |
32 | ), |
33 | |
34 | TP_printk("seq %d rmap size %d" , |
35 | __entry->seq, __entry->rmap_entries) |
36 | ); |
37 | |
38 | /** |
39 | * ksm_start_scan - called after a new ksm scan is started |
40 | * |
41 | * @seq: sequence number of scan |
42 | * @rmap_entries: actual number of rmap entries |
43 | * |
44 | * Allows to trace the start of a ksm scan. |
45 | */ |
46 | DEFINE_EVENT(ksm_scan_template, ksm_start_scan, |
47 | |
48 | TP_PROTO(int seq, u32 rmap_entries), |
49 | |
50 | TP_ARGS(seq, rmap_entries) |
51 | ); |
52 | |
53 | /** |
54 | * ksm_stop_scan - called after a new ksm scan has completed |
55 | * |
56 | * @seq: sequence number of scan |
57 | * @rmap_entries: actual number of rmap entries |
58 | * |
59 | * Allows to trace the completion of a ksm scan. |
60 | */ |
61 | DEFINE_EVENT(ksm_scan_template, ksm_stop_scan, |
62 | |
63 | TP_PROTO(int seq, u32 rmap_entries), |
64 | |
65 | TP_ARGS(seq, rmap_entries) |
66 | ); |
67 | |
68 | /** |
69 | * ksm_enter - called after a new process has been added / removed from ksm |
70 | * |
71 | * @mm: address of the mm object of the process |
72 | * |
73 | * Allows to trace the when a process has been added or removed from ksm. |
74 | */ |
75 | DECLARE_EVENT_CLASS(ksm_enter_exit_template, |
76 | |
77 | TP_PROTO(void *mm), |
78 | |
79 | TP_ARGS(mm), |
80 | |
81 | TP_STRUCT__entry( |
82 | __field(void *, mm) |
83 | ), |
84 | |
85 | TP_fast_assign( |
86 | __entry->mm = mm; |
87 | ), |
88 | |
89 | TP_printk("mm %p" , __entry->mm) |
90 | ); |
91 | |
92 | /** |
93 | * ksm_enter - called after a new process has been added to ksm |
94 | * |
95 | * @mm: address of the mm object of the process |
96 | * |
97 | * Allows to trace the when a process has been added to ksm. |
98 | */ |
99 | DEFINE_EVENT(ksm_enter_exit_template, ksm_enter, |
100 | |
101 | TP_PROTO(void *mm), |
102 | |
103 | TP_ARGS(mm) |
104 | ); |
105 | |
106 | /** |
107 | * ksm_exit - called after a new process has been removed from ksm |
108 | * |
109 | * @mm: address of the mm object of the process |
110 | * |
111 | * Allows to trace the when a process has been removed from ksm. |
112 | */ |
113 | DEFINE_EVENT(ksm_enter_exit_template, ksm_exit, |
114 | |
115 | TP_PROTO(void *mm), |
116 | |
117 | TP_ARGS(mm) |
118 | ); |
119 | |
120 | /** |
121 | * ksm_merge_one_page - called after a page has been merged |
122 | * |
123 | * @pfn: page frame number of ksm page |
124 | * @rmap_item: address of rmap_item object |
125 | * @mm: address of the process mm struct |
126 | * @err: success |
127 | * |
128 | * Allows to trace the ksm merging of individual pages. |
129 | */ |
130 | TRACE_EVENT(ksm_merge_one_page, |
131 | |
132 | TP_PROTO(unsigned long pfn, void *rmap_item, void *mm, int err), |
133 | |
134 | TP_ARGS(pfn, rmap_item, mm, err), |
135 | |
136 | TP_STRUCT__entry( |
137 | __field(unsigned long, pfn) |
138 | __field(void *, rmap_item) |
139 | __field(void *, mm) |
140 | __field(int, err) |
141 | ), |
142 | |
143 | TP_fast_assign( |
144 | __entry->pfn = pfn; |
145 | __entry->rmap_item = rmap_item; |
146 | __entry->mm = mm; |
147 | __entry->err = err; |
148 | ), |
149 | |
150 | TP_printk("ksm pfn %lu rmap_item %p mm %p error %d" , |
151 | __entry->pfn, __entry->rmap_item, __entry->mm, __entry->err) |
152 | ); |
153 | |
154 | /** |
155 | * ksm_merge_with_ksm_page - called after a page has been merged with a ksm page |
156 | * |
157 | * @ksm_page: address ksm page |
158 | * @pfn: page frame number of ksm page |
159 | * @rmap_item: address of rmap_item object |
160 | * @mm: address of the mm object of the process |
161 | * @err: success |
162 | * |
163 | * Allows to trace the merging of a page with a ksm page. |
164 | */ |
165 | TRACE_EVENT(ksm_merge_with_ksm_page, |
166 | |
167 | TP_PROTO(void *ksm_page, unsigned long pfn, void *rmap_item, void *mm, int err), |
168 | |
169 | TP_ARGS(ksm_page, pfn, rmap_item, mm, err), |
170 | |
171 | TP_STRUCT__entry( |
172 | __field(void *, ksm_page) |
173 | __field(unsigned long, pfn) |
174 | __field(void *, rmap_item) |
175 | __field(void *, mm) |
176 | __field(int, err) |
177 | ), |
178 | |
179 | TP_fast_assign( |
180 | __entry->ksm_page = ksm_page; |
181 | __entry->pfn = pfn; |
182 | __entry->rmap_item = rmap_item; |
183 | __entry->mm = mm; |
184 | __entry->err = err; |
185 | ), |
186 | |
187 | TP_printk("%spfn %lu rmap_item %p mm %p error %d" , |
188 | (__entry->ksm_page ? "ksm " : "" ), |
189 | __entry->pfn, __entry->rmap_item, __entry->mm, __entry->err) |
190 | ); |
191 | |
192 | /** |
193 | * ksm_remove_ksm_page - called after a ksm page has been removed |
194 | * |
195 | * @pfn: page frame number of ksm page |
196 | * |
197 | * Allows to trace the removing of stable ksm pages. |
198 | */ |
199 | TRACE_EVENT(ksm_remove_ksm_page, |
200 | |
201 | TP_PROTO(unsigned long pfn), |
202 | |
203 | TP_ARGS(pfn), |
204 | |
205 | TP_STRUCT__entry( |
206 | __field(unsigned long, pfn) |
207 | ), |
208 | |
209 | TP_fast_assign( |
210 | __entry->pfn = pfn; |
211 | ), |
212 | |
213 | TP_printk("pfn %lu" , __entry->pfn) |
214 | ); |
215 | |
216 | /** |
217 | * ksm_remove_rmap_item - called after a rmap_item has been removed from the |
218 | * stable tree |
219 | * |
220 | * @pfn: page frame number of ksm page |
221 | * @rmap_item: address of rmap_item object |
222 | * @mm: address of the process mm struct |
223 | * |
224 | * Allows to trace the removal of pages from the stable tree list. |
225 | */ |
226 | TRACE_EVENT(ksm_remove_rmap_item, |
227 | |
228 | TP_PROTO(unsigned long pfn, void *rmap_item, void *mm), |
229 | |
230 | TP_ARGS(pfn, rmap_item, mm), |
231 | |
232 | TP_STRUCT__entry( |
233 | __field(unsigned long, pfn) |
234 | __field(void *, rmap_item) |
235 | __field(void *, mm) |
236 | ), |
237 | |
238 | TP_fast_assign( |
239 | __entry->pfn = pfn; |
240 | __entry->rmap_item = rmap_item; |
241 | __entry->mm = mm; |
242 | ), |
243 | |
244 | TP_printk("pfn %lu rmap_item %p mm %p" , |
245 | __entry->pfn, __entry->rmap_item, __entry->mm) |
246 | ); |
247 | |
248 | #endif /* _TRACE_KSM_H */ |
249 | |
250 | /* This part must be outside protection */ |
251 | #include <trace/define_trace.h> |
252 | |