Lines Matching +full:async +full:- +full:io
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
33 * iogen - a tool for generating file/sds io for a doio process
98 int f_nextoff; /* offset of end of last io operation */
100 int f_lastoffset; /* offset of last io operation */
101 int f_lastlength; /* length of last io operation */
105 * Simple structure for associating strings with values - useful for converting
134 int a_opt = 0; /* async io comp. types supplied */
137 int i_opt = 0; /* iterations - 0 implies infinite */
138 int L_opt = 0; /* listio min-max nstrides & nents */
141 int p_opt = 0; /* output pipe - default is stdout */
142 int r_opt = 0; /* specify raw io multiple instead of */
151 int Iterations; /* # requests to generate (0 --> infinite) */
152 int Time_Mode = 0; /* non-zero if Iterations is in seconds */
153 /* (ie. -i arg was suffixed with 's') */
155 int Mintrans; /* min io transfer size */
156 int Maxtrans; /* max io transfer size */
157 int Rawmult; /* raw/ssd io multiple (from -r) */
163 int Orealtime = 0; /* flag set for -O REALTIME */
164 int Oextsize = 0; /* real-time extent size */
165 int Oreserve = 1; /* flag for -O [no]reserve */
166 int Oallocate = 0; /* flag for -O allocate */
167 int Owrite = 1; /* flag for -O nowrite */
176 /* io syscall has been chosen. */
177 int Naio_Strat_Types = 0; /* # async io completion types */
178 struct strmap *Aio_Strat_List[128]; /* Async io completion types */
181 * Map async io completion modes (-a args) names to values. Macros are
207 {NULL, -1}
219 * Map offset mode (-m args) names to values
226 {NULL, -1}
230 * Map syscall names (-s args) to values - macros are defined in doio.h.
313 {NULL, -1}
317 * Map open flags (-f args) to values
354 {NULL, -1}
363 {"blk-spec", S_IFBLK},
364 {"chr-spec", S_IFCHR},
420 * While iterations (or forever if Iterations == 0) - compute an in main()
421 * io request, and write the structure to the output descriptor in main()
428 (!Time_Mode && Iterations--) || in main()
429 (Time_Mode && (ts.tv_sec - start_time <= Iterations))) { in main()
432 if (form_iorequest(&req) == -1) { in main()
439 if (write(outfd, (char *)&req, sizeof(req)) == -1) in main()
456 fprintf(stream, "Out-pipe: %s\n", in startup_info()
471 fprintf(stream, "Offset-Mode: %s\n", Offset_Mode->m_string); in startup_info()
476 "Mintrans: %-11d (%d blocks)\n", in startup_info()
477 Mintrans, (Mintrans + BSIZE - 1) / BSIZE); in startup_info()
480 "Maxtrans: %-11d (%d blocks)\n", in startup_info()
481 Maxtrans, (Maxtrans + BSIZE - 1) / BSIZE); in startup_info()
488 "O_RAW/O_SSD Multiple: %-11d (%d blocks)\n", in startup_info()
489 Rawmult, (Rawmult + BSIZE - 1) / BSIZE); in startup_info()
493 fprintf(stream, "%s ", Syscall_List[i]->m_string); in startup_info()
498 fprintf(stream, "%s ", Aio_Strat_List[i]->m_string); in startup_info()
504 fprintf(stream, "%s ", Flag_List[i]->m_string); in startup_info()
515 "-----------------------------------------------------------------------------\n"); in startup_info()
519 fprintf(stream, "%-40s %12d %7d %7d %s\n", in startup_info()
536 if (stat(Outpipe, &sbuf) == -1) { in init_output()
538 if (mkfifo(Outpipe, 0666) == -1) { in init_output()
559 if ((outfd = open(Outpipe, O_RDWR)) == -1) { in init_output()
570 * Main io generation function. form_iorequest() selects a system call to
575 * returns -1.
595 sc = Syscall_List[random_range(0, Nsyscalls - 1, 1, NULL)]; in form_iorequest()
596 req->r_type = sc->m_value; in form_iorequest()
599 if (sc->m_value == LISTIO) { in form_iorequest()
605 if (sc->m_flags & SY_WRITE) in form_iorequest()
608 (0, sizeof(Byte_Patterns) - 1, 1, NULL)]; in form_iorequest()
614 * If sds io, simply choose a length (possibly pattern) and return in form_iorequest()
617 if (sc->m_flags & SY_SDS) { in form_iorequest()
618 req->r_data.ssread.r_nbytes = in form_iorequest()
620 if (sc->m_flags & SY_WRITE) in form_iorequest()
621 req->r_data.sswrite.r_pattern = pattern; in form_iorequest()
628 * otherwise, we're doing file io. Choose starting offset, length, in form_iorequest()
632 fptr = &File_List[random_range(0, Nfiles - 1, 1, NULL)]; in form_iorequest()
633 flags = Flag_List[random_range(0, Nflags - 1, 1, NULL)]; in form_iorequest()
636 * Choose offset/length multiple. IO going to a device, or regular in form_iorequest()
637 * IO that is O_RAW or O_SSD must be aligned on the file r_iou. Otherwise in form_iorequest()
641 if (fptr->f_type == S_IFREG && (flags->m_flags & FLG_RAW)) in form_iorequest()
642 mult = fptr->f_riou; in form_iorequest()
644 mult = fptr->f_iou; in form_iorequest()
651 * Choose length first - it must be a multiple of mult in form_iorequest()
654 laststart = fptr->f_lastoffset; in form_iorequest()
655 lastend = fptr->f_lastoffset + fptr->f_lastlength - 1; in form_iorequest()
659 switch (Offset_Mode->m_value) { in form_iorequest()
666 offset += mult - (offset % mult); in form_iorequest()
668 if (minlength > fptr->f_length - offset) in form_iorequest()
671 maxlength = fptr->f_length - offset; in form_iorequest()
680 return -1; in form_iorequest()
692 laststart = fptr->f_length; in form_iorequest()
693 lastend = fptr->f_length; in form_iorequest()
702 return -1; in form_iorequest()
705 offset = laststart - length; in form_iorequest()
708 offset += random_range(1, lastend - laststart, 1, NULL); in form_iorequest()
711 offset -= offset % mult; in form_iorequest()
719 minoffset = laststart - length + 1; in form_iorequest()
724 if (lastend + length > fptr->f_length) { in form_iorequest()
725 maxoffset = fptr->f_length - length; in form_iorequest()
731 maxoffset = fptr->f_length - length; in form_iorequest()
742 return -1; in form_iorequest()
746 fptr->f_lastoffset = offset; in form_iorequest()
747 fptr->f_lastlength = length; in form_iorequest()
750 * Choose an async io completion strategy if necessary in form_iorequest()
752 if (sc->m_flags & SY_ASYNC) in form_iorequest()
753 aio_strat = Aio_Strat_List[random_range(0, Naio_Strat_Types - 1, in form_iorequest()
761 switch (sc->m_value) { in form_iorequest()
764 strcpy(req->r_data.read.r_file, fptr->f_path); in form_iorequest()
765 req->r_data.read.r_oflags = O_RDONLY | flags->m_value; in form_iorequest()
766 req->r_data.read.r_offset = offset; in form_iorequest()
767 req->r_data.read.r_nbytes = length; in form_iorequest()
768 req->r_data.read.r_uflags = in form_iorequest()
769 (flags->m_flags & FLG_RAW) ? F_WORD_ALIGNED : 0; in form_iorequest()
770 req->r_data.read.r_aio_strat = in form_iorequest()
771 (aio_strat == NULL) ? 0 : aio_strat->m_value; in form_iorequest()
772 req->r_data.read.r_nstrides = 1; in form_iorequest()
773 req->r_data.read.r_nent = 1; in form_iorequest()
778 strcpy(req->r_data.write.r_file, fptr->f_path); in form_iorequest()
779 req->r_data.write.r_oflags = O_WRONLY | flags->m_value; in form_iorequest()
780 req->r_data.write.r_offset = offset; in form_iorequest()
781 req->r_data.write.r_nbytes = length; in form_iorequest()
782 req->r_data.write.r_pattern = pattern; in form_iorequest()
783 req->r_data.write.r_uflags = in form_iorequest()
784 (flags->m_flags & FLG_RAW) ? F_WORD_ALIGNED : 0; in form_iorequest()
785 req->r_data.write.r_aio_strat = in form_iorequest()
786 (aio_strat == NULL) ? 0 : aio_strat->m_value; in form_iorequest()
787 req->r_data.write.r_nstrides = 1; in form_iorequest()
788 req->r_data.write.r_nent = 1; in form_iorequest()
809 strcpy(req->r_data.io.r_file, fptr->f_path); in form_iorequest()
810 req->r_data.io.r_oflags = in form_iorequest()
811 ((sc->m_flags & SY_WRITE) ? O_WRONLY : O_RDONLY) | flags-> in form_iorequest()
813 req->r_data.io.r_offset = offset; in form_iorequest()
814 req->r_data.io.r_nbytes = length; in form_iorequest()
815 req->r_data.io.r_pattern = pattern; in form_iorequest()
816 req->r_data.io.r_uflags = in form_iorequest()
817 (flags->m_flags & FLG_RAW) ? F_WORD_ALIGNED : 0; in form_iorequest()
818 req->r_data.io.r_aio_strat = in form_iorequest()
819 (aio_strat == NULL) ? 0 : aio_strat->m_value; in form_iorequest()
820 req->r_data.io.r_nstrides = 1; in form_iorequest()
821 req->r_data.io.r_nent = 1; in form_iorequest()
826 strcpy(req->r_data.io.r_file, fptr->f_path); in form_iorequest()
827 /* a subtle "feature" of mmap: a write-map requires in form_iorequest()
829 req->r_data.io.r_oflags = in form_iorequest()
830 ((sc->m_flags & SY_WRITE) ? O_RDWR : O_RDONLY) | flags-> in form_iorequest()
832 req->r_data.io.r_offset = offset; in form_iorequest()
833 req->r_data.io.r_nbytes = length; in form_iorequest()
834 req->r_data.io.r_pattern = pattern; in form_iorequest()
835 req->r_data.io.r_uflags = in form_iorequest()
836 (flags->m_flags & FLG_RAW) ? F_WORD_ALIGNED : 0; in form_iorequest()
837 req->r_data.io.r_aio_strat = in form_iorequest()
838 (aio_strat == NULL) ? 0 : aio_strat->m_value; in form_iorequest()
839 req->r_data.io.r_nstrides = 1; in form_iorequest()
840 req->r_data.io.r_nent = 1; in form_iorequest()
851 /* multi-strided */ in form_iorequest()
852 strcpy(req->r_data.io.r_file, fptr->f_path); in form_iorequest()
853 req->r_data.io.r_oflags = in form_iorequest()
854 ((sc->m_flags & SY_WRITE) ? O_WRONLY : O_RDONLY) | flags-> in form_iorequest()
856 req->r_data.io.r_offset = offset; in form_iorequest()
857 req->r_data.io.r_uflags = in form_iorequest()
858 (flags->m_flags & FLG_RAW) ? F_WORD_ALIGNED : 0; in form_iorequest()
859 req->r_data.io.r_aio_strat = in form_iorequest()
860 (aio_strat == NULL) ? 0 : aio_strat->m_value; in form_iorequest()
861 req->r_data.io.r_pattern = pattern; in form_iorequest()
863 /* multi-strided request... in form_iorequest()
884 return -1; in form_iorequest()
892 slength -= slength % mult; in form_iorequest()
899 req->r_data.io.r_nbytes = slength; in form_iorequest()
900 if (sc->m_flags & SY_NENT) { in form_iorequest()
901 req->r_data.io.r_nstrides = 1; in form_iorequest()
902 req->r_data.io.r_nent = nstrides; in form_iorequest()
904 req->r_data.io.r_nstrides = nstrides; in form_iorequest()
905 req->r_data.io.r_nent = 1; in form_iorequest()
911 strcpy(req->r_data.listio.r_file, fptr->f_path); in form_iorequest()
912 req->r_data.listio.r_offset = offset; in form_iorequest()
913 req->r_data.listio.r_cmd = cmd; in form_iorequest()
914 req->r_data.listio.r_aio_strat = in form_iorequest()
915 (aio_strat == NULL) ? 0 : aio_strat->m_value; in form_iorequest()
916 req->r_data.listio.r_filestride = 0; in form_iorequest()
917 req->r_data.listio.r_memstride = 0; in form_iorequest()
918 req->r_data.listio.r_opcode = opcode; in form_iorequest()
919 req->r_data.listio.r_nstrides = 1; in form_iorequest()
920 req->r_data.listio.r_nbytes = length; in form_iorequest()
921 req->r_data.listio.r_uflags = in form_iorequest()
922 (flags->m_flags & FLG_RAW) ? F_WORD_ALIGNED : 0; in form_iorequest()
925 req->r_data.listio.r_pattern = pattern; in form_iorequest()
926 req->r_data.listio.r_oflags = O_WRONLY | flags->m_value; in form_iorequest()
928 req->r_data.listio.r_oflags = O_RDONLY | flags->m_value; in form_iorequest()
938 * Get information about a file that iogen uses to choose io length and
944 * Note: buffered and osync io must be iounit aligned
945 * raw and ossd io must be raw iounit aligned
964 if (stat(rec->f_path, &sbuf) == -1) { in get_file_info()
967 TagName, rec->f_path, SYSERR); in get_file_info()
968 return -1; in get_file_info()
971 if ((!S_ISREG(sbuf.st_mode)) || strncmp(rec->f_path, "/dev/", 5) == 0) { in get_file_info()
973 "iogen%s: device level io not supported on cray2\n", in get_file_info()
975 return -1; in get_file_info()
979 rec->f_type = sbuf.st_mode & S_IFMT; in get_file_info()
988 rec->f_iou = 1; in get_file_info()
989 rec->f_length = sbuf.st_size; in get_file_info()
992 * If -r used, take Rawmult as the raw/ssd io multiple. Otherwise in get_file_info()
998 rec->f_riou = Rawmult; in get_file_info()
1002 if (lk_rawdev(rec->f_path, dinfo.path, sizeof(dinfo.path), 0) == in get_file_info()
1003 -1) in get_file_info()
1004 return -1; in get_file_info()
1006 if (lk_devinfo(&dinfo, 0) == -1) { in get_file_info()
1007 /* can't get raw I/O unit -- use stat to fudge it */ in get_file_info()
1008 rec->f_riou = sbuf.st_blksize; in get_file_info()
1010 rec->f_riou = ctob(dinfo.iou); in get_file_info()
1014 rec->f_riou = BSIZE; in get_file_info()
1017 if ((fd = open(rec->f_path, O_RDWR | O_DIRECT, 0)) != -1) { in get_file_info()
1018 if (fcntl(fd, F_DIOINFO, &finfo) != -1) { in get_file_info()
1019 rec->f_riou = finfo.d_miniosz; in get_file_info()
1024 rec->f_path); in get_file_info()
1028 rec->f_riou = BBSIZE; in get_file_info()
1040 strcpy(dinfo.path, rec->f_path); in get_file_info()
1042 if (lk_devinfo(&dinfo, 0) == -1) { in get_file_info()
1045 return -1; in get_file_info()
1048 rec->f_iou = ctob(dinfo.iou); in get_file_info()
1049 rec->f_riou = ctob(dinfo.iou); in get_file_info()
1050 rec->f_length = ctob(dinfo.length); in get_file_info()
1053 rec->f_riou = BBSIZE; in get_file_info()
1054 rec->f_length = BBSIZE; in get_file_info()
1056 rec->f_riou = BSIZE; in get_file_info()
1057 rec->f_length = BSIZE; in get_file_info()
1068 * or -1 if there was a failure.
1087 if (rval == -1) { in create_file()
1094 return -1; in create_file()
1099 "iogen%s: file %s exists, but is not a regular file - cannot modify length\n", in create_file()
1101 return -1; in create_file()
1110 if ((fd = open(path, Oflags, 0666)) == -1) { in create_file()
1114 return -1; in create_file()
1119 * pre-allocate file blocks. in create_file()
1123 if (ftruncate(fd, nbytes) == -1) { in create_file()
1128 return -1; in create_file()
1134 * The file must be designated as Real-Time before any data in create_file()
1142 if (fcntl(fd, F_FSSETXATTR, &xattr) == -1) { in create_file()
1144 "iogen%s: Error %s (%d) setting XFS XATTR->Realtime on file %s\n", in create_file()
1147 return -1; in create_file()
1150 if (fcntl(fd, F_FSGETXATTR, &xattr) == -1) { in create_file()
1155 return -1; in create_file()
1178 /* non-zeroing reservation */ in create_file()
1179 if (fcntl(fd, F_RESVSP, &f) == -1) { in create_file()
1184 return -1; in create_file()
1199 if (fcntl(fd, F_ALLOCSP, &f) == -1) { in create_file()
1204 return -1; in create_file()
1219 0)) != -1) { in create_file()
1220 if (fcntl(fd, F_DIOINFO, &finfo) == -1) { in create_file()
1224 return -1; in create_file()
1233 return -1; in create_file()
1243 nb = nbytes - finfo.d_miniosz; in create_file()
1244 nb = nb - nb % finfo.d_miniosz; in create_file()
1250 if (lseek(fd, nb, SEEK_SET) == -1) { in create_file()
1256 return -1; in create_file()
1262 buf += finfo.d_mem - ((long)buf % finfo.d_mem); in create_file()
1279 return -1; in create_file()
1287 fd, nbytes-1, nbytes); */ in create_file()
1289 if (lseek(fd, nbytes - 1, SEEK_SET) == -1) { in create_file()
1293 nbytes - 1); in create_file()
1295 return -1; in create_file()
1307 nbytes - 1, nbytes); in create_file()
1309 return -1; in create_file()
1330 for (mp = map; mp->m_string != NULL; mp++) in str_to_value()
1331 if (strcmp(mp->m_string, str) == 0) in str_to_value()
1334 return mp->m_value; in str_to_value()
1346 for (mp = map; mp->m_string != NULL; mp++) in str_lookup()
1347 if (strcmp(mp->m_string, str) == 0) in str_lookup()
1350 return ((mp->m_string == NULL) ? NULL : mp); in str_lookup()
1362 for (mp = map; mp->m_string != NULL; mp++) in value_to_string()
1363 if (mp->m_value == val) in value_to_string()
1366 return mp->m_string; in value_to_string()
1400 "iogen%s: Unrecognized option -a on this platform\n", in parse_cmdline()
1434 if (flgs->m_value & O_SSD && !Sds_Avail) { in parse_cmdline()
1436 "iogen%s: Warning - no sds available, ignoring ssd flag\n", in parse_cmdline()
1476 "iogen%s: Illegal -i arg (%s): Must be of the format: number[s]\n", in parse_cmdline()
1489 "iogen%s: Unrecognized option -L on this platform\n", in parse_cmdline()
1494 &errmsg) == -1) { in parse_cmdline()
1513 "iogen%s: Illegal -m arg (%s)\n", in parse_cmdline()
1540 if (Oflags == -1) { in parse_cmdline()
1541 fprintf(stderr, "iogen%s: -O %s error: %s\n", in parse_cmdline()
1548 if (Oflags == -1) { in parse_cmdline()
1549 fprintf(stderr, "iogen%s: -O %s error: %s\n", in parse_cmdline()
1557 * -O realtime:extsize in parse_cmdline()
1567 * -O allocate in parse_cmdline()
1573 * -O [no]reserve in parse_cmdline()
1588 "iogen%s: Error: -O %s error: unrecognized option\n", in parse_cmdline()
1603 if ((Rawmult = bytes_by_prefix(optarg)) == -1 || in parse_cmdline()
1606 "iogen%s: Illegal -r arg (%s). Must be > 0 and multipe of BSIZE (%d)\n", in parse_cmdline()
1625 /* >>> sc->m_flags & FLG_SDS */ in parse_cmdline()
1626 if (sc->m_value != SSREAD in parse_cmdline()
1627 && sc->m_value != SSWRITE) in parse_cmdline()
1639 if ((Mintrans = bytes_by_prefix(optarg)) == -1) { in parse_cmdline()
1641 "iogen%s: Illegal -t arg (%s): Must have the form num[bkm]\n", in parse_cmdline()
1649 if ((Maxtrans = bytes_by_prefix(optarg)) == -1) { in parse_cmdline()
1651 "iogen%s: Illegal -T arg (%s): Must have the form num[bkm]\n", in parse_cmdline()
1693 * Supply default async io completion strategy types. in parse_cmdline()
1697 for (mp = Aio_Strat_Map; mp->m_string != NULL; mp++) { in parse_cmdline()
1736 if (Fileio && (argc - optind < 1)) { in parse_cmdline()
1743 * Supply default file io flags - defaut is 'buffered,raw,sync,ldraw'. in parse_cmdline()
1773 * Initialize File_List[] - only necessary if doing file io. First in parse_cmdline()
1777 File_List = malloc((argc - optind) * sizeof(struct file_info)); in parse_cmdline()
1782 TagName, argc - optind); in parse_cmdline()
1787 (argc - optind) * sizeof(struct file_info)); in parse_cmdline()
1791 len = -1; in parse_cmdline()
1801 if ((len = bytes_by_prefix(argv[optind])) == -1) { in parse_cmdline()
1812 "iogen%s: Max fname length is %d chars - ignoring file %s\n", in parse_cmdline()
1833 if (access(file, R_OK | W_OK) == -1) { in parse_cmdline()
1842 * get per-file information in parse_cmdline()
1848 strcpy(fptr->f_path, file); in parse_cmdline()
1851 (fptr->f_path, in parse_cmdline()
1852 sizeof(fptr->f_path) - 1) == NULL) in parse_cmdline()
1855 strcat(fptr->f_path, "/"); in parse_cmdline()
1856 strcat(fptr->f_path, file); in parse_cmdline()
1859 if (get_file_info(fptr) == -1) { in parse_cmdline()
1870 if (fptr->f_length < Mintrans) { in parse_cmdline()
1873 TagName, fptr->f_path); in parse_cmdline()
1876 fptr->f_length, Mintrans); in parse_cmdline()
1886 if (fptr->f_length < Maxtrans) { in parse_cmdline()
1889 TagName, fptr->f_path); in parse_cmdline()
1892 fptr->f_length, Maxtrans); in parse_cmdline()
1897 if (fptr->f_length > 0) { in parse_cmdline()
1898 switch (Offset_Mode->m_value) { in parse_cmdline()
1900 fptr->f_lastoffset = 0; in parse_cmdline()
1901 fptr->f_lastlength = 0; in parse_cmdline()
1905 fptr->f_lastoffset = in parse_cmdline()
1906 fptr->f_length; in parse_cmdline()
1907 fptr->f_lastlength = 0; in parse_cmdline()
1911 fptr->f_lastoffset = in parse_cmdline()
1912 fptr->f_length / 2; in parse_cmdline()
1913 fptr->f_lastlength = 0; in parse_cmdline()
1941 "\t-a aio_type,... Async io completion types to choose. Supported types\n"); in help()
1956 fprintf(stream, "\t-a (Not used on Linux).\n"); in help()
1959 "\t-f flag,... Flags to use for file IO. Supported flags are\n"); in help()
1981 fprintf(stream, "\t-h This help.\n"); in help()
1983 "\t-i iterations[s] # of requests to generate. 0 means causes iogen\n"); in help()
1992 "\t-L min:max listio nstrides / nrequests range\n"); in help()
1994 fprintf(stream, "\t-L (Not used on Linux).\n"); in help()
1997 "\t-m offset-mode The mode by which iogen chooses the offset for\n"); in help()
2004 fprintf(stream, "\t-N tagname Tag name, for Monster.\n"); in help()
2006 "\t-o Form overlapping consecutive requests.\n"); in help()
2007 fprintf(stream, "\t-O Open flags for creating files\n"); in help()
2014 "\t realtime:extsize - put file on real-time volume\n"); in help()
2016 "\t allocate - allocate space with F_ALLOCSP\n"); in help()
2018 "\t reserve - reserve space with F_RESVSP (default)\n"); in help()
2020 "\t noreserve - do not reserve with F_RESVSP\n"); in help()
2022 "\t direct - use O_DIRECT I/O to write to the file\n"); in help()
2028 "\t-p Output pipe. Default is stdout.\n"); in help()
2030 "\t-q Quiet mode. Normally iogen spits out info\n"); in help()
2034 "\t-s syscall,... Syscalls to do. Supported syscalls are\n"); in help()
2060 fprintf(stream, "\t-t mintrans Min transfer length\n"); in help()
2061 fprintf(stream, "\t-T maxtrans Max transfer length\n"); in help()
2064 "\t[len:]file,... Test files to do IO against (note ssread/sswrite\n"); in help()
2076 "\t from the flags (-f) and ssread,ssrite from the syscalls (-s)\n"); in help()
2080 "\tform [0-9]+[bkm]. The optional trailing b, k, or m multiplies\n"); in help()
2090 * Obvious - usage clause
2096 …-hoq] [-a aio_type,...] [-f flag[,flag...]] [-i iterations] [-p outpipe] [-m offset-mode] [-s sysc… in usage()