diff options
Diffstat (limited to 'include/linux/elevator.h')
-rw-r--r-- | include/linux/elevator.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/include/linux/elevator.h b/include/linux/elevator.h index cc81645a3e18..9c5a04f6114c 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _LINUX_ELEVATOR_H | 1 | #ifndef _LINUX_ELEVATOR_H |
2 | #define _LINUX_ELEVATOR_H | 2 | #define _LINUX_ELEVATOR_H |
3 | 3 | ||
4 | #include <linux/percpu.h> | ||
5 | |||
4 | typedef int (elevator_merge_fn) (request_queue_t *, struct request **, | 6 | typedef int (elevator_merge_fn) (request_queue_t *, struct request **, |
5 | struct bio *); | 7 | struct bio *); |
6 | 8 | ||
@@ -178,4 +180,27 @@ enum { | |||
178 | INIT_LIST_HEAD(&(rq)->donelist); \ | 180 | INIT_LIST_HEAD(&(rq)->donelist); \ |
179 | } while (0) | 181 | } while (0) |
180 | 182 | ||
183 | /* | ||
184 | * io context count accounting | ||
185 | */ | ||
186 | #define elv_ioc_count_mod(name, __val) \ | ||
187 | do { \ | ||
188 | preempt_disable(); \ | ||
189 | __get_cpu_var(name) += (__val); \ | ||
190 | preempt_enable(); \ | ||
191 | } while (0) | ||
192 | |||
193 | #define elv_ioc_count_inc(name) elv_ioc_count_mod(name, 1) | ||
194 | #define elv_ioc_count_dec(name) elv_ioc_count_mod(name, -1) | ||
195 | |||
196 | #define elv_ioc_count_read(name) \ | ||
197 | ({ \ | ||
198 | unsigned long __val = 0; \ | ||
199 | int __cpu; \ | ||
200 | smp_wmb(); \ | ||
201 | for_each_possible_cpu(__cpu) \ | ||
202 | __val += per_cpu(name, __cpu); \ | ||
203 | __val; \ | ||
204 | }) | ||
205 | |||
181 | #endif | 206 | #endif |