aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/trace/kmemtrace.c82
1 files changed, 58 insertions, 24 deletions
diff --git a/kernel/trace/kmemtrace.c b/kernel/trace/kmemtrace.c
index ae259f04ee39..d8c2d0c91b4c 100644
--- a/kernel/trace/kmemtrace.c
+++ b/kernel/trace/kmemtrace.c
@@ -208,47 +208,81 @@ static void kmemtrace_headers(struct seq_file *s)
208} 208}
209 209
210/* 210/*
211 * The two following functions give the original output from kmemtrace, 211 * The following functions give the original output from kmemtrace,
212 * or something close to....perhaps they need some missing things 212 * plus the origin CPU, since reordering occurs in-kernel now.
213 */ 213 */
214
215#define KMEMTRACE_USER_ALLOC 0
216#define KMEMTRACE_USER_FREE 1
217
218struct kmemtrace_user_event {
219 u8 event_id;
220 u8 type_id;
221 u16 event_size;
222 u32 cpu;
223 u64 timestamp;
224 unsigned long call_site;
225 unsigned long ptr;
226};
227
228struct kmemtrace_user_event_alloc {
229 size_t bytes_req;
230 size_t bytes_alloc;
231 unsigned gfp_flags;
232 int node;
233};
234
214static enum print_line_t 235static enum print_line_t
215kmemtrace_print_alloc_original(struct trace_iterator *iter, 236kmemtrace_print_alloc_user(struct trace_iterator *iter,
216 struct kmemtrace_alloc_entry *entry) 237 struct kmemtrace_alloc_entry *entry)
217{ 238{
218 struct trace_seq *s = &iter->seq; 239 struct trace_seq *s = &iter->seq;
219 int ret; 240 struct kmemtrace_user_event *ev;
220 241 struct kmemtrace_user_event_alloc *ev_alloc;
221 /* Taken from the old linux/kmemtrace.h */
222 ret = trace_seq_printf(s, "type_id %d call_site %lu ptr %lu "
223 "bytes_req %lu bytes_alloc %lu gfp_flags %lu node %d\n",
224 entry->type_id, entry->call_site, (unsigned long) entry->ptr,
225 (unsigned long) entry->bytes_req, (unsigned long) entry->bytes_alloc,
226 (unsigned long) entry->gfp_flags, entry->node);
227 242
228 if (!ret) 243 ev = trace_seq_reserve(s, sizeof(*ev));
244 if (!ev)
245 return TRACE_TYPE_PARTIAL_LINE;
246 ev->event_id = KMEMTRACE_USER_ALLOC;
247 ev->type_id = entry->type_id;
248 ev->event_size = sizeof(*ev) + sizeof(*ev_alloc);
249 ev->cpu = iter->cpu;
250 ev->timestamp = iter->ts;
251 ev->call_site = entry->call_site;
252 ev->ptr = (unsigned long) entry->ptr;
253
254 ev_alloc = trace_seq_reserve(s, sizeof(*ev_alloc));
255 if (!ev_alloc)
229 return TRACE_TYPE_PARTIAL_LINE; 256 return TRACE_TYPE_PARTIAL_LINE;
257 ev_alloc->bytes_req = entry->bytes_req;
258 ev_alloc->bytes_alloc = entry->bytes_alloc;
259 ev_alloc->gfp_flags = entry->gfp_flags;
260 ev_alloc->node = entry->node;
230 261
231 return TRACE_TYPE_HANDLED; 262 return TRACE_TYPE_HANDLED;
232} 263}
233 264
234static enum print_line_t 265static enum print_line_t
235kmemtrace_print_free_original(struct trace_iterator *iter, 266kmemtrace_print_free_user(struct trace_iterator *iter,
236 struct kmemtrace_free_entry *entry) 267 struct kmemtrace_free_entry *entry)
237{ 268{
238 struct trace_seq *s = &iter->seq; 269 struct trace_seq *s = &iter->seq;
239 int ret; 270 struct kmemtrace_user_event *ev;
240 271
241 /* Taken from the old linux/kmemtrace.h */ 272 ev = trace_seq_reserve(s, sizeof(*ev));
242 ret = trace_seq_printf(s, "type_id %d call_site %lu ptr %lu\n", 273 if (!ev)
243 entry->type_id, entry->call_site, (unsigned long) entry->ptr);
244
245 if (!ret)
246 return TRACE_TYPE_PARTIAL_LINE; 274 return TRACE_TYPE_PARTIAL_LINE;
275 ev->event_id = KMEMTRACE_USER_FREE;
276 ev->type_id = entry->type_id;
277 ev->event_size = sizeof(*ev);
278 ev->cpu = iter->cpu;
279 ev->timestamp = iter->ts;
280 ev->call_site = entry->call_site;
281 ev->ptr = (unsigned long) entry->ptr;
247 282
248 return TRACE_TYPE_HANDLED; 283 return TRACE_TYPE_HANDLED;
249} 284}
250 285
251
252/* The two other following provide a more minimalistic output */ 286/* The two other following provide a more minimalistic output */
253static enum print_line_t 287static enum print_line_t
254kmemtrace_print_alloc_compress(struct trace_iterator *iter, 288kmemtrace_print_alloc_compress(struct trace_iterator *iter,
@@ -385,7 +419,7 @@ static enum print_line_t kmemtrace_print_line(struct trace_iterator *iter)
385 if (kmem_tracer_flags.val & TRACE_KMEM_OPT_MINIMAL) 419 if (kmem_tracer_flags.val & TRACE_KMEM_OPT_MINIMAL)
386 return kmemtrace_print_alloc_compress(iter, field); 420 return kmemtrace_print_alloc_compress(iter, field);
387 else 421 else
388 return kmemtrace_print_alloc_original(iter, field); 422 return kmemtrace_print_alloc_user(iter, field);
389 } 423 }
390 424
391 case TRACE_KMEM_FREE: { 425 case TRACE_KMEM_FREE: {
@@ -394,7 +428,7 @@ static enum print_line_t kmemtrace_print_line(struct trace_iterator *iter)
394 if (kmem_tracer_flags.val & TRACE_KMEM_OPT_MINIMAL) 428 if (kmem_tracer_flags.val & TRACE_KMEM_OPT_MINIMAL)
395 return kmemtrace_print_free_compress(iter, field); 429 return kmemtrace_print_free_compress(iter, field);
396 else 430 else
397 return kmemtrace_print_free_original(iter, field); 431 return kmemtrace_print_free_user(iter, field);
398 } 432 }
399 433
400 default: 434 default: