summaryrefslogtreecommitdiffstats
path: root/drivers/block/xen-blkback
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2011-04-27 18:40:11 +0200
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2011-04-27 18:40:11 +0200
commita19be5f0f073525306f6a4b000d90dc84065ed93 (patch)
tree3c2b4f2dfda149838f0060d3f38c7494d8612f4d /drivers/block/xen-blkback
parentxen/blkback: Stick REQ_SYNC on WRITEs to deal with CFQ I/O scheduler. (diff)
downloadlinux-a19be5f0f073525306f6a4b000d90dc84065ed93.tar.xz
linux-a19be5f0f073525306f6a4b000d90dc84065ed93.zip
Revert "xen/blkback: Move the plugging/unplugging to a higher level."
This reverts commit 97961ef46b9b5a6a7c918a38b898a7b3e49869f4 b/c we lose about 15% performance if we do the unplugging and the end of the reading the ring buffer.
Diffstat (limited to 'drivers/block/xen-blkback')
-rw-r--r--drivers/block/xen-blkback/blkback.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 8583b130499a..eb068d0b47ea 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -276,8 +276,6 @@ int xen_blkif_schedule(void *arg)
printk(KERN_DEBUG "%s: started\n", current->comm);
while (!kthread_should_stop()) {
- struct blk_plug plug;
-
if (try_to_freeze())
continue;
if (unlikely(vbd->size != vbd_sz(vbd)))
@@ -294,13 +292,9 @@ int xen_blkif_schedule(void *arg)
blkif->waiting_reqs = 0;
smp_mb(); /* clear flag *before* checking for work */
- blk_start_plug(&plug);
-
if (do_block_io_op(blkif))
blkif->waiting_reqs = 1;
- blk_finish_plug(&plug);
-
if (log_stats && time_after(jiffies, blkif->st_print))
print_stats(blkif);
}
@@ -553,6 +547,7 @@ static void dispatch_rw_block_io(struct blkif_st *blkif,
struct bio *biolist[BLKIF_MAX_SEGMENTS_PER_REQUEST];
int i, nbio = 0;
int operation;
+ struct blk_plug plug;
switch (req->operation) {
case BLKIF_OP_READ:
@@ -665,9 +660,15 @@ static void dispatch_rw_block_io(struct blkif_st *blkif,
*/
atomic_set(&pending_req->pendcnt, nbio);
+ /* Get a reference count for the disk queue and start sending I/O */
+ blk_start_plug(&plug);
+
for (i = 0; i < nbio; i++)
submit_bio(operation, biolist[i]);
+ blk_finish_plug(&plug);
+ /* Let the I/Os go.. */
+
if (operation == READ)
blkif->st_rd_sect += preq.nr_sects;
else if (operation == WRITE || operation == WRITE_BARRIER)