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);
....@@ -448,7 +441,6 @@
448441 {
449442 char hardsoft_irq;
450443 char need_resched;
451
- char need_resched_lazy;
452444 char irqs_off;
453445 int hardirq;
454446 int softirq;
....@@ -479,9 +471,6 @@
479471 break;
480472 }
481473
482
- need_resched_lazy =
483
- (entry->flags & TRACE_FLAG_NEED_RESCHED_LAZY) ? 'L' : '.';
484
-
485474 hardsoft_irq =
486475 (nmi && hardirq) ? 'Z' :
487476 nmi ? 'z' :
....@@ -490,22 +479,11 @@
490479 softirq ? 's' :
491480 '.' ;
492481
493
- trace_seq_printf(s, "%c%c%c%c",
494
- irqs_off, need_resched, need_resched_lazy,
495
- hardsoft_irq);
482
+ trace_seq_printf(s, "%c%c%c",
483
+ irqs_off, need_resched, hardsoft_irq);
496484
497485 if (entry->preempt_count)
498486 trace_seq_printf(s, "%x", entry->preempt_count);
499
- else
500
- trace_seq_putc(s, '.');
501
-
502
- if (entry->preempt_lazy_count)
503
- trace_seq_printf(s, "%x", entry->preempt_lazy_count);
504
- else
505
- trace_seq_putc(s, '.');
506
-
507
- if (entry->migrate_disable)
508
- trace_seq_printf(s, "%x", entry->migrate_disable);
509487 else
510488 trace_seq_putc(s, '.');
511489
....@@ -519,7 +497,7 @@
519497
520498 trace_find_cmdline(entry->pid, comm);
521499
522
- trace_seq_printf(s, "%8.8s-%-5d %3d",
500
+ trace_seq_printf(s, "%8.8s-%-7d %3d",
523501 comm, entry->pid, cpu);
524502
525503 return trace_print_lat_fmt(s, entry);
....@@ -560,7 +538,7 @@
560538 struct trace_array *tr = iter->tr;
561539 unsigned long verbose = tr->trace_flags & TRACE_ITER_VERBOSE;
562540 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;
541
+ unsigned long long abs_ts = iter->ts - iter->array_buffer->time_start;
564542 unsigned long long rel_ts = next_ts - iter->ts;
565543 struct trace_seq *s = &iter->seq;
566544
....@@ -610,15 +588,15 @@
610588
611589 trace_find_cmdline(entry->pid, comm);
612590
613
- trace_seq_printf(s, "%16s-%-5d ", comm, entry->pid);
591
+ trace_seq_printf(s, "%16s-%-7d ", comm, entry->pid);
614592
615593 if (tr->trace_flags & TRACE_ITER_RECORD_TGID) {
616594 unsigned int tgid = trace_find_tgid(entry->pid);
617595
618596 if (!tgid)
619
- trace_seq_printf(s, "(-----) ");
597
+ trace_seq_printf(s, "(-------) ");
620598 else
621
- trace_seq_printf(s, "(%5d) ", tgid);
599
+ trace_seq_printf(s, "(%7d) ", tgid);
622600 }
623601
624602 trace_seq_printf(s, "[%03d] ", iter->cpu);
....@@ -639,21 +617,18 @@
639617
640618 int trace_print_lat_context(struct trace_iterator *iter)
641619 {
620
+ struct trace_entry *entry, *next_entry;
642621 struct trace_array *tr = iter->tr;
643
- /* trace_find_next_entry will reset ent_size */
644
- int ent_size = iter->ent_size;
645622 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);
650623 unsigned long verbose = (tr->trace_flags & TRACE_ITER_VERBOSE);
624
+ u64 next_ts;
651625
652
- /* Restore the original ent_size */
653
- iter->ent_size = ent_size;
654
-
626
+ next_entry = trace_find_next_entry(iter, NULL, &next_ts);
655627 if (!next_entry)
656628 next_ts = iter->ts;
629
+
630
+ /* trace_find_next_entry() may change iter->ent */
631
+ entry = iter->ent;
657632
658633 if (verbose) {
659634 char comm[TASK_COMM_LEN];
....@@ -661,7 +636,7 @@
661636 trace_find_cmdline(entry->pid, comm);
662637
663638 trace_seq_printf(
664
- s, "%16s %5d %3d %d %08x %08lx ",
639
+ s, "%16s %7d %3d %d %08x %08lx ",
665640 comm, entry->pid, iter->cpu, entry->flags,
666641 entry->preempt_count, iter->idx);
667642 } else {
....@@ -700,11 +675,11 @@
700675 static int trace_search_list(struct list_head **list)
701676 {
702677 struct trace_event *e;
703
- int last = __TRACE_LAST_TYPE;
678
+ int next = __TRACE_LAST_TYPE;
704679
705680 if (list_empty(&ftrace_event_list)) {
706681 *list = &ftrace_event_list;
707
- return last + 1;
682
+ return next;
708683 }
709684
710685 /*
....@@ -712,17 +687,17 @@
712687 * lets see if somebody freed one.
713688 */
714689 list_for_each_entry(e, &ftrace_event_list, list) {
715
- if (e->type != last + 1)
690
+ if (e->type != next)
716691 break;
717
- last++;
692
+ next++;
718693 }
719694
720695 /* Did we used up all 65 thousand events??? */
721
- if ((last + 1) > TRACE_EVENT_TYPE_MAX)
696
+ if (next > TRACE_EVENT_TYPE_MAX)
722697 return 0;
723698
724699 *list = &e->list;
725
- return last + 1;
700
+ return next;
726701 }
727702
728703 void trace_event_read_lock(void)
....@@ -942,7 +917,7 @@
942917 S = task_index_to_char(field->prev_state);
943918 trace_find_cmdline(field->next_pid, comm);
944919 trace_seq_printf(&iter->seq,
945
- " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n",
920
+ " %7d:%3d:%c %s [%03d] %7d:%3d:%c %s\n",
946921 field->prev_pid,
947922 field->prev_prio,
948923 S, delim,
....@@ -1094,7 +1069,7 @@
10941069
10951070 trace_seq_puts(s, "<stack trace>\n");
10961071
1097
- for (p = field->caller; p && *p != ULONG_MAX && p < end; p++) {
1072
+ for (p = field->caller; p && p < end && *p != ULONG_MAX; p++) {
10981073
10991074 if (trace_seq_has_overflowed(s))
11001075 break;
....@@ -1146,17 +1121,10 @@
11461121 for (i = 0; i < FTRACE_STACK_ENTRIES; i++) {
11471122 unsigned long ip = field->caller[i];
11481123
1149
- if (ip == ULONG_MAX || trace_seq_has_overflowed(s))
1124
+ if (!ip || trace_seq_has_overflowed(s))
11501125 break;
11511126
11521127 trace_seq_puts(s, " => ");
1153
-
1154
- if (!ip) {
1155
- trace_seq_puts(s, "??");
1156
- trace_seq_putc(s, '\n');
1157
- continue;
1158
- }
1159
-
11601128 seq_print_user_ip(s, mm, ip, flags);
11611129 trace_seq_putc(s, '\n');
11621130 }
....@@ -1187,12 +1155,12 @@
11871155
11881156 trace_assign_type(field, entry);
11891157
1190
- 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",
11911159 field->seqnum,
11921160 field->duration,
11931161 field->outer_duration,
11941162 (long long)field->timestamp.tv_sec,
1195
- field->timestamp.tv_nsec);
1163
+ field->timestamp.tv_nsec, field->count);
11961164
11971165 if (field->nmi_count) {
11981166 /*
....@@ -1410,7 +1378,7 @@
14101378 NULL
14111379 };
14121380
1413
-__init static int init_events(void)
1381
+__init int init_events(void)
14141382 {
14151383 struct trace_event *event;
14161384 int i, ret;
....@@ -1428,4 +1396,3 @@
14281396
14291397 return 0;
14301398 }
1431
-early_initcall(init_events);