mirror of https://github.com/OpenIPC/firmware.git
184 lines
5.4 KiB
Diff
184 lines
5.4 KiB
Diff
diff -drupN a/kernel/trace/trace.c b/kernel/trace/trace.c
|
|
--- a/kernel/trace/trace.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/kernel/trace/trace.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -1125,6 +1125,7 @@ static struct {
|
|
{ trace_clock, "perf", 1 },
|
|
{ ktime_get_mono_fast_ns, "mono", 1 },
|
|
{ ktime_get_raw_fast_ns, "mono_raw", 1 },
|
|
+ { ktime_get_boot_fast_ns, "boot", 1 },
|
|
ARCH_TRACE_CLOCKS
|
|
};
|
|
|
|
@@ -1597,6 +1598,7 @@ void tracing_reset_all_online_cpus(void)
|
|
|
|
#define SAVED_CMDLINES_DEFAULT 128
|
|
#define NO_CMDLINE_MAP UINT_MAX
|
|
+static unsigned saved_tgids[SAVED_CMDLINES_DEFAULT];
|
|
static arch_spinlock_t trace_cmdline_lock = __ARCH_SPIN_LOCK_UNLOCKED;
|
|
struct saved_cmdlines_buffer {
|
|
unsigned map_pid_to_cmdline[PID_MAX_DEFAULT+1];
|
|
@@ -1835,7 +1837,7 @@ static int trace_save_cmdline(struct tas
|
|
}
|
|
|
|
set_cmdline(idx, tsk->comm);
|
|
-
|
|
+ saved_tgids[idx] = tsk->tgid;
|
|
arch_spin_unlock(&trace_cmdline_lock);
|
|
|
|
return 1;
|
|
@@ -1878,6 +1880,25 @@ void trace_find_cmdline(int pid, char co
|
|
preempt_enable();
|
|
}
|
|
|
|
+int trace_find_tgid(int pid)
|
|
+{
|
|
+ unsigned map;
|
|
+ int tgid;
|
|
+
|
|
+ preempt_disable();
|
|
+ arch_spin_lock(&trace_cmdline_lock);
|
|
+ map = savedcmd->map_pid_to_cmdline[pid];
|
|
+ if (map != NO_CMDLINE_MAP)
|
|
+ tgid = saved_tgids[map];
|
|
+ else
|
|
+ tgid = -1;
|
|
+
|
|
+ arch_spin_unlock(&trace_cmdline_lock);
|
|
+ preempt_enable();
|
|
+
|
|
+ return tgid;
|
|
+}
|
|
+
|
|
void tracing_record_cmdline(struct task_struct *tsk)
|
|
{
|
|
if (atomic_read(&trace_record_cmdline_disabled) || !tracing_is_on())
|
|
@@ -2926,6 +2947,13 @@ static void print_func_help_header(struc
|
|
"# | | | | |\n");
|
|
}
|
|
|
|
+static void print_func_help_header_tgid(struct trace_buffer *buf, struct seq_file *m)
|
|
+{
|
|
+ print_event_info(buf, m);
|
|
+ seq_puts(m, "# TASK-PID TGID CPU# TIMESTAMP FUNCTION\n");
|
|
+ seq_puts(m, "# | | | | | |\n");
|
|
+}
|
|
+
|
|
static void print_func_help_header_irq(struct trace_buffer *buf, struct seq_file *m)
|
|
{
|
|
print_event_info(buf, m);
|
|
@@ -2938,6 +2966,18 @@ static void print_func_help_header_irq(s
|
|
"# | | | |||| | |\n");
|
|
}
|
|
|
|
+static void print_func_help_header_irq_tgid(struct trace_buffer *buf, struct seq_file *m)
|
|
+{
|
|
+ print_event_info(buf, m);
|
|
+ seq_puts(m, "# _-----=> irqs-off\n");
|
|
+ seq_puts(m, "# / _----=> need-resched\n");
|
|
+ seq_puts(m, "# | / _---=> hardirq/softirq\n");
|
|
+ seq_puts(m, "# || / _--=> preempt-depth\n");
|
|
+ seq_puts(m, "# ||| / delay\n");
|
|
+ seq_puts(m, "# TASK-PID TGID CPU# |||| TIMESTAMP FUNCTION\n");
|
|
+ seq_puts(m, "# | | | | |||| | |\n");
|
|
+}
|
|
+
|
|
void
|
|
print_trace_header(struct seq_file *m, struct trace_iterator *iter)
|
|
{
|
|
@@ -3011,13 +3051,14 @@ static void test_cpu_buff_start(struct t
|
|
if (!(iter->iter_flags & TRACE_FILE_ANNOTATE))
|
|
return;
|
|
|
|
- if (iter->started && cpumask_test_cpu(iter->cpu, iter->started))
|
|
+ if (cpumask_available(iter->started) &&
|
|
+ cpumask_test_cpu(iter->cpu, iter->started))
|
|
return;
|
|
|
|
if (per_cpu_ptr(iter->trace_buffer->data, iter->cpu)->skipped_entries)
|
|
return;
|
|
|
|
- if (iter->started)
|
|
+ if (cpumask_available(iter->started))
|
|
cpumask_set_cpu(iter->cpu, iter->started);
|
|
|
|
/* Don't print started cpu buffer for the first entry of the trace */
|
|
@@ -3250,9 +3291,15 @@ void trace_default_header(struct seq_fil
|
|
} else {
|
|
if (!(trace_flags & TRACE_ITER_VERBOSE)) {
|
|
if (trace_flags & TRACE_ITER_IRQ_INFO)
|
|
- print_func_help_header_irq(iter->trace_buffer, m);
|
|
+ if (trace_flags & TRACE_ITER_TGID)
|
|
+ print_func_help_header_irq_tgid(iter->trace_buffer, m);
|
|
+ else
|
|
+ print_func_help_header_irq(iter->trace_buffer, m);
|
|
else
|
|
- print_func_help_header(iter->trace_buffer, m);
|
|
+ if (trace_flags & TRACE_ITER_TGID)
|
|
+ print_func_help_header_tgid(iter->trace_buffer, m);
|
|
+ else
|
|
+ print_func_help_header(iter->trace_buffer, m);
|
|
}
|
|
}
|
|
}
|
|
@@ -4583,6 +4630,50 @@ static void trace_insert_enum_map(struct
|
|
}
|
|
|
|
static ssize_t
|
|
+tracing_saved_tgids_read(struct file *file, char __user *ubuf,
|
|
+ size_t cnt, loff_t *ppos)
|
|
+{
|
|
+ char *file_buf;
|
|
+ char *buf;
|
|
+ int len = 0;
|
|
+ int pid;
|
|
+ int i;
|
|
+
|
|
+ file_buf = kmalloc(SAVED_CMDLINES_DEFAULT*(16+1+16), GFP_KERNEL);
|
|
+ if (!file_buf)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ buf = file_buf;
|
|
+
|
|
+ for (i = 0; i < SAVED_CMDLINES_DEFAULT; i++) {
|
|
+ int tgid;
|
|
+ int r;
|
|
+
|
|
+ pid = savedcmd->map_cmdline_to_pid[i];
|
|
+ if (pid == -1 || pid == NO_CMDLINE_MAP)
|
|
+ continue;
|
|
+
|
|
+ tgid = trace_find_tgid(pid);
|
|
+ r = sprintf(buf, "%d %d\n", pid, tgid);
|
|
+ buf += r;
|
|
+ len += r;
|
|
+ }
|
|
+
|
|
+ len = simple_read_from_buffer(ubuf, cnt, ppos,
|
|
+ file_buf, len);
|
|
+
|
|
+ kfree(file_buf);
|
|
+
|
|
+ return len;
|
|
+}
|
|
+
|
|
+static const struct file_operations tracing_saved_tgids_fops = {
|
|
+ .open = tracing_open_generic,
|
|
+ .read = tracing_saved_tgids_read,
|
|
+ .llseek = generic_file_llseek,
|
|
+};
|
|
+
|
|
+static ssize_t
|
|
tracing_set_trace_read(struct file *filp, char __user *ubuf,
|
|
size_t cnt, loff_t *ppos)
|
|
{
|
|
@@ -7214,6 +7305,9 @@ init_tracer_tracefs(struct trace_array *
|
|
trace_create_file("trace_marker", 0220, d_tracer,
|
|
tr, &tracing_mark_fops);
|
|
|
|
+ trace_create_file("saved_tgids", 0444, d_tracer,
|
|
+ tr, &tracing_saved_tgids_fops);
|
|
+
|
|
trace_create_file("trace_clock", 0644, d_tracer, tr,
|
|
&trace_clock_fops);
|
|
|