noop-iosched.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * elevator 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/init.h>
  9. /*
  10. * See if we can find a request that this buffer can be coalesced with.
  11. */
  12. static int elevator_noop_merge(request_queue_t *q, struct request **req,
  13. struct bio *bio)
  14. {
  15. struct list_head *entry = &q->queue_head;
  16. struct request *__rq;
  17. int ret;
  18. if ((ret = elv_try_last_merge(q, bio))) {
  19. *req = q->last_merge;
  20. return ret;
  21. }
  22. while ((entry = entry->prev) != &q->queue_head) {
  23. __rq = list_entry_rq(entry);
  24. if (__rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER))
  25. break;
  26. else if (__rq->flags & REQ_STARTED)
  27. break;
  28. if (!blk_fs_request(__rq))
  29. continue;
  30. if ((ret = elv_try_merge(__rq, bio))) {
  31. *req = __rq;
  32. q->last_merge = __rq;
  33. return ret;
  34. }
  35. }
  36. return ELEVATOR_NO_MERGE;
  37. }
  38. static void elevator_noop_merge_requests(request_queue_t *q, struct request *req,
  39. struct request *next)
  40. {
  41. list_del_init(&next->queuelist);
  42. }
  43. static void elevator_noop_add_request(request_queue_t *q, struct request *rq,
  44. int where)
  45. {
  46. if (where == ELEVATOR_INSERT_FRONT)
  47. list_add(&rq->queuelist, &q->queue_head);
  48. else
  49. list_add_tail(&rq->queuelist, &q->queue_head);
  50. /*
  51. * new merges must not precede this barrier
  52. */
  53. if (rq->flags & REQ_HARDBARRIER)
  54. q->last_merge = NULL;
  55. else if (!q->last_merge)
  56. q->last_merge = rq;
  57. }
  58. static struct request *elevator_noop_next_request(request_queue_t *q)
  59. {
  60. if (!list_empty(&q->queue_head))
  61. return list_entry_rq(q->queue_head.next);
  62. return NULL;
  63. }
  64. static struct elevator_type elevator_noop = {
  65. .ops = {
  66. .elevator_merge_fn = elevator_noop_merge,
  67. .elevator_merge_req_fn = elevator_noop_merge_requests,
  68. .elevator_next_req_fn = elevator_noop_next_request,
  69. .elevator_add_req_fn = elevator_noop_add_request,
  70. },
  71. .elevator_name = "noop",
  72. .elevator_owner = THIS_MODULE,
  73. };
  74. static int __init noop_init(void)
  75. {
  76. return elv_register(&elevator_noop);
  77. }
  78. static void __exit noop_exit(void)
  79. {
  80. elv_unregister(&elevator_noop);
  81. }
  82. module_init(noop_init);
  83. module_exit(noop_exit);
  84. MODULE_AUTHOR("Jens Axboe");
  85. MODULE_LICENSE("GPL");
  86. MODULE_DESCRIPTION("No-op IO scheduler");