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@xxxxxxxxxx>
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 92091a7..b61a021 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -418,10 +418,20 @@ 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,
- NULL);
+ /*
+ * 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, we don't really know what the
+ * flushing semantics of the barrier are, so again, tag the
+ * requests in order and hope for the best.
+ */
+ if (info->feature_barrier)
+ ordered = QUEUE_ORDERED_TAG;
+
+ err = blk_queue_ordered(info->rq, ordered, NULL);
if (err)
return err;
@@ -508,8 +518,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);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|