Created
January 10, 2017 09:04
-
-
Save RcrdBrt/8e249c500a230ee9bea21e8703be628a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* elevator really-noop | |
*/ | |
#include <linux/blkdev.h> | |
#include <linux/elevator.h> | |
#include <linux/bio.h> | |
#include <linux/module.h> | |
#include <linux/slab.h> | |
#include <linux/init.h> | |
struct rnoop_data { | |
struct list_head queue; | |
}; | |
static int rnoop_allow_merge(struct request_queue *q, struct request *rq, | |
struct bio *bio) | |
{ | |
/* Always disallow merges */ | |
return 0; | |
} | |
static void rnoop_merged_requests(struct request_queue *q, struct request *rq, | |
struct request *next) | |
{ | |
list_del_init(&next->queuelist); | |
} | |
static int rnoop_dispatch(struct request_queue *q, int force) | |
{ | |
struct rnoop_data *nd = q->elevator->elevator_data; | |
if (!list_empty(&nd->queue)) { | |
struct request *rq; | |
rq = list_entry(nd->queue.next, struct request, queuelist); | |
list_del_init(&rq->queuelist); | |
/* Do not sort requests inside dispatch list */ | |
elv_dispatch_add_tail(q, rq); | |
return 1; | |
} | |
return 0; | |
} | |
static void rnoop_add_request(struct request_queue *q, struct request *rq) | |
{ | |
struct rnoop_data *nd = q->elevator->elevator_data; | |
list_add_tail(&rq->queuelist, &nd->queue); | |
} | |
static struct request * | |
rnoop_former_request(struct request_queue *q, struct request *rq) | |
{ | |
struct rnoop_data *nd = q->elevator->elevator_data; | |
if (rq->queuelist.prev == &nd->queue) | |
return NULL; | |
return list_entry(rq->queuelist.prev, struct request, queuelist); | |
} | |
static struct request * | |
rnoop_latter_request(struct request_queue *q, struct request *rq) | |
{ | |
struct rnoop_data *nd = q->elevator->elevator_data; | |
if (rq->queuelist.next == &nd->queue) | |
return NULL; | |
return list_entry(rq->queuelist.next, struct request, queuelist); | |
} | |
static void *rnoop_init_queue(struct request_queue *q) | |
{ | |
struct rnoop_data *nd; | |
nd = kmalloc_node(sizeof(*nd), GFP_KERNEL, q->node); | |
if (!nd) | |
return NULL; | |
INIT_LIST_HEAD(&nd->queue); | |
return nd; | |
} | |
static void rnoop_exit_queue(struct elevator_queue *e) | |
{ | |
struct rnoop_data *nd = e->elevator_data; | |
BUG_ON(!list_empty(&nd->queue)); | |
kfree(nd); | |
} | |
static struct elevator_type elevator_rnoop = { | |
.ops = { | |
.elevator_allow_merge_fn = rnoop_allow_merge, | |
.elevator_merge_req_fn = rnoop_merged_requests, | |
.elevator_dispatch_fn = rnoop_dispatch, | |
.elevator_add_req_fn = rnoop_add_request, | |
.elevator_former_req_fn = rnoop_former_request, | |
.elevator_latter_req_fn = rnoop_latter_request, | |
.elevator_init_fn = rnoop_init_queue, | |
.elevator_exit_fn = rnoop_exit_queue, | |
}, | |
.elevator_name = "rnoop", | |
.elevator_owner = THIS_MODULE, | |
}; | |
static int __init rnoop_init(void) | |
{ | |
elv_register(&elevator_rnoop); | |
return 0; | |
} | |
static void __exit rnoop_exit(void) | |
{ | |
elv_unregister(&elevator_rnoop); | |
} | |
module_init(rnoop_init); | |
module_exit(rnoop_exit); | |
MODULE_AUTHOR("Jens Axboe"); | |
MODULE_LICENSE("GPL"); | |
MODULE_DESCRIPTION("Really No-op IO scheduler"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
config IOSCHED_RNOOP
bool
default y
---help---
The really no-op I/O scheduler does not perform any operation on
inserted requests.