hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
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);
....@@ -519,7 +512,7 @@
519512
520513 trace_find_cmdline(entry->pid, comm);
521514
522
- trace_seq_printf(s, "%8.8s-%-5d %3d",
515
+ trace_seq_printf(s, "%8.8s-%-7d %3d",
523516 comm, entry->pid, cpu);
524517
525518 return trace_print_lat_fmt(s, entry);
....@@ -560,7 +553,7 @@
560553 struct trace_array *tr = iter->tr;
561554 unsigned long verbose = tr->trace_flags & TRACE_ITER_VERBOSE;
562555 unsigned long in_ns = iter->iter_flags & TRACE_FILE_TIME_IN_NS;
563
- unsigned long long abs_ts = iter->ts - iter->trace_buffer->time_start;
556
+ unsigned long long abs_ts = iter->ts - iter->array_buffer->time_start;
564557 unsigned long long rel_ts = next_ts - iter->ts;
565558 struct trace_seq *s = &iter->seq;
566559
....@@ -610,15 +603,15 @@
610603
611604 trace_find_cmdline(entry->pid, comm);
612605
613
- trace_seq_printf(s, "%16s-%-5d ", comm, entry->pid);
606
+ trace_seq_printf(s, "%16s-%-7d ", comm, entry->pid);
614607
615608 if (tr->trace_flags & TRACE_ITER_RECORD_TGID) {
616609 unsigned int tgid = trace_find_tgid(entry->pid);
617610
618611 if (!tgid)
619
- trace_seq_printf(s, "(-----) ");
612
+ trace_seq_printf(s, "(-------) ");
620613 else
621
- trace_seq_printf(s, "(%5d) ", tgid);
614
+ trace_seq_printf(s, "(%7d) ", tgid);
622615 }
623616
624617 trace_seq_printf(s, "[%03d] ", iter->cpu);
....@@ -639,21 +632,18 @@
639632
640633 int trace_print_lat_context(struct trace_iterator *iter)
641634 {
635
+ struct trace_entry *entry, *next_entry;
642636 struct trace_array *tr = iter->tr;
643
- /* trace_find_next_entry will reset ent_size */
644
- int ent_size = iter->ent_size;
645637 struct trace_seq *s = &iter->seq;
646
- u64 next_ts;
647
- struct trace_entry *entry = iter->ent,
648
- *next_entry = trace_find_next_entry(iter, NULL,
649
- &next_ts);
650638 unsigned long verbose = (tr->trace_flags & TRACE_ITER_VERBOSE);
639
+ u64 next_ts;
651640
652
- /* Restore the original ent_size */
653
- iter->ent_size = ent_size;
654
-
641
+ next_entry = trace_find_next_entry(iter, NULL, &next_ts);
655642 if (!next_entry)
656643 next_ts = iter->ts;
644
+
645
+ /* trace_find_next_entry() may change iter->ent */
646
+ entry = iter->ent;
657647
658648 if (verbose) {
659649 char comm[TASK_COMM_LEN];
....@@ -661,7 +651,7 @@
661651 trace_find_cmdline(entry->pid, comm);
662652
663653 trace_seq_printf(
664
- s, "%16s %5d %3d %d %08x %08lx ",
654
+ s, "%16s %7d %3d %d %08x %08lx ",
665655 comm, entry->pid, iter->cpu, entry->flags,
666656 entry->preempt_count, iter->idx);
667657 } else {
....@@ -700,11 +690,11 @@
700690 static int trace_search_list(struct list_head **list)
701691 {
702692 struct trace_event *e;
703
- int last = __TRACE_LAST_TYPE;
693
+ int next = __TRACE_LAST_TYPE;
704694
705695 if (list_empty(&ftrace_event_list)) {
706696 *list = &ftrace_event_list;
707
- return last + 1;
697
+ return next;
708698 }
709699
710700 /*
....@@ -712,17 +702,17 @@
712702 * lets see if somebody freed one.
713703 */
714704 list_for_each_entry(e, &ftrace_event_list, list) {
715
- if (e->type != last + 1)
705
+ if (e->type != next)
716706 break;
717
- last++;
707
+ next++;
718708 }
719709
720710 /* Did we used up all 65 thousand events??? */
721
- if ((last + 1) > TRACE_EVENT_TYPE_MAX)
711
+ if (next > TRACE_EVENT_TYPE_MAX)
722712 return 0;
723713
724714 *list = &e->list;
725
- return last + 1;
715
+ return next;
726716 }
727717
728718 void trace_event_read_lock(void)
....@@ -942,7 +932,7 @@
942932 S = task_index_to_char(field->prev_state);
943933 trace_find_cmdline(field->next_pid, comm);
944934 trace_seq_printf(&iter->seq,
945
- " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n",
935
+ " %7d:%3d:%c %s [%03d] %7d:%3d:%c %s\n",
946936 field->prev_pid,
947937 field->prev_prio,
948938 S, delim,
....@@ -1094,7 +1084,7 @@
10941084
10951085 trace_seq_puts(s, "<stack trace>\n");
10961086
1097
- for (p = field->caller; p && *p != ULONG_MAX && p < end; p++) {
1087
+ for (p = field->caller; p && p < end && *p != ULONG_MAX; p++) {
10981088
10991089 if (trace_seq_has_overflowed(s))
11001090 break;
....@@ -1146,17 +1136,10 @@
11461136 for (i = 0; i < FTRACE_STACK_ENTRIES; i++) {
11471137 unsigned long ip = field->caller[i];
11481138
1149
- if (ip == ULONG_MAX || trace_seq_has_overflowed(s))
1139
+ if (!ip || trace_seq_has_overflowed(s))
11501140 break;
11511141
11521142 trace_seq_puts(s, " => ");
1153
-
1154
- if (!ip) {
1155
- trace_seq_puts(s, "??");
1156
- trace_seq_putc(s, '\n');
1157
- continue;
1158
- }
1159
-
11601143 seq_print_user_ip(s, mm, ip, flags);
11611144 trace_seq_putc(s, '\n');
11621145 }
....@@ -1187,12 +1170,12 @@
11871170
11881171 trace_assign_type(field, entry);
11891172
1190
- trace_seq_printf(s, "#%-5u inner/outer(us): %4llu/%-5llu ts:%lld.%09ld",
1173
+ trace_seq_printf(s, "#%-5u inner/outer(us): %4llu/%-5llu ts:%lld.%09ld count:%d",
11911174 field->seqnum,
11921175 field->duration,
11931176 field->outer_duration,
11941177 (long long)field->timestamp.tv_sec,
1195
- field->timestamp.tv_nsec);
1178
+ field->timestamp.tv_nsec, field->count);
11961179
11971180 if (field->nmi_count) {
11981181 /*