relay revamp 7, full patch
Subsystems (3)
RFC PATCH 1/1 relay revamp 7, full patch
--- block/blktrace.c | 69 +-- include/linux/blktrace_api.h | 7 +- include/linux/relay.h | 255 ++----- include/linux/relay_pagewriter.h | 294 ++++++++ kernel/Makefile | 2 +- kernel/relay.c | 1469 +++++++++++++++----------------------- kernel/relay_pagewriter.c | 868 ++++++++++++++++++++++ virt/kvm/kvm_trace.c | 84 +-- 8 files changed, 1854 insertions(+), 1194 deletions(-) create mode 100644 include/linux/relay_pagewriter.h create mode 100644 kernel/relay_pagewriter.c
block/blktrace.c +25 -44
@@ -35,7 +35,7 @@ static void trace_note(struct blk_trace *bt, pid_t pid, int action, {struct blk_io_trace *t; - t =relay_reserve (bt->rchan,sizeof (*t) + len); + t =pagewriter_reserve (bt->pagewriter,sizeof (*t) + len);if (t) {const int cpu =smp_processor_id ();
@@ -153,7 +153,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,if (unlikely (tsk->btrace_seq != blktrace_seq))trace_note_tsk (bt, tsk); - t =relay_reserve (bt->rchan,sizeof (*t) + pdu_len); + t =pagewriter_reserve (bt->pagewriter,sizeof (*t) + pdu_len);if (t) { cpu =smp_processor_id (); sequence =per_cpu_ptr (bt->sequence, cpu);
@@ -230,7 +230,7 @@ err:static void blk_trace_cleanup (struct blk_trace *bt) { -relay_close (bt->rchan); +pagewriter_close (bt->pagewriter);debugfs_remove (bt->msg_file);debugfs_remove (bt->dropped_file);blk_remove_tree (bt->dir);
@@ -268,7 +268,8 @@ static ssize_t blk_dropped_read(struct file *filp, char __user *buffer,struct blk_trace *bt = filp->private_data;char buf[16 ]; -snprintf (buf,sizeof (buf),"%u\n" ,atomic_read (&bt->dropped)); +snprintf (buf,sizeof (buf),"%u\n" , +atomic_read (&bt->pagewriter->dropped));return simple_read_from_buffer (buffer, count, ppos, buf,strlen (buf)); }
@@ -317,43 +318,19 @@ static const struct file_operations blk_msg_fops = { .write = blk_msg_write, }; -/* -* 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,size_t prev_padding) +static void blk_write_padding_callback (struct pagewriter_buf *buf, +size_t length, +void *reserved) { -struct blk_trace *bt; +struct blk_io_trace *t = reserved; -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); -return 0 ; -} - -static struct dentry *blk_create_buf_file_callback (const char *filename, -struct dentry *parent, -int mode, -struct rchan_buf *buf, -int *is_global) -{ -return debugfs_create_file (filename, mode, parent, buf, - &relay_file_operations); + t->magic =BLK_IO_TRACE_MAGIC |BLK_IO_TRACE_VERSION ; + t->action =BLK_TN_PADDING ; + t->pdu_len = length -sizeof (*t); } -static 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, +static struct pagewriter_callbacks blk_pagewriter_callbacks = { + .write_padding = blk_write_padding_callback, };/*
@@ -365,6 +342,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 ;
@@ -400,7 +378,6 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, bt->dir = dir; bt->dev = dev; -atomic_set (&bt->dropped,0 ); ret = -EIO ; bt->dropped_file =debugfs_create_file ("dropped" ,0444 , dir, bt, &blk_dropped_fops);
@@ -411,9 +388,13 @@ 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); -if (!bt->rchan) + n_pages = (buts->buf_size * buts->buf_nr) /PAGE_SIZE ; + n_pages_wakeup = buts->buf_size /PAGE_SIZE ; + bt->pagewriter =pagewriter_open ("trace" , dir, n_pages, n_pages_wakeup, +sizeof (struct blk_io_trace ), + &blk_pagewriter_callbacks, bt, +PAGEWRITER_PAD_WRITES ); +if (!bt->pagewriter) goto err; bt->act_mask = buts->act_mask;
@@ -446,8 +427,8 @@ err:debugfs_remove (bt->dropped_file);free_percpu (bt->sequence);free_percpu (bt->msg_data); -if (bt->rchan) -relay_close (bt->rchan); +if (bt->pagewriter) +pagewriter_close (bt->pagewriter);kfree (bt); }return ret;
@@ -500,7 +481,7 @@ int blk_trace_startstop(struct request_queue *q, int start) }else {if (bt->trace_state == Blktrace_running) { bt->trace_state = Blktrace_stopped; -relay_flush (bt->rchan); +pagewriter_flush (bt->pagewriter); ret =0 ; } }
include/linux/blktrace_api.h +4 -3
@@ -3,7 +3,7 @@#ifdef __KERNEL__#include <linux/blkdev.h> -#include <linux/relay.h> +#include <linux/relay_pagewriter.h> #endif /*
@@ -62,6 +62,7 @@ enum blktrace_notify { __BLK_TN_PROCESS =0 ,/* establish pid/name mapping */ __BLK_TN_TIMESTAMP,/* include system clock */ __BLK_TN_MESSAGE,/* Character string message */ + __BLK_TN_PADDING, /* Padding message */ };
@@ -89,6 +90,7 @@ enum blktrace_notify {#define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY))#define BLK_TN_TIMESTAMP (__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY))#define BLK_TN_MESSAGE (__BLK_TN_MESSAGE | BLK_TC_ACT(BLK_TC_NOTIFY)) +#define BLK_TN_PADDING (__BLK_TN_PADDING | BLK_TC_ACT(BLK_TC_NOTIFY))#define BLK_IO_TRACE_MAGIC 0x65617400#define BLK_IO_TRACE_VERSION 0x07
@@ -144,7 +146,7 @@ struct blk_user_trace_setup { #if defined(CONFIG_BLK_DEV_IO_TRACE) struct blk_trace { int trace_state; - struct rchan *rchan; + struct pagewriter *pagewriter; unsigned long *sequence; unsigned char *msg_data; u16 act_mask;
@@ -155,7 +157,6 @@ struct blk_trace {struct dentry *dir;struct dentry *dropped_file;struct dentry *msg_file; -atomic_t dropped; };extern int blk_trace_ioctl (struct block_device *,unsigned ,char __user *);
include/linux/relay.h +70 -185
328 lines not on this page · raw message
include/linux/relay_pagewriter.h new file +294 -0
294 lines not on this page · raw message
kernel/Makefile +1 -1
@@ -80,7 +80,7 @@ obj-$(CONFIG_PREEMPT_RCU) += rcupreempt.o ifeq ($(CONFIG_PREEMPT_RCU),y) obj-$(CONFIG_RCU_TRACE) += rcupreempt_trace.o endif -obj-$(CONFIG_RELAY) += relay.o +obj-$(CONFIG_RELAY) += relay.o relay_pagewriter.o obj-$(CONFIG_SYSCTL) += utsname_sysctl.o obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
kernel/relay.c +561 -908
1,803 lines not on this page · raw message
kernel/relay_pagewriter.c new file +868 -0
397 lines not on this page · raw message
virt/kvm/kvm_trace.c +31 -53
84 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
1.5.3.5
Part of the diff is not shown here. View the raw message.