Commit a53202ce authored by Jason Xing's avatar Jason Xing Committed by Andrew Morton
Browse files

relayfs: introduce getting relayfs statistics function

In this version, only support getting 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.

Link: https://lkml.kernel.org/r/20250612061201.34272-4-kerneljasonxing@gmail.com


Signed-off-by: default avatarJason Xing <kernelxing@tencent.com>
Reviewed-by: default avatarYushan Zhou <katrinzhou@tencent.com>
Reviewed-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent ca01a90a
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -31,6 +31,12 @@
/*
 * Relay buffer statistics
 */
enum {
	RELAY_STATS_BUF_FULL = (1 << 0),

	RELAY_STATS_LAST = RELAY_STATS_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);
size_t relay_stats(struct rchan *chan, int flags);
extern void relay_subbufs_consumed(struct rchan *chan,
				   unsigned int cpu,
				   size_t consumed);
+30 −0
Original line number Diff line number Diff line
@@ -700,6 +700,36 @@ void relay_flush(struct rchan *chan)
}
EXPORT_SYMBOL_GPL(relay_flush);

/**
 *	relay_stats - get channel buffer statistics
 *	@chan: the channel
 *	@flags: select particular information to get
 *
 *	Returns the count of certain field that caller specifies.
 */
size_t relay_stats(struct rchan *chan, int flags)
{
	unsigned int i, count = 0;
	struct rchan_buf *rbuf;

	if (!chan || flags > RELAY_STATS_LAST)
		return 0;

	if (chan->is_global) {
		rbuf = *per_cpu_ptr(chan->buf, 0);
		if (flags & RELAY_STATS_BUF_FULL)
			count = rbuf->stats.full_count;
	} else {
		for_each_online_cpu(i) {
			rbuf = *per_cpu_ptr(chan->buf, i);
			if (rbuf && flags & RELAY_STATS_BUF_FULL)
				count += rbuf->stats.full_count;
		}
	}

	return count;
}

/**
 *	relay_file_open - open file op for relay files
 *	@inode: the inode