From: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>, Shuah Khan <shuah@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
Tom Zanussi <zanussi@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org
Subject: [PATCH v7 2/3] tracing/hist: Support POLLPRI event for poll on histogram
Date: Fri, 27 Dec 2024 13:08:07 +0900 [thread overview]
Message-ID: <173527248770.464571.2536902137325258133.stgit@devnote2> (raw)
In-Reply-To: <173527246726.464571.11533527581374142406.stgit@devnote2>
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Since POLLIN will not be flushed until the hist file is read, the user
needs to repeatedly read() and poll() on the hist file for monitoring the
event continuously. But the read() is somewhat redundant when the user is
only monitoring for event updates.
Add POLLPRI poll event on the hist file so the event returns when a
histogram is updated after open(), poll() or read(). Thus it is possible
to wait for the next event without having to issue a read().
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Reviewed-by: Tom Zanussi <zanussi@kernel.org>
---
Changes in v7:
- Reword description according to Steve's comment.
- Use guard() in hist_poll_open().
---
kernel/trace/trace_events_hist.c | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index e169f67c6088..15f76c681c6c 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -5595,6 +5595,7 @@ static void hist_trigger_show(struct seq_file *m,
struct hist_file_data {
struct file *file;
u64 last_read;
+ u64 last_act;
};
static u64 get_hist_hit_count(struct trace_event_file *event_file)
@@ -5632,6 +5633,11 @@ static int hist_show(struct seq_file *m, void *v)
hist_trigger_show(m, data, n++);
}
hist_file->last_read = get_hist_hit_count(event_file);
+ /*
+ * Update last_act too so that poll()/POLLPRI can wait for the next
+ * event after any syscall on hist file.
+ */
+ hist_file->last_act = hist_file->last_read;
out_unlock:
mutex_unlock(&event_mutex);
@@ -5644,6 +5650,8 @@ static __poll_t event_hist_poll(struct file *file, struct poll_table_struct *wai
struct trace_event_file *event_file;
struct seq_file *m = file->private_data;
struct hist_file_data *hist_file = m->private;
+ __poll_t ret = 0;
+ u64 cnt;
guard(mutex)(&event_mutex);
@@ -5653,10 +5661,15 @@ static __poll_t event_hist_poll(struct file *file, struct poll_table_struct *wai
hist_poll_wait(file, wait);
- if (hist_file->last_read != get_hist_hit_count(event_file))
- return EPOLLIN | EPOLLRDNORM;
+ cnt = get_hist_hit_count(event_file);
+ if (hist_file->last_read != cnt)
+ ret |= EPOLLIN | EPOLLRDNORM;
+ if (hist_file->last_act != cnt) {
+ hist_file->last_act = cnt;
+ ret |= EPOLLPRI;
+ }
- return 0;
+ return ret;
}
static int event_hist_release(struct inode *inode, struct file *file)
@@ -5670,6 +5683,7 @@ static int event_hist_release(struct inode *inode, struct file *file)
static int event_hist_open(struct inode *inode, struct file *file)
{
+ struct trace_event_file *event_file;
struct hist_file_data *hist_file;
int ret;
@@ -5677,16 +5691,25 @@ static int event_hist_open(struct inode *inode, struct file *file)
if (ret)
return ret;
+ guard(mutex)(&event_mutex);
+
+ event_file = event_file_data(file);
+ if (!event_file)
+ return -ENODEV;
+
hist_file = kzalloc(sizeof(*hist_file), GFP_KERNEL);
if (!hist_file)
return -ENOMEM;
+
hist_file->file = file;
+ hist_file->last_act = get_hist_hit_count(event_file);
/* Clear private_data to avoid warning in single_open() */
file->private_data = NULL;
ret = single_open(file, hist_show, hist_file);
if (ret)
kfree(hist_file);
+
return ret;
}
next prev parent reply other threads:[~2024-12-27 4:08 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-27 4:07 [PATCH v7 0/3] tracing: Support poll on event hist file Masami Hiramatsu (Google)
2024-12-27 4:07 ` [PATCH v7 1/3] tracing/hist: Add poll(POLLIN) support on " Masami Hiramatsu (Google)
2024-12-27 4:08 ` Masami Hiramatsu (Google) [this message]
2024-12-27 4:08 ` [PATCH v7 3/3] selftests/tracing: Add hist poll() support test Masami Hiramatsu (Google)
2024-12-29 13:08 ` Masami Hiramatsu
2024-12-29 13:24 ` [PATCH v7.1 " Masami Hiramatsu (Google)
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=173527248770.464571.2536902137325258133.stgit@devnote2 \
--to=mhiramat@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=rostedt@goodmis.org \
--cc=shuah@kernel.org \
--cc=zanussi@kernel.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