#ifndef IOCONTEXT_H #define IOCONTEXT_H /* * This is the per-process anticipatory I/O scheduler state. */ struct as_io_context { spinlock_t lock; void (*dtor)(struct as_io_context *aic); /* destructor */ void (*exit)(struct as_io_context *aic); /* called on task exit */ unsigned long state; atomic_t nr_queued; /* queued reads & sync writes */ atomic_t nr_dispatched; /* number of requests gone to the drivers */ /* IO History tracking */ /* Thinktime */ unsigned long last_end_request; unsigned long ttime_total; unsigned long ttime_samples; unsigned long ttime_mean; /* Layout pattern */ unsigned int seek_samples; sector_t last_request_pos; u64 seek_total; sector_t seek_mean; }; struct cfq_queue; struct cfq_io_context { struct rb_node rb_node; void *key; struct cfq_queue *cfqq[2]; struct io_context *ioc; unsigned long last_end_request; sector_t last_request_pos; unsigned long ttime_total; unsigned long ttime_samples; unsigned long ttime_mean; unsigned int seek_samples; u64 seek_total; sector_t seek_mean; struct list_head queue_list; void (*dtor)(struct io_context *); /* destructor */ void (*exit)(struct io_context *); /* called on task exit */ }; /* * This is the per-process I/O subsystem state. It is refcounted and * kmalloc'ed. Currently all fields are modified in process io context * (apart from the atomic refcount), so require no locking. */ struct io_context { atomic_t refcount; struct task_struct *task; unsigned short ioprio; unsigned short ioprio_changed; /* * For request batching */ unsigned long last_waited; /* Time last woken after wait for request */ int nr_batch_requests; /* Number of requests left in the batch */ struct as_io_context *aic; struct rb_root cic_root; void *ioc_data; }; #endif