xen/blkfront: use tagged queuing for barriers
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Thu, 22 Jul 2010 21:17:00 +0000 (14:17 -0700)
committerJens Axboe <jaxboe@fusionio.com>
Sat, 7 Aug 2010 16:52:53 +0000 (18:52 +0200)
When barriers are supported, then use QUEUE_ORDERED_TAG to tell the block
subsystem that it doesn't need to do anything else with the barriers.
Previously we used ORDERED_DRAIN which caused the block subsystem to
drain all pending IO before submitting the barrier, which would be
very expensive.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
drivers/block/xen-blkfront.c

index c6727b5..6d912ab 100644 (file)
@@ -420,9 +420,19 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
 static int xlvbd_barrier(struct blkfront_info *info)
 {
        int err;
+       unsigned ordered = QUEUE_ORDERED_NONE;
 
-       err = blk_queue_ordered(info->rq,
-                               info->feature_barrier ? QUEUE_ORDERED_DRAIN : QUEUE_ORDERED_NONE);
+       /*
+        * If we don't have barrier support, then there's really no
+        * way to guarantee write ordering, so we really just have to
+        * send writes to the backend and hope for the best.  If
+        * barriers are supported then we can treat them as proper
+        * ordering tags.
+        */
+       if (info->feature_barrier)
+               ordered = QUEUE_ORDERED_TAG;
+
+       err = blk_queue_ordered(info->rq, ordered);
 
        if (err)
                return err;
@@ -509,8 +519,7 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
        info->rq = gd->queue;
        info->gd = gd;
 
-       if (info->feature_barrier)
-               xlvbd_barrier(info);
+       xlvbd_barrier(info);
 
        if (vdisk_info & VDISK_READONLY)
                set_disk_ro(gd, 1);