1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_ELEVATOR_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_ELEVATOR_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (elevator_merge_fn) (request_queue_t *, struct request **, 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct bio *); 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_merge_req_fn) (request_queue_t *, struct request *, struct request *); 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_merged_fn) (request_queue_t *, struct request *); 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (elevator_dispatch_fn) (request_queue_t *, int); 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_add_req_fn) (request_queue_t *, struct request *); 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (elevator_queue_empty_fn) (request_queue_t *); 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct request *(elevator_request_list_fn) (request_queue_t *, struct request *); 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_completed_req_fn) (request_queue_t *, struct request *); 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (elevator_may_queue_fn) (request_queue_t *, int, struct bio *); 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (elevator_set_req_fn) (request_queue_t *, struct request *, struct bio *, gfp_t); 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_put_req_fn) (request_queue_t *, struct request *); 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_activate_req_fn) (request_queue_t *, struct request *); 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_deactivate_req_fn) (request_queue_t *, struct request *); 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void *(elevator_init_fn) (request_queue_t *, elevator_t *); 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef void (elevator_exit_fn) (elevator_t *); 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct elevator_ops 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_merge_fn *elevator_merge_fn; 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_merged_fn *elevator_merged_fn; 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_merge_req_fn *elevator_merge_req_fn; 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_dispatch_fn *elevator_dispatch_fn; 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_add_req_fn *elevator_add_req_fn; 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_activate_req_fn *elevator_activate_req_fn; 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_deactivate_req_fn *elevator_deactivate_req_fn; 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_queue_empty_fn *elevator_queue_empty_fn; 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_completed_req_fn *elevator_completed_req_fn; 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_request_list_fn *elevator_former_req_fn; 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_request_list_fn *elevator_latter_req_fn; 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_set_req_fn *elevator_set_req_fn; 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_put_req_fn *elevator_put_req_fn; 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_may_queue_fn *elevator_may_queue_fn; 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_init_fn *elevator_init_fn; 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru elevator_exit_fn *elevator_exit_fn; 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*trim)(struct io_context *); 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELV_NAME_MAX (16) 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct elv_fs_entry { 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct attribute attr; 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*show)(elevator_t *, char *); 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*store)(elevator_t *, const char *, size_t); 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * identifies an elevator type, such as AS or deadline 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct elevator_type 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head list; 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct elevator_ops ops; 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct elevator_type *elevator_type; 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct elv_fs_entry *elevator_attrs; 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char elevator_name[ELV_NAME_MAX]; 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct module *elevator_owner; 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * each queue has an elevator_queue associated with it 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct elevator_queue 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct elevator_ops *ops; 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *elevator_data; 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct kobject kobj; 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct elevator_type *elevator_type; 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mutex sysfs_lock; 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * block elevator interface 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_dispatch_sort(request_queue_t *, struct request *); 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_add_request(request_queue_t *, struct request *, int, int); 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __elv_add_request(request_queue_t *, struct request *, int, int); 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_insert(request_queue_t *, struct request *, int); 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_merge(request_queue_t *, struct request **, struct bio *); 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_merge_requests(request_queue_t *, struct request *, 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct request *); 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_merged_request(request_queue_t *, struct request *); 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_dequeue_request(request_queue_t *, struct request *); 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_requeue_request(request_queue_t *, struct request *); 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_queue_empty(request_queue_t *); 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct request *elv_next_request(struct request_queue *q); 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct request *elv_former_request(request_queue_t *, struct request *); 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct request *elv_latter_request(request_queue_t *, struct request *); 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_register_queue(request_queue_t *q); 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_unregister_queue(request_queue_t *q); 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_may_queue(request_queue_t *, int, struct bio *); 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_completed_request(request_queue_t *, struct request *); 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_set_request(request_queue_t *, struct request *, struct bio *, gfp_t); 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_put_request(request_queue_t *, struct request *); 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * io scheduler registration 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_register(struct elevator_type *); 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elv_unregister(struct elevator_type *); 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * io scheduler sysfs switching 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern ssize_t elv_iosched_show(request_queue_t *, char *); 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern ssize_t elv_iosched_store(request_queue_t *, const char *, size_t); 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elevator_init(request_queue_t *, char *); 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void elevator_exit(elevator_t *); 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int elv_rq_merge_ok(struct request *, struct bio *); 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Return values from elevator merger 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_NO_MERGE 0 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_FRONT_MERGE 1 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_BACK_MERGE 2 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Insertion selection 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_INSERT_FRONT 1 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_INSERT_BACK 2 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_INSERT_SORT 3 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ELEVATOR_INSERT_REQUEUE 4 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * return values from elevator_may_queue_fn 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum { 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ELV_MQUEUE_MAY, 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ELV_MQUEUE_NO, 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ELV_MQUEUE_MUST, 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define rq_end_sector(rq) ((rq)->sector + (rq)->nr_sectors) 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 154