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; | |
53 | ||
54 | void (*dtor)(struct io_context *); /* destructor */ | |
55 | void (*exit)(struct io_context *); /* called on task exit */ | |
56 | }; | |
57 | ||
58 | /* | |
d38ecf93 JA |
59 | * I/O subsystem state of the associated processes. It is refcounted |
60 | * and kmalloc'ed. These could be shared between processes. | |
fd0928df JA |
61 | */ |
62 | struct io_context { | |
63 | atomic_t refcount; | |
d38ecf93 JA |
64 | atomic_t nr_tasks; |
65 | ||
66 | /* all the fields below are protected by this lock */ | |
67 | spinlock_t lock; | |
fd0928df JA |
68 | |
69 | unsigned short ioprio; | |
70 | unsigned short ioprio_changed; | |
71 | ||
72 | /* | |
73 | * For request batching | |
74 | */ | |
75 | unsigned long last_waited; /* Time last woken after wait for request */ | |
76 | int nr_batch_requests; /* Number of requests left in the batch */ | |
77 | ||
78 | struct as_io_context *aic; | |
4ac845a2 | 79 | struct radix_tree_root radix_root; |
fd0928df JA |
80 | void *ioc_data; |
81 | }; | |
82 | ||
d38ecf93 JA |
83 | static inline struct io_context *ioc_task_link(struct io_context *ioc) |
84 | { | |
85 | /* | |
86 | * if ref count is zero, don't allow sharing (ioc is going away, it's | |
87 | * a race). | |
88 | */ | |
89 | if (ioc && atomic_inc_not_zero(&ioc->refcount)) | |
90 | return ioc; | |
91 | ||
92 | return NULL; | |
93 | } | |
94 | ||
fd0928df | 95 | #endif |