hc
2024-05-10 61598093bbdd283a7edc367d900f223070ead8d2
kernel/kernel/trace/trace_output.c
....@@ -20,7 +20,7 @@
2020
2121 static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly;
2222
23
-static int next_event_type = __TRACE_LAST_TYPE + 1;
23
+static int next_event_type = __TRACE_LAST_TYPE;
2424
2525 enum print_line_t trace_print_bputs_msg_only(struct trace_iterator *iter)
2626 {
....@@ -219,10 +219,10 @@
219219 {
220220 int i;
221221 const char *ret = trace_seq_buffer_ptr(p);
222
+ const char *fmt = concatenate ? "%*phN" : "%*ph";
222223
223
- for (i = 0; i < buf_len; i++)
224
- trace_seq_printf(p, "%s%2.2x", concatenate || i == 0 ? "" : " ",
225
- buf[i]);
224
+ for (i = 0; i < buf_len; i += 16)
225
+ trace_seq_printf(p, fmt, min(buf_len - i, 16), &buf[i]);
226226 trace_seq_putc(p, 0);
227227
228228 return ret;
....@@ -273,6 +273,21 @@
273273 return ret;
274274 }
275275 EXPORT_SYMBOL(trace_print_array_seq);
276
+
277
+const char *
278
+trace_print_hex_dump_seq(struct trace_seq *p, const char *prefix_str,
279
+ int prefix_type, int rowsize, int groupsize,
280
+ const void *buf, size_t len, bool ascii)
281
+{
282
+ const char *ret = trace_seq_buffer_ptr(p);
283
+
284
+ trace_seq_putc(p, '\n');
285
+ trace_seq_hex_dump(p, prefix_str, prefix_type,
286
+ rowsize, groupsize, buf, len, ascii);
287
+ trace_seq_putc(p, 0);
288
+ return ret;
289
+}
290
+EXPORT_SYMBOL(trace_print_hex_dump_seq);
276291
277292 int trace_raw_output_prep(struct trace_iterator *iter,
278293 struct trace_event *trace_event)
....@@ -339,43 +354,24 @@
339354 #endif /* CONFIG_KRETPROBES */
340355
341356 static void
342
-seq_print_sym_short(struct trace_seq *s, const char *fmt, unsigned long address)
357
+seq_print_sym(struct trace_seq *s, unsigned long address, bool offset)
343358 {
344
- char str[KSYM_SYMBOL_LEN];
345359 #ifdef CONFIG_KALLSYMS
360
+ char str[KSYM_SYMBOL_LEN];
346361 const char *name;
347362
348
- kallsyms_lookup(address, NULL, NULL, NULL, str);
349
-
363
+ if (offset)
364
+ sprint_symbol(str, address);
365
+ else
366
+ kallsyms_lookup(address, NULL, NULL, NULL, str);
350367 name = kretprobed(str);
351368
352369 if (name && strlen(name)) {
353
- trace_seq_printf(s, fmt, name);
370
+ trace_seq_puts(s, name);
354371 return;
355372 }
356373 #endif
357
- snprintf(str, KSYM_SYMBOL_LEN, "0x%08lx", address);
358
- trace_seq_printf(s, fmt, str);
359
-}
360
-
361
-static void
362
-seq_print_sym_offset(struct trace_seq *s, const char *fmt,
363
- unsigned long address)
364
-{
365
- char str[KSYM_SYMBOL_LEN];
366
-#ifdef CONFIG_KALLSYMS
367
- const char *name;
368
-
369
- sprint_symbol(str, address);
370
- name = kretprobed(str);
371
-
372
- if (name && strlen(name)) {
373
- trace_seq_printf(s, fmt, name);
374
- return;
375
- }
376
-#endif
377
- snprintf(str, KSYM_SYMBOL_LEN, "0x%08lx", address);
378
- trace_seq_printf(s, fmt, str);
374
+ trace_seq_printf(s, "0x%08lx", address);
379375 }
380376
381377 #ifndef CONFIG_64BIT
....@@ -397,7 +393,7 @@
397393 if (mm) {
398394 const struct vm_area_struct *vma;
399395
400
- down_read(&mm->mmap_sem);
396
+ mmap_read_lock(mm);
401397 vma = find_vma(mm, ip);
402398 if (vma) {
403399 file = vma->vm_file;
....@@ -409,7 +405,7 @@
409405 trace_seq_printf(s, "[+0x%lx]",
410406 ip - vmstart);
411407 }
412
- up_read(&mm->mmap_sem);
408
+ mmap_read_unlock(mm);
413409 }
414410 if (ret && ((sym_flags & TRACE_ITER_SYM_ADDR) || !file))
415411 trace_seq_printf(s, " <" IP_FMT ">", ip);
....@@ -424,10 +420,7 @@
424420 goto out;
425421 }
426422
427
- if (sym_flags & TRACE_ITER_SYM_OFFSET)
428
- seq_print_sym_offset(s, "%s", ip);
429
- else
430
- seq_print_sym_short(s, "%s", ip);
423
+ seq_print_sym(s, ip, sym_flags & TRACE_ITER_SYM_OFFSET);
431424
432425 if (sym_flags & TRACE_ITER_SYM_ADDR)
433426 trace_seq_printf(s, " <" IP_FMT ">", ip);
....@@ -504,7 +497,7 @@
504497
505498 trace_find_cmdline(entry->pid, comm);
506499
507
- trace_seq_printf(s, "%8.8s-%-5d %3d",
500
+ trace_seq_printf(s, "%8.8s-%-7d %3d",
508501 comm, entry->pid, cpu);
509502
510503 return trace_print_lat_fmt(s, entry);
....@@ -545,7 +538,7 @@
545538 struct trace_array *tr = iter->tr;
546539 unsigned long verbose = tr->trace_flags & TRACE_ITER_VERBOSE;
547540 unsigned long in_ns = iter->iter_flags & TRACE_FILE_TIME_IN_NS;
548
- unsigned long long abs_ts = iter->ts - iter->trace_buffer->time_start;
541
+ unsigned long long abs_ts = iter->ts - iter->array_buffer->time_start;
549542 unsigned long long rel_ts = next_ts - iter->ts;
550543 struct trace_seq *s = &iter->seq;
551544
....@@ -595,15 +588,15 @@
595588
596589 trace_find_cmdline(entry->pid, comm);
597590
598
- trace_seq_printf(s, "%16s-%-5d ", comm, entry->pid);
591
+ trace_seq_printf(s, "%16s-%-7d ", comm, entry->pid);
599592
600593 if (tr->trace_flags & TRACE_ITER_RECORD_TGID) {
601594 unsigned int tgid = trace_find_tgid(entry->pid);
602595
603596 if (!tgid)
604
- trace_seq_printf(s, "(-----) ");
597
+ trace_seq_printf(s, "(-------) ");
605598 else
606
- trace_seq_printf(s, "(%5d) ", tgid);
599
+ trace_seq_printf(s, "(%7d) ", tgid);
607600 }
608601
609602 trace_seq_printf(s, "[%03d] ", iter->cpu);
....@@ -624,21 +617,18 @@
624617
625618 int trace_print_lat_context(struct trace_iterator *iter)
626619 {
620
+ struct trace_entry *entry, *next_entry;
627621 struct trace_array *tr = iter->tr;
628
- /* trace_find_next_entry will reset ent_size */
629
- int ent_size = iter->ent_size;
630622 struct trace_seq *s = &iter->seq;
631
- u64 next_ts;
632
- struct trace_entry *entry = iter->ent,
633
- *next_entry = trace_find_next_entry(iter, NULL,
634
- &next_ts);
635623 unsigned long verbose = (tr->trace_flags & TRACE_ITER_VERBOSE);
624
+ u64 next_ts;
636625
637
- /* Restore the original ent_size */
638
- iter->ent_size = ent_size;
639
-
626
+ next_entry = trace_find_next_entry(iter, NULL, &next_ts);
640627 if (!next_entry)
641628 next_ts = iter->ts;
629
+
630
+ /* trace_find_next_entry() may change iter->ent */
631
+ entry = iter->ent;
642632
643633 if (verbose) {
644634 char comm[TASK_COMM_LEN];
....@@ -646,7 +636,7 @@
646636 trace_find_cmdline(entry->pid, comm);
647637
648638 trace_seq_printf(
649
- s, "%16s %5d %3d %d %08x %08lx ",
639
+ s, "%16s %7d %3d %d %08x %08lx ",
650640 comm, entry->pid, iter->cpu, entry->flags,
651641 entry->preempt_count, iter->idx);
652642 } else {
....@@ -685,11 +675,11 @@
685675 static int trace_search_list(struct list_head **list)
686676 {
687677 struct trace_event *e;
688
- int last = __TRACE_LAST_TYPE;
678
+ int next = __TRACE_LAST_TYPE;
689679
690680 if (list_empty(&ftrace_event_list)) {
691681 *list = &ftrace_event_list;
692
- return last + 1;
682
+ return next;
693683 }
694684
695685 /*
....@@ -697,17 +687,17 @@
697687 * lets see if somebody freed one.
698688 */
699689 list_for_each_entry(e, &ftrace_event_list, list) {
700
- if (e->type != last + 1)
690
+ if (e->type != next)
701691 break;
702
- last++;
692
+ next++;
703693 }
704694
705695 /* Did we used up all 65 thousand events??? */
706
- if ((last + 1) > TRACE_EVENT_TYPE_MAX)
696
+ if (next > TRACE_EVENT_TYPE_MAX)
707697 return 0;
708698
709699 *list = &e->list;
710
- return last + 1;
700
+ return next;
711701 }
712702
713703 void trace_event_read_lock(void)
....@@ -927,7 +917,7 @@
927917 S = task_index_to_char(field->prev_state);
928918 trace_find_cmdline(field->next_pid, comm);
929919 trace_seq_printf(&iter->seq,
930
- " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n",
920
+ " %7d:%3d:%c %s [%03d] %7d:%3d:%c %s\n",
931921 field->prev_pid,
932922 field->prev_prio,
933923 S, delim,
....@@ -1079,7 +1069,7 @@
10791069
10801070 trace_seq_puts(s, "<stack trace>\n");
10811071
1082
- for (p = field->caller; p && *p != ULONG_MAX && p < end; p++) {
1072
+ for (p = field->caller; p && p < end && *p != ULONG_MAX; p++) {
10831073
10841074 if (trace_seq_has_overflowed(s))
10851075 break;
....@@ -1131,17 +1121,10 @@
11311121 for (i = 0; i < FTRACE_STACK_ENTRIES; i++) {
11321122 unsigned long ip = field->caller[i];
11331123
1134
- if (ip == ULONG_MAX || trace_seq_has_overflowed(s))
1124
+ if (!ip || trace_seq_has_overflowed(s))
11351125 break;
11361126
11371127 trace_seq_puts(s, " => ");
1138
-
1139
- if (!ip) {
1140
- trace_seq_puts(s, "??");
1141
- trace_seq_putc(s, '\n');
1142
- continue;
1143
- }
1144
-
11451128 seq_print_user_ip(s, mm, ip, flags);
11461129 trace_seq_putc(s, '\n');
11471130 }
....@@ -1172,12 +1155,12 @@
11721155
11731156 trace_assign_type(field, entry);
11741157
1175
- trace_seq_printf(s, "#%-5u inner/outer(us): %4llu/%-5llu ts:%lld.%09ld",
1158
+ trace_seq_printf(s, "#%-5u inner/outer(us): %4llu/%-5llu ts:%lld.%09ld count:%d",
11761159 field->seqnum,
11771160 field->duration,
11781161 field->outer_duration,
11791162 (long long)field->timestamp.tv_sec,
1180
- field->timestamp.tv_nsec);
1163
+ field->timestamp.tv_nsec, field->count);
11811164
11821165 if (field->nmi_count) {
11831166 /*
....@@ -1395,7 +1378,7 @@
13951378 NULL
13961379 };
13971380
1398
-__init static int init_events(void)
1381
+__init int init_events(void)
13991382 {
14001383 struct trace_event *event;
14011384 int i, ret;
....@@ -1413,4 +1396,3 @@
14131396
14141397 return 0;
14151398 }
1416
-early_initcall(init_events);