On Thu, 15 May 2025 14:16:41 +0800 Jason Xing <kerneljasonx...@gmail.com> wrote:
> From: Jason Xing <kernelx...@tencent.com> > > In this version, only support dumping the counter for buffer full and > implement the framework of how it works. > > Users can pass certain flag to fetch what field/statistics they expect > to know. Each time it only returns one result. So do not pass multiple > flags. > > Reviewed-by: Yushan Zhou <katrinz...@tencent.com> > Signed-off-by: Jason Xing <kernelx...@tencent.com> > --- > v2 > 1. refactor relay_dump() and make it only return a pure size_t result > of the value that users specifies. > 2. revise the commit log. > --- > include/linux/relay.h | 7 +++++++ > kernel/relay.c | 31 +++++++++++++++++++++++++++++++ > 2 files changed, 38 insertions(+) > > diff --git a/include/linux/relay.h b/include/linux/relay.h > index ce7a1b396872..3fb285716e34 100644 > --- a/include/linux/relay.h > +++ b/include/linux/relay.h > @@ -31,6 +31,12 @@ > /* > * Relay buffer statistics dump > */ > +enum { > + RELAY_DUMP_BUF_FULL = (1 << 0), > + > + RELAY_DUMP_LAST = RELAY_DUMP_BUF_FULL, > +}; > + > struct rchan_buf_stats > { > unsigned int full_count; /* counter for buffer full */ > @@ -167,6 +173,7 @@ struct rchan *relay_open(const char *base_filename, > void *private_data); > extern void relay_close(struct rchan *chan); > extern void relay_flush(struct rchan *chan); > +extern size_t relay_dump(struct rchan *chan, int flags); > extern void relay_subbufs_consumed(struct rchan *chan, > unsigned int cpu, > size_t consumed); > diff --git a/kernel/relay.c b/kernel/relay.c > index eb3f630f3896..f47fc750e559 100644 > --- a/kernel/relay.c > +++ b/kernel/relay.c > @@ -701,6 +701,37 @@ void relay_flush(struct rchan *chan) > } > EXPORT_SYMBOL_GPL(relay_flush); > > +/** > + * relay_dump - dump channel buffer statistics nit: relay_dump() can mislead to dump relay channel contents. Can you rename it to relay_stats() or relay_get_stats()? Thanks, > + * @chan: the channel > + * @flags: select particular information to dump > + * > + * Returns the count of certain field that caller specifies. > + */ > +size_t relay_dump(struct rchan *chan, int flags) > +{ > + unsigned int i, count = 0; > + struct rchan_buf *rbuf; > + > + if (!chan || flags > RELAY_DUMP_LAST) > + return 0; > + > + if (chan->is_global) { > + rbuf = *per_cpu_ptr(chan->buf, 0); > + if (flags & RELAY_DUMP_BUF_FULL) > + count = rbuf->stats.full_count; > + } else { > + for_each_online_cpu(i) { > + if ((rbuf = *per_cpu_ptr(chan->buf, i))) > + if (flags & RELAY_DUMP_BUF_FULL) > + count += rbuf->stats.full_count; > + } > + } > + > + return count; > +} > +EXPORT_SYMBOL_GPL(relay_dump); > + > /** > * relay_file_open - open file op for relay files > * @inode: the inode > -- > 2.43.5 > -- Masami Hiramatsu (Google) <mhira...@kernel.org>