RcrdBrt

Untitled

Sep 23rd, 2012
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.93 KB | None | 0 0
  1. /*
  2.  * elevator really-noop
  3.  */
  4. #include <linux/blkdev.h>
  5. #include <linux/elevator.h>
  6. #include <linux/bio.h>
  7. #include <linux/module.h>
  8. #include <linux/slab.h>
  9. #include <linux/init.h>
  10.  
  11. struct rnoop_data {
  12.     struct list_head queue;
  13. };
  14.  
  15. static int rnoop_allow_merge(struct request_queue *q, struct request *rq,
  16.                  struct bio *bio)
  17. {
  18.     /* Always disallow merges */
  19.     return 0;
  20. }
  21.  
  22. static void rnoop_merged_requests(struct request_queue *q, struct request *rq,
  23.                  struct request *next)
  24. {
  25.     list_del_init(&next->queuelist);
  26. }
  27.  
  28. static int rnoop_dispatch(struct request_queue *q, int force)
  29. {
  30.     struct rnoop_data *nd = q->elevator->elevator_data;
  31.  
  32.     if (!list_empty(&nd->queue)) {
  33.         struct request *rq;
  34.         rq = list_entry(nd->queue.next, struct request, queuelist);
  35.         list_del_init(&rq->queuelist);
  36.         /* Do not sort requests inside dispatch list */
  37.         elv_dispatch_add_tail(q, rq);
  38.         return 1;
  39.     }
  40.     return 0;
  41. }
  42.  
  43. static void rnoop_add_request(struct request_queue *q, struct request *rq)
  44. {
  45.     struct rnoop_data *nd = q->elevator->elevator_data;
  46.  
  47.     list_add_tail(&rq->queuelist, &nd->queue);
  48. }
  49.  
  50. static struct request *
  51. rnoop_former_request(struct request_queue *q, struct request *rq)
  52. {
  53.     struct rnoop_data *nd = q->elevator->elevator_data;
  54.  
  55.     if (rq->queuelist.prev == &nd->queue)
  56.         return NULL;
  57.     return list_entry(rq->queuelist.prev, struct request, queuelist);
  58. }
  59.  
  60. static struct request *
  61. rnoop_latter_request(struct request_queue *q, struct request *rq)
  62. {
  63.     struct rnoop_data *nd = q->elevator->elevator_data;
  64.  
  65.     if (rq->queuelist.next == &nd->queue)
  66.         return NULL;
  67.     return list_entry(rq->queuelist.next, struct request, queuelist);
  68. }
  69.  
  70. static int rnoop_init_queue(struct request_queue *q)
  71. {
  72.     struct rnoop_data *nd;
  73.  
  74.     nd = kmalloc_node(sizeof(*nd), GFP_KERNEL, q->node);
  75.     if (!nd)
  76.         return -ENOMEM;
  77.  
  78.     INIT_LIST_HEAD(&nd->queue);
  79.     q->elevator->elevator_data = nd;
  80.     return 0;
  81. }
  82.  
  83. static void rnoop_exit_queue(struct elevator_queue *e)
  84. {
  85.     struct rnoop_data *nd = e->elevator_data;
  86.  
  87.     BUG_ON(!list_empty(&nd->queue));
  88.     kfree(nd);
  89. }
  90.  
  91. static struct elevator_type elevator_rnoop = {
  92.     .ops = {
  93.         .elevator_allow_merge_fn    = rnoop_allow_merge,
  94.         .elevator_merge_req_fn      = rnoop_merged_requests,
  95.         .elevator_dispatch_fn       = rnoop_dispatch,
  96.         .elevator_add_req_fn        = rnoop_add_request,
  97.         .elevator_former_req_fn     = rnoop_former_request,
  98.         .elevator_latter_req_fn     = rnoop_latter_request,
  99.         .elevator_init_fn       = rnoop_init_queue,
  100.         .elevator_exit_fn       = rnoop_exit_queue,
  101.     },
  102.     .elevator_name = "rnoop",
  103.     .elevator_owner = THIS_MODULE,
  104. };
  105.  
  106. static int __init rnoop_init(void)
  107. {
  108.     return elv_register(&elevator_rnoop);
  109. }
  110.  
  111. static void __exit rnoop_exit(void)
  112. {
  113.     elv_unregister(&elevator_rnoop);
  114. }
  115.  
  116. module_init(rnoop_init);
  117. module_exit(rnoop_exit);
  118.  
  119.  
  120. MODULE_AUTHOR("Jens Axboe");
  121. MODULE_AUTHOR("Arianna Avanzini");
  122. MODULE_AUTHOR("Riccardo Berto");
  123. MODULE_LICENSE("GPL");
  124. MODULE_DESCRIPTION("Really No-op IO scheduler");
Advertisement
Add Comment
Please, Sign In to add comment