mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-04-15 10:27:32 +07:00
[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: Nate Diller <nate.diller@gmail.com> Signed-off-by: Jens Axboe <axboe@suse.de>
This commit is contained in:
parent
53e86061b5
commit
5f00397644
@ -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)
|
|||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user