From nobody Fri Dec 19 22:01:18 2025 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 D1B3A186E54 for ; Wed, 8 Jan 2025 03:35:33 +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=1736307333; cv=none; b=ZpRBHdxuLhFW/+iF1QpS2lEKCySQuXt5NDkaC2QShR0790e7BwchCj6BpP2sTjWqq8pL537R5iAaSMuXafKaWeUIaG5EjuMDg+z8dnUccPSFAaEfV/vxoqDl4oFFS+/suthJR5+hrW4IaLtdu0yR/HcBXihlmtK0derccDAg1+8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736307333; c=relaxed/simple; bh=clkgdICUjAcE4+loZX1YnYJB2wUdRXSbI7IoTOTpaOo=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=K5GPgjfiwwcW1oH/57WbMo7O/44vd9QxFwo3fbC9j/Gl5sQnx8f39GAXJRzBxqQW8Hg44t4Mv8vYGM5H9CEecS3/kkN2CQLi4zFXYo5TJ9DgMmG+Qb5UGBpmEiDwguFypdw0UtPwD0QsapLW0ht4ocOUGLDvxEuvmbd8gWDmawM= 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 7BCE2C4CEE1; Wed, 8 Jan 2025 03:35:33 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.98) (envelope-from ) id 1tVMsR-0000000ApAc-2o8H; Tue, 07 Jan 2025 22:37:03 -0500 Message-ID: <20250108033703.517765134@goodmis.org> User-Agent: quilt/0.68 Date: Tue, 07 Jan 2025 22:36:48 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , kernel test robot , Dan Carpenter Subject: [for-next][PATCH 1/4] tracing: Fix using ret variable in tracing_set_tracer() 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: Steven Rostedt When the function tracing_set_tracer() switched over to using the guard() infrastructure, it did not need to save the 'ret' variable and would just return the value when an error arised, instead of setting ret and jumping to an out label. When CONFIG_TRACER_SNAPSHOT is enabled, it had code that expected the "ret" variable to be initialized to zero and had set 'ret' while holding an arch_spin_lock() (not used by guard), and then upon releasing the lock it would check 'ret' and exit if set. But because ret was only set when an error occurred while holding the locks, 'ret' would be used uninitialized if there was no error. The code in the CONFIG_TRACER_SNAPSHOT block should be self contain. Make sure 'ret' is also set when no error occurred. Cc: Mathieu Desnoyers Link: https://lore.kernel.org/20250106111143.2f90ff65@gandalf.local.home Reported-by: kernel test robot Reported-by: Dan Carpenter Closes: https://lore.kernel.org/r/202412271654.nJVBuwmF-lkp@intel.com/ Fixes: d33b10c0c73ad ("tracing: Switch trace.c code over to use guard()") Signed-off-by: Steven Rostedt (Google) Acked-by: Masami Hiramatsu (Google) --- kernel/trace/trace.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 0aaf442271e9..5aeb898054e7 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -6104,8 +6104,7 @@ int tracing_set_tracer(struct trace_array *tr, const = char *buf) if (t->use_max_tr) { local_irq_disable(); arch_spin_lock(&tr->max_lock); - if (tr->cond_snapshot) - ret =3D -EBUSY; + ret =3D tr->cond_snapshot ? -EBUSY : 0; arch_spin_unlock(&tr->max_lock); local_irq_enable(); if (ret) --=20 2.45.2 From nobody Fri Dec 19 22:01:18 2025 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 3E3CA19CC31 for ; Wed, 8 Jan 2025 03:35:33 +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=fZmWxoSeM8+ekWNKs0UtKGLKW7xBMElHB5RDeDo8LUkFKvML3T/XyVI3+d9qc+h6zPv1QNINE5zK2wjil157fHy1eTqSjBA052RScveDy/ZYMZS+worsriSIujSxTr8d7CluVgqcoI4Z0kC+YEdntFLvuJHKUcWVIpSq3Q/hTJ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736307334; c=relaxed/simple; bh=51eBQ3gSyp1J4JPo7RTnRw31KgT6LtgtC5UuDUXBAM8=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=dps3GCSh5fkTEwBzEBewnw7om4K0wnL4djfZimsZYw3qjD2I/EOeiDQA4++3MAFDdneV1aGeBjsRZyF9qKKVy1YmFyxp9jUDBjdauTZOdy60P7Turq4h+3bEeyNfqWjvSPVHr0B7P1waSx3QfkXsDwzkmBCSzVtSdVMCUMch3kk= 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 92498C4CEE4; Wed, 8 Jan 2025 03:35:33 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.98) (envelope-from ) id 1tVMsR-0000000ApB7-3WIQ; Tue, 07 Jan 2025 22:37:03 -0500 Message-ID: <20250108033703.690400772@goodmis.org> User-Agent: quilt/0.68 Date: Tue, 07 Jan 2025 22:36:49 -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 2/4] tracing/hist: Add poll(POLLIN) support on hist file 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)" Add poll syscall support on the `hist` file. The Waiter will be waken up when the histogram is updated with POLLIN. Currently, there is no way to wait for a specific event in userspace. So user needs to peek the `trace` periodicaly, or wait on `trace_pipe`. But it is not a good idea to peek at the `trace` for an event that randomly happens. And `trace_pipe` is not coming back until a page is filled with events. This allows a user to wait for a specific event on the `hist` file. User can set a histogram trigger on the event which they want to monitor and poll() on its `hist` file. Since this poll() returns POLLIN, the next poll() will return soon unless a read() happens on that hist file. NOTE: To read the hist file again, you must set the file offset to 0, but just for monitoring the event, you may not need to read the histogram. Cc: Shuah Khan Cc: Mathieu Desnoyers Link: https://lore.kernel.org/173527247756.464571.14236296701625509931.stgi= t@devnote2 Signed-off-by: Masami Hiramatsu (Google) Reviewed-by: Tom Zanussi Signed-off-by: Steven Rostedt (Google) --- include/linux/trace_events.h | 14 +++++++ kernel/trace/trace_events.c | 14 +++++++ kernel/trace/trace_events_hist.c | 70 ++++++++++++++++++++++++++++++-- 3 files changed, 95 insertions(+), 3 deletions(-) diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index 91b8ffbdfa8c..02cde1174487 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -673,6 +673,20 @@ struct trace_event_file { atomic_t tm_ref; /* trigger-mode reference counter */ }; =20 +#ifdef CONFIG_HIST_TRIGGERS +extern struct irq_work hist_poll_work; +extern wait_queue_head_t hist_poll_wq; + +static inline void hist_poll_wakeup(void) +{ + if (wq_has_sleeper(&hist_poll_wq)) + irq_work_queue(&hist_poll_work); +} + +#define hist_poll_wait(file, wait) \ + poll_wait(file, &hist_poll_wq, wait) +#endif + #define __TRACE_EVENT_FLAGS(name, value) \ static int __init trace_init_flags_##name(void) \ { \ diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 047d2775184b..2b9222e7bd5a 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -3094,6 +3094,20 @@ static bool event_in_systems(struct trace_event_call= *call, return !*p || isspace(*p) || *p =3D=3D ','; } =20 +#ifdef CONFIG_HIST_TRIGGERS +/* + * Wake up waiter on the hist_poll_wq from irq_work because the hist trigg= er + * may happen in any context. + */ +static void hist_poll_event_irq_work(struct irq_work *work) +{ + wake_up_all(&hist_poll_wq); +} + +DEFINE_IRQ_WORK(hist_poll_work, hist_poll_event_irq_work); +DECLARE_WAIT_QUEUE_HEAD(hist_poll_wq); +#endif + static struct trace_event_file * trace_create_new_event(struct trace_event_call *call, struct trace_array *tr) diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_h= ist.c index 879b58892b9d..af4be28f01e0 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -5311,6 +5311,8 @@ static void event_hist_trigger(struct event_trigger_d= ata *data, =20 if (resolve_var_refs(hist_data, key, var_ref_vals, true)) hist_trigger_actions(hist_data, elt, buffer, rec, rbe, key, var_ref_vals= ); + + hist_poll_wakeup(); } =20 static void hist_trigger_stacktrace_print(struct seq_file *m, @@ -5590,15 +5592,36 @@ static void hist_trigger_show(struct seq_file *m, n_entries, (u64)atomic64_read(&hist_data->map->drops)); } =20 +struct hist_file_data { + struct file *file; + u64 last_read; +}; + +static u64 get_hist_hit_count(struct trace_event_file *event_file) +{ + struct hist_trigger_data *hist_data; + struct event_trigger_data *data; + u64 ret =3D 0; + + list_for_each_entry(data, &event_file->triggers, list) { + if (data->cmd_ops->trigger_type =3D=3D ETT_EVENT_HIST) { + hist_data =3D data->private_data; + ret +=3D atomic64_read(&hist_data->map->hits); + } + } + return ret; +} + static int hist_show(struct seq_file *m, void *v) { + struct hist_file_data *hist_file =3D m->private; struct event_trigger_data *data; struct trace_event_file *event_file; int n =3D 0; =20 guard(mutex)(&event_mutex); =20 - event_file =3D event_file_file(m->private); + event_file =3D event_file_file(hist_file->file); if (unlikely(!event_file)) return -ENODEV; =20 @@ -5606,27 +5629,68 @@ static int hist_show(struct seq_file *m, void *v) if (data->cmd_ops->trigger_type =3D=3D ETT_EVENT_HIST) hist_trigger_show(m, data, n++); } + hist_file->last_read =3D get_hist_hit_count(event_file); + return 0; } =20 +static __poll_t event_hist_poll(struct file *file, struct poll_table_struc= t *wait) +{ + struct trace_event_file *event_file; + struct seq_file *m =3D file->private_data; + struct hist_file_data *hist_file =3D m->private; + + guard(mutex)(&event_mutex); + + event_file =3D event_file_data(file); + if (!event_file) + return EPOLLERR; + + hist_poll_wait(file, wait); + + if (hist_file->last_read !=3D get_hist_hit_count(event_file)) + return EPOLLIN | EPOLLRDNORM; + + return 0; +} + +static int event_hist_release(struct inode *inode, struct file *file) +{ + struct seq_file *m =3D file->private_data; + struct hist_file_data *hist_file =3D m->private; + + kfree(hist_file); + return tracing_single_release_file_tr(inode, file); +} + static int event_hist_open(struct inode *inode, struct file *file) { + struct hist_file_data *hist_file; int ret; =20 ret =3D tracing_open_file_tr(inode, file); if (ret) return ret; =20 + hist_file =3D kzalloc(sizeof(*hist_file), GFP_KERNEL); + if (!hist_file) + return -ENOMEM; + hist_file->file =3D file; + /* Clear private_data to avoid warning in single_open() */ file->private_data =3D NULL; - return single_open(file, hist_show, file); + ret =3D single_open(file, hist_show, hist_file); + if (ret) + kfree(hist_file); + return ret; } =20 const struct file_operations event_hist_fops =3D { .open =3D event_hist_open, .read =3D seq_read, .llseek =3D seq_lseek, - .release =3D tracing_single_release_file_tr, + .release =3D event_hist_release, + .poll =3D event_hist_poll, }; =20 #ifdef CONFIG_HIST_TRIGGERS_DEBUG --=20 2.45.2 From nobody Fri Dec 19 22:01:18 2025 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 From nobody Fri Dec 19 22:01:18 2025 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 3669F19F47E 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=1736307335; cv=none; b=UySoWFkKZnmbJxyTyJq5hlWKNFiaKl2Zc4bvAo/YD0ZBHdWWhTetOZ1G81Pi15oQ4+HSoB7L4zk7SQOYfyC0S5FnCkX7v8BbBnz6wexkzNRdFeQuNOxQhiKNsducxA03eKVJ82zMKhlqOZ2c7TXal590/M/bwZ2N3hBiqoODAKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736307335; c=relaxed/simple; bh=1vmG54t45n+aurV1artpyA5hhS7qYLkoSaHB+QqkHdk=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=OfDBG6uOJstz2bIz0fSB1nMAERRjGybjnUhY+MJBN08pZduF25LTJ13n35btfZFhtDZhH1Ft9CfYLsXKPNmtiLg1fgqVHQ3/D1gklU2XeYrLGQE0LlNpNAzAJ2HdjWQCRjyD2Z7Gjjk01k0rMlV+IwPlaRD/jsWiKF/lijm6LVk= 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 00A7AC4CEE3; Wed, 8 Jan 2025 03:35:34 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.98) (envelope-from ) id 1tVMsS-0000000ApC6-0llj; Tue, 07 Jan 2025 22:37:04 -0500 Message-ID: <20250108033704.033555246@goodmis.org> User-Agent: quilt/0.68 Date: Tue, 07 Jan 2025 22:36:51 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , Shuah Khan , Tom Zanussi , Shuah Khan Subject: [for-next][PATCH 4/4] selftests/tracing: Add hist poll() support test 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)" Add a testcase for poll() on hist file. This introduces a helper binary to the ftracetest, because there is no good way to reliably execute poll() on hist file. Cc: Shuah Khan Cc: Tom Zanussi Cc: Mathieu Desnoyers Link: https://lore.kernel.org/173547867935.569911.10127126796879854182.stgi= t@devnote2 Signed-off-by: Masami Hiramatsu (Google) Reviewed-by: Shuah Khan Signed-off-by: Steven Rostedt (Google) --- tools/testing/selftests/ftrace/Makefile | 2 + tools/testing/selftests/ftrace/poll.c | 74 +++++++++++++++++++ .../test.d/trigger/trigger-hist-poll.tc | 74 +++++++++++++++++++ 3 files changed, 150 insertions(+) create mode 100644 tools/testing/selftests/ftrace/poll.c create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/trigger-h= ist-poll.tc diff --git a/tools/testing/selftests/ftrace/Makefile b/tools/testing/selfte= sts/ftrace/Makefile index a1e955d2de4c..49d96bb16355 100644 --- a/tools/testing/selftests/ftrace/Makefile +++ b/tools/testing/selftests/ftrace/Makefile @@ -6,4 +6,6 @@ TEST_PROGS :=3D ftracetest-ktap TEST_FILES :=3D test.d settings EXTRA_CLEAN :=3D $(OUTPUT)/logs/* =20 +TEST_GEN_PROGS =3D poll + include ../lib.mk diff --git a/tools/testing/selftests/ftrace/poll.c b/tools/testing/selftest= s/ftrace/poll.c new file mode 100644 index 000000000000..53258f7515e7 --- /dev/null +++ b/tools/testing/selftests/ftrace/poll.c @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Simple poll on a file. + * + * Copyright (c) 2024 Google LLC. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define BUFSIZE 4096 + +/* + * Usage: + * poll [-I|-P] [-t timeout] FILE + */ +int main(int argc, char *argv[]) +{ + struct pollfd pfd =3D {.events =3D POLLIN}; + char buf[BUFSIZE]; + int timeout =3D -1; + int ret, opt; + + while ((opt =3D getopt(argc, argv, "IPt:")) !=3D -1) { + switch (opt) { + case 'I': + pfd.events =3D POLLIN; + break; + case 'P': + pfd.events =3D POLLPRI; + break; + case 't': + timeout =3D atoi(optarg); + break; + default: + fprintf(stderr, "Usage: %s [-I|-P] [-t timeout] FILE\n", + argv[0]); + return -1; + } + } + if (optind >=3D argc) { + fprintf(stderr, "Error: Polling file is not specified\n"); + return -1; + } + + pfd.fd =3D open(argv[optind], O_RDONLY); + if (pfd.fd < 0) { + fprintf(stderr, "failed to open %s", argv[optind]); + perror("open"); + return -1; + } + + /* Reset poll by read if POLLIN is specified. */ + if (pfd.events & POLLIN) + do {} while (read(pfd.fd, buf, BUFSIZE) =3D=3D BUFSIZE); + + ret =3D poll(&pfd, 1, timeout); + if (ret < 0 && errno !=3D EINTR) { + perror("poll"); + return -1; + } + close(pfd.fd); + + /* If timeout happned (ret =3D=3D 0), exit code is 1 */ + if (ret =3D=3D 0) + return 1; + + return 0; +} diff --git a/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-pol= l.tc b/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-poll.tc new file mode 100644 index 000000000000..8d275e3238d9 --- /dev/null +++ b/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-poll.tc @@ -0,0 +1,74 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# description: event trigger - test poll wait on histogram +# requires: set_event events/sched/sched_process_free/trigger events/sched= /sched_process_free/hist +# flags: instance + +POLL=3D${FTRACETEST_ROOT}/poll + +if [ ! -x ${POLL} ]; then + echo "poll program is not compiled!" + exit_unresolved +fi + +EVENT=3Devents/sched/sched_process_free/ + +# Check poll ops is supported. Before implementing poll on hist file, it +# returns soon with POLLIN | POLLOUT, but not POLLPRI. + +# This must wait >1 sec and return 1 (timeout). +set +e +${POLL} -I -t 1000 ${EVENT}/hist +ret=3D$? +set -e +if [ ${ret} !=3D 1 ]; then + echo "poll on hist file is not supported" + exit_unsupported +fi + +# Test POLLIN +echo > trace +echo 'hist:key=3Dcomm if comm =3D=3D"sleep"' > ${EVENT}/trigger +echo 1 > ${EVENT}/enable + +# This sleep command will exit after 2 seconds. +sleep 2 & +BGPID=3D$! +# if timeout happens, poll returns 1. +${POLL} -I -t 4000 ${EVENT}/hist +echo 0 > tracing_on + +if [ -d /proc/${BGPID} ]; then + echo "poll exits too soon" + kill -KILL ${BGPID} ||: + exit_fail +fi + +if ! grep -qw "sleep" trace; then + echo "poll exits before event happens" + exit_fail +fi + +# Test POLLPRI +echo > trace +echo 1 > tracing_on + +# This sleep command will exit after 2 seconds. +sleep 2 & +BGPID=3D$! +# if timeout happens, poll returns 1. +${POLL} -P -t 4000 ${EVENT}/hist +echo 0 > tracing_on + +if [ -d /proc/${BGPID} ]; then + echo "poll exits too soon" + kill -KILL ${BGPID} ||: + exit_fail +fi + +if ! grep -qw "sleep" trace; then + echo "poll exits before event happens" + exit_fail +fi + +exit_pass --=20 2.45.2