xref: /linux/include/linux/iocontext.h (revision b2efa05265d62bc29f3a64400fad4b44340eedb8)
1fd0928dfSJens Axboe #ifndef IOCONTEXT_H
2fd0928dfSJens Axboe #define IOCONTEXT_H
3fd0928dfSJens Axboe 
44ac845a2SJens Axboe #include <linux/radix-tree.h>
534e6bbf2SFabio Checconi #include <linux/rcupdate.h>
6*b2efa052STejun Heo #include <linux/workqueue.h>
74ac845a2SJens Axboe 
8fd0928dfSJens Axboe struct cfq_queue;
9383cd721SShaohua Li struct cfq_ttime {
10383cd721SShaohua Li 	unsigned long last_end_request;
11383cd721SShaohua Li 
12383cd721SShaohua Li 	unsigned long ttime_total;
13383cd721SShaohua Li 	unsigned long ttime_samples;
14383cd721SShaohua Li 	unsigned long ttime_mean;
15383cd721SShaohua Li };
16383cd721SShaohua Li 
17dc86900eSTejun Heo enum {
18dc86900eSTejun Heo 	CIC_IOPRIO_CHANGED,
19dc86900eSTejun Heo 	CIC_CGROUP_CHANGED,
20dc86900eSTejun Heo };
21dc86900eSTejun Heo 
22fd0928dfSJens Axboe struct cfq_io_context {
23fd0928dfSJens Axboe 	void *key;
24283287a5STejun Heo 	struct request_queue *q;
25fd0928dfSJens Axboe 
26fd0928dfSJens Axboe 	struct cfq_queue *cfqq[2];
27fd0928dfSJens Axboe 
28fd0928dfSJens Axboe 	struct io_context *ioc;
29fd0928dfSJens Axboe 
30383cd721SShaohua Li 	struct cfq_ttime ttime;
31fd0928dfSJens Axboe 
32fd0928dfSJens Axboe 	struct list_head queue_list;
33ffc4e759SJens Axboe 	struct hlist_node cic_list;
34fd0928dfSJens Axboe 
35dc86900eSTejun Heo 	unsigned long changed;
36dc86900eSTejun Heo 
37*b2efa052STejun Heo 	void (*exit)(struct cfq_io_context *);
38*b2efa052STejun Heo 	void (*release)(struct cfq_io_context *);
3934e6bbf2SFabio Checconi 
4034e6bbf2SFabio Checconi 	struct rcu_head rcu_head;
41fd0928dfSJens Axboe };
42fd0928dfSJens Axboe 
43fd0928dfSJens Axboe /*
44d38ecf93SJens Axboe  * I/O subsystem state of the associated processes.  It is refcounted
45d38ecf93SJens Axboe  * and kmalloc'ed. These could be shared between processes.
46fd0928dfSJens Axboe  */
47fd0928dfSJens Axboe struct io_context {
48d9c7d394SNikanth Karthikesan 	atomic_long_t refcount;
49d38ecf93SJens Axboe 	atomic_t nr_tasks;
50d38ecf93SJens Axboe 
51d38ecf93SJens Axboe 	/* all the fields below are protected by this lock */
52d38ecf93SJens Axboe 	spinlock_t lock;
53fd0928dfSJens Axboe 
54fd0928dfSJens Axboe 	unsigned short ioprio;
5531e4c28dSVivek Goyal 
56fd0928dfSJens Axboe 	/*
57fd0928dfSJens Axboe 	 * For request batching
58fd0928dfSJens Axboe 	 */
59fd0928dfSJens Axboe 	int nr_batch_requests;     /* Number of requests left in the batch */
6058c24a61SRichard Kennedy 	unsigned long last_waited; /* Time last woken after wait for request */
61fd0928dfSJens Axboe 
624ac845a2SJens Axboe 	struct radix_tree_root radix_root;
63ffc4e759SJens Axboe 	struct hlist_head cic_list;
644d2deb40SArnd Bergmann 	void __rcu *ioc_data;
65*b2efa052STejun Heo 
66*b2efa052STejun Heo 	struct work_struct release_work;
67fd0928dfSJens Axboe };
68fd0928dfSJens Axboe 
69d38ecf93SJens Axboe static inline struct io_context *ioc_task_link(struct io_context *ioc)
70d38ecf93SJens Axboe {
71d38ecf93SJens Axboe 	/*
72d38ecf93SJens Axboe 	 * if ref count is zero, don't allow sharing (ioc is going away, it's
73d38ecf93SJens Axboe 	 * a race).
74d38ecf93SJens Axboe 	 */
75d9c7d394SNikanth Karthikesan 	if (ioc && atomic_long_inc_not_zero(&ioc->refcount)) {
76cbb4f264SLi Zefan 		atomic_inc(&ioc->nr_tasks);
77d38ecf93SJens Axboe 		return ioc;
78d237e5c7SJens Axboe 	}
79d38ecf93SJens Axboe 
80d38ecf93SJens Axboe 	return NULL;
81d38ecf93SJens Axboe }
82d38ecf93SJens Axboe 
83b69f2292SLouis Rilling struct task_struct;
84da9cbc87SJens Axboe #ifdef CONFIG_BLOCK
85*b2efa052STejun Heo void put_io_context(struct io_context *ioc, struct request_queue *locked_q);
86b69f2292SLouis Rilling void exit_io_context(struct task_struct *task);
876e736be7STejun Heo struct io_context *get_task_io_context(struct task_struct *task,
886e736be7STejun Heo 				       gfp_t gfp_flags, int node);
89dc86900eSTejun Heo void ioc_ioprio_changed(struct io_context *ioc, int ioprio);
90dc86900eSTejun Heo void ioc_cgroup_changed(struct io_context *ioc);
91da9cbc87SJens Axboe #else
92da9cbc87SJens Axboe struct io_context;
93*b2efa052STejun Heo static inline void put_io_context(struct io_context *ioc,
94*b2efa052STejun Heo 				  struct request_queue *locked_q) { }
9542ec57a8STejun Heo static inline void exit_io_context(struct task_struct *task) { }
96da9cbc87SJens Axboe #endif
97da9cbc87SJens Axboe 
98fd0928dfSJens Axboe #endif
99