aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/blk-iopoll.h
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2009-08-05 03:07:21 -0400
committerJens Axboe <jens.axboe@oracle.com>2009-09-11 08:33:31 -0400
commit5e605b64a183a6c0e84cdb99a6f8acb1f8200437 (patch)
tree1133a343bea602cb1bd8ee744c5997ce42a69b54 /include/linux/blk-iopoll.h
parentfb1e75389bd06fd5987e9cda1b4e0305c782f854 (diff)
block: add blk-iopoll, a NAPI like approach for block devices
This borrows some code from NAPI and implements a polled completion mode for block devices. The idea is the same as NAPI - instead of doing the command completion when the irq occurs, schedule a dedicated softirq in the hopes that we will complete more IO when the iopoll handler is invoked. Devices have a budget of commands assigned, and will stay in polled mode as long as they continue to consume their budget from the iopoll softirq handler. If they do not, the device is set back to interrupt completion mode. This patch holds the core bits for blk-iopoll, device driver support sold separately. Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'include/linux/blk-iopoll.h')
-rw-r--r--include/linux/blk-iopoll.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/include/linux/blk-iopoll.h b/include/linux/blk-iopoll.h
new file mode 100644
index 000000000000..b2e1739a2e7b
--- /dev/null
+++ b/include/linux/blk-iopoll.h
@@ -0,0 +1,41 @@
1#ifndef BLK_IOPOLL_H
2#define BLK_IOPOLL_H
3
4struct blk_iopoll;
5typedef int (blk_iopoll_fn)(struct blk_iopoll *, int);
6
7struct 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
16enum {
17 IOPOLL_F_SCHED = 0,
18 IOPOLL_F_DISABLE = 1,
19};
20
21static 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
27static inline int blk_iopoll_disable_pending(struct blk_iopoll *iop)
28{
29 return test_bit(IOPOLL_F_DISABLE, &iop->state);
30}
31
32extern void blk_iopoll_sched(struct blk_iopoll *);
33extern void blk_iopoll_init(struct blk_iopoll *, int, blk_iopoll_fn *);
34extern void blk_iopoll_complete(struct blk_iopoll *);
35extern void __blk_iopoll_complete(struct blk_iopoll *);
36extern void blk_iopoll_enable(struct blk_iopoll *);
37extern void blk_iopoll_disable(struct blk_iopoll *);
38
39extern int blk_iopoll_enabled;
40
41#endif