xref: /linux/include/linux/iocontext.h (revision dc86900e0a8f665122de6faadd27fb4c6d2b3e4d)
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>
64ac845a2SJens Axboe 
7fd0928dfSJens Axboe struct cfq_queue;
8383cd721SShaohua Li struct cfq_ttime {
9383cd721SShaohua Li 	unsigned long last_end_request;
10383cd721SShaohua Li 
11383cd721SShaohua Li 	unsigned long ttime_total;
12383cd721SShaohua Li 	unsigned long ttime_samples;
13383cd721SShaohua Li 	unsigned long ttime_mean;
14383cd721SShaohua Li };
15383cd721SShaohua Li 
16*dc86900eSTejun Heo enum {
17*dc86900eSTejun Heo 	CIC_IOPRIO_CHANGED,
18*dc86900eSTejun Heo 	CIC_CGROUP_CHANGED,
19*dc86900eSTejun Heo };
20*dc86900eSTejun Heo 
21fd0928dfSJens Axboe struct cfq_io_context {
22fd0928dfSJens Axboe 	void *key;
23283287a5STejun Heo 	struct request_queue *q;
24fd0928dfSJens Axboe 
25fd0928dfSJens Axboe 	struct cfq_queue *cfqq[2];
26fd0928dfSJens Axboe 
27fd0928dfSJens Axboe 	struct io_context *ioc;
28fd0928dfSJens Axboe 
29383cd721SShaohua Li 	struct cfq_ttime ttime;
30fd0928dfSJens Axboe 
31fd0928dfSJens Axboe 	struct list_head queue_list;
32ffc4e759SJens Axboe 	struct hlist_node cic_list;
33fd0928dfSJens Axboe 
34*dc86900eSTejun Heo 	unsigned long changed;
35*dc86900eSTejun Heo 
36fd0928dfSJens Axboe 	void (*dtor)(struct io_context *); /* destructor */
37fd0928dfSJens Axboe 	void (*exit)(struct io_context *); /* called on task exit */
3834e6bbf2SFabio Checconi 
3934e6bbf2SFabio Checconi 	struct rcu_head rcu_head;
40fd0928dfSJens Axboe };
41fd0928dfSJens Axboe 
42fd0928dfSJens Axboe /*
43d38ecf93SJens Axboe  * I/O subsystem state of the associated processes.  It is refcounted
44d38ecf93SJens Axboe  * and kmalloc'ed. These could be shared between processes.
45fd0928dfSJens Axboe  */
46fd0928dfSJens Axboe struct io_context {
47d9c7d394SNikanth Karthikesan 	atomic_long_t refcount;
48d38ecf93SJens Axboe 	atomic_t nr_tasks;
49d38ecf93SJens Axboe 
50d38ecf93SJens Axboe 	/* all the fields below are protected by this lock */
51d38ecf93SJens Axboe 	spinlock_t lock;
52fd0928dfSJens Axboe 
53fd0928dfSJens Axboe 	unsigned short ioprio;
5431e4c28dSVivek Goyal 
55fd0928dfSJens Axboe 	/*
56fd0928dfSJens Axboe 	 * For request batching
57fd0928dfSJens Axboe 	 */
58fd0928dfSJens Axboe 	int nr_batch_requests;     /* Number of requests left in the batch */
5958c24a61SRichard Kennedy 	unsigned long last_waited; /* Time last woken after wait for request */
60fd0928dfSJens Axboe 
614ac845a2SJens Axboe 	struct radix_tree_root radix_root;
62ffc4e759SJens Axboe 	struct hlist_head cic_list;
634d2deb40SArnd Bergmann 	void __rcu *ioc_data;
64fd0928dfSJens Axboe };
65fd0928dfSJens Axboe 
66d38ecf93SJens Axboe static inline struct io_context *ioc_task_link(struct io_context *ioc)
67d38ecf93SJens Axboe {
68d38ecf93SJens Axboe 	/*
69d38ecf93SJens Axboe 	 * if ref count is zero, don't allow sharing (ioc is going away, it's
70d38ecf93SJens Axboe 	 * a race).
71d38ecf93SJens Axboe 	 */
72d9c7d394SNikanth Karthikesan 	if (ioc && atomic_long_inc_not_zero(&ioc->refcount)) {
73cbb4f264SLi Zefan 		atomic_inc(&ioc->nr_tasks);
74d38ecf93SJens Axboe 		return ioc;
75d237e5c7SJens Axboe 	}
76d38ecf93SJens Axboe 
77d38ecf93SJens Axboe 	return NULL;
78d38ecf93SJens Axboe }
79d38ecf93SJens Axboe 
80b69f2292SLouis Rilling struct task_struct;
81da9cbc87SJens Axboe #ifdef CONFIG_BLOCK
8242ec57a8STejun Heo void put_io_context(struct io_context *ioc);
83b69f2292SLouis Rilling void exit_io_context(struct task_struct *task);
846e736be7STejun Heo struct io_context *get_task_io_context(struct task_struct *task,
856e736be7STejun Heo 				       gfp_t gfp_flags, int node);
86*dc86900eSTejun Heo void ioc_ioprio_changed(struct io_context *ioc, int ioprio);
87*dc86900eSTejun Heo void ioc_cgroup_changed(struct io_context *ioc);
88da9cbc87SJens Axboe #else
89da9cbc87SJens Axboe struct io_context;
9042ec57a8STejun Heo static inline void put_io_context(struct io_context *ioc) { }
9142ec57a8STejun Heo static inline void exit_io_context(struct task_struct *task) { }
92da9cbc87SJens Axboe #endif
93da9cbc87SJens Axboe 
94fd0928dfSJens Axboe #endif
95