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

[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
Loading
Loading
Loading
Loading
+14 −31
Original line number Diff line number Diff line
@@ -139,34 +139,15 @@ static int elevator_attach(request_queue_t *q, struct elevator_type *e,

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
	 * won't get the wrong elevator.
	 */
	if (!strcmp(chosen_elevator, "as"))
	if (!strcmp(str, "as"))
		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
 		strcpy(chosen_elevator, CONFIG_DEFAULT_IOSCHED);
}

static int __init elevator_setup(char *str)
{
		strncpy(chosen_elevator, str, sizeof(chosen_elevator) - 1);
	return 0;
}
@@ -184,15 +165,15 @@ int elevator_init(request_queue_t *q, char *name)
	q->end_sector = 0;
	q->boundary_rq = NULL;

	elevator_setup_default();

	if (!name)
		name = chosen_elevator;

	e = elevator_get(name);
	if (!e)
	if (name && !(e = elevator_get(name)))
		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);
	if (!eq) {
		elevator_put(e);
@@ -669,7 +650,9 @@ int elv_register(struct elevator_type *e)
	spin_unlock_irq(&elv_list_lock);

	printk(KERN_INFO "io scheduler %s registered", e->elevator_name);
	if (!strcmp(e->elevator_name, chosen_elevator))
	if (!strcmp(e->elevator_name, chosen_elevator) ||
			(!*chosen_elevator &&
			 !strcmp(e->elevator_name, CONFIG_DEFAULT_IOSCHED)))
				printk(" (default)");
	printk("\n");
	return 0;