···39394040 if (atomic_long_dec_and_test(&ioc->refcount)) {4141 rcu_read_lock();4242- if (ioc->aic && ioc->aic->dtor)4343- ioc->aic->dtor(ioc->aic);4442 cfq_dtor(ioc);4543 rcu_read_unlock();4644···7476 task_unlock(task);75777678 if (atomic_dec_and_test(&ioc->nr_tasks)) {7777- if (ioc->aic && ioc->aic->exit)7878- ioc->aic->exit(ioc->aic);7979 cfq_exit(ioc);80808181 }···9397 ret->ioprio = 0;9498 ret->last_waited = jiffies; /* doesn't matter... */9599 ret->nr_batch_requests = 0; /* because this is 0 */9696- ret->aic = NULL;97100 INIT_RADIX_TREE(&ret->radix_root, GFP_ATOMIC | __GFP_HIGH);98101 INIT_HLIST_HEAD(&ret->cic_list);99102 ret->ioc_data = NULL;
-27
include/linux/iocontext.h
···44#include <linux/radix-tree.h>55#include <linux/rcupdate.h>6677-/*88- * This is the per-process anticipatory I/O scheduler state.99- */1010-struct as_io_context {1111- spinlock_t lock;1212-1313- void (*dtor)(struct as_io_context *aic); /* destructor */1414- void (*exit)(struct as_io_context *aic); /* called on task exit */1515-1616- unsigned long state;1717- atomic_t nr_queued; /* queued reads & sync writes */1818- atomic_t nr_dispatched; /* number of requests gone to the drivers */1919-2020- /* IO History tracking */2121- /* Thinktime */2222- unsigned long last_end_request;2323- unsigned long ttime_total;2424- unsigned long ttime_samples;2525- unsigned long ttime_mean;2626- /* Layout pattern */2727- unsigned int seek_samples;2828- sector_t last_request_pos;2929- u64 seek_total;3030- sector_t seek_mean;3131-};3232-337struct cfq_queue;348struct cfq_io_context {359 void *key;···5278 unsigned long last_waited; /* Time last woken after wait for request */5379 int nr_batch_requests; /* Number of requests left in the batch */54805555- struct as_io_context *aic;5681 struct radix_tree_root radix_root;5782 struct hlist_head cic_list;5883 void *ioc_data;