ChangeSet 1.1159.256.83, 2005/03/31 16:43:57+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx
Backport of batched request_queue unplugging in blkback driver.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
blkback.c | 31 +++++++++++++++++++++++++++++--
common.h | 2 ++
vbd.c | 8 ++++----
3 files changed, 35 insertions(+), 6 deletions(-)
diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blkback/blkback.c
b/linux-2.6.11-xen-sparse/drivers/xen/blkback/blkback.c
--- a/linux-2.6.11-xen-sparse/drivers/xen/blkback/blkback.c 2005-03-31
11:02:53 -05:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blkback/blkback.c 2005-03-31
11:02:53 -05:00
@@ -66,6 +66,19 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
static kmem_cache_t *buffer_head_cachep;
+#else
+static request_queue_t *plugged_queue;
+void bdev_put(struct block_device *bdev)
+{
+ request_queue_t *q = plugged_queue;
+ /* We might be giving up last reference to plugged queue. Flush if so. */
+ if ( (q != NULL) &&
+ (q == bdev_get_queue(bdev)) &&
+ (cmpxchg(&plugged_queue, q, NULL) == q) )
+ blk_run_queue(q);
+ /* It's now safe to drop the block device. */
+ blkdev_put(bdev);
+}
#endif
static int do_block_io_op(blkif_t *blkif, int max_to_do);
@@ -176,9 +189,15 @@
blkif_put(blkif);
}
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
/* Push the batch through to disc. */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
run_task_queue(&tq_disk);
+#else
+ if ( plugged_queue != NULL )
+ {
+ blk_run_queue(plugged_queue);
+ plugged_queue = NULL;
+ }
#endif
}
}
@@ -481,6 +500,7 @@
for ( i = 0; i < nr_psegs; i++ )
{
struct bio *bio;
+ request_queue_t *q;
bio = bio_alloc(GFP_ATOMIC, 1);
if ( unlikely(bio == NULL) )
@@ -500,7 +520,14 @@
phys_seg[i].nr_sects << 9,
phys_seg[i].buffer & ~PAGE_MASK);
- submit_bio(operation | (1 << BIO_RW_SYNC), bio);
+ if ( (q = bdev_get_queue(bio->bi_bdev)) != plugged_queue )
+ {
+ if ( plugged_queue != NULL )
+ blk_run_queue(plugged_queue);
+ plugged_queue = q;
+ }
+
+ submit_bio(operation, bio);
}
#endif
diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blkback/common.h
b/linux-2.6.11-xen-sparse/drivers/xen/blkback/common.h
--- a/linux-2.6.11-xen-sparse/drivers/xen/blkback/common.h 2005-03-31
11:02:53 -05:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blkback/common.h 2005-03-31
11:02:53 -05:00
@@ -30,8 +30,10 @@
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
typedef struct rb_root rb_root_t;
typedef struct rb_node rb_node_t;
+extern void bdev_put(struct block_device *bdev);
#else
struct block_device;
+#define bdev_put(_b) ((void)0)
#endif
typedef struct blkif_st {
diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blkback/vbd.c
b/linux-2.6.11-xen-sparse/drivers/xen/blkback/vbd.c
--- a/linux-2.6.11-xen-sparse/drivers/xen/blkback/vbd.c 2005-03-31 11:02:53
-05:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blkback/vbd.c 2005-03-31 11:02:53
-05:00
@@ -150,7 +150,7 @@
{
DPRINTK("vbd_grow: device %08x doesn't exist.\n", x->extent.device);
grow->status = BLKIF_BE_STATUS_EXTENT_NOT_FOUND;
- blkdev_put(x->bdev);
+ bdev_put(x->bdev);
goto out;
}
@@ -255,7 +255,7 @@
*px = x->next; /* ATOMIC: no need for vbd_lock. */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- blkdev_put(x->bdev);
+ bdev_put(x->bdev);
#endif
kfree(x);
@@ -307,7 +307,7 @@
{
t = x->next;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- blkdev_put(x->bdev);
+ bdev_put(x->bdev);
#endif
kfree(x);
x = t;
@@ -335,7 +335,7 @@
{
t = x->next;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- blkdev_put(x->bdev);
+ bdev_put(x->bdev);
#endif
kfree(x);
x = t;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|