Commit | Line | Data |
---|---|---|
fd0928df JA |
1 | #ifndef IOCONTEXT_H |
2 | #define IOCONTEXT_H | |
3 | ||
4ac845a2 JA |
4 | #include <linux/radix-tree.h> |
5 | ||
fd0928df JA |
6 | /* |
7 | * This is the per-process anticipatory I/O scheduler state. | |
8 | */ | |
9 | struct as_io_context { | |
10 | spinlock_t lock; | |
11 | ||
12 | void (*dtor)(struct as_io_context *aic); /* destructor */ | |
13 | void (*exit)(struct as_io_context *aic); /* called on task exit */ | |
14 | ||
15 | unsigned long state; | |
16 | atomic_t nr_queued; /* queued reads & sync writes */ | |
17 | atomic_t nr_dispatched; /* number of requests gone to the drivers */ | |
18 | ||
19 | /* IO History tracking */ | |
20 | /* Thinktime */ | |
21 | unsigned long last_end_request; | |
22 | unsigned long ttime_total; | |
23 | unsigned long ttime_samples; | |
24 | unsigned long ttime_mean; | |
25 | /* Layout pattern */ | |
26 | unsigned int seek_samples; | |
27 | sector_t last_request_pos; | |
28 | u64 seek_total; | |
29 | sector_t seek_mean; | |
30 | }; | |
31 | ||
32 | struct cfq_queue; | |
33 | struct cfq_io_context { | |
fd0928df | 34 | void *key; |
4ac845a2 | 35 | unsigned long dead_key; |
fd0928df JA |
36 | |
37 | struct cfq_queue *cfqq[2]; | |
38 | ||
39 | struct io_context *ioc; | |
40 | ||
41 | unsigned long last_end_request; | |
42 | sector_t last_request_pos; | |
43 | ||
44 | unsigned long ttime_total; | |
45 | unsigned long ttime_samples; | |
46 | unsigned long ttime_mean; | |
47 | ||
48 | unsigned int seek_samples; | |
49 | u64 seek_total; | |
50 | sector_t seek_mean; | |
51 | ||
52 | struct list_head queue_list; | |
ffc4e759 | 53 | struct hlist_node cic_list; |
fd0928df JA |
54 | |
55 | void (*dtor)(struct io_context *); /* destructor */ | |
56 | void (*exit)(struct io_context *); /* called on task exit */ | |
57 | }; | |
58 | ||
59 | /* | |
d38ecf93 JA |
60 | * I/O subsystem state of the associated processes. It is refcounted |
61 | * and kmalloc'ed. These could be shared between processes. | |
fd0928df JA |
62 | */ |
63 | struct io_context { | |
64 | atomic_t refcount; | |
d38ecf93 JA |
65 | atomic_t nr_tasks; |
66 | ||
67 | /* all the fields below are protected by this lock */ | |
68 | spinlock_t lock; | |
fd0928df JA |
69 | |
70 | unsigned short ioprio; | |
71 | unsigned short ioprio_changed; | |
72 | ||
73 | /* | |
74 | * For request batching | |
75 | */ | |
76 | unsigned long last_waited; /* Time last woken after wait for request */ | |
77 | int nr_batch_requests; /* Number of requests left in the batch */ | |
78 | ||
79 | struct as_io_context *aic; | |
4ac845a2 | 80 | struct radix_tree_root radix_root; |
ffc4e759 | 81 | struct hlist_head cic_list; |
fd0928df JA |
82 | void *ioc_data; |
83 | }; | |
84 | ||
d38ecf93 JA |
85 | static inline struct io_context *ioc_task_link(struct io_context *ioc) |
86 | { | |
87 | /* | |
88 | * if ref count is zero, don't allow sharing (ioc is going away, it's | |
89 | * a race). | |
90 | */ | |
91 | if (ioc && atomic_inc_not_zero(&ioc->refcount)) | |
92 | return ioc; | |
93 | ||
94 | return NULL; | |
95 | } | |
96 | ||
fd0928df | 97 | #endif |