From nobody Mon Feb 9 00:03:16 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 16AFC19B5A9 for ; Wed, 8 Jan 2025 03:35:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736307334; cv=none; b=uRoqrPU8BkRZHgGY8xT6yaCY7h6guBkrTtlI85IV2gncqFihrHh0PU3fAxzua3IrN0BK/xXtgPLzc937h6Xj8Td9E+O2dUTmZnx2g7e5+iDOLhYDY3M9KcaZpc/knpt1dvGMJaLazkIUUDBx/a7iGp63Ib5aOM+SHYjAEFjiy8E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736307334; c=relaxed/simple; bh=zNjBlqM58ne451Iq+Fn+XmMNFOGH4R2TSt61tmkyajk=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=LlnsULSgqmzNjM1ifqfkBPbxwtt4apBaeKCVU1ORDmaIzmZZ7Hn8ZYeF6GQlzwEP1Y1j4RsYBK3YsmslHGw9VRudHTguQCRohuB5HxSHSBsuRMlV8OKuUgbQSKhIoFLELCPXc8UU1ceuinErnBP1it+dMarX8PdzPYJhOFBmbfA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id DE5D9C4CED0; Wed, 8 Jan 2025 03:35:33 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.98) (envelope-from ) id 1tVMsS-0000000ApBb-03GQ; Tue, 07 Jan 2025 22:37:04 -0500 Message-ID: <20250108033703.860150681@goodmis.org> User-Agent: quilt/0.68 Date: Tue, 07 Jan 2025 22:36:50 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , Shuah Khan , Tom Zanussi Subject: [for-next][PATCH 3/4] tracing/hist: Support POLLPRI event for poll on histogram References: <20250108033647.656576164@goodmis.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Masami Hiramatsu (Google)" 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(). Cc: Shuah Khan Cc: Mathieu Desnoyers Link: https://lore.kernel.org/173527248770.464571.2536902137325258133.stgit= @devnote2 Signed-off-by: Masami Hiramatsu (Google) Reviewed-by: Tom Zanussi Signed-off-by: Steven Rostedt (Google) --- 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_h= ist.c index af4be28f01e0..261163b00137 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; }; =20 static u64 get_hist_hit_count(struct trace_event_file *event_file) @@ -5630,6 +5631,11 @@ static int hist_show(struct seq_file *m, void *v) hist_trigger_show(m, data, n++); } hist_file->last_read =3D 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 =3D hist_file->last_read; =20 return 0; } @@ -5639,6 +5645,8 @@ static __poll_t event_hist_poll(struct file *file, st= ruct poll_table_struct *wai struct trace_event_file *event_file; struct seq_file *m =3D file->private_data; struct hist_file_data *hist_file =3D m->private; + __poll_t ret =3D 0; + u64 cnt; =20 guard(mutex)(&event_mutex); =20 @@ -5648,10 +5656,15 @@ static __poll_t event_hist_poll(struct file *file, = struct poll_table_struct *wai =20 hist_poll_wait(file, wait); =20 - if (hist_file->last_read !=3D get_hist_hit_count(event_file)) - return EPOLLIN | EPOLLRDNORM; + cnt =3D get_hist_hit_count(event_file); + if (hist_file->last_read !=3D cnt) + ret |=3D EPOLLIN | EPOLLRDNORM; + if (hist_file->last_act !=3D cnt) { + hist_file->last_act =3D cnt; + ret |=3D EPOLLPRI; + } =20 - return 0; + return ret; } =20 static int event_hist_release(struct inode *inode, struct file *file) @@ -5665,6 +5678,7 @@ static int event_hist_release(struct inode *inode, st= ruct file *file) =20 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; =20 @@ -5672,16 +5686,25 @@ static int event_hist_open(struct inode *inode, str= uct file *file) if (ret) return ret; =20 + guard(mutex)(&event_mutex); + + event_file =3D event_file_data(file); + if (!event_file) + return -ENODEV; + hist_file =3D kzalloc(sizeof(*hist_file), GFP_KERNEL); if (!hist_file) return -ENOMEM; + hist_file->file =3D file; + hist_file->last_act =3D get_hist_hit_count(event_file); =20 /* Clear private_data to avoid warning in single_open() */ file->private_data =3D NULL; ret =3D single_open(file, hist_show, hist_file); if (ret) kfree(hist_file); + return ret; } =20 --=20 2.45.2