581c1b1439
Tejun Heo notes: "I'm currently debugging this. The problem is that we are using the generic dispatch queue directly in the noop sched and merging is NOT allowed on dispatch queues but generic handling of last_merge tries to merge requests. I'm still trying to verify this, so I'll be back with results soon." In the meantime, disable merging for noop by setting REQ_NOMERGE in elevator_noop_add_request(). Eventually, we should add a noop_list and do the dispatching like in the other io schedulers. Merging is still beneficial for noop (and it has always done it). Signed-off-by: Jens Axboe <axboe@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
47 lines
894 B
C
47 lines
894 B
C
/*
|
|
* elevator noop
|
|
*/
|
|
#include <linux/blkdev.h>
|
|
#include <linux/elevator.h>
|
|
#include <linux/bio.h>
|
|
#include <linux/module.h>
|
|
#include <linux/init.h>
|
|
|
|
static void elevator_noop_add_request(request_queue_t *q, struct request *rq)
|
|
{
|
|
rq->flags |= REQ_NOMERGE;
|
|
elv_dispatch_add_tail(q, rq);
|
|
}
|
|
|
|
static int elevator_noop_dispatch(request_queue_t *q, int force)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static struct elevator_type elevator_noop = {
|
|
.ops = {
|
|
.elevator_dispatch_fn = elevator_noop_dispatch,
|
|
.elevator_add_req_fn = elevator_noop_add_request,
|
|
},
|
|
.elevator_name = "noop",
|
|
.elevator_owner = THIS_MODULE,
|
|
};
|
|
|
|
static int __init noop_init(void)
|
|
{
|
|
return elv_register(&elevator_noop);
|
|
}
|
|
|
|
static void __exit noop_exit(void)
|
|
{
|
|
elv_unregister(&elevator_noop);
|
|
}
|
|
|
|
module_init(noop_init);
|
|
module_exit(noop_exit);
|
|
|
|
|
|
MODULE_AUTHOR("Jens Axboe");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_DESCRIPTION("No-op IO scheduler");
|