// (c) 2010 Thomas Schoebel-Theuer / 1&1 Internet AG #ifndef MARS_AIO_H #define MARS_AIO_H #include #include #define AIO_SUBMIT_MAX_LATENCY 1000 // 1 ms #define AIO_IO_R_MAX_LATENCY 50000 // 50 ms #define AIO_IO_W_MAX_LATENCY 150000 // 150 ms #define AIO_SYNC_MAX_LATENCY 150000 // 150 ms extern struct threshold aio_submit_threshold; extern struct threshold aio_io_threshold[2]; extern struct threshold aio_sync_threshold; //#define USE_CLEVER_SYNC // TODO: NYI (should result in better write performance) #ifdef USE_CLEVER_SYNC #include "lib_pairing_heap.h" _PAIRING_HEAP_TYPEDEF(sync,); struct q_sync { struct pairing_heap_sync *heap[MARS_PRIO_NR]; }; #endif struct aio_mref_aspect { GENERIC_ASPECT(mref); #ifdef USE_CLEVER_SYNC struct pairing_heap_sync heap_head; #endif struct list_head io_head; unsigned long long enqueue_stamp; long long start_jiffies; int resubmit; int alloc_len; bool do_dealloc; }; struct aio_brick { MARS_BRICK(aio); // parameters int readahead; int linear_cache_size; // in MB int linear_cache_rounds; bool o_direct; bool o_fdsync; bool wait_during_fdsync; }; struct aio_input { MARS_INPUT(aio); }; struct aio_threadinfo { struct list_head mref_list[MARS_PRIO_NR]; struct aio_output *output; struct task_struct *thread; wait_queue_head_t event; wait_queue_head_t terminate_event; spinlock_t lock; int queued[MARS_PRIO_NR]; int queued_sum; atomic_t total_enqueue_count; bool terminated; }; struct aio_output { MARS_OUTPUT(aio); // private struct file *filp; int fd; // FIXME: remove this! int rounds; loff_t min_pos; struct aio_threadinfo tinfo[3]; aio_context_t ctxp; wait_queue_head_t fdsync_event; bool fdsync_active; // statistics int index; atomic_t total_read_count; atomic_t total_write_count; atomic_t total_alloc_count; atomic_t total_delay_count; atomic_t total_msleep_count; atomic_t total_fdsync_count; atomic_t total_fdsync_wait_count; atomic_t total_mapfree_count; atomic_t read_count; atomic_t write_count; atomic_t alloc_count; }; MARS_TYPES(aio); #endif