block: add blk-iopoll, a NAPI like approach for block devices
[linux-2.6.git] / include / linux / blk-iopoll.h
1 #ifndef BLK_IOPOLL_H
2 #define BLK_IOPOLL_H
3
4 struct blk_iopoll;
5 typedef int (blk_iopoll_fn)(struct blk_iopoll *, int);
6
7 struct blk_iopoll {
8         struct list_head list;
9         unsigned long state;
10         unsigned long data;
11         int weight;
12         int max;
13         blk_iopoll_fn *poll;
14 };
15
16 enum {
17         IOPOLL_F_SCHED          = 0,
18         IOPOLL_F_DISABLE        = 1,
19 };
20
21 static inline int blk_iopoll_sched_prep(struct blk_iopoll *iop)
22 {
23         return !test_bit(IOPOLL_F_DISABLE, &iop->state) &&
24                 !test_and_set_bit(IOPOLL_F_SCHED, &iop->state);
25 }
26
27 static inline int blk_iopoll_disable_pending(struct blk_iopoll *iop)
28 {
29         return test_bit(IOPOLL_F_DISABLE, &iop->state);
30 }
31
32 extern void blk_iopoll_sched(struct blk_iopoll *);
33 extern void blk_iopoll_init(struct blk_iopoll *, int, blk_iopoll_fn *);
34 extern void blk_iopoll_complete(struct blk_iopoll *);
35 extern void __blk_iopoll_complete(struct blk_iopoll *);
36 extern void blk_iopoll_enable(struct blk_iopoll *);
37 extern void blk_iopoll_disable(struct blk_iopoll *);
38
39 extern int blk_iopoll_enabled;
40
41 #endif