[PATCH 2/6] tracing: Replace memcpy() with __get_task_comm()

Yafang Shao
2024-06-02T02:38:28Z

Using __get_task_comm() to read the task comm ensures that the name is
always NUL-terminated, regardless of the source string. This approach also
facilitates future extensions to the task comm.

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
include/linux/tracepoint.h | 4 ++--
include/trace/events/block.h | 10 +++++-----
include/trace/events/oom.h | 2 +-
include/trace/events/osnoise.h | 2 +-
include/trace/events/sched.h | 27 ++++++++++++++-------------
include/trace/events/signal.h | 2 +-
include/trace/events/task.h | 4 ++--
7 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
index 689b6d71590e..6381824d8107 100644
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -519,10 +519,10 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
* *
*
* TP_fast_assign(
- * memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN);
+ * __get_task_comm(__entry->next_comm, TASK_COMM_LEN, next);
* __entry->prev_pid = prev->pid;
* __entry->prev_prio = prev->prio;
- * memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN);
+ * __get_task_comm(__entry->prev_comm, TASK_COMM_LEN, prev);
* __entry->next_pid = next->pid;
* __entry->next_prio = next->prio;
* ),
diff --git a/include/trace/events/block.h b/include/trace/events/block.h
index 0e128ad51460..6f8c5d0014e6 100644
--- a/include/trace/events/block.h
+++ b/include/trace/events/block.h
@@ -193,7 +193,7 @@ DECLARE_EVENT_CLASS(block_rq,

blk_fill_rwbs(__entry->rwbs, rq->cmd_flags);
__get_str(cmd)[0] = '\0';
- memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, current);
),

TP_printk("%d,%d %s %u (%s) %llu + %u [%s]",
@@ -328,7 +328,7 @@ DECLARE_EVENT_CLASS(block_bio,
__entry->sector = bio->bi_iter.bi_sector;
__entry->nr_sector = bio_sectors(bio);
blk_fill_rwbs(__entry->rwbs, bio->bi_opf);
- memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, current);
),

TP_printk("%d,%d %s %llu + %u [%s]",
@@ -415,7 +415,7 @@ TRACE_EVENT(block_plug,
),

TP_fast_assign(
- memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, current);
),

TP_printk("[%s]", __entry->comm)
@@ -434,7 +434,7 @@ DECLARE_EVENT_CLASS(block_unplug,

TP_fast_assign(
__entry->nr_rq = depth;
- memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, current);
),

TP_printk("[%s] %d", __entry->comm, __entry->nr_rq)
@@ -485,7 +485,7 @@ TRACE_EVENT(block_split,
__entry->sector = bio->bi_iter.bi_sector;
__entry->new_sector = new_sector;
blk_fill_rwbs(__entry->rwbs, bio->bi_opf);
- memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, current);
),

