relay - Remove sub-buffers from relay.
Subsystems (3)
RFC PATCH 10/11 relay - Remove sub-buffers from relay.
Remove sub-buffers from relay.
This patch removes the concept of sub-buffers from relay - everything now just operates on pages. relay_open() was also changed accordingly; instead of specifying buffer sizes in terms of sub-buffer sizes and numbers, the buffer size is specfied in pages. There's also a new param that specifies how often to wake up consumers, in terms of every n pages produced. If 0 is given for this param, consumers are never woken up.
Signed-off-by Tom Zanussi <[email protected]>
--- block/blktrace.c | 7 +- include/linux/relay.h | 113 +++++++++++----------- kernel/relay.c | 257 ++++++++++++++++++++++++------------------------- virt/kvm/kvm_trace.c | 25 +++-- 4 files changed, 202 insertions(+), 200 deletions(-)
block/blktrace.c +5 -2
@@ -359,6 +359,7 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,struct blk_trace *old_bt, *bt =NULL ;struct dentry *dir =NULL ;int ret, i; +int n_pages, n_pages_wakeup;if (!buts->buf_size || !buts->buf_nr)return -EINVAL ;
@@ -403,8 +404,10 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,if (!bt->msg_file) goto err; - bt->rchan =relay_open ("trace" , dir, buts->buf_size, - buts->buf_nr, &blk_relay_callbacks, bt,0UL ); + n_pages = (buts->buf_size * buts->buf_nr) /PAGE_SIZE ; + n_pages_wakeup = buts->buf_size /PAGE_SIZE ; + bt->rchan =relay_open ("trace" , dir, n_pages, n_pages_wakeup, + &blk_relay_callbacks, bt,0UL );if (!bt->rchan) goto err;
include/linux/relay.h +58 -55
254 lines not on this page · raw message
kernel/relay.c +125 -132
535 lines not on this page · raw message
virt/kvm/kvm_trace.c +14 -11
@@ -28,7 +28,7 @@ struct kvm_trace {int trace_state;struct rchan *rchan;struct dentry *lost_file; -int first_subbuf; +int first_page; };static struct kvm_trace *kvm_trace;
@@ -105,21 +105,21 @@ DEFINE_SIMPLE_ATTRIBUTE(kvm_trace_lost_ops, lost_records_get, NULL, "%llu\n");* many times we encountered a full subbuffer, to tell user space app the * lost records there were. */ -static void kvm_new_subbuf_callback (struct rchan_buf *buf, -void *subbuf) +static void kvm_new_page_callback (struct rchan_buf *buf, +void *page_data) {struct kvm_trace *kt = buf->chan->private_data;relay_wakeup_readers (buf); -if (kt->first_subbuf) { +if (kt->first_page) {/* * executed only once when the channel is opened * save metadata as first record */ -subbuf_start_reserve (buf,sizeof (u32)); - *(u32 *)subbuf =0x12345678 ; - kt->first_subbuf =0 ; +page_start_reserve (buf,sizeof (u32)); + *(u32 *)page_data =0x12345678 ; + kt->first_page =0 ; } }
@@ -139,7 +139,7 @@ static int kvm_remove_buf_file_callback(struct dentry *dentry) }static struct rchan_callbacks kvm_relay_callbacks = { - .new_subbuf = kvm_new_subbuf_callback, + .new_page = kvm_new_page_callback, .create_buf_file = kvm_create_buf_file_callack, .remove_buf_file = kvm_remove_buf_file_callback, };
@@ -148,6 +148,7 @@ static int do_kvm_trace_enable(struct kvm_user_trace_setup *kuts) {struct kvm_trace *kt;int i, r = -ENOMEM ; +int n_pages, n_pages_wakeup;if (!kuts->buf_size || !kuts->buf_nr)return -EINVAL ;
@@ -157,14 +158,16 @@ static int do_kvm_trace_enable(struct kvm_user_trace_setup *kuts) goto err; r = -EIO ; - kt->first_subbuf =1 ; + kt->first_page =1 ; kt->lost_file =debugfs_create_file ("lost_records" ,0444 , kvm_debugfs_dir, kt, &kvm_trace_lost_ops);if (!kt->lost_file) goto err; - kt->rchan =relay_open ("trace" , kvm_debugfs_dir, kuts->buf_size, - kuts->buf_nr, &kvm_relay_callbacks, kt,0UL ); + n_pages = (kuts->buf_size * kuts->buf_nr) /PAGE_SIZE ; + n_pages_wakeup = kuts->buf_size /PAGE_SIZE ; + kt->rchan =relay_open ("trace" , kvm_debugfs_dir, n_pages, + n_pages_wakeup, &kvm_relay_callbacks, kt,0UL );if (!kt->rchan) goto err;
Signature · 1 line
1.5.3.5