For some workloads, CFQ has better performance than the no-op scheduler
that is forced by the blkfront driver. The only way to set a different
scheduler is the sysfs interface, because elevator_init is called
unconditionally. This patch allows one to use "elevator=cfq" as well.
While one could argue that the driver's behavior is expected (after all
"elevator=cfq" is the default and should not have any effect), the
do-what-I-mean behavior implemented by this patch is more logical.
Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
---
block/elevator.c | 3 ++-
drivers/xen/blkfront/vbd.c | 11 ++++++-----
drivers/xen/blktap2/device.c | 11 ++++++-----
3 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/block/elevator.c b/block/elevator.c
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -132,7 +132,8 @@
eq->elevator_data = data;
}
-static char chosen_elevator[16];
+char chosen_elevator[16];
+EXPORT_SYMBOL_GPL(chosen_elevator);
static int __init elevator_setup(char *str)
{
diff --git a/drivers/xen/blkfront/vbd.c b/drivers/xen/blkfront/vbd.c
--- a/drivers/xen/blkfront/vbd.c
+++ b/drivers/xen/blkfront/vbd.c
@@ -208,6 +208,8 @@
/* XXX: release major if 0 */
}
+extern char chosen_elevator[];
+
static int
xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
{
@@ -217,11 +219,10 @@
if (rq == NULL)
return -1;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
- elevator_init(rq, "noop");
-#else
- elevator_init(rq, &elevator_noop);
-#endif
+ /* Always respect the user's explicitly chosen elevator, but otherwise
+ pick a different default than CONFIG_DEFAULT_IOSCHED. */
+ if (!*chosen_elevator)
+ elevator_init(rq, "noop");
/* Hard sector size and max sectors impersonate the equiv. hardware. */
blk_queue_hardsect_size(rq, sector_size);
diff --git a/drivers/xen/blktap2/device.c b/drivers/xen/blktap2/device.c
--- a/drivers/xen/blktap2/device.c
+++ b/drivers/xen/blktap2/device.c
@@ -1034,6 +1034,8 @@
return 0;
}
+extern char chosen_elevator[];
+
int
blktap_device_create(struct blktap *tap)
{
@@ -1078,11 +1080,10 @@
if (!rq)
goto error;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
- elevator_init(rq, "noop");
-#else
- elevator_init(rq, &elevator_noop);
-#endif
+ /* Always respect the user's explicitly chosen elevator, but otherwise
+ pick a different default than CONFIG_DEFAULT_IOSCHED. */
+ if (!*chosen_elevator)
+ elevator_init(rq, "noop");
gd->queue = rq;
rq->queuedata = dev;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|