Hi,
I've been trying to investigate an IO performance issue on my machine, as
part of this I've noticed what is (presumably only a cosmetic) issue with
the messages displayed at kernel boot-time.
In the "good old days" (i.e. older 2.6.x kernel versions), one of the many
messages displayed at kernel boot-time was "elevator: using XXX as default
io scheduler", where XXX was one of the IO schedulers (cfq, anticipatory,
deadline, etc) depending on kernel .config at compile time.
I noticed in 2.6.11, this message has vanished (although this may have
happened in an earlier kernel), and I now get some messages "io scheduler
XXX registered". Unfortunately, the "default" scheduler is no longer
tagged.
The Bug, however, is that code to tag the default clearly exists in
elevator.c, thus:
In function "elv_register":
printk(KERN_INFO "io scheduler %s registered", e->elevator_name);
if (!strcmp(e->elevator_name, chosen_elevator))
printk(" (default)");
printk("\n");
Some investigation has shown that when this code is called at kernel boot
time with no "elevator=xxx" kernel argument, chosen_elevator is undefined.
The code that defines chosen_elevator (elevator_setup_default) is only
called for the first time AFTER all the compiled in schedulers call
"elv_register".
However, if "elevator=xxx" is passed as a kernel argument, the code in
elv_register works.
Presumably, this code causes that behaviour:
static int __init elevator_setup(char *str)
{
strncpy(chosen_elevator, str, sizeof(chosen_elevator) - 1);
return 0;
}
__setup("elevator=", elevator_setup);
I imagine the fix for the bug is to have "elevator_setup_default" called
before any of the compiled in schedulers call "elv_register"; but I lack
sufficient knowledge of how the kernel hangs together to be able to patch
anything to do this. Presumably, ll_rw_blk.c is responsible for the calling
order - somehow.
For completeness, the appropriate section from my .config:
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_ATA_OVER_ETH is not set
If anyone can come up with a patch, I'm happy to test and report back....
Thanks,
James Roberts-Thomson
----------
Hardware: The parts of a computer system that can be kicked.
LKML Readers: Please ignore the following disclaimer - this email is
explicitly declared to be non confidential and does not contain privileged
information.
This communication is confidential and may contain privileged material.
If you are not the intended recipient you must not use, disclose, copy or retain it.
If you have received it in error please immediately notify me by return email
and delete the emails.
Thank you.
On Wed, Mar 09 2005, Roberts-Thomson, James wrote:
> Hi,
>
> I've been trying to investigate an IO performance issue on my machine, as
> part of this I've noticed what is (presumably only a cosmetic) issue with
> the messages displayed at kernel boot-time.
>
> In the "good old days" (i.e. older 2.6.x kernel versions), one of the many
> messages displayed at kernel boot-time was "elevator: using XXX as default
> io scheduler", where XXX was one of the IO schedulers (cfq, anticipatory,
> deadline, etc) depending on kernel .config at compile time.
>
> I noticed in 2.6.11, this message has vanished (although this may have
> happened in an earlier kernel), and I now get some messages "io scheduler
> XXX registered". Unfortunately, the "default" scheduler is no longer
> tagged.
Does this work?
--- 2.6.11/drivers/block/elevator.c 2005-01-22 15:22:55.000000000 +1100
+++ test/drivers/block/elevator.c 2005-01-31 22:38:36.000000000 +1100
@@ -180,6 +180,8 @@
__setup("elevator=", elevator_setup);
+static int default_msg = 0;
+
int elevator_init(request_queue_t *q, char *name)
{
struct elevator_type *e = NULL;
@@ -195,6 +197,12 @@
if (!e)
return -EINVAL;
+ if (!default_msg && !strcmp(e->elevator_name, chosen_elevator)) {
+ printk(KERN_INFO "using %s as default io scheduler\n",
+ chosen_elevator);
+ default_msg = 1;
+ }
+
eq = kmalloc(sizeof(struct elevator_queue), GFP_KERNEL);
if (!eq) {
elevator_put(e->elevator_type);
@@ -513,10 +521,7 @@
list_add_tail(&e->list, &elv_list);
spin_unlock_irq(&elv_list_lock);
- printk(KERN_INFO "io scheduler %s registered", e->elevator_name);
- if (!strcmp(e->elevator_name, chosen_elevator))
- printk(" (default)");
- printk("\n");
+ printk(KERN_INFO "io scheduler %s registered\n", e->elevator_name);
return 0;
}
EXPORT_SYMBOL_GPL(elv_register);
--
Jens Axboe