diff options
Diffstat (limited to 'include/linux/elevator.h')
-rw-r--r-- | include/linux/elevator.h | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 1d0f7a2ff73b..c24f3d7fbf1e 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h | |||
@@ -5,6 +5,8 @@ | |||
5 | 5 | ||
6 | #ifdef CONFIG_BLOCK | 6 | #ifdef CONFIG_BLOCK |
7 | 7 | ||
8 | struct io_cq; | ||
9 | |||
8 | typedef int (elevator_merge_fn) (struct request_queue *, struct request **, | 10 | typedef int (elevator_merge_fn) (struct request_queue *, struct request **, |
9 | struct bio *); | 11 | struct bio *); |
10 | 12 | ||
@@ -24,6 +26,8 @@ typedef struct request *(elevator_request_list_fn) (struct request_queue *, stru | |||
24 | typedef void (elevator_completed_req_fn) (struct request_queue *, struct request *); | 26 | typedef void (elevator_completed_req_fn) (struct request_queue *, struct request *); |
25 | typedef int (elevator_may_queue_fn) (struct request_queue *, int); | 27 | typedef int (elevator_may_queue_fn) (struct request_queue *, int); |
26 | 28 | ||
29 | typedef void (elevator_init_icq_fn) (struct io_cq *); | ||
30 | typedef void (elevator_exit_icq_fn) (struct io_cq *); | ||
27 | typedef int (elevator_set_req_fn) (struct request_queue *, struct request *, gfp_t); | 31 | typedef int (elevator_set_req_fn) (struct request_queue *, struct request *, gfp_t); |
28 | typedef void (elevator_put_req_fn) (struct request *); | 32 | typedef void (elevator_put_req_fn) (struct request *); |
29 | typedef void (elevator_activate_req_fn) (struct request_queue *, struct request *); | 33 | typedef void (elevator_activate_req_fn) (struct request_queue *, struct request *); |
@@ -56,6 +60,9 @@ struct elevator_ops | |||
56 | elevator_request_list_fn *elevator_former_req_fn; | 60 | elevator_request_list_fn *elevator_former_req_fn; |
57 | elevator_request_list_fn *elevator_latter_req_fn; | 61 | elevator_request_list_fn *elevator_latter_req_fn; |
58 | 62 | ||
63 | elevator_init_icq_fn *elevator_init_icq_fn; /* see iocontext.h */ | ||
64 | elevator_exit_icq_fn *elevator_exit_icq_fn; /* ditto */ | ||
65 | |||
59 | elevator_set_req_fn *elevator_set_req_fn; | 66 | elevator_set_req_fn *elevator_set_req_fn; |
60 | elevator_put_req_fn *elevator_put_req_fn; | 67 | elevator_put_req_fn *elevator_put_req_fn; |
61 | 68 | ||
@@ -63,7 +70,6 @@ struct elevator_ops | |||
63 | 70 | ||
64 | elevator_init_fn *elevator_init_fn; | 71 | elevator_init_fn *elevator_init_fn; |
65 | elevator_exit_fn *elevator_exit_fn; | 72 | elevator_exit_fn *elevator_exit_fn; |
66 | void (*trim)(struct io_context *); | ||
67 | }; | 73 | }; |
68 | 74 | ||
69 | #define ELV_NAME_MAX (16) | 75 | #define ELV_NAME_MAX (16) |
@@ -79,11 +85,20 @@ struct elv_fs_entry { | |||
79 | */ | 85 | */ |
80 | struct elevator_type | 86 | struct elevator_type |
81 | { | 87 | { |
82 | struct list_head list; | 88 | /* managed by elevator core */ |
89 | struct kmem_cache *icq_cache; | ||
90 | |||
91 | /* fields provided by elevator implementation */ | ||
83 | struct elevator_ops ops; | 92 | struct elevator_ops ops; |
93 | size_t icq_size; /* see iocontext.h */ | ||
94 | size_t icq_align; /* ditto */ | ||
84 | struct elv_fs_entry *elevator_attrs; | 95 | struct elv_fs_entry *elevator_attrs; |
85 | char elevator_name[ELV_NAME_MAX]; | 96 | char elevator_name[ELV_NAME_MAX]; |
86 | struct module *elevator_owner; | 97 | struct module *elevator_owner; |
98 | |||
99 | /* managed by elevator core */ | ||
100 | char icq_cache_name[ELV_NAME_MAX + 5]; /* elvname + "_io_cq" */ | ||
101 | struct list_head list; | ||
87 | }; | 102 | }; |
88 | 103 | ||
89 | /* | 104 | /* |
@@ -91,10 +106,9 @@ struct elevator_type | |||
91 | */ | 106 | */ |
92 | struct elevator_queue | 107 | struct elevator_queue |
93 | { | 108 | { |
94 | struct elevator_ops *ops; | 109 | struct elevator_type *type; |
95 | void *elevator_data; | 110 | void *elevator_data; |
96 | struct kobject kobj; | 111 | struct kobject kobj; |
97 | struct elevator_type *elevator_type; | ||
98 | struct mutex sysfs_lock; | 112 | struct mutex sysfs_lock; |
99 | struct hlist_head *hash; | 113 | struct hlist_head *hash; |
100 | unsigned int registered:1; | 114 | unsigned int registered:1; |
@@ -129,7 +143,7 @@ extern void elv_drain_elevator(struct request_queue *); | |||
129 | /* | 143 | /* |
130 | * io scheduler registration | 144 | * io scheduler registration |
131 | */ | 145 | */ |
132 | extern void elv_register(struct elevator_type *); | 146 | extern int elv_register(struct elevator_type *); |
133 | extern void elv_unregister(struct elevator_type *); | 147 | extern void elv_unregister(struct elevator_type *); |
134 | 148 | ||
135 | /* | 149 | /* |
@@ -197,22 +211,5 @@ enum { | |||
197 | INIT_LIST_HEAD(&(rq)->csd.list); \ | 211 | INIT_LIST_HEAD(&(rq)->csd.list); \ |
198 | } while (0) | 212 | } while (0) |
199 | 213 | ||
200 | /* | ||
201 | * io context count accounting | ||
202 | */ | ||
203 | #define elv_ioc_count_mod(name, __val) this_cpu_add(name, __val) | ||
204 | #define elv_ioc_count_inc(name) this_cpu_inc(name) | ||
205 | #define elv_ioc_count_dec(name) this_cpu_dec(name) | ||
206 | |||
207 | #define elv_ioc_count_read(name) \ | ||
208 | ({ \ | ||
209 | unsigned long __val = 0; \ | ||
210 | int __cpu; \ | ||
211 | smp_wmb(); \ | ||
212 | for_each_possible_cpu(__cpu) \ | ||
213 | __val += per_cpu(name, __cpu); \ | ||
214 | __val; \ | ||
215 | }) | ||
216 | |||
217 | #endif /* CONFIG_BLOCK */ | 214 | #endif /* CONFIG_BLOCK */ |
218 | #endif | 215 | #endif |