elevator.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _LINUX_ELEVATOR_H
  2. #define _LINUX_ELEVATOR_H
  3. typedef void (elevator_fn) (struct request *, elevator_t *,
  4.     struct list_head *,
  5.     struct list_head *, int);
  6. typedef int (elevator_merge_fn) (request_queue_t *, struct request **, struct list_head *,
  7.  struct buffer_head *, int, int);
  8. typedef void (elevator_merge_cleanup_fn) (request_queue_t *, struct request *, int);
  9. typedef void (elevator_merge_req_fn) (struct request *, struct request *);
  10. struct elevator_s
  11. {
  12. int read_latency;
  13. int write_latency;
  14. elevator_merge_fn *elevator_merge_fn;
  15. elevator_merge_req_fn *elevator_merge_req_fn;
  16. unsigned int queue_ID;
  17. };
  18. int elevator_noop_merge(request_queue_t *, struct request **, struct list_head *, struct buffer_head *, int, int);
  19. void elevator_noop_merge_cleanup(request_queue_t *, struct request *, int);
  20. void elevator_noop_merge_req(struct request *, struct request *);
  21. int elevator_linus_merge(request_queue_t *, struct request **, struct list_head *, struct buffer_head *, int, int);
  22. void elevator_linus_merge_cleanup(request_queue_t *, struct request *, int);
  23. void elevator_linus_merge_req(struct request *, struct request *);
  24. typedef struct blkelv_ioctl_arg_s {
  25. int queue_ID;
  26. int read_latency;
  27. int write_latency;
  28. int max_bomb_segments;
  29. } blkelv_ioctl_arg_t;
  30. #define BLKELVGET   _IOR(0x12,106,sizeof(blkelv_ioctl_arg_t))
  31. #define BLKELVSET   _IOW(0x12,107,sizeof(blkelv_ioctl_arg_t))
  32. extern int blkelvget_ioctl(elevator_t *, blkelv_ioctl_arg_t *);
  33. extern int blkelvset_ioctl(elevator_t *, const blkelv_ioctl_arg_t *);
  34. extern void elevator_init(elevator_t *, elevator_t);
  35. /*
  36.  * Return values from elevator merger
  37.  */
  38. #define ELEVATOR_NO_MERGE 0
  39. #define ELEVATOR_FRONT_MERGE 1
  40. #define ELEVATOR_BACK_MERGE 2
  41. /*
  42.  * This is used in the elevator algorithm.  We don't prioritise reads
  43.  * over writes any more --- although reads are more time-critical than
  44.  * writes, by treating them equally we increase filesystem throughput.
  45.  * This turns out to give better overall performance.  -- sct
  46.  */
  47. #define IN_ORDER(s1,s2)
  48. ((((s1)->rq_dev == (s2)->rq_dev &&
  49.    (s1)->sector < (s2)->sector)) ||
  50.  (s1)->rq_dev < (s2)->rq_dev)
  51. #define BHRQ_IN_ORDER(bh, rq)
  52. ((((bh)->b_rdev == (rq)->rq_dev &&
  53.    (bh)->b_rsector < (rq)->sector)) ||
  54.  (bh)->b_rdev < (rq)->rq_dev)
  55. static inline int elevator_request_latency(elevator_t * elevator, int rw)
  56. {
  57. int latency;
  58. latency = elevator->read_latency;
  59. if (rw != READ)
  60. latency = elevator->write_latency;
  61. return latency;
  62. }
  63. #define ELV_LINUS_SEEK_COST 16
  64. #define ELEVATOR_NOOP
  65. ((elevator_t) {
  66. 0, /* read_latency */
  67. 0, /* write_latency */
  68. elevator_noop_merge, /* elevator_merge_fn */
  69. elevator_noop_merge_req, /* elevator_merge_req_fn */
  70. })
  71. #define ELEVATOR_LINUS
  72. ((elevator_t) {
  73. 2048, /* read passovers */
  74. 8192, /* write passovers */
  75. elevator_linus_merge, /* elevator_merge_fn */
  76. elevator_linus_merge_req, /* elevator_merge_req_fn */
  77. })
  78. #endif