From: Steven Rostedt <rostedt@goodmis.org>
To: Chaosheng Qu <quchaosheng000406@163.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
"Matthew Wilcox (Oracle)" <willy@infradead.org>,
Jan Kara <jack@suse.cz>,
linux-trace-kernel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] tracing: don't reference jiffies from writeback TP_printk()
Date: Mon, 26 Oct 2026 08:47:09 -0400 [thread overview]
Message-ID: <20261026084709.26f7737f@fedora> (raw)
In-Reply-To: <179299543891.294518.18224691820856958686@163.com>
On Mon, 26 Oct 2026 14:17:18 +0800
Chaosheng Qu <quchaosheng000406@163.com> wrote:
> From: Chaosheng Qu <quchaosheng000406@163.com>
> Subject: [PATCH] tracing: don't reference jiffies from writeback TP_printk()
> To: Steven Rostedt <rostedt@goodmis.org>
> Cc: Masami Hiramatsu <mhiramat@kernel.org>,
> Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
> "Matthew Wilcox (Oracle)" <willy@infradead.org>,
> Jan Kara <jack@suse.cz>,
> linux-trace-kernel@vger.kernel.org,
> linux-kernel@vger.kernel.org
>
> writeback_sb_inodes_requeue and writeback_single_inode_start/() compute
> the inode age with:
>
> (jiffies - __entry->dirtied_when) / HZ
>
> inside TP_printk(). TP_printk() is not part of the recorded event: it
> runs when the trace is read back, so the expression is evaluated at
> formatter time, not at the time the event was recorded. The formatted
> output therefore reports the interval between recording and reading,
> not the age of the inode when it was traced.
>
> It is also evaluated outside of the kernel: tracefs renders the format
> string once and userspace re-evaluates it. A tool that has to resolve
> every symbol in the expression (trace-cmd and the parser in LISA both
> do) resolves the bare "jiffies" to its address, so the printed age
> becomes ((unsigned long)&jiffies - dirtied_when) / HZ, which is
> nonsense. This was reported as a wrong "age" value in trace-cmd
> output:
>
> https://bugzilla.kernel.org/show_bug.cgi?id=219839
>
> Nothing in TP_printk() may depend on the state of the machine at read
> time, which is the same rule that keeps ktime_get() and friends out of
> it. writeback_queue_io already does the right thing and stores the age
> in TP_fast_assign(); make these two events do that as well.
>
> The new __entry->age field is appended after the existing fields, so
> no existing field changes offset and trace consumers that index the
> event by offset keep working. The "age=%lu" placeholder keeps its
> position in the output text.
>
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=219839
> Signed-off-by: Chaosheng Qu <quchaosheng000406@163.com>
> ---
> include/trace/events/writeback.h | 12 ++++++++----
> 1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h
> index 13ee076..23d107c 100644
> --- a/include/trace/events/writeback.h
> +++ b/include/trace/events/writeback.h
> @@ -745,6 +745,7 @@ TRACE_EVENT(writeback_sb_inodes_requeue,
> __field(u64, cgroup_ino)
> __field(unsigned long, state)
> __field(unsigned long, dirtied_when)
> + __field(unsigned long, age)
Actually can we just record jiffies here?
> ),
>
> TP_fast_assign(
> @@ -753,6 +754,7 @@ TRACE_EVENT(writeback_sb_inodes_requeue,
> __entry->ino = inode->i_ino;
> __entry->state = inode_state_read_once(inode);
> __entry->dirtied_when = inode->dirtied_when;
> + __entry->age = (jiffies - __entry->dirtied_when) / HZ;
Divisions are expensive and this is executed during the trace where we
try to keep the trace side effects as small as possible.
> __entry->cgroup_ino = __trace_wb_assign_cgroup(inode_to_wb(inode));
> ),
>
> @@ -761,7 +763,7 @@ TRACE_EVENT(writeback_sb_inodes_requeue,
> __entry->ino,
> show_inode_state(__entry->state),
> __entry->dirtied_when,
> - (jiffies - __entry->dirtied_when) / HZ,
> + __entry->age,
By saving jiffies, this would be:
(__entry->jiffies - __entry->dirtied_when) / HZ
Where it would be processed at the time of read (aka "slow path").
As jiffies would be saved in the event, user space would also be able
to calculate this.
-- Steve
> __entry->cgroup_ino
next prev parent reply other threads:[~2026-10-26 12:47 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-26 6:17 [PATCH] tracing: don't reference jiffies from writeback TP_printk() Chaosheng Qu
2026-10-26 11:16 ` Jan Kara
2026-10-26 12:47 ` Steven Rostedt [this message]
2026-10-28 3:25 ` [PATCH v2] tracing: record jiffies in writeback events instead of computing age Chaosheng Qu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261026084709.26f7737f@fedora \
--to=rostedt@goodmis.org \
--cc=jack@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=quchaosheng000406@163.com \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox