1*716fd348SMartin Matuska /* 2*716fd348SMartin Matuska * CDDL HEADER START 3*716fd348SMartin Matuska * 4*716fd348SMartin Matuska * The contents of this file are subject to the terms of the 5*716fd348SMartin Matuska * Common Development and Distribution License (the "License"). 6*716fd348SMartin Matuska * You may not use this file except in compliance with the License. 7*716fd348SMartin Matuska * 8*716fd348SMartin Matuska * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*716fd348SMartin Matuska * or http://www.opensolaris.org/os/licensing. 10*716fd348SMartin Matuska * See the License for the specific language governing permissions 11*716fd348SMartin Matuska * and limitations under the License. 12*716fd348SMartin Matuska * 13*716fd348SMartin Matuska * When distributing Covered Code, include this CDDL HEADER in each 14*716fd348SMartin Matuska * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*716fd348SMartin Matuska * If applicable, add the following below this CDDL HEADER, with the 16*716fd348SMartin Matuska * fields enclosed by brackets "[]" replaced with your own identifying 17*716fd348SMartin Matuska * information: Portions Copyright [yyyy] [name of copyright owner] 18*716fd348SMartin Matuska * 19*716fd348SMartin Matuska * CDDL HEADER END 20*716fd348SMartin Matuska */ 21*716fd348SMartin Matuska 22*716fd348SMartin Matuska /* 23*716fd348SMartin Matuska * Copyright 2018 Canonical. All rights reserved. 24*716fd348SMartin Matuska */ 25*716fd348SMartin Matuska 26*716fd348SMartin Matuska #include <stdio.h> 27*716fd348SMartin Matuska #include <stdlib.h> 28*716fd348SMartin Matuska #include <unistd.h> 29*716fd348SMartin Matuska #include <fcntl.h> 30*716fd348SMartin Matuska #include <sys/mman.h> 31*716fd348SMartin Matuska #include <sys/types.h> 32*716fd348SMartin Matuska #include <sys/stat.h> 33*716fd348SMartin Matuska #include <libaio.h> 34*716fd348SMartin Matuska #include <err.h> 35*716fd348SMartin Matuska 36*716fd348SMartin Matuska io_context_t io_ctx; 37*716fd348SMartin Matuska 38*716fd348SMartin Matuska static void 39*716fd348SMartin Matuska do_sync_io(struct iocb *iocb) 40*716fd348SMartin Matuska { 41*716fd348SMartin Matuska struct io_event event; 42*716fd348SMartin Matuska struct iocb *iocbs[] = { iocb }; 43*716fd348SMartin Matuska struct timespec ts = { 30, 0 }; 44*716fd348SMartin Matuska 45*716fd348SMartin Matuska if (io_submit(io_ctx, 1, iocbs) != 1) 46*716fd348SMartin Matuska err(1, "io_submit failed"); 47*716fd348SMartin Matuska 48*716fd348SMartin Matuska if (io_getevents(io_ctx, 0, 1, &event, &ts) != 1) 49*716fd348SMartin Matuska err(1, "io_getevents failed"); 50*716fd348SMartin Matuska } 51*716fd348SMartin Matuska 52*716fd348SMartin Matuska int 53*716fd348SMartin Matuska main(int argc, char **argv) 54*716fd348SMartin Matuska { 55*716fd348SMartin Matuska (void) argc; 56*716fd348SMartin Matuska char *buf; 57*716fd348SMartin Matuska int page_size = getpagesize(); 58*716fd348SMartin Matuska int buf_size = strtol(argv[2], NULL, 0); 59*716fd348SMartin Matuska int rwfd; 60*716fd348SMartin Matuska struct iocb iocb; 61*716fd348SMartin Matuska 62*716fd348SMartin Matuska if (io_queue_init(1024, &io_ctx)) 63*716fd348SMartin Matuska err(1, "io_queue_init failed"); 64*716fd348SMartin Matuska 65*716fd348SMartin Matuska rwfd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); 66*716fd348SMartin Matuska if (rwfd < 0) 67*716fd348SMartin Matuska err(1, "open failed"); 68*716fd348SMartin Matuska 69*716fd348SMartin Matuska if (ftruncate(rwfd, buf_size) < 0) 70*716fd348SMartin Matuska err(1, "ftruncate failed"); 71*716fd348SMartin Matuska 72*716fd348SMartin Matuska buf = mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, rwfd, 0); 73*716fd348SMartin Matuska if (buf == MAP_FAILED) 74*716fd348SMartin Matuska err(1, "mmap failed"); 75*716fd348SMartin Matuska 76*716fd348SMartin Matuska (void) io_prep_pwrite(&iocb, rwfd, buf, buf_size, 0); 77*716fd348SMartin Matuska do_sync_io(&iocb); 78*716fd348SMartin Matuska 79*716fd348SMartin Matuska (void) io_prep_pread(&iocb, rwfd, buf, buf_size, 0); 80*716fd348SMartin Matuska do_sync_io(&iocb); 81*716fd348SMartin Matuska 82*716fd348SMartin Matuska if (close(rwfd)) 83*716fd348SMartin Matuska err(1, "close failed"); 84*716fd348SMartin Matuska 85*716fd348SMartin Matuska if (io_queue_release(io_ctx) != 0) 86*716fd348SMartin Matuska err(1, "io_queue_release failed"); 87*716fd348SMartin Matuska 88*716fd348SMartin Matuska return (0); 89*716fd348SMartin Matuska } 90