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