hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
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);
....@@ -448,6 +441,7 @@
448441 {
449442 char hardsoft_irq;
450443 char need_resched;
444
+ char need_resched_lazy;
451445 char irqs_off;
452446 int hardirq;
453447 int softirq;
....@@ -478,6 +472,9 @@
478472 break;
479473 }
480474
475
+ need_resched_lazy =
476
+ (entry->flags & TRACE_FLAG_NEED_RESCHED_LAZY) ? 'L' : '.';
477
+
481478 hardsoft_irq =
482479 (nmi && hardirq) ? 'Z' :
483480 nmi ? 'z' :
....@@ -486,11 +483,22 @@
486483 softirq ? 's' :
487484 '.' ;
488485
489
- trace_seq_printf(s, "%c%c%c",
490
- irqs_off, need_resched, hardsoft_irq);
486
+ trace_seq_printf(s, "%c%c%c%c",
487
+ irqs_off, need_resched, need_resched_lazy,
488
+ hardsoft_irq);
491489
492490 if (entry->preempt_count)
493491 trace_seq_printf(s, "%x", entry->preempt_count);
492
+ else
493
+ trace_seq_putc(s, '.');
494
+
495
+ if (entry->preempt_lazy_count)
496
+ trace_seq_printf(s, "%x", entry->preempt_lazy_count);
497
+ else
498
+ trace_seq_putc(s, '.');
499
+
500
+ if (entry->migrate_disable)
501
+ trace_seq_printf(s, "%x", entry->migrate_disable);
494502 else
495503 trace_seq_putc(s, '.');
496504
....@@ -504,7 +512,7 @@
504512
505513 trace_find_cmdline(entry->pid, comm);
506514
507
- trace_seq_printf(s, "%8.8s-%-5d %3d",
515
+ trace_seq_printf(s, "%8.8s-%-7d %3d",
508516 comm, entry->pid, cpu);
509517
510518 return trace_print_lat_fmt(s, entry);
....@@ -545,7 +553,7 @@
545553 struct trace_array *tr = iter->tr;
546554 unsigned long verbose = tr->trace_flags & TRACE_ITER_VERBOSE;
547555 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;
556
+ unsigned long long abs_ts = iter->ts - iter->array_buffer->time_start;
549557 unsigned long long rel_ts = next_ts - iter->ts;
550558 struct trace_seq *s = &iter->seq;
551559
....@@ -595,15 +603,15 @@
595603
596604 trace_find_cmdline(entry->pid, comm);
597605
598
- trace_seq_printf(s, "%16s-%-5d ", comm, entry->pid);
606
+ trace_seq_printf(s, "%16s-%-7d ", comm, entry->pid);
599607
600608 if (tr->trace_flags & TRACE_ITER_RECORD_TGID) {
601609 unsigned int tgid = trace_find_tgid(entry->pid);
602610
603611 if (!tgid)
604
- trace_seq_printf(s, "(-----) ");
612
+ trace_seq_printf(s, "(-------) ");
605613 else
606
- trace_seq_printf(s, "(%5d) ", tgid);
614
+ trace_seq_printf(s, "(%7d) ", tgid);
607615 }
608616
609617 trace_seq_printf(s, "[%03d] ", iter->cpu);
....@@ -624,21 +632,18 @@
624632
625633 int trace_print_lat_context(struct trace_iterator *iter)
626634 {
635
+ struct trace_entry *entry, *next_entry;
627636 struct trace_array *tr = iter->tr;
628
- /* trace_find_next_entry will reset ent_size */
629
- int ent_size = iter->ent_size;
630637 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);
635638 unsigned long verbose = (tr->trace_flags & TRACE_ITER_VERBOSE);
639
+ u64 next_ts;
636640
637
- /* Restore the original ent_size */
638
- iter->ent_size = ent_size;
639
-
641
+ next_entry = trace_find_next_entry(iter, NULL, &next_ts);
640642 if (!next_entry)
641643 next_ts = iter->ts;
644
+
645
+ /* trace_find_next_entry() may change iter->ent */
646
+ entry = iter->ent;
642647
643648 if (verbose) {
644649 char comm[TASK_COMM_LEN];
....@@ -646,7 +651,7 @@
646651 trace_find_cmdline(entry->pid, comm);
647652
648653 trace_seq_printf(
649
- s, "%16s %5d %3d %d %08x %08lx ",
654
+ s, "%16s %7d %3d %d %08x %08lx ",
650655 comm, entry->pid, iter->cpu, entry->flags,
651656 entry->preempt_count, iter->idx);
652657 } else {
....@@ -685,11 +690,11 @@
685690 static int trace_search_list(struct list_head **list)
686691 {
687692 struct trace_event *e;
688
- int last = __TRACE_LAST_TYPE;
693
+ int next = __TRACE_LAST_TYPE;
689694
690695 if (list_empty(&ftrace_event_list)) {
691696 *list = &ftrace_event_list;
692
- return last + 1;
697
+ return next;
693698 }
694699
695700 /*
....@@ -697,17 +702,17 @@
697702 * lets see if somebody freed one.
698703 */
699704 list_for_each_entry(e, &ftrace_event_list, list) {
700
- if (e->type != last + 1)
705
+ if (e->type != next)
701706 break;
702
- last++;
707
+ next++;
703708 }
704709
705710 /* Did we used up all 65 thousand events??? */
706
- if ((last + 1) > TRACE_EVENT_TYPE_MAX)
711
+ if (next > TRACE_EVENT_TYPE_MAX)
707712 return 0;
708713
709714 *list = &e->list;
710
- return last + 1;
715
+ return next;
711716 }
712717
713718 void trace_event_read_lock(void)
....@@ -927,7 +932,7 @@
927932 S = task_index_to_char(field->prev_state);
928933 trace_find_cmdline(field->next_pid, comm);
929934 trace_seq_printf(&iter->seq,
930
- " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n",
935
+ " %7d:%3d:%c %s [%03d] %7d:%3d:%c %s\n",
931936 field->prev_pid,
932937 field->prev_prio,
933938 S, delim,
....@@ -1079,7 +1084,7 @@
10791084
10801085 trace_seq_puts(s, "<stack trace>\n");
10811086
1082
- for (p = field->caller; p && *p != ULONG_MAX && p < end; p++) {
1087
+ for (p = field->caller; p && p < end && *p != ULONG_MAX; p++) {
10831088
10841089 if (trace_seq_has_overflowed(s))
10851090 break;
....@@ -1131,17 +1136,10 @@
11311136 for (i = 0; i < FTRACE_STACK_ENTRIES; i++) {
11321137 unsigned long ip = field->caller[i];
11331138
1134
- if (ip == ULONG_MAX || trace_seq_has_overflowed(s))
1139
+ if (!ip || trace_seq_has_overflowed(s))
11351140 break;
11361141
11371142 trace_seq_puts(s, " => ");
1138
-
1139
- if (!ip) {
1140
- trace_seq_puts(s, "??");
1141
- trace_seq_putc(s, '\n');
1142
- continue;
1143
- }
1144
-
11451143 seq_print_user_ip(s, mm, ip, flags);
11461144 trace_seq_putc(s, '\n');
11471145 }
....@@ -1172,12 +1170,12 @@
11721170
11731171 trace_assign_type(field, entry);
11741172
1175
- 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",
11761174 field->seqnum,
11771175 field->duration,
11781176 field->outer_duration,
11791177 (long long)field->timestamp.tv_sec,
1180
- field->timestamp.tv_nsec);
1178
+ field->timestamp.tv_nsec, field->count);
11811179
11821180 if (field->nmi_count) {
11831181 /*