[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Backport of batched request_queue unplugging in blkback driver.
ChangeSet 1.1817, 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:03:39 -05:00 +++ b/linux-2.6.11-xen-sparse/drivers/xen/blkback/blkback.c 2005-03-31 11:03:39 -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:03:39 -05:00 +++ b/linux-2.6.11-xen-sparse/drivers/xen/blkback/common.h 2005-03-31 11:03:39 -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:03:39 -05:00 +++ b/linux-2.6.11-xen-sparse/drivers/xen/blkback/vbd.c 2005-03-31 11:03:39 -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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |