Skip to contentSkip to conversation

relay - Remove sub-buffers from relay.

RFC PATCH In review Tom Zanussi 1 participant 1 message Sep 29, 2008

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

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.

---
 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
index c04168b..84a9cb4 100644
@@ -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
index 293a3c2..9373b34 100644
@@ -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