//#define _GNU_SOURCE #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int err, fd; char *p; unsigned long long int total_read_bytes= 0; struct timespec timeout = {1, 100}; io_context_t libaio; struct iocb **pcb, *laiocb; fd = open(argv[1], O_RDONLY | O_DIRECT); assert(fd >= 0); int nr_requests= atoi(argv[2]); int io_unit_kb= atoi(argv[3]); struct io_event events[nr_requests]; unsigned long long int BLOCK = io_unit_kb * 1024; pcb= (struct iocb**)malloc(nr_requests*sizeof(struct iocb*)); laiocb= (struct iocb*)malloc(nr_requests*sizeof(struct iocb)); err = io_queue_init(nr_requests, &libaio); assert(!err); err = posix_memalign((void **)&p, BLOCK, BLOCK); assert(!err); while(1) { for(int i=0; i< nr_requests; i++) { pcb[i] = &laiocb[i]; io_prep_pread(&laiocb[i], fd, p, BLOCK, total_read_bytes+ i * BLOCK); io_set_callback(&laiocb[i], (io_callback_t)(i+1)); } err = io_submit(libaio, nr_requests, pcb); assert(err >= 0); io_getevents(libaio, nr_requests, nr_requests, events, &timeout); total_read_bytes+= nr_requests * BLOCK; } }