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