| From: Jason Xing <kernelxing@tencent.com> |
| Subject: blktrace: use rbuf->stats.full as a drop indicator in relayfs |
| Date: Thu, 12 Jun 2025 14:12:00 +0800 |
| |
| Replace internal subbuf_start in blktrace with the default policy in |
| relayfs. |
| |
| Remove dropped field from struct blktrace. Correspondingly, call the |
| common helper in relay. By incrementing full_count to keep track of how |
| many times we encountered a full buffer issue, user space will know how |
| many events were lost. |
| |
| Link: https://lkml.kernel.org/r/20250612061201.34272-5-kerneljasonxing@gmail.com |
| Signed-off-by: Jason Xing <kernelxing@tencent.com> |
| Reviewed-by: Yushan Zhou <katrinzhou@tencent.com> |
| Reviewed-by: Jens Axboe <axboe@kernel.dk> |
| Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> |
| Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
| Cc: Steven Rostedt <rostedt@goodmis.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| kernel/trace/blktrace.c | 22 ++-------------------- |
| 1 file changed, 2 insertions(+), 20 deletions(-) |
| |
| --- a/kernel/trace/blktrace.c~blktrace-use-rbuf-statsfull-as-a-drop-indicator-in-relayfs |
| +++ a/kernel/trace/blktrace.c |
| @@ -415,9 +415,10 @@ static ssize_t blk_dropped_read(struct f |
| size_t count, loff_t *ppos) |
| { |
| struct blk_trace *bt = filp->private_data; |
| + size_t dropped = relay_stats(bt->rchan, RELAY_STATS_BUF_FULL); |
| char buf[16]; |
| |
| - snprintf(buf, sizeof(buf), "%u\n", atomic_read(&bt->dropped)); |
| + snprintf(buf, sizeof(buf), "%zu\n", dropped); |
| |
| return simple_read_from_buffer(buffer, count, ppos, buf, strlen(buf)); |
| } |
| @@ -456,23 +457,6 @@ static const struct file_operations blk_ |
| .llseek = noop_llseek, |
| }; |
| |
| -/* |
| - * Keep track of how many times we encountered a full subbuffer, to aid |
| - * the user space app in telling how many lost events there were. |
| - */ |
| -static int blk_subbuf_start_callback(struct rchan_buf *buf, void *subbuf, |
| - void *prev_subbuf) |
| -{ |
| - struct blk_trace *bt; |
| - |
| - if (!relay_buf_full(buf)) |
| - return 1; |
| - |
| - bt = buf->chan->private_data; |
| - atomic_inc(&bt->dropped); |
| - return 0; |
| -} |
| - |
| static int blk_remove_buf_file_callback(struct dentry *dentry) |
| { |
| debugfs_remove(dentry); |
| @@ -491,7 +475,6 @@ static struct dentry *blk_create_buf_fil |
| } |
| |
| static const struct rchan_callbacks blk_relay_callbacks = { |
| - .subbuf_start = blk_subbuf_start_callback, |
| .create_buf_file = blk_create_buf_file_callback, |
| .remove_buf_file = blk_remove_buf_file_callback, |
| }; |
| @@ -580,7 +563,6 @@ static int do_blk_trace_setup(struct req |
| } |
| |
| bt->dev = dev; |
| - atomic_set(&bt->dropped, 0); |
| INIT_LIST_HEAD(&bt->running_list); |
| |
| ret = -EIO; |
| _ |