TP_printk("%d,%d %s %llu / %llu [%s]",
diff --git a/include/trace/events/oom.h b/include/trace/events/oom.h
index b799f3bcba82..f29be9ebcd4d 100644
--- a/include/trace/events/oom.h
+++ b/include/trace/events/oom.h
@@ -23,7 +23,7 @@ TRACE_EVENT(oom_score_adj_update,

TP_fast_assign(
__entry->pid = task->pid;
- memcpy(__entry->comm, task->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, task);
__entry->oom_score_adj = task->signal->oom_score_adj;
),

diff --git a/include/trace/events/osnoise.h b/include/trace/events/osnoise.h
index 82f741ec0f57..50f480655722 100644
--- a/include/trace/events/osnoise.h
+++ b/include/trace/events/osnoise.h
@@ -20,7 +20,7 @@ TRACE_EVENT(thread_noise,
),

TP_fast_assign(
- memcpy(__entry->comm, t->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, t);
__entry->pid = t->pid;
__entry->start = start;
__entry->duration = duration;
diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h
index 68973f650c26..2a9d7c62c58a 100644
--- a/include/trace/events/sched.h
+++ b/include/trace/events/sched.h
@@ -9,6 +9,7 @@
#include <linux/sched/numa_balancing.h>
#include <linux/tracepoint.h>
#include <linux/binfmts.h>
+#include <linux/sched.h>

/*
* Tracepoint for calling kthread_stop, performed to end a kthread:
@@ -25,7 +26,7 @@ TRACE_EVENT(sched_kthread_stop,
),

TP_fast_assign(
- memcpy(__entry->comm, t->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, t);
__entry->pid = t->pid;
),

@@ -152,7 +153,7 @@ DECLARE_EVENT_CLASS(sched_wakeup_template,
),

TP_fast_assign(
- memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, p);
__entry->pid = p->pid;
__entry->prio = p->prio; /* XXX SCHED_DEADLINE */
__entry->target_cpu = task_cpu(p);
@@ -239,11 +240,11 @@ TRACE_EVENT(sched_switch,
),

TP_fast_assign(
- memcpy(__entry->next_comm, next->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->next_comm, TASK_COMM_LEN, next);
__entry->prev_pid = prev->pid;
__entry->prev_prio = prev->prio;
__entry->prev_state = __trace_sched_switch_state(preempt, prev_state, prev);
- memcpy(__entry->prev_comm, prev->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->prev_comm, TASK_COMM_LEN, prev);
__entry->next_pid = next->pid;
__entry->next_prio = next->prio;
/* XXX SCHED_DEADLINE */
@@ -286,7 +287,7 @@ TRACE_EVENT(sched_migrate_task,
),

TP_fast_assign(
- memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, p);
__entry->pid = p->pid;
__entry->prio = p->prio; /* XXX SCHED_DEADLINE */
__entry->orig_cpu = task_cpu(p);
@@ -311,7 +312,7 @@ DECLARE_EVENT_CLASS(sched_process_template,
),

TP_fast_assign(
- memcpy(__entry->comm, p->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, p);
__entry->pid = p->pid;
__entry->prio = p->prio; /* XXX SCHED_DEADLINE */
),
@@ -357,7 +358,7 @@ TRACE_EVENT(sched_process_wait,
),

TP_fast_assign(
- memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, current);
__entry->pid = pid_nr(pid);
__entry->prio = current->prio; /* XXX SCHED_DEADLINE */
),
@@ -383,9 +384,9 @@ TRACE_EVENT(sched_process_fork,
),

TP_fast_assign(
- memcpy(__entry->parent_comm, parent->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->parent_comm, TASK_COMM_LEN, parent);
__entry->parent_pid = parent->pid;
- memcpy(__entry->child_comm, child->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->child_comm, TASK_COMM_LEN, child);
__entry->child_pid = child->pid;
),

@@ -481,7 +482,7 @@ DECLARE_EVENT_CLASS_SCHEDSTAT(sched_stat_template,
),

TP_fast_assign(
- memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, tsk);
__entry->pid = tsk->pid;
__entry->delay = delay;
),
@@ -539,7 +540,7 @@ DECLARE_EVENT_CLASS(sched_stat_runtime,
),

TP_fast_assign(
- memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, tsk);
__entry->pid = tsk->pid;
__entry->runtime = runtime;
),
@@ -571,7 +572,7 @@ TRACE_EVENT(sched_pi_setprio,
),

TP_fast_assign(
- memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, tsk);
__entry->pid = tsk->pid;
__entry->oldprio = tsk->prio;
__entry->newprio = pi_task ?
@@ -596,7 +597,7 @@ TRACE_EVENT(sched_process_hang,
),

TP_fast_assign(
- memcpy(__entry->comm, tsk->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, tsk);
__entry->pid = tsk->pid;
),

diff --git a/include/trace/events/signal.h b/include/trace/events/signal.h
index 1db7e4b07c01..8f317a265392 100644
--- a/include/trace/events/signal.h
+++ b/include/trace/events/signal.h
@@ -67,7 +67,7 @@ TRACE_EVENT(signal_generate,
TP_fast_assign(
__entry->sig = sig;
TP_STORE_SIGINFO(__entry, info);
- memcpy(__entry->comm, task->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, task);
__entry->pid = task->pid;
__entry->group = group;
__entry->result = result;
diff --git a/include/trace/events/task.h b/include/trace/events/task.h
index 47b527464d1a..77c14707460e 100644
--- a/include/trace/events/task.h
+++ b/include/trace/events/task.h
@@ -21,7 +21,7 @@ TRACE_EVENT(task_newtask,

TP_fast_assign(
__entry->pid = task->pid;
- memcpy(__entry->comm, task->comm, TASK_COMM_LEN);
+ __get_task_comm(__entry->comm, TASK_COMM_LEN, task);
__entry->clone_flags = clone_flags;
__entry->oom_score_adj = task->signal->oom_score_adj;
),
@@ -46,7 +46,7 @@ TRACE_EVENT(task_rename,

TP_fast_assign(
__entry->pid = task->pid;
- memcpy(entry->oldcomm, task->comm, TASK_COMM_LEN);
+ __get_task_comm(entry->oldcomm, TASK_COMM_LEN, task);
strscpy(entry->newcomm, comm, TASK_COMM_LEN);
__entry->oom_score_adj = task->signal->oom_score_adj;
),
--
2.39.1