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