Commit 5f003976 authored by Nate Diller's avatar Nate Diller Committed by Jens Axboe

[BLOCK] elevator: default choice selection

My previous default iosched patch did a poor job dealing with the
'elevator=' boot-time option.  The old behavior falls back to the
compiled-in default if the requested one is not registered at boot
time.  This patch dynamically evaluates which default
to use, and emits a suitable error message when the requested scheduler
is not available.  It also does the 'as' -> 'anticipatory' conversion
before elevator registration, which along with a modified registration
function, allows it to correctly indicate which default scheduler is
in use.

Tested for a range of boot options on 2.6.16-rc1-mm2.
Signed-off-by: default avatarNate Diller <nate.diller@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@suse.de>
parent 53e86061
...@@ -139,35 +139,16 @@ static int elevator_attach(request_queue_t *q, struct elevator_type *e, ...@@ -139,35 +139,16 @@ static int elevator_attach(request_queue_t *q, struct elevator_type *e,
static char chosen_elevator[16]; static char chosen_elevator[16];
static void elevator_setup_default(void) static int __init elevator_setup(char *str)
{ {
struct elevator_type *e;
/*
* If default has not been set, use the compiled-in selection.
*/
if (!chosen_elevator[0])
strcpy(chosen_elevator, CONFIG_DEFAULT_IOSCHED);
/* /*
* Be backwards-compatible with previous kernels, so users * Be backwards-compatible with previous kernels, so users
* won't get the wrong elevator. * won't get the wrong elevator.
*/ */
if (!strcmp(chosen_elevator, "as")) if (!strcmp(str, "as"))
strcpy(chosen_elevator, "anticipatory"); strcpy(chosen_elevator, "anticipatory");
/*
* If the given scheduler is not available, fall back to the default
*/
if ((e = elevator_find(chosen_elevator)))
elevator_put(e);
else else
strcpy(chosen_elevator, CONFIG_DEFAULT_IOSCHED); strncpy(chosen_elevator, str, sizeof(chosen_elevator) - 1);
}
static int __init elevator_setup(char *str)
{
strncpy(chosen_elevator, str, sizeof(chosen_elevator) - 1);
return 0; return 0;
} }
...@@ -184,15 +165,15 @@ int elevator_init(request_queue_t *q, char *name) ...@@ -184,15 +165,15 @@ int elevator_init(request_queue_t *q, char *name)
q->end_sector = 0; q->end_sector = 0;
q->boundary_rq = NULL; q->boundary_rq = NULL;
elevator_setup_default(); if (name && !(e = elevator_get(name)))
if (!name)
name = chosen_elevator;
e = elevator_get(name);
if (!e)
return -EINVAL; return -EINVAL;
if (!e && !(e = elevator_get(chosen_elevator))) {
e = elevator_get(CONFIG_DEFAULT_IOSCHED);
if (*chosen_elevator)
printk("I/O scheduler %s not found\n", chosen_elevator);
}
eq = kmalloc(sizeof(struct elevator_queue), GFP_KERNEL); eq = kmalloc(sizeof(struct elevator_queue), GFP_KERNEL);
if (!eq) { if (!eq) {
elevator_put(e); elevator_put(e);
...@@ -669,8 +650,10 @@ int elv_register(struct elevator_type *e) ...@@ -669,8 +650,10 @@ int elv_register(struct elevator_type *e)
spin_unlock_irq(&elv_list_lock); spin_unlock_irq(&elv_list_lock);
printk(KERN_INFO "io scheduler %s registered", e->elevator_name); printk(KERN_INFO "io scheduler %s registered", e->elevator_name);
if (!strcmp(e->elevator_name, chosen_elevator)) if (!strcmp(e->elevator_name, chosen_elevator) ||
printk(" (default)"); (!*chosen_elevator &&
!strcmp(e->elevator_name, CONFIG_DEFAULT_IOSCHED)))
printk(" (default)");
printk("\n"); printk("\n");
return 0; return 0;
} }
......
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