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