Commit 4dab46ff authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Jens Axboe

xen/blkfront: use tagged queuing for barriers

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: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
parent e96f6abe
...@@ -420,9 +420,19 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size) ...@@ -420,9 +420,19 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
static int xlvbd_barrier(struct blkfront_info *info) static int xlvbd_barrier(struct blkfront_info *info)
{ {
int err; 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) if (err)
return err; return err;
...@@ -509,8 +519,7 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity, ...@@ -509,8 +519,7 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
info->rq = gd->queue; info->rq = gd->queue;
info->gd = gd; info->gd = gd;
if (info->feature_barrier) xlvbd_barrier(info);
xlvbd_barrier(info);
if (vdisk_info & VDISK_READONLY) if (vdisk_info & VDISK_READONLY)
set_disk_ro(gd, 1); set_disk_ro(gd, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment