diff --git a/papi-no-iozone.patch b/papi-no-iozone.patch new file mode 100644 index 0000000..3dd8e1e --- /dev/null +++ b/papi-no-iozone.patch @@ -0,0 +1,34628 @@ +From 08608fb6887b53e3bbd71dde8eeaf8f5f2ad6e29 Mon Sep 17 00:00:00 2001 +From: William Cohen +Date: Mon, 30 Nov 2020 12:19:54 -0500 +Subject: [PATCH 1/2] Remove bundled iozone due to incompatible license. + +A review of the PAPI sources found some iozone code bundled in papi +(rhbz1901077 - papi bundles non-free iozone code ). The upstream +license for iozone does not give permission to modify the source. +There are some minor changes in the PAPI version of the iozone files. +--- + src/components/appio/tests/Makefile | 10 +- + src/components/appio/tests/iozone/Changes.txt | 2409 -- + .../appio/tests/iozone/Generate_Graphs | 32 - + src/components/appio/tests/iozone/Gnuplot.txt | 23 - + src/components/appio/tests/iozone/client_list | 36 - + src/components/appio/tests/iozone/fileop.c | 1389 - + .../appio/tests/iozone/gengnuplot.sh | 57 - + src/components/appio/tests/iozone/gnu3d.dem | 146 - + src/components/appio/tests/iozone/gnuplot.dem | 60 - + .../appio/tests/iozone/gnuplotps.dem | 63 - + src/components/appio/tests/iozone/iozone.c | 25297 ---------------- + .../appio/tests/iozone/iozone_visualizer.pl | 262 - + src/components/appio/tests/iozone/libasync.c | 1604 - + src/components/appio/tests/iozone/libbif.c | 452 - + src/components/appio/tests/iozone/makefile | 1461 - + .../appio/tests/iozone/pit_server.c | 831 - + .../appio/tests/iozone/read_telemetry | 29 - + src/components/appio/tests/iozone/report.pl | 150 - + src/components/appio/tests/iozone/spec.in | 107 - + .../appio/tests/iozone/write_telemetry | 29 - + 20 files changed, 1 insertion(+), 34446 deletions(-) + delete mode 100644 src/components/appio/tests/iozone/Changes.txt + delete mode 100755 src/components/appio/tests/iozone/Generate_Graphs + delete mode 100644 src/components/appio/tests/iozone/Gnuplot.txt + delete mode 100644 src/components/appio/tests/iozone/client_list + delete mode 100644 src/components/appio/tests/iozone/fileop.c + delete mode 100755 src/components/appio/tests/iozone/gengnuplot.sh + delete mode 100644 src/components/appio/tests/iozone/gnu3d.dem + delete mode 100644 src/components/appio/tests/iozone/gnuplot.dem + delete mode 100644 src/components/appio/tests/iozone/gnuplotps.dem + delete mode 100644 src/components/appio/tests/iozone/iozone.c + delete mode 100755 src/components/appio/tests/iozone/iozone_visualizer.pl + delete mode 100644 src/components/appio/tests/iozone/libasync.c + delete mode 100644 src/components/appio/tests/iozone/libbif.c + delete mode 100644 src/components/appio/tests/iozone/makefile + delete mode 100644 src/components/appio/tests/iozone/pit_server.c + delete mode 100644 src/components/appio/tests/iozone/read_telemetry + delete mode 100755 src/components/appio/tests/iozone/report.pl + delete mode 100644 src/components/appio/tests/iozone/spec.in + delete mode 100644 src/components/appio/tests/iozone/write_telemetry + +diff --git a/src/components/appio/tests/Makefile b/src/components/appio/tests/Makefile +index 26fc5f3c5..4a3005df5 100644 +--- a/src/components/appio/tests/Makefile ++++ b/src/components/appio/tests/Makefile +@@ -55,17 +55,9 @@ appio_test_fread_fwrite: appio_test_fread_fwrite.o $(UTILOBJS) $(PAPILIB) + appio_test_pthreads: appio_test_pthreads.o $(UTILOBJS) $(PAPILIB) + $(CC) $(CFLAGS) $(INCLUDE) -o $@ appio_test_pthreads.o $(UTILOBJS) $(PAPILIB) $(LDFLAGS) -lpthread + +-iozone/iozone_linux$(ARCH_SUFFIX).o iozone/libasync.o iozone/libbif.o: +- $(MAKE) -C iozone iozone_linux$(ARCH_SUFFIX).o libasync.o libbif.o +- + init_fini.o: init_fini.c + $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $^ + +-# to test, try: +-# ./appio_test_iozone -s 100m -r 64 -i 0 -i 1 -t 1 +-appio_test_iozone: iozone/iozone_linux$(ARCH_SUFFIX).o iozone/libasync.o iozone/libbif.o init_fini.o $(UTILOBJS) $(PAPILIB) +- $(CC) -g -O2 -o $@ $(LDFLAGS) $^ -lpthread -lrt +- + clean: +- rm -f $(ALL_TESTS) appio_test_iozone *.o ++ rm -f $(ALL_TESTS) *.o + +diff --git a/src/components/appio/tests/iozone/Changes.txt b/src/components/appio/tests/iozone/Changes.txt +deleted file mode 100644 +index a619f8bba..000000000 +--- a/src/components/appio/tests/iozone/Changes.txt ++++ /dev/null +@@ -1,2409 +0,0 @@ +-V1.0 (capps): +-Capps: +- Beginning of the code base. +-Isom: +- Added reread +- Added rewrite +- Added read backwards +- Added lseek+read +- Added lseek+reread +- +-Capps: +- Added more accurate time collection method. +- Added alignment in the on chip Cache code. +- Added change step when passing 16 Meg size file. +- +-Capps: +- Added auto+ to purge on chip cache. +- +-kcollins: +- replaced the lseek+read &reread test with random reads and writes +- +-Capps: +- Replaced reverse re-read with record rewrite. This gives +- both source and destination on chip cache hits. +- +-Capps: +- added auto+multi +- Support for multiple buffers in the iozone. +- +-Capps: +- Removed the recursion through main(). +- Cleaned up the printout when not in auto mode. +- Added support for stride-read. ( Manual mode only ) +- +-Capps: +- Cleanup so it will build for bsd4_2 ( C series machines ) +- +-Capps: +- Cleanup on frontend. Now uses getopt() and has a real parser. +- Cleanup on error handling. +- Added throughput tests. +- Eliminated page faults in the throughput tests. +- +-Capps: +- Made all perf tests table driven. +- Add back Bill's Copyright. +- ansify, prototypes, scope limitations. +- +-V2.1 (kcollins): +- Simplified auto mode logic. auto test now runs from +- MEGABYTES_START to MEGABYTES_END and from RECLEN_START +- to RECLEN_END with values multiplied by MULTIPLIER +- each iteration. Range set to (4K...16M) for RECLEN +- and (1M...512M) for MEGABYTES. (the physical I/O +- tests for RECLEN <4K take several hours on a 1200). +- +- Enlarged MAXBUFFERSIZE to 16MB for large record tests. +- +- Added error checking for mallocs (!-). +- +- Changed multibuffer code to use all of MAXBUFFERSIZE +- as a circular buffer, with the number of buffers +- varying as MAXBUFFERSIZE/reclen. This corrects +- problems where MAXBUFFERSIZE*MAXBUFFERS was very large. +- Also modified auto mode so that tests where +- reclen>filesize are skipped. +- +- Modified preadv code to vary the number of buffers as +- necessary such that they will fit in min(MAXBUFFERSIZE,filesize). +- This fixes problems where the number of buffers in +- the i/o vector exceeded the size of mainbuffer. +- +- Added bzero for buffer when it is first malloc'd. This +- ensures that it is initialized before use. +- +- Created a script (profile.fs) that runs a series of tests +- to generate a "box" around common application variables +- such as filesize, buffer size, buffer encachement, and +- number of concurrent processes. This is intended to serve +- as the "standard" filesystem profile. +- +- buffer reset to mainbuffer before each test loop +- +-V2.3 (kcollins): +- +- added -F option to write to specify pathnames for throughput +- tests (allowing throughput tests to multiple filesystems). +- +-V2.4 (capps): +- Changed preadv/pwritev to use a non-sequential access pattern. +- Changed the version number. +- Moved all user interface values to KB. This simplifies +- the user interface. (consistant scaling) and it also +- allows one to start with 512kb file. This is very important +- since the first indirect block causes a significant +- slowdown in the initial write cases. +- +-V2.5 (capps): +- Re-structure and cleanup. +- +-V2.6 (kcollins) +- Bug fix for the throughput tests. +- +-V2.7 (capps): +- Added -o flag. This makes all file opens for writes +- have the O_SYNC flag set. This makes all writes go +- to disk before competion. This is useful for seeing +- what the media can do without the buffer cache helping. +- +-V2.8 (capps): +- Added -V flag. This turns on pattern verification. If +- the user were to type: +- -V 165 +- Then bit pattern 0xa5 would be placed in every byte in the +- buffer and when read back from buffer cache, or disk, +- it will be verified to be correct. If it fails then +- the error handler will specify the byte location of the +- miscompare. +- +-V2.9 (capps): +- Added fread/re-fread, fwrite/re-fwrite to list of tests. +- Added -E to allow the user to run pread and friends as an option. +- +-V2.10 (capps): +- Added -R. This will generate Excel compatible files that +- can then be imported into Excel and graphed. +- Added support for 5 targets to the makefile. +- Added -M This prints out the uname -a stuff about a machine. +- Added -O This gives all results in operations/sec instead of KB/sec. +- More code cleanup. Update comments. +- +-V2.11 (kcollins) +- added -A. Auto mode with no crossover and read/write tests only +- changed default record size to 64KB (from 512 bytes) +- +-V2.12 (capps) +- Added shared memory barrier sync for throughput mode. This +- provides much finer control over the actual timeing +- of the children. +- Added mmap() for BSD (Convex) machines that do not +- have System V shared memory. +- Added two ways of showing throughput results. The second +- method takes into consideration children that lag behind +- due to slow devices, and gives results that are more accurate. +- Cleanup of some tab problems in throughput results. +- Cleanup of floating point output taking to much space. +- Added -d to allow a variable delay comming out of the barrier +- in the throughput tests. +-V2.12 (kcollins) +- added declaration for create_list to make ansi c compiles work +- several fixes to some of the SPPUX 5.x make targets +- added date run to banner (hope this doesn't break your scripts $-) +- +-V2.13 (capps) +- Added "stone walling". During throughput tests, if one process +- finishes then all others are sent a signal to tell them +- to stop. (The parallel region has finished). This provides +- better numbers for throughput. +- Only bzero or fill min(reclen,CACHE_SIZE) this saves a bunch +- of paging on workstations with small memory systems. +- Fixed broken target in the makefile. +- Note: use of -d is not advised. It makes the children not run +- in parallel. +-V2.14 (capps) +- Bug fix to avoid anomaly in SPP-UX. In SPP-UX the filesystem +- code preallocates meta-data to improve initial file writes. +- The first indirect block allocation was causing a block +- of zeros to be written syncronously. In SPP-UX the filesytem +- code preallocates zero filled blocks when the first writer +- touches a filesystem after a sync. A pool of on disk zero'd +- blocks are created asynchronously and handed out to writers +- when they cross the boundry into the first level indirect +- and would have had to stop and wait for the zero filled +- block to be written. Iozone's testing methodology was not +- allowing the OS to have any time to complete the async +- pre-allocation and was not showing the speed up that real +- applications would see. +- +-V2.15 (capps) +- Improve throughput testing mode. +- +-V2.16 (capps) +- Added -U option. This allows the filesystem to be unmounted +- and remounted between tests. This guarentees that the buffer +- cache is cold. +- +-V2.17 (capps) +- Added -T option. This makes the throughput tests use +- threads instead of processes. Currently using pthread_create(), +- pthread_self(), and pthread_exit(). +- Cleaned up file cleanup mechanism. Control C will now cause +- all temp files to be deleted. Removed all signals used to +- control sub-processes. +- +-V2.18 (capps) +- Cleanup. Added read stride, read backwards to the throughput +- tests. Various bug fixes +- +-V2.19 (capps) +- Removed all calls to malloc() and all use of system V shared +- memory. mmap() is much easier to deal with. As for malloc() +- HP programs are very limited on the ammount of malloc() space +- and not nearly so constrained on mmap() memory. It was necessary +- to move to mmap() since multiple threads all need buffers in +- the processes address space. +- Removed dependency on first thread being number 2. Iozone now +- probes to find out what the thread library will return for +- the first thread. This makes the switching thread libraries +- much easier. +- +-V2.20 (capps) +- Children now set stop_flag and shutdown all other children.There +- is no further need to tell the parent to distribute the stop_flag. +- verify, purge, and osync are now supported in the throughput +- tests. Fixed bug where pthreads stack size was causing +- segmentation violation when purgeit() was called for buffer +- that were greater than 256kb. +- +-V2.21 (capps) +- Enhanced throughput reporting. Now provides: +- Child throughput, Parent throughput, Minimum throughput for +- any child in the group, Maximum throughput for any child in the +- group, and Minimum transfer count. Due to stone walling +- not all children write the full requested size. This +- minimum transfer count provides the user with knowledge of +- how much work was performed by the slowest child. +- Added -C flag. This allows the user to see all of the transfer +- counts for each child. Had to add system 5 shared memory back. +- Linux does not support mmap(MAP_ANONYMOUS|MAP_SHARED). So it +- must use SYSV shared memory get get sharing working. +- +-V2.22 (capps) +- Made changes to make iozone work correctly on Linux on a +- PC. Changes are just scaling down the test to fit on a +- pc, and scaling down shared segments to < 16 Meg so it +- can run on an Intel 386 class machine. +- Added: -L # Set the processor cache line size in bytes. +- Added: -S # Set the processor cache size in kbytes. +- Removed spin wait in parent waiting for threads to +- finish each throughput test. Code not uses thread_join(). +- Fixed -O (operations/sec) mode to work in throughput tests. +- +-V2.23 (capps) +- Close small timing hole where thread/process has set stop flag +- and others are in a system call. The hole allowed threads/processes +- to continue to increment work done after one had finished and +- told the others to stop. The result was that the children would +- report slightly high numbers as they were not truely parallel +- at the finish line. Added random read throughput test. +- Fixes for VxFS small extents being created by prime_zb() functions. +- Provides more details about the throughput run. +- +-V2.24 (capps) +- Added support for -R (Excell chart generation) to the throughput +- tests. Also added support for the -O (ops/sec) to the throughput +- Excell chart. +- +-V2.25 (capps) +- Added support for selecting which test to run. -i # +- -i 0 -i 3 +- will run write and read-backwards tests only. For a list +- of the test numbers type iozone -h. +-V2.26 (capps) +- Added support for LARGE_FILES for the hpux-11.0 target. +- +- +-V2.27 (capps) +- All tests now verify one long word of data from each page +- written/read to/from the file. This is to level the +- playing field with systems that do not move data +- when "read" or "write" is called, but instead just +- map the file and perform the I/O when the address space +- is touched. Benchmarks that do not validate the data +- ,at least touch each page, do not measure the read/write +- times just the map times. +- Note: The -V option still verifies each byte of the buffer, +- the default is now to verify one long from each page. +- +-V2.28 (capps) +- Added support for benchmarking mmap() files. +- Added more command line options. -B -G -D +- B = Use mmap() files for the benchmark. +- G = Use msync(MS_SYNC) for mmap files. +- D = Use msync(MS_ASYNC) for mmap files. +- +-V2.29 (capps) +- Bug fixes for: +- Combination of running individual tests and mmap() files support. +- Stride read bug that caused only portions of the total file to be +- examined. +- +-V2.30 (capps) +- Fixups for build under SPP-UX +- +-V2.31 (capps) +- Fixups for build under Linux. +- Added -j ### to support user setting the stride size for the +- stride read benchmark. +- +-V2.32 (capps) +- Add support for IRIX and IRIX64. +- +-V2.33 (capps) +- Add support for POSIX async I/O benchmarking. Uses a library +- to interface to POSIX async I/O model. The library provides +- and extended async_read() interface. It takes the standard +- calling options of read() but also allows the application to +- perform read-ahead with a stride. (positive or negative) +- and allows the user to specify how much read ahead to +- perform. +- Tested on HP-UX 11.0, Linux, SGI Origin. +- +-V2.34 (capps) +- Added -k. This allows POSIX async I/O to utilize the buffer +- specified and not to perform any bcopys. Fixes to make +- multi-threadedness work on SGI Origin. +- +-V2.34 (capps) +- Added [-k #]. This allows POSIX async I/O to utilize the buffer +- specified and not to perform any bcopys. Fixes to make +- multi-threadedness work on SGI Origin. +- +-V2.36 (capps) +- Iozone is now a 64 bit application. It may be compiled for either +- 64 bit or 32 bit machines. The makefile supports 64 and 32 bit +- targets for machines that support 32 & 64 bit targets. +- All version numbers are now automatically generated by +- RCS. This is the last time we have to bump the version +- number by hand. +- +- +------------------------------------------------------------------------------------ +-Changed over to RCS source control here: +-Version Numbers are reset at this point back to Version 1.1. +------------------------------------------------------------------------------------ +- +- +-RCS file: iozone.c,v; Working file: iozone.c +-head: 1.94 +-locks: ; strict +-access list: +-symbolic names: +-comment leader: " * " +-total revisions: 94; selected revisions: 94 +-description: +-Initial rcs version of Iozone +----------------------------- +-Revision 1.94 +-date: 99/01/18 13:02:57; author: capps; state: Exp; lines added/del: 7/2 +-Call msync if writer wants sync in timing and terminates early in multi thread test case. +----------------------------- +-Revision 1.93 +-date: 99/01/18 11:46:11; author: capps; state: Exp; lines added/del: 309/126 +-Cleanup for include_flush and include_close for single and multi threaded operations. +----------------------------- +-Revision 1.92 +-date: 99/01/15 10:53:58; author: capps; state: Exp; lines added/del: 40/11 +-Add include_close support for throughput testing +----------------------------- +-Revision 1.91 +-date: 98/12/07 09:26:22; author: capps; state: Exp; lines added/del: 43/24 +-For Windows: Use the high resolution timers instead of timeofday(); +-Fix a few casting problems. +----------------------------- +-Revision 1.90 +-date: 98/11/30 14:49:46; author: capps; state: Exp; lines added/del: 24/17 +-Update the copyright and names and places +----------------------------- +-Revision 1.89 +-date: 98/10/30 09:04:51; author: capps; state: Exp; lines added/del: 1/2 +-An extra close(fd) causes HP-UX to fail future unmounts... +----------------------------- +-Revision 1.88 +-date: 98/10/29 09:47:25; author: capps; state: Exp; lines added/del: 17/17 +-Cleanup the help screen +----------------------------- +-Revision 1.87 +-date: 98/10/28 23:31:11; author: capps; state: Exp; lines added/del: 7/6 +-Spelling error fix. +----------------------------- +-Revision 1.86 +-date: 98/10/14 11:21:50; author: capps; state: Exp; lines added/del: 23/68 +-Unified the time method to only have 2 ways to get time. +----------------------------- +-Revision 1.85 +-date: 98/10/14 09:22:09; author: capps; state: Exp; lines added/del: 91/91 +-Added code to remove the latency of gettimeofday() from the file performance measurements. +----------------------------- +-Revision 1.84 +-date: 98/10/12 11:44:50; author: capps; state: Exp; lines added/del: 107/8 +-Add time resolution output, and fix the divide by zero when the time in +-a system call turns out to be Zero. This will introduce distortion for machines +-that have very fast system calls and very poor time resolution. Windows +-has a 50 Milli second resolution on gettimeofday(). So... to fix it +-all calls that take less than 50 Milli seconds will be rounded up to +-cost 50 milliseconds. +----------------------------- +-Revision 1.83 +-date: 98/10/06 09:58:16; author: capps; state: Exp; lines added/del: 46/2 +-Add support for Windows build +----------------------------- +-Revision 1.82 +-date: 98/09/23 09:48:02; author: capps; state: Exp; lines added/del: 2/2 +-Fix bug where -i # was leaving tmp files after throughput test. +----------------------------- +-Revision 1.81 +-date: 98/09/23 09:41:12; author: capps; state: Exp; lines added/del: 1/3 +-Remove debug printf +----------------------------- +-Revision 1.80 +-date: 98/09/23 09:29:01; author: capps; state: Exp; lines added/del: 23/1 +-Add my_nap(). This allows the threads to switch processors to their +-new bound processor before performing any work. +----------------------------- +-Revision 1.79 +-date: 98/09/22 11:57:20; author: capps; state: Exp; lines added/del: 8/8 +-Change xx back into an int so the modulo will work better. +----------------------------- +-Revision 1.78 +-date: 98/09/18 16:27:05; author: capps; state: Exp; lines added/del: 18/15 +-Remove create in rewrite path. +----------------------------- +-Revision 1.77 +-date: 98/08/17 16:44:06; author: capps; state: Exp; lines added/del: 23/1 +-Fixes for Solaris and the new processor bind feature. +----------------------------- +-Revision 1.76 +-date: 98/08/17 16:17:45; author: capps; state: Exp; lines added/del: 1/2 +-Remove debug code. +----------------------------- +-Revision 1.75 +-date: 98/08/17 16:16:15; author: capps; state: Exp; lines added/del: 92/5 +-Add support for binding procs/threads to cpus. +----------------------------- +-Revision 1.74 +-date: 98/08/07 16:51:41; author: capps; state: Exp; lines added/del: 4/3 +-Add fsync to the fwrite test case when the user specifies -e +----------------------------- +-Revision 1.73 +-date: 98/08/07 16:47:38; author: capps; state: Exp; lines added/del: 178/208 +-Add -c and -e to allow closes and fsyncs to be inside the timing calculations. +----------------------------- +-Revision 1.72 +-date: 98/08/06 22:40:15; author: capps; state: Exp; lines added/del: 9/1 +-Add setvbuf to fwrite and fread tests so that the internal fwrite and fread +-buffer size is the same as the record size. This is what a well tuned application +-would do. +----------------------------- +-Revision 1.71 +-date: 98/08/06 09:03:06; author: capps; state: Exp; lines added/del: 2/3 +-Fix fsync filename problem in fwrite_perf_test +----------------------------- +-Revision 1.70 +-date: 98/08/05 18:06:41; author: capps; state: Exp; lines added/del: 6/2 +-Add fsync after fwrite test case so the fread will start with a +-clean buffer cache and no writes in progress. +----------------------------- +-Revision 1.69 +-date: 98/08/03 10:45:49; author: capps; state: Exp; lines added/del: 3/3 +-Bug fix for -V option not filling the entire buffer. +----------------------------- +-Revision 1.68 +-date: 98/07/30 22:11:11; author: capps; state: Exp; lines added/del: 2/3 +-Fix for solaris +----------------------------- +-Revision 1.67 +-date: 98/07/30 22:08:19; author: capps; state: Exp; lines added/del: 2/2 +-Fix for solaris +----------------------------- +-Revision 1.66 +-date: 98/07/30 22:05:02; author: capps; state: Exp; lines added/del: 43/15 +-Add support for Solaris +----------------------------- +-Revision 1.65 +-date: 98/07/01 14:19:19; author: capps; state: Exp; lines added/del: 80/82 +-Move end_async inside the timing loops as in async I/O it counts. +----------------------------- +-Revision 1.64 +-date: 98/06/16 17:04:36; author: capps; state: Exp; lines added/del: 13/2 +-Correct problem where user specifies pread tests on hpux... which does not +-support these operations. The test now prints an error message and exits. +----------------------------- +-Revision 1.63 +-date: 98/06/16 16:54:22; author: capps; state: Exp; lines added/del: 1/2 +-Remove exit from auto_test. This allows the message "iozone test complete" to +-be printed when in auto test mode. +----------------------------- +-Revision 1.62 +-date: 98/06/10 10:54:28; author: capps; state: Exp; lines added/del: 175/173 +-All exit()s now have a unique exit value. +----------------------------- +-Revision 1.61 +-date: 98/05/18 13:34:03; author: capps; state: Exp; lines added/del: 17/18 +-Move .dat file descriptors to global data. Needed to prevent re-opens. +----------------------------- +-Revision 1.60 +-date: 98/05/18 13:24:22; author: capps; state: Exp; lines added/del: 6/3 +-Bug fix. Prevents re-opending .dat files when in auto mode. +----------------------------- +-Revision 1.59 +-date: 98/05/08 13:03:02; author: capps; state: Exp; lines added/del: 21/3 +-Enhance throughput tests to follow the -i test number to run options. +----------------------------- +-Revision 1.58 +-date: 98/05/07 14:15:49; author: capps; state: Exp; lines added/del: 109/39 +-Make VXFS a define in the make command. This makes moving to other targets +-easier. It removes the binding of HPUX and VXFS. +-Also, Added -Q to support offset/latency file generation for later use +-as inputs to plot program. +----------------------------- +-Revision 1.57 +-date: 98/05/06 15:09:43; author: capps; state: Exp; lines added/del: 100/27 +-Add -N to provide results in microseconds per operation. +----------------------------- +-Revision 1.56 +-date: 98/05/05 13:23:29; author: capps; state: Exp; lines added/del: 3/10 +-If the user specifies -i 0 then run both write and rewrite tests. +----------------------------- +-Revision 1.55 +-date: 98/04/30 15:19:02; author: capps; state: Exp; lines added/del: 1/1 +-No change +----------------------------- +-Revision 1.54 +-date: 98/04/30 15:09:58; author: capps; state: Exp; lines added/del: 2/2 +-Unlink the vxfstest when the test fails. +----------------------------- +-Revision 1.53 +-date: 98/04/30 13:07:21; author: capps; state: Exp; lines added/del: 7/5 +-Cleanup help output. +----------------------------- +-Revision 1.52 +-date: 98/04/30 12:58:29; author: capps; state: Exp; lines added/del: 21/4 +-Add async I/O with no bcopy to throughput tests. +----------------------------- +-Revision 1.51 +-date: 98/04/29 15:29:29; author: capps; state: Exp; lines added/del: 5/1 +-Fixes so it will compile on the SGI Origin. +----------------------------- +-Revision 1.50 +-date: 98/04/29 11:57:58; author: capps; state: Exp; lines added/del: 5/1 +-Do not need to limit async ops. Fix is in libasync.c +----------------------------- +-Revision 1.49 +-date: 98/04/29 10:45:19; author: capps; state: Exp; lines added/del: 61/3 +-Add async I/O to throughput testing for writes +----------------------------- +-Revision 1.48 +-date: 98/04/28 11:57:13; author: capps; state: Exp; lines added/del: 5/1 +-Limit max async operations to 60. Beyond this there be dragons. +----------------------------- +-Revision 1.47 +-date: 98/04/28 10:16:09; author: capps; state: Exp; lines added/del: 108/21 +-Completed support for no_bcopy POSIX async I/O in the async_write_no_copy path. +-This allows write tests to perform async I/O with buffers released when +-the write is completed. +----------------------------- +-Revision 1.46 +-date: 98/04/27 16:58:38; author: capps; state: Exp; lines added/del: 43/10 +-Add aio_write() to the write and re-write tests. This provides +-POSIX async I/O for the those tests. +----------------------------- +-Revision 1.45 +-date: 98/04/25 09:53:39; author: capps; state: Exp; lines added/del: 3/2 +-direct_flag is an int. Was a char in one place and +-an int in another. +----------------------------- +-Revision 1.44 +-date: 98/04/25 09:17:42; author: capps; state: Exp; lines added/del: 27/15 +-More support for vx_direct support in the write path +----------------------------- +-Revision 1.43 +-date: 98/04/24 16:33:44; author: capps; state: Exp; lines added/del: 115/77 +-Move VX_DIRECT to libasync. But keep the VX_DIRECT support also +-in iozone. So one can use VX_DIRECT with and without async I/O +----------------------------- +-Revision 1.42 +-date: 98/04/24 16:20:34; author: capps; state: Exp; lines added/del: 127/60 +-Move VX_DIRECT to the libasync module. +----------------------------- +-Revision 1.41 +-date: 98/04/24 15:50:54; author: capps; state: Exp; lines added/del: 190/7 +-Add support for VxFS VX_DIRECT +-Idea is to use VX_DIRECT and POSIX async I/O together +----------------------------- +-Revision 1.40 +-date: 98/04/22 16:38:25; author: capps; state: Exp; lines added/del: 5/5 +-Sppux wants ail_gettimeofday variables to be unsigned int. +----------------------------- +-Revision 1.39 +-date: 98/04/22 16:19:50; author: capps; state: Exp; lines added/del: 7/3 +-Fix -M option not printing cleanly +-Fix -R in 32 bit mode printing garbage. +----------------------------- +-Revision 1.38 +-date: 98/04/22 15:56:02; author: capps; state: Exp; lines added/del: 1/1 +-Change to only disply revision not full header. +----------------------------- +-Revision 1.37 +-date: 98/04/22 15:52:19; author: capps; state: Exp; lines added/del: 1/1 +-Add RCS Header to support versioning. +----------------------------- +-Revision 1.36 +-date: 98/04/22 15:38:26; author: capps; state: Exp; lines added/del: 1/1 +-fix to bcopy() third arg needs to be size_t for 32 bit mode. +----------------------------- +-Revision 1.35 +-date: 98/04/22 09:09:24; author: capps; state: Exp; lines added/del: 17/17 +-Bug fixes for 64 bit mode on IRIX, and addition +-on the internal inuse queue to insure that the +-internal struct_cache_ent structures are not released +-too early when doing direct I/O (async_read_no_copy). +----------------------------- +-Revision 1.34 +-date: 98/04/21 09:31:02; author: capps; state: Exp; lines added/del: 4/0 +-Fix to eliminate hidden (dot) files that iozone was creating +-in throughput mode. All files are now visible with ls. +----------------------------- +-Revision 1.33 +-date: 98/04/21 08:30:35; author: capps; state: Exp; lines added/del: 7/1 +-Have Iozone print the compile model used. +----------------------------- +-Revision 1.32 +-date: 98/04/20 18:46:02; author: capps; state: Exp; lines added/del: 49/20 +-Fixes for 32 bit mode. +----------------------------- +-Revision 1.31 +-date: 98/04/20 16:57:29; author: capps; state: Exp; lines added/del: 8/8 +-make sure malloc is called with (size_t) parameter. +----------------------------- +-Revision 1.30 +-date: 98/04/20 16:05:08; author: capps; state: Exp; lines added/del: 933/757 +-Iozone now 64 bit application +----------------------------- +-Revision 1.29 +-date: 98/04/20 12:32:25; author: capps; state: Exp; lines added/del: 4/4 +-Move msync to before munmap so file gets written. +----------------------------- +-Revision 1.28 +-date: 98/04/20 10:21:30; author: capps; state: Exp; lines added/del: 2/2 +-Minor fix for -O flag and -B not working smoothly together. +----------------------------- +-Revision 1.27 +-date: 98/04/20 10:17:19; author: capps; state: Exp; lines added/del: 0/0 +-No change +- +----------------------------- +-Revision 1.26 +-date: 98/04/19 15:11:07; author: capps; state: Exp; lines added/del: 5/5 +-Remove prime_zbfill. It causes problems with mmap files. +----------------------------- +-Revision 1.25 +-date: 98/04/16 15:24:50; author: capps; state: Exp; lines added/del: 228/70 +--H is Nastran async I/O with bcopy +--k is async I/O without any bcopys +----------------------------- +-Revision 1.24 +-date: 98/04/15 16:48:30; author: capps; state: Exp; lines added/del: 22/4 +-fix to make build on 9.05 and 10.1 +----------------------------- +-Revision 1.23 +-date: 98/04/15 15:36:55; author: capps; state: Exp; lines added/del: 9/9 +-Cleanup some compiler warnings about un-initialized variables. They +-are not really un-initialized and used but it does generate +-compiler warnings on some machines. +----------------------------- +-Revision 1.22 +-date: 98/04/15 15:32:56; author: capps; state: Exp; lines added/del: 7/7 +-Need to free the dummyname space a bit later. +----------------------------- +-Revision 1.21 +-date: 98/04/15 14:37:05; author: capps; state: Exp; lines added/del: 27/13 +-Fix to use smaller stack size in thread_ routines. It was causing +-the SGI to drop core in throughput tests. +----------------------------- +-Revision 1.20 +-date: 98/04/14 17:01:19; author: capps; state: Exp; lines added/del: 27/16 +-Fix a memory leak. In multi_throughput testing shmalloc was getting called +-for each iteration. This is not needed and causes much to much +-shm to be allocated. Not broken but definately a pig. +----------------------------- +-Revision 1.19 +-date: 98/04/14 15:19:15; author: capps; state: Exp; lines added/del: 2/0 +-When -k is specified alone this will turn on the POSIX async I/O and +-set depth to 0. +----------------------------- +-Revision 1.18 +-date: 98/04/14 15:00:18; author: capps; state: Exp; lines added/del: 21/20 +-Fixes to make multi-threaded version run on the SGI Origin. +----------------------------- +-Revision 1.17 +-date: 98/04/14 11:55:44; author: capps; state: Exp; lines added/del: 17/11 +-Add support for -k. When using POSIX async I/O use the +-buffer specified and do not perform any bcopys. +----------------------------- +-Revision 1.16 +-date: 98/04/13 10:22:18; author: capps; state: Exp; lines added/del: 27/380 +-Add libasync library support +----------------------------- +-Revision 1.15 +-date: 98/04/11 12:09:25; author: capps; state: Exp; lines added/del: 1/0 +-Fix memory leak. Now calls del_cache when ever any calls to async_end happen. +-This will ensure that there are no outstanding I/Os on the cache that +-ha ve not been canceled . +----------------------------- +-Revision 1.14 +-date: 98/04/11 11:57:10; author: capps; state: Exp; lines added/del: 632/47 +-Add support for POSIX async I/O testing +----------------------------- +-Revision 1.13 +-date: 98/03/31 14:30:15; author: capps; state: Exp; lines added/del: 44/6 +-Fix support for bsd4_2 and ConvexOS +----------------------------- +-Revision 1.12 +-date: 98/03/31 11:26:34; author: capps; state: Exp; lines added/del: 2/2 +-Bump version number to 2.32 +----------------------------- +-Revision 1.11 +-date: 98/03/31 11:20:51; author: capps; state: Exp; lines added/del: 70/6 +-Add support for SGI IRIX and SGI IRIX64 +----------------------------- +-Revision 1.10 +-date: 98/03/27 14:00:47; author: capps; state: Exp; lines added/del: 15/20 +-Put the bcopy back. It is more represenative +-of what the real application will do. +----------------------------- +-Revision 1.9 +-date: 98/03/27 13:25:02; author: capps; state: Exp; lines added/del: 40/14 +-Improved mmap file support. Now only have 1 long word from +-each page touched. This eliminates the overhead of bcopy +-dominating the results. It also is performing the same +-work that the non-mmap version does with verify(). +----------------------------- +-Revision 1.8 +-date: 98/03/27 10:41:13; author: capps; state: Exp; lines added/del: 10/4 +-Bug fix. Frewrite was truncating the file. This fix +-ensures that the Frewrite test opens without trunc. +----------------------------- +-Revision 1.7 +-date: 98/03/27 10:16:41; author: capps; state: Exp; lines added/del: 3/3 +-Fix report to specify stride size as a function of reclen. +-It did not make sense to output kbytes as the value changes +-when in auto mode to match the current record length. +----------------------------- +-Revision 1.6 +-date: 98/03/26 15:28:15; author: capps; state: Exp; lines added/del: 16/8 +-Add support for -j option. This +-allows the user to specify the stride size for +-the strided file access benchmark. +----------------------------- +-Revision 1.5 +-date: 98/03/25 15:27:01; author: capps; state: Exp; lines added/del: 1/1 +-Fixup help screen to reflect new options +----------------------------- +-Revision 1.4 +-date: 98/03/25 15:21:23; author: capps; state: Exp; lines added/del: 1/1 +-Change the revision number +----------------------------- +-Revision 1.3 +-date: 98/03/25 15:20:28; author: capps; state: Exp; lines added/del: 16/1 +-Fixup support for Linux +----------------------------- +-Revision 1.2 +-date: 98/03/25 13:58:05; author: capps; state: Exp; lines added/del: 16/3 +-Bug fixes for SPP-UX +----------------------------- +-Revision 1.1 +-date: 98/03/25 10:43:45; author: capps; state: Exp; +-Initial revision +-============================================================================= +- +-RCS file: libasync.c,v; Working file: libasync.c +-head: 1.39 +-locks: ; strict +-access list: +-symbolic names: +-comment leader: " * " +-total revisions: 39; selected revisions: 39 +-description: +-Initial version of POSIX async I/O library interface. +----------------------------- +-Revision 1.39 +-date: 98/07/30 22:05:21; author: capps; state: Exp; lines added/del: 3/1 +-Add support for Solaris +----------------------------- +-Revision 1.38 +-date: 98/07/07 13:00:39; author: capps; state: Exp; lines added/del: 1/11 +-Remove extra bcopy in the async_write_no_bcopy path. +----------------------------- +-Revision 1.37 +-date: 98/06/11 09:47:58; author: capps; state: Exp; lines added/del: 3/3 +-Fix syntax error for IRIX +----------------------------- +-Revision 1.36 +-date: 98/06/10 10:56:55; author: capps; state: Exp; lines added/del: 10/10 +-All exit()s now have a unique exit value. +----------------------------- +-Revision 1.35 +-date: 98/05/07 14:17:20; author: capps; state: Exp; lines added/del: 2/2 +-Make VXFS a define in the make command. This makes moving to other targets +-easier. It removes the binding of HPUX and VXFS. +-Also, Added -Q to support offset/latency file generation for later use +-as inputs to plot program. +----------------------------- +-Revision 1.34 +-date: 98/04/30 15:19:54; author: capps; state: Exp; lines added/del: 1/3 +-Remove debug code that breaks 64 bit mode compiled code. +----------------------------- +-Revision 1.33 +-date: 98/04/30 13:09:13; author: capps; state: Exp; lines added/del: 2/2 +-Make retval an int so it can be checked for less than zero. +----------------------------- +-Revision 1.32 +-date: 98/04/29 16:49:34; author: capps; state: Exp; lines added/del: 5/11 +-If overshooting on number of asyncs then terminate the loop and +-let the next time through pick up the I/O. +----------------------------- +-Revision 1.31 +-date: 98/04/29 16:37:49; author: capps; state: Exp; lines added/del: 3/3 +-Remove debug code +----------------------------- +-Revision 1.30 +-date: 98/04/29 15:29:48; author: capps; state: Exp; lines added/del: 3/1 +-Fixes so it will compile on the SGI Origin. +----------------------------- +-Revision 1.29 +-date: 98/04/29 11:56:27; author: capps; state: Exp; lines added/del: 36/10 +-Work around for bug in POSIX async I/O library +----------------------------- +-Revision 1.28 +-date: 98/04/29 11:04:26; author: capps; state: Exp; lines added/del: 1/2 +-Remove debug code +----------------------------- +-Revision 1.27 +-date: 98/04/29 11:02:54; author: capps; state: Exp; lines added/del: 54/27 +-Added resource shortage paths. +----------------------------- +-Revision 1.26 +-date: 98/04/28 18:12:51; author: capps; state: Exp; lines added/del: 1/3 +-Add async I/O to the throughput tests +----------------------------- +-Revision 1.25 +-date: 98/04/28 17:12:40; author: capps; state: Exp; lines added/del: 3/1 +-fix wait_for_ routine to reset w_tail if item being removed is also the tail. +----------------------------- +-Revision 1.24 +-date: 98/04/28 16:14:06; author: capps; state: Exp; lines added/del: 1/3 +-bug fix. 2 calls to malloc for aligned memory. +----------------------------- +-Revision 1.23 +-date: 98/04/28 11:57:39; author: capps; state: Exp; lines added/del: 37/13 +-Limit max async operations to 60. Beyond this there be dragons. +----------------------------- +-Revision 1.22 +-date: 98/04/28 10:17:22; author: capps; state: Exp; lines added/del: 127/42 +-Completed support for no_bcopy POSIX async I/O in the async_write_no_copy path. +-This allows write tests to perform async I/O with buffers released when +-the write is completed. +----------------------------- +-Revision 1.21 +-date: 98/04/27 16:59:14; author: capps; state: Exp; lines added/del: 246/9 +-Add aio_write() to the write and re-write tests. This provides +-POSIX async I/O for the those tests. +----------------------------- +-Revision 1.20 +-date: 98/04/24 16:20:55; author: capps; state: Exp; lines added/del: 15/3 +-Move VX_DIRECT to the libasync module. +----------------------------- +-Revision 1.19 +-date: 98/04/24 15:50:13; author: capps; state: Exp; lines added/del: 42/11 +-Add support for VxFS VX_DIRECT +-Idea is to use VX_DIRECT and POSIX async I/O together +----------------------------- +-Revision 1.18 +-date: 98/04/24 12:36:42; author: capps; state: Exp; lines added/del: 13/5 +-Fix some error printfs to match the size of the off_t. +----------------------------- +-Revision 1.17 +-date: 98/04/24 12:18:11; author: capps; state: Exp; lines added/del: 7/7 +-Fixes for LP64 mode. off_t changed to off64_t +----------------------------- +-Revision 1.16 +-date: 98/04/24 09:33:32; author: capps; state: Exp; lines added/del: 275/35 +-Add comments and fix for LP64 model on hpux. +----------------------------- +-Revision 1.15 +-date: 98/04/23 16:58:06; author: capps; state: Exp; lines added/del: 167/13 +-Make libasync large file aware. +----------------------------- +-Revision 1.14 +-date: 98/04/22 15:58:45; author: capps; state: Exp; lines added/del: 1/1 +-Change version to only display rcs version id. +----------------------------- +-Revision 1.13 +-date: 98/04/22 15:52:54; author: capps; state: Exp; lines added/del: 1/2 +-Add RCS version support +----------------------------- +-Revision 1.12 +-date: 98/04/22 11:39:35; author: capps; state: Exp; lines added/del: 52/8 +-Add firewall to prevent in flight changes to the aiocb structure. +----------------------------- +-Revision 1.11 +-date: 98/04/22 09:10:36; author: capps; state: Exp; lines added/del: 57/19 +-Bug fixes for 64 bit mode on IRIX, and addition +-on the internal inuse queue to insure that the +-internal struct_cache_ent structures are not released +-too early when doing direct I/O (async_read_no_copy). +----------------------------- +-Revision 1.10 +-date: 98/04/21 09:34:14; author: capps; state: Exp; lines added/del: 18/10 +-Improve error messages. +----------------------------- +-Revision 1.9 +-date: 98/04/20 16:06:21; author: capps; state: Exp; lines added/del: 53/50 +-Iozone now 64 bit application +----------------------------- +-Revision 1.8 +-date: 98/04/20 10:17:59; author: capps; state: Exp; lines added/del: 0/0 +-no change +----------------------------- +-Revision 1.7 +-date: 98/04/17 08:49:16; author: capps; state: Exp; lines added/del: 15/2 +-Optimization on async operations. Just add one to the end +-of the list if the list already has more than one item. +----------------------------- +-Revision 1.6 +-date: 98/04/17 00:00:30; author: capps; state: Exp; lines added/del: 10/2 +-Make cancel keep trying until it succeeds. Otherwise transfers after the buffer +-is freed can occur. +----------------------------- +-Revision 1.5 +-date: 98/04/16 16:49:28; author: capps; state: Exp; lines added/del: 49/4 +-Improve error handling when running machine out of memory. +----------------------------- +-Revision 1.4 +-date: 98/04/16 15:26:41; author: capps; state: Exp; lines added/del: 118/28 +-added async_read_no_copy(). This allows the application to let the +-library specify the destination buffer and perform the async I/O +-without unwanted bcopys. +----------------------------- +-Revision 1.3 +-date: 98/04/14 11:56:23; author: capps; state: Exp; lines added/del: 36/10 +-Add supporf for -k. When using POSIX async I/O use +-the buffer specified and do not perform any bcopys. +----------------------------- +-Revision 1.2 +-date: 98/04/13 10:35:20; author: capps; state: Exp; lines added/del: 5/7 +-Fixup for error path to propagate any small transfers. +----------------------------- +-Revision 1.1 +-date: 98/04/13 10:21:23; author: capps; state: Exp; +-Initial revision +-============================================================================= +- +-RCS file: makefile,v; Working file: makefile +-head: 1.20 +-locks: ; strict +-access list: +-symbolic names: +-comment leader: "# " +-total revisions: 20; selected revisions: 20 +-description: +-Initial version of makefile +----------------------------- +-Revision 1.20 +-date: 98/10/06 10:36:22; author: capps; state: Exp; lines added/del: 87/28 +-Add comments to describe each targets capabilities. +----------------------------- +-Revision 1.19 +-date: 98/10/06 09:59:18; author: capps; state: Exp; lines added/del: 3/3 +-Fix spelling error +----------------------------- +-Revision 1.18 +-date: 98/10/06 09:58:29; author: capps; state: Exp; lines added/del: 18/3 +-Add support for Windows build +----------------------------- +-Revision 1.17 +-date: 98/08/17 16:44:56; author: capps; state: Exp; lines added/del: 2/2 +-Fixes for Solaris +----------------------------- +-Revision 1.16 +-date: 98/07/30 22:05:33; author: capps; state: Exp; lines added/del: 20/1 +-Add support for Solaris +----------------------------- +-Revision 1.15 +-date: 98/05/07 14:17:26; author: capps; state: Exp; lines added/del: 13/13 +-Make VXFS a define in the make command. This makes moving to other targets +-easier. It removes the binding of HPUX and VXFS. +-Also, Added -Q to support offset/latency file generation for later use +-as inputs to plot program. +----------------------------- +-Revision 1.14 +-date: 98/04/22 16:02:42; author: capps; state: Exp; lines added/del: 2/0 +-Add RCS version ids. +----------------------------- +-Revision 1.13 +-date: 98/04/22 13:58:54; author: capps; state: Exp; lines added/del: 6/6 +-For now only build the SGI targets in 32 bit mode. +-There is some problem with POSIX async I/O and 64 bit apps. +----------------------------- +-Revision 1.12 +-date: 98/04/22 12:08:25; author: capps; state: Exp; lines added/del: 3/3 +-Let the IRIX64 target default to its default compile mode. +----------------------------- +-Revision 1.11 +-date: 98/04/22 09:10:54; author: capps; state: Exp; lines added/del: 3/3 +-Bug fixes for 64 bit mode on IRIX, and addition +-on the internal inuse queue to insure that the +-internal struct_cache_ent structures are not released +-too early when doing direct I/O (async_read_no_copy). +----------------------------- +-Revision 1.10 +-date: 98/04/21 09:29:57; author: capps; state: Exp; lines added/del: 17/17 +-Improve dependencies +----------------------------- +-Revision 1.9 +-date: 98/04/20 16:05:48; author: capps; state: Exp; lines added/del: 58/29 +-Iozone now 64 bit application +----------------------------- +-Revision 1.8 +-date: 98/04/20 10:17:44; author: capps; state: Exp; lines added/del: 0/0 +-*** empty log message *** +----------------------------- +-Revision 1.7 +-date: 98/04/16 16:50:11; author: capps; state: Exp; lines added/del: 6/6 +-Have the SGI build 32 bit app too. +----------------------------- +-Revision 1.6 +-date: 98/04/15 16:48:09; author: capps; state: Exp; lines added/del: 5/5 +-Fix to make build on 9.05 and 10.1 +----------------------------- +-Revision 1.5 +-date: 98/04/13 10:22:34; author: capps; state: Exp; lines added/del: 14/6 +-Add support for libasync library. +----------------------------- +-Revision 1.4 +-date: 98/04/11 11:57:34; author: capps; state: Exp; lines added/del: 10/10 +-AAdd support for POSIX async I/O testing +----------------------------- +-Revision 1.3 +-date: 98/03/31 11:21:34; author: capps; state: Exp; lines added/del: 24/0 +-Add support for SGI IRIX and SGI IRIX64 +----------------------------- +-Revision 1.2 +-date: 98/03/25 13:59:18; author: capps; state: Exp; lines added/del: 21/9 +-Fixes for SPP-UX +----------------------------- +-Revision 1.1 +-date: 98/03/25 10:48:21; author: capps; state: Exp; +-Initial revision +-============================================================================= +-Added support for BIFF file output. Iozone can now write Excel spreadsheet +-format. This allows one to directly access the Excel spreadsheet without +-needing to import with tab and space delimited method. +- +-Added support for large files and threads for Solaris. +- +-Add support for FreeBSD +- +-Change default stride value to avoid nodalization with various spindle counts. +-============================================================================= +-Version 3.3: +-Changed name of processor_bind to ioz_processor_bind to avoid collision +-with SVR5.4.MP shared library. +-Removed leading tab on an #ifdef that caused some compilers to get sick. +-============================================================================= +-Version 3.4: +-Add support for OpenBSD +-============================================================================= +-Version 3.6: +-Lots of code cleanup. +-Added support for OSF1 on the DEC Alpha. +-============================================================================= +-Version 3.7: +-Add support for OSF Version 4. +-Add timer resolution problem detection. +- +-============================================================================= +-Add support for OSF Version 5. +-============================================================================= +-Version 3.13: +-Add support for Linux to use pthreads. +- +-============================================================================= +-Version 3.16: +-============================================================================= +-Add support for Netbsd +-Add support for Largefiles and Async I/O to Linux target +-============================================================================= +-Version 3.17: +-============================================================================= +-Removed small model for Linux. In the past Iozone was forced to +-use a small model for testing Linux as the normal load caused +-Redhat to panic. Redhat users have told me that the system now +-works fine with the normal load. They have tested Redhat 6.1 and +-it no longer panics. +-============================================================================= +-Version 3.18: +-============================================================================= +-Add support for BSDI. Base, largefiles, pthread. No async I/O +-============================================================================= +-Revision 3.19 +-============================================================================= +-date: 2000/03/08 14:47:21; author: capps; state: Exp; lines added/del: 4/1 +-Add support for getpagesize. This is used when available. +-============================================================================= +-Revision 3.20 +-============================================================================= +-date: 00/04/01 11:04:59; author: capps; state: Exp; lines added/del: 2/2 +-Fix for multiple filenames and range of threads being used. +-============================================================================= +-Revision 3.21 +-============================================================================= +-date: 00/04/01 11:10:54; author: capps; state: Exp; lines added/del: 3/1 +-SPPUX does not have getpagesize... +-============================================================================= +-Revision 3.22 +-============================================================================= +-Add support for Linux-ia64 +-Add support for mmap & normal file I/O mixing. +-============================================================================= +-Revision 3.23 +-Fixups for IBM AIX. +-============================================================================= +-Revision 3.24 +-Fixups for BSD 2.7 (New release of BSD that supports O_SYNC) +-============================================================================= +-Revision 3.27 +-Fixups for Cygnus compiler changes. (Windows targets). With this +-change Iozone will compile with at least 2 versions of the Cygnus +-compilers. +-============================================================================= +-Revision 3.28 +-============================================================================= +-Add support for reading and writing while holding lockf() on the file. +-This turns out to be important aspect of NFS benchmarking. +-============================================================================= +-Revision 3.29 +-============================================================================= +-Change calls to lockf() to calls to fcntl(). This is more portable. +-============================================================================= +-Revision 3.30 +-============================================================================= +-Add support for variable compute cycle time before each I/O +-operation. This allows one to more accuratly represent +-a specific application that is doing compute/read/compute/read +-style operations. +-============================================================================= +-Revision 3.30 through 3.37 +-============================================================================= +-Add support for read and write telemetry files. +-============================================================================= +-Revision 3.40 +-============================================================================= +-Code cleanup for popen() usage in -M path. +-============================================================================= +-Revision 3.41 +-============================================================================= +-Bug fix for ops/sec in rewrite throughput testing. +-Added average throughput to output in throughput mode. +-============================================================================= +-Revision 3.42 +-============================================================================= +-Bug fix for read and re-read. Usage of un-initialized variable that +-caused results to be wrong. +-============================================================================= +-Revision 3.43 +-============================================================================= +-Add support for latency plot data for throughput testing. +-Each child thread/process gets its own data file. +-============================================================================= +-Revision 3.44 +-============================================================================= +-Enhance compatibility of multi-thread/proc latency offsets with +-telemetry file support. +-============================================================================= +-Revision 3.45 through 3.48 +-============================================================================= +-Added latency/offset plot data files for all throughput tests. +-============================================================================= +-Revision 3.49 +-============================================================================= +-Fixed compile warning for Linux off64_t redefinition. +-Add Solaris2.6 target with simple build. +-============================================================================= +-Revision 3.50 +-============================================================================= +-Added support for openbsd-threads +-Cleanup for page size foo. +-============================================================================= +-Revision 3.51, 3.52, 3.53 +-============================================================================= +-Cleanup for new random write testing in throughput mode. +-Improve perror handling. +-============================================================================= +-Revision 3.54 +-============================================================================= +-Add -g maxfilesize so people will not have to edit the source to +-test files bigger than 512 Mbytes. +-============================================================================= +-Revision 3.55 +-============================================================================= +-Supports -n and -g to set the min and max file sizes to be used for +-an auto mode run. +-============================================================================= +-Revision 3.56 +-============================================================================= +-Added support for SCO Unixware SVR5 with gcc compiler +-============================================================================= +-Revision 3.57 +-============================================================================= +-Fixed bug where file locking was not being used when +-_LARGE_FILE64_SOURCE was defined in read_perf_test. +-============================================================================= +-Revision 3.58 +-============================================================================= +-Added -z option. This is to be used with the -a option. It +-provides more complete testing for small record sizes +-when the file sizes are very large. +-Fixed -a so that the cross-over mechanism works correctly. +-============================================================================= +-Revision 3.59 +-============================================================================= +-Fix a bug where the user specified -R -s but did not specify +--a or -r. This caused the Excel report to print a bunch +-of zeros. +-============================================================================= +-Revision 3.60 +-============================================================================= +-Fix headers in the Excel output when cross over kicks in. +-============================================================================= +-Revision 3.61 +-============================================================================= +-Added -y and -q to set record size range +-Added command line to output +-============================================================================= +-Revision 3.62 +-============================================================================= +-Put auto cross over back to 16 Meg +-============================================================================= +-Revision 3.63 +-============================================================================= +-Minor code cleanups for error messages +-============================================================================= +-Revision 3.64 +-============================================================================= +-Re-organize the help listing. +-============================================================================= +-Revision 3.65 +-============================================================================= +-Add labels to the latency/offset output files. +-============================================================================= +-Revision 3.66 +-============================================================================= +-Added Randy Dunlap to the list of contributors. Thanks Randy !! +-============================================================================= +-Revision 3.67 +-============================================================================= +-Fix labels when using -R and -i options together. +-============================================================================= +-Revision 3.68 +-============================================================================= +-Code cleanup. No functionality changes. +-============================================================================= +-Revision 3.69 +-============================================================================= +-Prevent mixed modes. Auto and throughput. +-Added support for the Plus extended options. +-============================================================================= +-Revision 3.70 +-============================================================================= +-Added support for -+u option. Cpu utilization. +-============================================================================= +-Revision 3.71 +-============================================================================= +-Added comment for the support for -+u option. Cpu utilization. +-============================================================================= +-Revision 3.72 +-============================================================================= +-Added network testing mode. -+m (Experimental) Tested: Linux, HP-UX +-============================================================================= +-Revision 3.73 +-============================================================================= +-Added -xflag support for distributed mode. +-Handle interrupts when in distributed mode. +-============================================================================= +-Revision 3.74 +-============================================================================= +-Add default for REMOTE_SHELL +-============================================================================= +-Revision 3.75 +-============================================================================= +-Code cleanup. +-============================================================================= +-Revision 3.76 +-============================================================================= +-Portability change for shmat(). +-Added and example of client_list file to the distribution. +-============================================================================= +-Revision 3.77 +-============================================================================= +-Disable CPU utilization in distributed mode. +-Bug fix for CPU utilization in normal mode. +-============================================================================= +-Revision 3.78 +-============================================================================= +-Fix compatibility with AIX for shmat() +-============================================================================= +-Revision 3.79 +-============================================================================= +-Fix throughput labels when user is selecting specific tests with -i option. +-============================================================================= +-Revision 3.80 +-============================================================================= +-Remove dependency on min() and max(). They are not portable. +-============================================================================= +-Revision 3.81 +-============================================================================= +-Changes for 64bit architectures. Brad Smith. OpenBSD. +-============================================================================= +-Revision 3.83 +-============================================================================= +-Add -+m cluster option to the help list and the list of options. +-============================================================================= +-Revision 3.84 -> 3.88 +-============================================================================= +-Fix file descriptor leak in cluster mode. +-============================================================================= +-Revision 3.89 -> 3.91 +-============================================================================= +-Support for heterogeneous clusters, bug fix for -C +-============================================================================= +-Revision 3.92 +-============================================================================= +-Add a small sleep in the client so the master's terminate message +-can arrive before the client exits and closes the channel. +-============================================================================= +-Revision 3.93 +-============================================================================= +-Add support for UWIN (Unix for Windows) +-============================================================================= +-Revision 3.94 +-============================================================================= +-Bug fix for client's working dir in cluster mode. +-============================================================================= +-Revision 3.95 +-============================================================================= +-Enable more options in Cluster mode. +-============================================================================= +-Revision 3.96 +-============================================================================= +-Add support for Solaris 8 in 64-bit mode. +-============================================================================= +-Revision 3.97 +-============================================================================= +-Linux demands a function proto for functions that take floats as args. +-============================================================================= +-Revision 3.98 +-============================================================================= +-Changes for Solaris to make their silly compiler eat reasonable +-function prototypes. (yech !!) +-============================================================================= +-Revision 3.99 +-============================================================================= +-Add protocol version checking for distributed messages. +-Add support for AIX 5.2 +-============================================================================= +-Revision 3.100 +-============================================================================= +-Fixes for socket ports. Needed to be in network format. +-============================================================================= +-Revision 3.101 +-============================================================================= +-Add support for RSH environment override. +-============================================================================= +-Revision 3.102 +-============================================================================= +-Improve O_DIRECT and VX_DIRECT so that testing is done +-on the correct file on the correct client. +-============================================================================= +-Revision 3.103 +-============================================================================= +-Code cleanup. +-============================================================================= +-Revision 3.104 +-============================================================================= +-Code cleanup. Bug fix for O_DIRECT in read_perf_test. +-============================================================================= +-Revision 3.105 +-============================================================================= +-Bug fix for TRU64 and OSF where reclen was not getting displayed. +-============================================================================= +-Revision 3.106 +-============================================================================= +-Add -+d file I/O diagnostic mode. +-============================================================================= +-Revision 3.107 +-============================================================================= +-Fixes for the awesome Diagnostics mode. +-============================================================================= +-Revision 3.108 +-============================================================================= +-turn off cdebug +-Switch child comm to SOCK_STREAM. Avoid UDP fragment problems. +-============================================================================= +-Revision 3.109 +-============================================================================= +-Fix for "disrupt" and Direct I/O. Needs to be page size and aligned. +-============================================================================= +-Revision 3.110 +-============================================================================= +-Cleanup for -Wall to all source files. +-============================================================================= +-Revision 3.111 +-============================================================================= +-Fixes for UWIN compile warnings. +-============================================================================= +-Revision 3.112 +-============================================================================= +-Fixes for Windows compile warnings. do_compute() proto. +-============================================================================= +-Revision 3.113 +-============================================================================= +-Add definition char *dumb for Solaris to alloc_mem() +-============================================================================= +-Revision 3.114 +-============================================================================= +-Code cleanup for AIX. No async support caused warnings. +-============================================================================= +-Revision 3.115 +-============================================================================= +-Fix for Solaris returning short reads() from socket to child_listen. +-============================================================================= +-Revision 3.116 +-============================================================================= +-Add support for Mac OS X +-============================================================================= +-Revision 3.117 +-============================================================================= +-Add code to set the socket buffer window size. Solaris needs this. +-============================================================================= +-Revision 3.118 +-============================================================================= +-Add O_Direct for AIX +-============================================================================= +-Revision 3.119-> 3.120 +-============================================================================= +-Fix some compiler warnings and implement the -+x option for +-setting the multiplier used for file and record size incrementing. +-============================================================================= +-Revision 3.121 +-============================================================================= +-Add changes from Debian. Add powerpc and sparc. +-Add changes to fix warning on Irix and Irix64 +-============================================================================= +-Revision 3.122 +-============================================================================= +-Bug fix for cluster mode. Need to bzero buffers before sprintf or sscanf +-============================================================================= +-Revision 3.123 +-============================================================================= +-Bug fix for handling all chars that are transported over messaging. +-============================================================================= +-Revision 3.124 +-============================================================================= +-Simplify the child's debug output mechanism. +-============================================================================= +-Revision 3.125 +-============================================================================= +-Fix for stonewall in cluster mode. +-============================================================================= +-Revision 3.126 +-============================================================================= +-Shrink the client_neutral_command structure so it fits in a single +-UDP packet. +-============================================================================= +-Revision 3.127 +-============================================================================= +-Improve debug code for cluster mode. +-============================================================================= +-Revision 3.128 +-============================================================================= +-Reduce the message traffic due to master's distribution of STOP. Only +-one STOP distribution is needed. More can lead to socket buffer overflows. +-============================================================================= +-Revision 3.129 +-============================================================================= +-Bzero structures on the stack before using. No problem seen but it +-is a possible hole. +-============================================================================= +-Revision 3.130 +-============================================================================= +-Add error checking for the client file contents. +-============================================================================= +-Revision 3.131 +-============================================================================= +-Use prealloc() for HP-UX to create file for use with mmap. +-============================================================================= +-Revision 3.132 +-============================================================================= +-Add random mix mode. +-============================================================================= +-Revision 3.133 +-============================================================================= +-Make a better 32 bit random offset from calling rand()<<16||rand() +-============================================================================= +-Revision 3.134 +-============================================================================= +-Add -+p percentage read option. +-============================================================================= +-Revision 3.135 +-============================================================================= +-Improve the mixed mode distribution algorithm. +-============================================================================= +-Revision 3.136 +-============================================================================= +-Fix auto bug introduced by mixed mode testing. +-Introduce -+r for O_RSYNC. +-============================================================================= +-Revision 3.137 +-============================================================================= +-Code cleanup for some warnings on IA-64 systems. +-============================================================================= +-Revision 3.138 +-============================================================================= +-Fixes for FreeBSD +-============================================================================= +-Revision 3.139 +-============================================================================= +-Add support for multiple -r and -s options. +-============================================================================= +-Revision 3.140 +-============================================================================= +-Code cleanup for non-ansi builds +-Add target build to output. +-============================================================================= +-Revision 3.141 +-============================================================================= +-Add speed check code. +-============================================================================= +-Revision 3.142 +-============================================================================= +-Increase maximum threads/procs to 256 +-============================================================================= +-Revision 3.143 +-============================================================================= +-Add contribs and -+t to help splash screen. +-============================================================================= +-Revision 3.144 +-============================================================================= +-Bug fix for Redhat. +-============================================================================= +-Revision 3.145 +-============================================================================= +-Bug fix for when user used -l but failed to use -u too. +-============================================================================= +-Revision 3.146 +-============================================================================= +-Add void to speed_main() for non-ansi compiles. +-============================================================================= +-Revision 3.147 +-============================================================================= +-Add "Test running" So users will know the test is running +-and not to hit control 'c' too soon. +-Bug fix in libbif.c do_float() +-============================================================================= +-Revision 3.148 +-============================================================================= +-Turn off some child debug code. +-============================================================================= +-Revision 3.149 +-============================================================================= +-Disable fread and fwrite testing if mmap or async is in use. +-============================================================================= +-Revision 3.150 +-============================================================================= +-Add pread/pwrite to Linux +-============================================================================= +-Revision 3.151 +-============================================================================= +-Handle -EB +-============================================================================= +-Revision 3.152 +-============================================================================= +-Add pread/pwrite throughput testing +-============================================================================= +-Revision 3.153 +-============================================================================= +-Changed second parameter to mmap() to be size_t. AIX needs this. +-============================================================================= +-Revision 3.154 +-============================================================================= +-Add support for madvise(). +-============================================================================= +-Revision 3.155 +-============================================================================= +-Code cleanup. +-============================================================================= +-Revision 3.156 +-============================================================================= +-Fixes for -w -t -R from Veritas +-============================================================================= +-Revision 3.157 +-============================================================================= +-Make madvise() go away for windows. +-============================================================================= +-Revision 3.158 +-============================================================================= +-Permit smaller values for -n and -g +-============================================================================= +-Revision 3.159 +-============================================================================= +-Make initial write in initfile() a page size request. +-============================================================================= +-Revision 3.160 +-============================================================================= +-Stop test if file can not be written. +-============================================================================= +-Revision 3.161 +-============================================================================= +-Special handling for mmap of a file that is opened (O_DIRECT) +-============================================================================= +-Revision 3.162 +-============================================================================= +-Fixup for systems that do not have O_DIRECT. +-============================================================================= +-Revision 3.163 +-============================================================================= +-Simplify the prototype for do_compute() +-============================================================================= +-Revision 3.164 +-============================================================================= +-Zero compute_val inside of loops. +-============================================================================= +-Revision 3.165 +-============================================================================= +-Add support for O_DIRECT for IRIX and IRIX64 +-============================================================================= +-Revision 3.166 +-============================================================================= +-Improve macros and add prototypes. +-============================================================================= +-Revision 3.167 +-============================================================================= +-Improve resolution of get_resolution(). +-============================================================================= +-Revision 3.168 +-============================================================================= +-Changes to support RedHat 9.0. +-============================================================================= +-Revision 3.169 +-============================================================================= +-Special handling of NAME for broken frontend in Cygwin/Windows env. +-============================================================================= +-Revision 3.170 +-============================================================================= +-Add support for the CrayX1 +-============================================================================= +-Revision 3.171 +-============================================================================= +-Remove reference to PAGE_SIZE for linux. This causes problems +-with SuSe 8. +-============================================================================= +-Revision 3.172 +-============================================================================= +-Fixup for SCO build. +-============================================================================= +-Revision 3.173 +-============================================================================= +-Add -DHAVE_PREAD for Solaris8-64 target. +-============================================================================= +-Revision 3.174 +-============================================================================= +-Code cleanup for Linux +-============================================================================= +-Revision 3.177 +-============================================================================= +-Improve -+d so that each byte is more unique. +-Improve byte level validation. +-============================================================================= +-Revision 3.178 +-============================================================================= +-Provide byte level error detection with Found char and Expecting Char in +- -+d mode. +-============================================================================= +-Revision 3.179 +-============================================================================= +-Improve speed of -+d without losing uniqueness of bytes. +-============================================================================= +-Revision 3.180 +-============================================================================= +-Fix so that Windows can use multiple processes. Needed mmap like SCO. +-============================================================================= +-Revision 3.181 +-============================================================================= +-Use malloc() instead of mmap() for threads memory, instead of mmap. +-============================================================================= +-Revision 3.182 +-============================================================================= +-Make CPU utilization use doubles everywhere. +-============================================================================= +-Revision 3.183 +-============================================================================= +-Add support for CPU utilization while in distributed mode. +-============================================================================= +-Revision 3.184 +-============================================================================= +-Make all times relative so multi node can do CPU usage. +-============================================================================= +-Revision 3.185 +-============================================================================= +-Remove unused variables. +-============================================================================= +-Revision 3.186 +-============================================================================= +-Add -+n option to disable re-testing. +-============================================================================= +-Revision 3.187 +-============================================================================= +-Fixup -+n for throughput mode. +-============================================================================= +-Revision 3.188 +-============================================================================= +-Fix Excel output when -+n is used. +-============================================================================= +-Revision 3.189 +-============================================================================= +-Add support for the IBM S390 running Linux. +-============================================================================= +-Revision 3.190 +-============================================================================= +-Cleanup naming conventions for the S390 and fixup a #define. +-============================================================================= +-Revision 3.191 +-============================================================================= +-Add 64 bit compiles for s390x +-Move BIG_ENDIAN to ZBIG_ENDIAN to avoid header conflicts. +-============================================================================= +-Revision 3.192 +-============================================================================= +-Make random offsets always based on 48 bit random values. +-============================================================================= +-Revision 3.193 +-============================================================================= +-Addition for make random offsets always based on 48 bit random values. +-============================================================================= +-Revision 3.194 +-============================================================================= +-Make rands long longs. +-============================================================================= +-Revision 3.195 +-============================================================================= +-Bug fix for 48 bit rands in bsd4_2 and Windows. +-============================================================================= +-Revision 3.196 +-============================================================================= +-Make big_rand a long long. +-============================================================================= +-Revision 3.197 +-============================================================================= +-Inject Erik's changes for Multi-client Windows. +-============================================================================= +-Revision 3.198 +-============================================================================= +-Change proto version due to changes in Windows -+m support. +-Add Eric to the contributors list. +-============================================================================= +-Revision 3.199 +-============================================================================= +-Add more Windows support. +-============================================================================= +-Revision 3.200 +-============================================================================= +-Spelling error. +-============================================================================= +-Revision 3.201 +-============================================================================= +-Bug fixes from Erik H. +-============================================================================= +-Revision 3.202 +-============================================================================= +-Reduce usage of shared memory. +-============================================================================= +-Revision 3.203 +-============================================================================= +-Eliminate STUPID warning from the silly compiler. +-============================================================================= +-Revision 3.204 +-============================================================================= +-Changes to remove warnings on BSD. Thanks to Christian Weisgerber +-============================================================================= +-Revision 3.205 +-============================================================================= +-Support for the AMD64 +-============================================================================= +-Revision 3.206 +-============================================================================= +-Add -+k for constant aggregate data set size in throughput mode. +-============================================================================= +-Revision 3.207 +-============================================================================= +-Add pread support for the TRU64 target. Department of Defense in Canada. +-Add -+q for delay in seconds between tests. +-============================================================================= +-Revision 3.208 +-============================================================================= +-Move variable up, GCC on Solaris was getting a bogus parse error +-============================================================================= +-Revision 3.209 +-============================================================================= +-Add support for -+D (O_DSYNC) mode testing. +-============================================================================= +-Revision 3.210 +-============================================================================= +-Make O_DSYNC conditional. +-============================================================================= +-Revision 3.211 +-============================================================================= +-Add telemetry support for pread/pwrite +-============================================================================= +-Revision 3.212 +-============================================================================= +-Add record locking +-Add single file, file sharing. +-============================================================================= +-Revision 3.213 +-============================================================================= +-Enhance fill/verify (diag mode) for shared file. +-============================================================================= +-Revision 3.214 +-============================================================================= +-Remove warnings. +-============================================================================= +-Revision 3.215 +-============================================================================= +-Add prototype for mylockr() +-============================================================================= +-Revision 3.216 +-============================================================================= +-Fix prototype for mylockr +-============================================================================= +-Revision 3.217 +-============================================================================= +-Enable options for Windows systems. +-============================================================================= +-Revision 3.218 +-============================================================================= +-Add label to Excel spreadsheet that describes the rows and columns. +-Add support for Solaris64 with VxFS. +-Add support for Linux-arm +-============================================================================= +-Revision 3.219 +-============================================================================= +-Add sleep to permit child to get connection up before master does connect. +-============================================================================= +-Revision 3.220 +-============================================================================= +-Improve master connect to child, without delays. +-============================================================================= +-Revision 3.221 +-============================================================================= +-Add -+B Mixed sequential testing. BlueArc request. +-============================================================================= +-Revision 3.222 +-============================================================================= +-Workaround for bug in Cygwin's sscanf +-============================================================================= +-Revision 3.223 +-============================================================================= +-Add transfer size to the output from -Q +-============================================================================= +-Revision 3.224 +-============================================================================= +-Work around for TCP_WAIT in Windows. +-============================================================================= +-Revision 3.225 +-============================================================================= +-Fix for broken rsh on Windows. +-============================================================================= +-Revision 3.226 +-============================================================================= +-Workaround for gcc 3.4. From the folks at Gentoo.org. +-============================================================================= +-Revision 3.227 +-============================================================================= +-Enable -+m and telemetry files. +-============================================================================= +-Revision 3.228 +-============================================================================= +-Make more unique file names for mmap files. +-============================================================================= +-Revision 3.229 +-============================================================================= +-Add -+T time stamps. +-============================================================================= +-Revision 3.230 +-============================================================================= +-Bug fix for -m and validation code. +-============================================================================= +-Revision 3.231 +-============================================================================= +-Add a space to the throughput output dump. +-============================================================================= +-Revision 3.232 +-============================================================================= +-Add another space to the throughput output dump. +-============================================================================= +-Revision 3.233 +-============================================================================= +-Enable shared file with no locking +-============================================================================= +-Revision 3.234 +-============================================================================= +-Add sanity check to validate that open(name, O_CREAT | O_WRONLY | O_TRUNC, 0) +-does work correctly. This is an NFS client test that +-detects if the NFS server's local filesystem is broken and +-fails to support the sequence above correctly. +-============================================================================= +-Revision 3.235 +-============================================================================= +-add a close(fd) to the sanity test. +-============================================================================= +-Revision 3.237 +-============================================================================= +-Transport the -o flag to remote clients. +-============================================================================= +-Revision 3.238 +-============================================================================= +-Fix hang when using HP-UX master, Linux client, ssh buildup. +-============================================================================= +-Revision 3.239 +-============================================================================= +-Add -+h hostname. Permits one to manually set the hostname. For systems +-with multiple names/NICs. +-============================================================================= +-Revision 3.241 +-============================================================================= +-Add -+h, set hostname, and fix Solaris hang. +-============================================================================= +-Revision 3.242 +-============================================================================= +-Remove the side effect of no-rereads when using -w. Now use -+n for +-consistancy. +-============================================================================= +-Revision 3.243 +-============================================================================= +-Bug fix for -+k option. +-============================================================================= +-Revision 3.246 +-============================================================================= +-Add the -+U for WIN32 API calls .. Unbuffered I/O. Sony studios. +-============================================================================= +-Revision 3.247 +-============================================================================= +-Add support for -+U with -K (WIN32API calls + Jitter) +-============================================================================= +-Revision 3.248 +-============================================================================= +-Bug fix. -J with -+m not passing compute delay correctly. +-============================================================================= +-Revision 3.249 +-============================================================================= +-Add support for -i 8 when used with -+B (sequential mix) +-============================================================================= +-Revision 3.250 +-============================================================================= +-Change the default pattern. Samba is trying to cheat by +-special casing IOZONE.tmp, and the pattern of 0xA5. +-============================================================================= +-Revision 3.251 +-============================================================================= +-Make the default pattern random, and based on Iozone version. +-This is to prevent the hack from Richard Sharpe (in Samba) +-from special casing Iozone, and lying to the user. +-============================================================================= +-Revision 3.252 +-============================================================================= +-bug fix in pattern gen. +-============================================================================= +-Revision 3.253 +-============================================================================= +-Add -+Z old data set mode. +-Add -+X constant data for short circuit testing only. +-============================================================================= +-Revision 3.254 +-============================================================================= +- Multi-node changes for new options. (-+Z and -+X) +-============================================================================= +-Revision 3.255 +-============================================================================= +-Add -+K flag for Sony. +-============================================================================= +-Revision 3.256 +-============================================================================= +-Move -+K outside of Windows only. +-============================================================================= +-Revision 3.257 +-============================================================================= +-Simplify percentage calculation +-============================================================================= +-Revision 3.258 +-============================================================================= +-Add error checking for -f and -F in the wrong modes. +-============================================================================= +-Revision 3.259 +-============================================================================= +-Bug fix for pbuffer allocation on remote clients. +-============================================================================= +-Revision 3.260 +-============================================================================= +-Check for max_rec_size when using ranges. -r -r -r +-============================================================================= +-Revision 3.261 +-============================================================================= +-Fix for Debian user bug. -r 1m -n 1m -g 2m gave bogus error. +-============================================================================= +-Revision 3.262 +-============================================================================= +-Bug fix for -k used in conjunction with -t and content validation. +-============================================================================= +-Revision 3.263 +-============================================================================= +-Bug fix for -k used in conjunction with -t and content validation. +-============================================================================= +-Revision 3.264 +-============================================================================= +-Add DragonFly target. +-============================================================================= +-Revision 3.265 +-============================================================================= +-Put PER_VECTOR_OFFSET in for HP-UX +-============================================================================= +-Revision 3.266 +-============================================================================= +-Fix compiler warning messages +-============================================================================= +-Revision 3.267 +-============================================================================= +-Enforce minimum file size of page_size +-============================================================================= +-Revision 3.268 +-============================================================================= +-Minor fixes. +-============================================================================= +-Revision 3.269 +-============================================================================= +-Check fsync and close for errors. +-============================================================================= +-Revision 3.270 +-============================================================================= +-Adding support for testing block devices. Will be done is phases. This is +-phase 1. (Single threaded mode only) +-============================================================================= +-Revision 3.271 +-============================================================================= +-Adding 4 token support to client_list. Each entry may now contain 4 tokens +-and the new one is the absolute path to the temp file for testing. +-============================================================================= +-Revision 3.272 +-Editorial change. +-============================================================================= +-Revision 3.273 +-Add support for external monitor start & stop for throughput tests. +-IMON_START and IMON_STOP environmental variables used. +-============================================================================= +-Revision 3.274 +-============================================================================= +-minor change. +-============================================================================= +-Revision 3.275 +-Bug fix for systems without O_DIRECT. Fall through in switch statement. +-============================================================================= +-Revision 3.276 +-Fix for -c -t over NFS and initial writer close() when told by another to stop +-============================================================================= +-Revision 3.277 +-Add Benny Halevy to contributors list. +-============================================================================= +-Revision 3.278 +-Fix for Cygwin environment. +-============================================================================= +-Revision 3.279 +-Code cleanup, and add arg to external trigger. +-============================================================================= +-Revision 3.280 +-Code fixes for macosx +-============================================================================= +-============================================================================= +-Revision 3.281 +-Add support for building with Sun's Studio 11 compiler +-============================================================================= +-Revision 3.283 +-Bug fix for fread/fwrite with > 2Gig files. +-============================================================================= +-Revision 3.287 +-Add O_DIRECT for Windows +-============================================================================= +-Revision 3.288 +-Add -+w dedup testing mode. +-============================================================================= +-Revision 3.289 +-Make remaining non-dedup data unique. +-============================================================================= +-Revision 3.290 +-Make non-dedupable more unique. +-============================================================================= +-Revision 3.291 +-Bug fix for non-dedup. +-============================================================================= +-Revision 3.292 +-Make random offsets unique, using Knuth shuffle. +-============================================================================= +-Revision 3.292 +-free memory used for random offset uniqueness. +-============================================================================= +-Revision 3.294 +-Make unique/random offsets 64bits. +-============================================================================= +-Revision 3.295 +-Add fallback for random/unique. +-============================================================================= +-Revision 3.296 +-Make non-dedup region more unique +-============================================================================= +-Revision 3.297 +-Add -+y ## to set percentage of interior dedup. +-============================================================================= +-Revision 3.298 +-Add -+y ## to set percentage of interior dedup. +-============================================================================= +-Revision 3.299 +-Bug fixes for -+w and -+y +-============================================================================= +-Revision 3.300 +-Minor fix for dedup +-============================================================================= +-Revision 3.302 +-Adding -+C to set percent of dedupable within a file. +-============================================================================= +-Revision 3.303 +-bug fix +-============================================================================= +-Revision 3.304 +-Add solaris to read sync O_RSYNC +-============================================================================= +-Revision 3.305 +-Add space to avoid field output touching each other. +-============================================================================= +-Revision 3.306 +-Add check for config file exceeding MAXSTREAMS. +-============================================================================= +-Revision 3.307 +-Add new contributor's name. +-============================================================================= +-Revision 3.308 +-Fix type-oh +-============================================================================= +-Revision 3.309 +-Bug fix. rewrite_rec needed to fill entire buffer, or later stride read will +-fail. +-============================================================================= +-Revision 3.310 +-============================================================================= +-Add ability for remote clients to return errors to the master and +-have the master display on output. +-============================================================================= +-Revision 3.311 +-============================================================================= +-fix double reporting of client errors +-============================================================================= +-Revision 3.312 +-============================================================================= +-Eliminate extra file descriptor in fwrite test. +-============================================================================= +-Revision 3.312 +-============================================================================= +-bug fix for barray allocation in -T mode +-============================================================================= +-Revision 3.313 +-Revision 3.314 +-Revision 3.315 +-============================================================================= +-Changes from Debian: Retry umount, add fileop for linux-sparc, and +-fix column width in fileop for faster boxes. +-============================================================================= +-Revision 3.316 +-Add O_DIRECT support to FreeBSD +-============================================================================= +-Revision 3.317 +-Fix for defines in FreeBSD +-============================================================================= +-Revision 3.318 +-Add IMON_SYNC to enable monitor scripts to be run sync. +-============================================================================= +-Revision 3.319 +-Add directio() for Solaris +-============================================================================= +-Revision 3.320 +-Add fixes for unresolved references in directio() for Solaris +-============================================================================= +-Revision 3.321 +-Fix type oh. +-============================================================================= +-Revision 3.322 +-Fix c++ style comment back to 'C' style comment. +-============================================================================= +-Revision 3.323 +-Bug fix for check_filenames and large files +-============================================================================= +-Revision 3.324 +-Replace tripple rand() calls with 64 bit Mersene twister. +-============================================================================= +-Revision 3.325 +-Add read-only, external file, with no-verify. -+E +-============================================================================= +-Revision 3.325 +-Permit -+E on dedup files. +-============================================================================= +-Revision 3.327 +-Permit -+E on random read only testing, on existing file. +-============================================================================= +-Revision 3.328 +-Add passing master listener's port to remote children if it is not +-HOST_LIST_PORT +-============================================================================= +-Revision 3.329 +-Adding Dave Boone's notruncate option -+N +-============================================================================= +-Revision 3.330 +-Bug fix for Dave's code. +-============================================================================= +-Revision 3.331 +-Add multi -t ops. Fabrice +-============================================================================= +-Revision 3.332 +-Added Li Qin's multi dedup set support. -+S # +-============================================================================= +-Revision 3.333 +-Bug fix for -+S dedup_mseed needs to be an integer +-============================================================================= +-Revision 3.334 +-Make -+S generate more uniqueness +-============================================================================= +-Revision 3.335 +-Make -+S generate more uniqueness +-============================================================================= +-Revision 3.336 +-Make -+S generate more uniqueness +-============================================================================= +-Revision 3.337 +-Bug fix for -+S +-============================================================================= +-Revision 3.338 +-Make umount/remount more robust, in the face of server errors. +-============================================================================= +-Revision 3.339 +-Improve the help string for the -+S option. +-============================================================================= +-Revision 3.340 +-Add new contributor name. +-============================================================================= +-Revision 3.342 +-Add support for the programmable interdimensional timer. +-============================================================================= +-Revision 3.343 +-Bug fix for PIT on remote clients. +-============================================================================= +-Revision 3.344 +-Bug fix for PIT on remote clients. +-============================================================================= +-Revision 3.345 +-Have children re-acquire get_resolution. +-============================================================================= +-Revision 3.346 +-Bug fix for t_range addition. +-============================================================================= +-Revision 3.347 +-Get rid of a warning. ( An invalid warning, but none the less ) +-============================================================================= +-Revision 3.348 +-Add more words to the usage warnings and license +-============================================================================= +-Revision 3.349 +-Remove Ascii dependency for IBM's Z/OS that speaks EBCDIC. +-============================================================================= +-Revision 3.353 +-Add support for SUA +-============================================================================= +-Revision 3.354 +-Remove Sanity check so that SMB on Windows, under SUA, works +-============================================================================= +-Revision 3.355 +-Cache the getaddrinfo call. +-============================================================================= +-Revision 3.356 +-delete optimization.. bad...Cache the getaddrinfo call. +-============================================================================= +-Revision 3.358 +-Change pit to use unsigned long longs +-============================================================================= +-Revision 3.359 +-Add Linux processor affinity +-============================================================================= +-Revision 3.360 +-Remove UDP usage +-============================================================================= +-Revision 3.361 +-Increment protocol_version to catch incompat versions. +-============================================================================= +-Revision 3.362 +-Fixup for new include needed by Solaris10 +-============================================================================= +-Revision 3.363 +-Patch for Mac errno +-============================================================================= +-Revision 3.364 +-Patch for Mac printf's +-============================================================================= +-Revision 3.365 +-Fix Josh's introduction of new Linux warnings. +-============================================================================= +-Revision 3.366 +-Take sleep(1) out put path, deal with it in error/retry path +-============================================================================= +-Revision 3.367 +-Add -+z latency histogram logging. +-============================================================================= +-Revision 3.368 +-Format change for the -+z latency histogram logging. +-============================================================================= +-Revision 3.369 +-Added -+O Op_rate control. +-============================================================================= +-Revision 3.370 +-Close race condition with master closing socket to child async reader +-============================================================================= +-Revision 3.371 +-Add "mygen" generation to the remote children protocol. +-This prevents zombies from coming back to life and killing future masters. +-============================================================================= +-Revision 3.372 +-Set Listen(s,100) to Listen(s,MAXSTREAMS) +-============================================================================= +-Revision 3.373 +-Move lable "again" to outside of cdebug. +-============================================================================= +-Revision 3.374 +-More fixes for busted crap in Solaris !!! +-============================================================================= +-Revision 3.376 +-AIX update. They now have errno.h +-============================================================================= +-Revision 3.377 +-Need errno.h for FreeBSD +-============================================================================= +-Revision 3.379 +-Need to include errno.h for Cygwin +-============================================================================= +-Revision 3.381 +-Add SO_LINGER for master_listen and child_listen, so that wind-blows +-will work like all other systems on the planet. +-============================================================================= +-Revision 3.382 +-Fix for linger addition +-============================================================================= +-Revision 3.383 +-Fix for linger addition +-============================================================================= +-Revision 3.384 +-Fix for linger addition +-============================================================================= +-Revision 3.385 +-Make linger for all +-============================================================================= +-Revision 3.387 +-Change sleep() calls, that help connect() to nanosleep() calls. +-============================================================================= +-Revision 3.388 +-Fixup remainder for nanosleep() +-============================================================================= +-Revision 3.389 +-Fixup remainder for nanosleep() +-============================================================================= +-Revision 3.390 +-Add code for pread/pwrite from Ben England (Redhat) +-============================================================================= +-Revision 3.391 +-Add code for MDEBUG and CDEBUG from Bob England (Redhat) +-============================================================================= +-Revision 3.392 +-Add code for building HPUX. Errno.h +-============================================================================= +-Revision 3.393 +-Fixes for Windows (nanosleep doesn't always work ) +-============================================================================= +-Revision 3.394 +-Fixes for preadv and pwritev from RedHat (Ben Englanc) +-============================================================================= +-Revision 3.395 +-Add warnings for default switch cases, and exit with value for unknowns. +-============================================================================= +-Revision 3.396 +-Fix warnings from RedHat patches +-============================================================================= +-Revision 3.397 +-Bug fix for getopt default case, with bad parameter handed in. +-============================================================================= +-Revision 3.398 +-Adding thread_read_test and thread_write_test. +-============================================================================= +diff --git a/src/components/appio/tests/iozone/Generate_Graphs b/src/components/appio/tests/iozone/Generate_Graphs +deleted file mode 100755 +index 7c14a9a14..000000000 +--- a/src/components/appio/tests/iozone/Generate_Graphs ++++ /dev/null +@@ -1,32 +0,0 @@ +-# +-# This script will create the Iozone graphs using +-# gnuplot. +-# +-# +-# +-# ------------------------------------------------ +-# YOU MUST PROVIDE A FILE NAME FOR IT TO PROCESS. +-# This filename is the name of the file where you +-# sent Iozone's output. +-# ------------------------------------------------ +- +-# Generate data base for all of the operation types. +- +-./gengnuplot.sh $1 write +-./gengnuplot.sh $1 rewrite +-./gengnuplot.sh $1 read +-./gengnuplot.sh $1 reread +-./gengnuplot.sh $1 randread +-./gengnuplot.sh $1 randwrite +-./gengnuplot.sh $1 bkwdread +-./gengnuplot.sh $1 recrewrite +-./gengnuplot.sh $1 strideread +-./gengnuplot.sh $1 fwrite +-./gengnuplot.sh $1 frewrite +-./gengnuplot.sh $1 fread +-./gengnuplot.sh $1 freread +- +-# Produce graphs and postscript results. +-gnuplot gnu3d.dem +- +- +diff --git a/src/components/appio/tests/iozone/Gnuplot.txt b/src/components/appio/tests/iozone/Gnuplot.txt +deleted file mode 100644 +index c62e08e86..000000000 +--- a/src/components/appio/tests/iozone/Gnuplot.txt ++++ /dev/null +@@ -1,23 +0,0 @@ +-The script Generate_Graphs will create the 3D surface plots +-and display them. It will also produce postscript outputs +-for each test and leave them in their respective sub-directory. +- +-It processes the output from an Iozone run. The output from +-Iozone that it is expecting is the text output from +-the iozone default behavior. (iozone -a, or iozone -az) +- +-How to produce graphs: +- +- Generate_Graphs iozone.out +- +-The gen_graphs script will: +-1. Create the databases for each type of operation +- and then processes them with Gnuplot. +-2. It will display each result on the X11 screen, and +- also save a copy in postscript in the test sub-directory. +- +- +-Thanks to Yves Rougy for providing the nifty scripts to help +-with the plots. +- +- +diff --git a/src/components/appio/tests/iozone/client_list b/src/components/appio/tests/iozone/client_list +deleted file mode 100644 +index c3f043bec..000000000 +--- a/src/components/appio/tests/iozone/client_list ++++ /dev/null +@@ -1,36 +0,0 @@ +-# +-# Lines that start with # in column 0 are comments. +-# +-# There are now two formats supported. +-# Format: 3 fields, space delimited. +-# Format: 4 fields, space delimited. +-# +-# Format: 3 fields, space delimited. +-# client_name working_dir_on_client path_to_iozone_on_client +-# Format: 4 fields, space delimited. +-# client_name working_dir_on_client path_to_iozone_on_client path_to_testfile +-# +-# Example: With two clients (format 3 fields) +-# +-# client1 /home/user/tmp /home/user/tmp/iozone +-# client2 /home/user/tmp /home/user/tmp/iozone +-# +-# +-# Example: With two copies of Iozone on each of the two clients +-# (format 3 fields) +-# +-# client1 /home/user/tmp /home/user/tmp/iozone +-# client1 /home/user/tmp /home/user/tmp/iozone +-# client2 /home/user/tmp /home/user/tmp/iozone +-# client2 /home/user/tmp /home/user/tmp/iozone +-# +-# Example: With two clients (format 4 fields) +-# client1 /home/user/tmp /home/user/tmp/iozone /tmp/foo1 +-# client2 /home/user/tmp /home/user/tmp/iozone /tmp/foo2 +-# +-# Example: With two copies of Iozone on each of the two clients +-# (format 4 fields) +-# client1 /home/user/tmp /home/user/tmp/iozone /tmp/foo1 +-# client1 /home/user/tmp /home/user/tmp/iozone /tmp/foo2 +-# client2 /home/user/tmp /home/user/tmp/iozone /tmp/foo3 +-# client2 /home/user/tmp /home/user/tmp/iozone /tmp/foo4 +diff --git a/src/components/appio/tests/iozone/fileop.c b/src/components/appio/tests/iozone/fileop.c +deleted file mode 100644 +index 588a2d279..000000000 +--- a/src/components/appio/tests/iozone/fileop.c ++++ /dev/null +@@ -1,1389 +0,0 @@ +-/* +- * Author: Don Capps +- * 3/13/2006 +- * +- * Author: Don Capps (capps@iozone.org) +- * 7417 Crenshaw +- * Plano, TX 75025 +- * +- * Copyright 2006, 2007, 2008, 2009 Don Capps. +- * +- * License to freely use and distribute this software is hereby granted +- * by the author, subject to the condition that this copyright notice +- * remains intact. The author retains the exclusive right to publish +- * derivative works based on this work, including, but not limited to, +- * revised versions of this work", +- * +- * +- fileop [-f X ]|[-l # -u #] [-s Y] [-e] [-b] [-w] [-d ] [-t] [-v] [-h] +- -f # Force factor. X^3 files will be created and removed. +- -l # Lower limit on the value of the Force factor. +- -u # Upper limit on the value of the Force factor. +- -s # Optional. Sets filesize for the create/write. May use suffix 'K' or 'M'. +- -e Excel importable format. +- -b Output best case. +- -w Output worst case. +- -d Specify starting directory. +- -U Mount point to remount between tests. +- -t Verbose output option. +- -v Version information. +- -h Help text. +- * +- * X is a force factor. The total number of files will +- * be X * X * X ( X ^ 3 ) +- * The structure of the file tree is: +- * X number of Level 1 directories, with X number of +- * level 2 directories, with X number of files in each +- * of the level 2 directories. +- * +- * Example: fileop 2 +- * +- * dir_1 dir_2 +- * / \ / \ +- * sdir_1 sdir_2 sdir_1 sdir_2 +- * / \ / \ / \ / \ +- * file_1 file_2 file_1 file_2 file_1 file_2 file_1 file_2 +- * +- * Each file will be created, and then 1 byte is written to the file. +- * +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include +- +-#if defined(Windows) +-#include +-#endif +-#if !defined(PATH_MAX) +-#define PATH_MAX 255 +-#endif +- +-#if defined(_SUA_) +-extern char *optarg; +-extern char *opterr; +-int fsync(); +-int getopt(); +-#endif +-int junk, *junkp; +-int x,excel; +-int verbose = 0; +-int sz = 1; +-char *mbuffer; +-int incr = 1; +-#define _STAT_CREATE 0 +-#define _STAT_WRITE 1 +-#define _STAT_CLOSE 2 +-#define _STAT_LINK 3 +-#define _STAT_UNLINK 4 +-#define _STAT_DELETE 5 +-#define _STAT_STAT 6 +-#define _STAT_ACCESS 7 +-#define _STAT_CHMOD 8 +-#define _STAT_READDIR 9 +-#define _STAT_DIR_CREATE 10 +-#define _STAT_DIR_DELETE 11 +-#define _STAT_READ 12 +-#define _STAT_OPEN 13 +-#define _STAT_DIR_TRAVERSE 14 +-#define _NUM_STATS 15 +-struct stat_struct { +- double starttime; +- double endtime; +- double speed; +- double best; +- double worst; +- double dummy; +- double total_time; +- double dummy1; +- long long counter; +-} volatile stats[_NUM_STATS]; +- +- +-static double time_so_far(void); +-void dir_create(int); +-void dir_traverse(int); +-void dir_delete(int); +-void file_create(int); +-void file_stat(int); +-void file_access(int); +-void file_chmod(int); +-void file_readdir(int); +-void file_delete(int); +-void file_link(int); +-void file_unlink(int); +-void file_read(int); +-void splash(void); +-void usage(void); +-void bzero(); +-void clear_stats(); +-int validate(char *, int , char ); +- +-#define THISVERSION " $Revision$" +-/*#define NULL 0*/ +- +-char version[]=THISVERSION; +-char thedir[PATH_MAX]="."; /* Default is to use the current directory */ +-const char *mountname=NULL; /* Default is not to unmount anything between the tests */ +- +-int cret; +-int lower, upper,range; +-int i; +-int best, worst; +-int dirlen; +- +-/************************************************************************/ +-/* Routine to purge the buffer cache by unmounting drive. */ +-/************************************************************************/ +-void purge_buffer_cache() +-{ +- if (!mountname) +- return; +- +- char cwd[PATH_MAX]; +- char command[1024]; +- int ret,i; +- +- junkp=(int *)getcwd(cwd, sizeof(cwd)); +- junk=chdir("/"); +- strcpy(command,"umount "); +- strcat(command, mountname); +- /* +- umount might fail if the device is still busy, so +- retry unmounting several times with increasing delays +- */ +- for (i = 1; i < 10; ++i) { +- ret = system(command); +- if (ret == 0) +- break; +- sleep(i); /* seconds */ +- } +- strcpy(command,"mount "); +- strcat(command, mountname); +- junk=system(command); +- junk=chdir(cwd); +-} +- +-int main(int argc, char **argv) +-{ +- if(argc == 1) +- { +- usage(); +- exit(1); +- } +- while((cret = getopt(argc,argv,"hbwetvf:s:l:u:d:U:i: ")) != EOF){ +- switch(cret){ +- case 'h': +- usage(); +- exit(0); +- break; +- case 'd' : +- dirlen=strlen(optarg); +- if (optarg[dirlen-1]=='/') +- --dirlen; +- strncpy(thedir, optarg, dirlen); +- thedir[dirlen] = 0; +- break; +- case 'U': +- mountname = optarg; +- break; +- case 'i': /* Increment force by */ +- incr=atoi(optarg); +- if(incr < 0) +- incr=1; +- break; +- case 'f': /* Force factor */ +- x=atoi(optarg); +- if(x < 0) +- x=1; +- break; +- case 's': /* Size of files */ +- sz=atoi(optarg); +- if(optarg[strlen(optarg)-1]=='k' || +- optarg[strlen(optarg)-1]=='K'){ +- sz = (1024 * atoi(optarg)); +- } +- if(optarg[strlen(optarg)-1]=='m' || +- optarg[strlen(optarg)-1]=='M'){ +- sz = (1024 * 1024 * atoi(optarg)); +- } +- if(sz < 0) +- sz=1; +- break; +- case 'l': /* lower force value */ +- lower=atoi(optarg); +- range=1; +- if(lower < 0) +- lower=1; +- break; +- case 'v': /* version */ +- splash(); +- exit(0); +- break; +- case 'u': /* upper force value */ +- upper=atoi(optarg); +- range=1; +- if(upper < 0) +- upper=1; +- break; +- case 't': /* verbose */ +- verbose=1; +- break; +- case 'e': /* Excel */ +- excel=1; +- break; +- case 'b': /* Best */ +- best=1; +- break; +- case 'w': /* Worst */ +- worst=1; +- break; +- } +- } +- mbuffer=(char *)malloc(sz); +- memset(mbuffer,'a',sz); +- if(!excel) +- printf("\nFileop: Working in %s, File size is %d, Output is in Ops/sec. (A=Avg, B=Best, W=Worst)\n", thedir, sz); +- if(!verbose) +- { +-#ifdef Windows +- printf(" . %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %10s\n", +- "mkdir","chdir","rmdir","create","open","read","write","close","stat", +- "access","chmod","readdir","delete"," Total_files"); +-#else +- +- printf(" . %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %10s\n", +- "mkdir","chdir","rmdir","create","open", "read","write","close","stat", +- "access","chmod","readdir","link ","unlink","delete", +- " Total_files"); +-#endif +- } +- junk=chdir(thedir); /* change starting point */ +- if(x==0) +- x=1; +- if(range==0) +- lower=upper=x; +- for(i=lower;i<=upper;i+=incr) +- { +- clear_stats(); +- x=i; +- /* +- * Dir Create test +- */ +- purge_buffer_cache(); +- dir_create(x); +- +- if(verbose) +- { +- printf("mkdir: Dirs = %9lld ",stats[_STAT_DIR_CREATE].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_DIR_CREATE].total_time); +- printf(" Avg mkdir(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_DIR_CREATE].counter/stats[_STAT_DIR_CREATE].total_time, +- stats[_STAT_DIR_CREATE].total_time/stats[_STAT_DIR_CREATE].counter); +- printf(" Best mkdir(s)/sec = %12.2f (%12.9f seconds/op)\n",1/stats[_STAT_DIR_CREATE].best,stats[_STAT_DIR_CREATE].best); +- printf(" Worst mkdir(s)/sec = %12.2f (%12.9f seconds/op)\n\n",1/stats[_STAT_DIR_CREATE].worst,stats[_STAT_DIR_CREATE].worst); +- } +- +- /* +- * Dir Traverse test +- */ +- purge_buffer_cache(); +- dir_traverse(x); +- +- if(verbose) +- { +- printf("chdir: Dirs = %9lld ",stats[_STAT_DIR_TRAVERSE].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_DIR_TRAVERSE].total_time); +- printf(" Avg chdir(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_DIR_TRAVERSE].counter/stats[_STAT_DIR_TRAVERSE].total_time, +- stats[_STAT_DIR_TRAVERSE].total_time/stats[_STAT_DIR_TRAVERSE].counter); +- printf(" Best chdir(s)/sec = %12.2f (%12.9f seconds/op)\n",1/stats[_STAT_DIR_TRAVERSE].best,stats[_STAT_DIR_TRAVERSE].best); +- printf(" Worst chdir(s)/sec = %12.2f (%12.9f seconds/op)\n\n",1/stats[_STAT_DIR_TRAVERSE].worst,stats[_STAT_DIR_TRAVERSE].worst); +- } +- +- /* +- * Dir delete test +- */ +- purge_buffer_cache(); +- dir_delete(x); +- +- if(verbose) +- { +- printf("rmdir: Dirs = %9lld ",stats[_STAT_DIR_DELETE].counter); +- printf("Total Time = %12.9f seconds\n",stats[_STAT_DIR_DELETE].total_time); +- printf(" Avg rmdir(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_DIR_DELETE].counter/stats[_STAT_DIR_DELETE].total_time, +- stats[_STAT_DIR_DELETE].total_time/stats[_STAT_DIR_DELETE].counter); +- printf(" Best rmdir(s)/sec = %12.2f (%12.9f seconds/op)\n",1/stats[_STAT_DIR_DELETE].best,stats[_STAT_DIR_DELETE].best); +- printf(" Worst rmdir(s)/sec = %12.2f (%12.9f seconds/op)\n\n",1/stats[_STAT_DIR_DELETE].worst,stats[_STAT_DIR_DELETE].worst); +- } +- +- /* +- * Create test +- */ +- purge_buffer_cache(); +- file_create(x); +- if(verbose) +- { +- printf("create: Files = %9lld ",stats[_STAT_CREATE].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_CREATE].total_time); +- printf(" Avg create(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_CREATE].counter/stats[_STAT_CREATE].total_time, +- stats[_STAT_CREATE].total_time/stats[_STAT_CREATE].counter); +- printf(" Best create(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_CREATE].best,stats[_STAT_CREATE].best); +- printf(" Worst create(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_CREATE].worst,stats[_STAT_CREATE].worst); +- printf("write: Files = %9lld ",stats[_STAT_WRITE].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_WRITE].total_time); +- printf(" Avg write(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_WRITE].counter/stats[_STAT_WRITE].total_time, +- stats[_STAT_WRITE].total_time/stats[_STAT_WRITE].counter); +- printf(" Best write(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_WRITE].best,stats[_STAT_WRITE].best); +- printf(" Worst write(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_WRITE].worst,stats[_STAT_WRITE].worst); +- printf("close: Files = %9lld ",stats[_STAT_CLOSE].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_CLOSE].total_time); +- printf(" Avg close(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_CLOSE].counter/stats[_STAT_CLOSE].total_time, +- stats[_STAT_CLOSE].total_time/stats[_STAT_CLOSE].counter); +- printf(" Best close(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_CLOSE].best,stats[_STAT_CLOSE].best); +- printf(" Worst close(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_CLOSE].worst,stats[_STAT_CLOSE].worst); +- } +- +- /* +- * Stat test +- */ +- purge_buffer_cache(); +- file_stat(x); +- +- if(verbose) +- { +- printf("stat: Files = %9lld ",stats[_STAT_STAT].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_STAT].total_time); +- printf(" Avg stat(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_STAT].counter/stats[_STAT_STAT].total_time, +- stats[_STAT_STAT].total_time/stats[_STAT_STAT].counter); +- printf(" Best stat(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_STAT].best,stats[_STAT_STAT].best); +- printf(" Worst stat(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_STAT].worst,stats[_STAT_STAT].worst); +- } +- /* +- * Read test +- */ +- purge_buffer_cache(); +- file_read(x); +- +- if(verbose) +- { +- printf("open: Files = %9lld ",stats[_STAT_OPEN].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_OPEN].total_time); +- printf(" Avg open(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_OPEN].counter/stats[_STAT_OPEN].total_time, +- stats[_STAT_OPEN].total_time/stats[_STAT_OPEN].counter); +- printf(" Best open(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_OPEN].best,stats[_STAT_OPEN].best); +- printf(" Worst open(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_OPEN].worst,stats[_STAT_OPEN].worst); +- +- printf("read: Files = %9lld ",stats[_STAT_READ].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_READ].total_time); +- printf(" Avg read(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_READ].counter/stats[_STAT_READ].total_time, +- stats[_STAT_READ].total_time/stats[_STAT_READ].counter); +- printf(" Best read(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_READ].best,stats[_STAT_READ].best); +- printf(" Worst read(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_READ].worst,stats[_STAT_READ].worst); +- } +- +- /* +- * Access test +- */ +- purge_buffer_cache(); +- file_access(x); +- if(verbose) +- { +- printf("access: Files = %9lld ",stats[_STAT_ACCESS].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_ACCESS].total_time); +- printf(" Avg access(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_ACCESS].counter/stats[_STAT_ACCESS].total_time, +- stats[_STAT_ACCESS].total_time/stats[_STAT_ACCESS].counter); +- printf(" Best access(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_ACCESS].best,stats[_STAT_ACCESS].best); +- printf(" Worst access(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_ACCESS].worst,stats[_STAT_ACCESS].worst); +- } +- /* +- * Chmod test +- */ +- purge_buffer_cache(); +- file_chmod(x); +- +- if(verbose) +- { +- printf("chmod: Files = %9lld ",stats[_STAT_CHMOD].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_CHMOD].total_time); +- printf(" Avg chmod(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_CHMOD].counter/stats[_STAT_CHMOD].total_time, +- stats[_STAT_CHMOD].total_time/stats[_STAT_CHMOD].counter); +- printf(" Best chmod(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_CHMOD].best,stats[_STAT_CHMOD].best); +- printf(" Worst chmod(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_CHMOD].worst,stats[_STAT_CHMOD].worst); +- } +- /* +- * readdir test +- */ +- purge_buffer_cache(); +- file_readdir(x); +- +- if(verbose) +- { +- printf("readdir: Files = %9lld ",stats[_STAT_READDIR].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_READDIR].total_time); +- printf(" Avg readdir(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_READDIR].counter/stats[_STAT_READDIR].total_time, +- stats[_STAT_READDIR].total_time/stats[_STAT_READDIR].counter); +- printf(" Best readdir(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_READDIR].best,stats[_STAT_READDIR].best); +- printf(" Worst readdir(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_READDIR].worst,stats[_STAT_READDIR].worst); +- } +-#if !defined(Windows) +- /* +- * link test +- */ +- purge_buffer_cache(); +- file_link(x); +- if(verbose) +- { +- printf("link: Files = %9lld ",stats[_STAT_LINK].counter); +- printf("Total Time = %12.9f seconds\n",stats[_STAT_LINK].total_time); +- printf(" Avg link(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_LINK].counter/stats[_STAT_LINK].total_time, +- stats[_STAT_LINK].total_time/stats[_STAT_LINK].counter); +- printf(" Best link(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_LINK].best,stats[_STAT_LINK].best); +- printf(" Worst link(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_LINK].worst,stats[_STAT_LINK].worst); +- } +- /* +- * unlink test +- */ +- purge_buffer_cache(); +- file_unlink(x); +- if(verbose) +- { +- printf("unlink: Files = %9lld ",stats[_STAT_UNLINK].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_UNLINK].total_time); +- printf(" Avg unlink(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_UNLINK].counter/stats[_STAT_UNLINK].total_time, +- stats[_STAT_UNLINK].total_time/stats[_STAT_UNLINK].counter); +- printf(" Best unlink(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_UNLINK].best,stats[_STAT_UNLINK].best); +- printf(" Worst unlink(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_UNLINK].worst,stats[_STAT_UNLINK].worst); +- } +-#endif +- /* +- * Delete test +- */ +- purge_buffer_cache(); +- file_delete(x); +- if(verbose) +- { +- printf("delete: Files = %9lld ",stats[_STAT_DELETE].counter); +- printf("Total Time = %12.9f seconds\n", stats[_STAT_DELETE].total_time); +- printf(" Avg delete(s)/sec = %12.2f (%12.9f seconds/op)\n", +- stats[_STAT_DELETE].counter/stats[_STAT_DELETE].total_time, +- stats[_STAT_DELETE].total_time/stats[_STAT_DELETE].counter); +- printf(" Best delete(s)/sec = %12.2f (%12.9f seconds/op)\n", +- 1/stats[_STAT_DELETE].best,stats[_STAT_DELETE].best); +- printf(" Worst delete(s)/sec = %12.2f (%12.9f seconds/op)\n\n", +- 1/stats[_STAT_DELETE].worst,stats[_STAT_DELETE].worst); +- } +- if(!verbose) +- { +- printf("%c %4d %7.0f ",'A',x,stats[_STAT_DIR_CREATE].counter/stats[_STAT_DIR_CREATE].total_time); +- printf("%7.0f ",stats[_STAT_DIR_TRAVERSE].counter/stats[_STAT_DIR_TRAVERSE].total_time); +- printf("%7.0f ",stats[_STAT_DIR_DELETE].counter/stats[_STAT_DIR_DELETE].total_time); +- printf("%7.0f ",stats[_STAT_CREATE].counter/stats[_STAT_CREATE].total_time); +- printf("%7.0f ",stats[_STAT_OPEN].counter/stats[_STAT_OPEN].total_time); +- printf("%7.0f ",stats[_STAT_READ].counter/stats[_STAT_READ].total_time); +- printf("%7.0f ",stats[_STAT_WRITE].counter/stats[_STAT_WRITE].total_time); +- printf("%7.0f ",stats[_STAT_CLOSE].counter/stats[_STAT_CLOSE].total_time); +- printf("%7.0f ",stats[_STAT_STAT].counter/stats[_STAT_STAT].total_time); +- printf("%7.0f ",stats[_STAT_ACCESS].counter/stats[_STAT_ACCESS].total_time); +- printf("%7.0f ",stats[_STAT_CHMOD].counter/stats[_STAT_CHMOD].total_time); +- printf("%7.0f ",stats[_STAT_READDIR].counter/stats[_STAT_READDIR].total_time); +-#ifndef Windows +- printf("%7.0f ",stats[_STAT_LINK].counter/stats[_STAT_LINK].total_time); +- printf("%7.0f ",stats[_STAT_UNLINK].counter/stats[_STAT_UNLINK].total_time); +-#endif +- printf("%7.0f ",stats[_STAT_DELETE].counter/stats[_STAT_DELETE].total_time); +- printf("%10d ",x*x*x); +- printf("\n"); +- fflush(stdout); +- +- if(best) +- { +- printf("%c %4d %7.0f ",'B',x, 1/stats[_STAT_DIR_CREATE].best); +- printf("%7.0f ",1/stats[_STAT_DIR_TRAVERSE].best); +- printf("%7.0f ",1/stats[_STAT_DIR_DELETE].best); +- printf("%7.0f ",1/stats[_STAT_CREATE].best); +- printf("%7.0f ",1/stats[_STAT_OPEN].best); +- printf("%7.0f ",1/stats[_STAT_READ].best); +- printf("%7.0f ",1/stats[_STAT_WRITE].best); +- printf("%7.0f ",1/stats[_STAT_CLOSE].best); +- printf("%7.0f ",1/stats[_STAT_STAT].best); +- printf("%7.0f ",1/stats[_STAT_ACCESS].best); +- printf("%7.0f ",1/stats[_STAT_CHMOD].best); +- printf("%7.0f ",1/stats[_STAT_READDIR].best); +-#ifndef Windows +- printf("%7.0f ",1/stats[_STAT_LINK].best); +- printf("%7.0f ",1/stats[_STAT_UNLINK].best); +-#endif +- printf("%7.0f ",1/stats[_STAT_DELETE].best); +- printf("%10d ",x*x*x); +- printf("\n"); +- fflush(stdout); +- } +- if(worst) +- { +- printf("%c %4d %7.0f ",'W',x, 1/stats[_STAT_DIR_CREATE].worst); +- printf("%7.0f ",1/stats[_STAT_DIR_TRAVERSE].worst); +- printf("%7.0f ",1/stats[_STAT_DIR_DELETE].worst); +- printf("%7.0f ",1/stats[_STAT_CREATE].worst); +- printf("%7.0f ",1/stats[_STAT_OPEN].worst); +- printf("%7.0f ",1/stats[_STAT_READ].worst); +- printf("%7.0f ",1/stats[_STAT_WRITE].worst); +- printf("%7.0f ",1/stats[_STAT_CLOSE].worst); +- printf("%7.0f ",1/stats[_STAT_STAT].worst); +- printf("%7.0f ",1/stats[_STAT_ACCESS].worst); +- printf("%7.0f ",1/stats[_STAT_CHMOD].worst); +- printf("%7.0f ",1/stats[_STAT_READDIR].worst); +-#ifndef Windows +- printf("%7.0f ",1/stats[_STAT_LINK].worst); +- printf("%7.0f ",1/stats[_STAT_UNLINK].worst); +-#endif +- printf("%7.0f ",1/stats[_STAT_DELETE].worst); +- printf("%10d ",x*x*x); +- printf("\n"); +- fflush(stdout); +- } +- } +- } +- return(0); +-} +- +-void +-dir_create(int x) +-{ +- int i,j,k; +- int ret; +- char buf[100]; +- stats[_STAT_DIR_CREATE].best=(double)99999.9; +- stats[_STAT_DIR_CREATE].worst=(double)0.00000000; +- for(i=0;i stats[_STAT_DIR_CREATE].worst) +- stats[_STAT_DIR_CREATE].worst=stats[_STAT_DIR_CREATE].speed; +- junk=chdir(buf); +- for(j=0;j stats[_STAT_DIR_CREATE].worst) +- stats[_STAT_DIR_CREATE].worst=stats[_STAT_DIR_CREATE].speed; +- junk=chdir(buf); +- for(k=0;k stats[_STAT_DIR_CREATE].worst) +- stats[_STAT_DIR_CREATE].worst=stats[_STAT_DIR_CREATE].speed; +- junk=chdir(buf); +- junk=chdir(".."); +- } +- junk=chdir(".."); +- } +- junk=chdir(".."); +- } +-} +- +-void +-dir_traverse(int x) +-{ +- int i,j,k; +- char buf[100]; +- double time1, time2; +- stats[_STAT_DIR_TRAVERSE].best=(double)99999.9; +- stats[_STAT_DIR_TRAVERSE].worst=(double)0.00000000; +- for(i=0;i stats[_STAT_DIR_TRAVERSE].worst) +- stats[_STAT_DIR_TRAVERSE].worst=stats[_STAT_DIR_TRAVERSE].speed; +- } +- stats[_STAT_DIR_TRAVERSE].starttime=time_so_far(); +- junk=chdir(".."); +- stats[_STAT_DIR_TRAVERSE].endtime=time_so_far(); +- stats[_STAT_DIR_TRAVERSE].speed=time2+stats[_STAT_DIR_TRAVERSE].endtime-stats[_STAT_DIR_TRAVERSE].starttime; +- if(stats[_STAT_DIR_TRAVERSE].speed < (double)0.0) +- stats[_STAT_DIR_TRAVERSE].speed=(double) 0.0; +- stats[_STAT_DIR_TRAVERSE].total_time+=stats[_STAT_DIR_TRAVERSE].speed; +- stats[_STAT_DIR_TRAVERSE].counter++; +- if(stats[_STAT_DIR_TRAVERSE].speed < stats[_STAT_DIR_TRAVERSE].best) +- stats[_STAT_DIR_TRAVERSE].best=stats[_STAT_DIR_TRAVERSE].speed; +- if(stats[_STAT_DIR_TRAVERSE].speed > stats[_STAT_DIR_TRAVERSE].worst) +- stats[_STAT_DIR_TRAVERSE].worst=stats[_STAT_DIR_TRAVERSE].speed; +- } +- stats[_STAT_DIR_TRAVERSE].starttime=time_so_far(); +- junk=chdir(".."); +- stats[_STAT_DIR_TRAVERSE].endtime=time_so_far(); +- stats[_STAT_DIR_TRAVERSE].speed=time1+stats[_STAT_DIR_TRAVERSE].endtime-stats[_STAT_DIR_TRAVERSE].starttime; +- if(stats[_STAT_DIR_TRAVERSE].speed < (double)0.0) +- stats[_STAT_DIR_TRAVERSE].speed=(double)0.0; +- stats[_STAT_DIR_TRAVERSE].total_time+=stats[_STAT_DIR_TRAVERSE].speed; +- stats[_STAT_DIR_TRAVERSE].counter++; +- if(stats[_STAT_DIR_TRAVERSE].speed < stats[_STAT_DIR_TRAVERSE].best) +- stats[_STAT_DIR_TRAVERSE].best=stats[_STAT_DIR_TRAVERSE].speed; +- if(stats[_STAT_DIR_TRAVERSE].speed > stats[_STAT_DIR_TRAVERSE].worst) +- stats[_STAT_DIR_TRAVERSE].worst=stats[_STAT_DIR_TRAVERSE].speed; +- } +-} +- +-void +-file_create(int x) +-{ +- int i,j,k; +- int fd; +- int ret; +- char buf[100]; +- char value; +- stats[_STAT_CREATE].best=(double)999999.9; +- stats[_STAT_CREATE].worst=(double)0.0; +- stats[_STAT_WRITE].best=(double)999999.9; +- stats[_STAT_WRITE].worst=(double)0.0; +- stats[_STAT_CLOSE].best=(double)999999.9; +- stats[_STAT_CLOSE].worst=(double)0.0; +- for(i=0;i stats[_STAT_CREATE].worst) +- stats[_STAT_CREATE].worst=stats[_STAT_CREATE].speed; +- +- stats[_STAT_WRITE].starttime=time_so_far(); +- junk=write(fd,mbuffer,sz); +- stats[_STAT_WRITE].endtime=time_so_far(); +- stats[_STAT_WRITE].counter++; +- stats[_STAT_WRITE].speed=stats[_STAT_WRITE].endtime-stats[_STAT_WRITE].starttime; +- if(stats[_STAT_WRITE].speed < (double)0.0) +- stats[_STAT_WRITE].speed=(double)0.0; +- stats[_STAT_WRITE].total_time+=stats[_STAT_WRITE].speed; +- if(stats[_STAT_WRITE].speed < stats[_STAT_WRITE].best) +- stats[_STAT_WRITE].best=stats[_STAT_WRITE].speed; +- if(stats[_STAT_WRITE].speed > stats[_STAT_WRITE].worst) +- stats[_STAT_WRITE].worst=stats[_STAT_WRITE].speed; +- +- fsync(fd); +- stats[_STAT_CLOSE].starttime=time_so_far(); +- close(fd); +- stats[_STAT_CLOSE].endtime=time_so_far(); +- stats[_STAT_CLOSE].speed=stats[_STAT_CLOSE].endtime-stats[_STAT_CLOSE].starttime; +- if(stats[_STAT_CLOSE].speed < (double)0.0) +- stats[_STAT_CLOSE].speed=(double)0.0; +- stats[_STAT_CLOSE].total_time+=stats[_STAT_CLOSE].speed; +- stats[_STAT_CLOSE].counter++; +- if(stats[_STAT_CLOSE].speed < stats[_STAT_CLOSE].best) +- stats[_STAT_CLOSE].best=stats[_STAT_CLOSE].speed; +- if(stats[_STAT_CLOSE].speed > stats[_STAT_CLOSE].worst) +- stats[_STAT_CLOSE].worst=stats[_STAT_CLOSE].speed; +- } +- junk=chdir(".."); +- } +- junk=chdir(".."); +- } +-} +- +-void +-file_stat(int x) +-{ +- int i,j,k,y; +- char buf[100]; +- struct stat mystat; +- stats[_STAT_STAT].best=(double)99999.9; +- stats[_STAT_STAT].worst=(double)0.00000000; +- for(i=0;i stats[_STAT_STAT].worst) +- stats[_STAT_STAT].worst=stats[_STAT_STAT].speed; +- } +- junk=chdir(".."); +- } +- junk=chdir(".."); +- } +-} +- +-void +-file_access(int x) +-{ +- int i,j,k,y; +- char buf[100]; +- stats[_STAT_ACCESS].best=(double)999999.9; +- stats[_STAT_ACCESS].worst=(double)0.0; +- for(i=0;i stats[_STAT_ACCESS].worst) +- stats[_STAT_ACCESS].worst=stats[_STAT_ACCESS].speed; +- } +- junk=chdir(".."); +- } +- junk=chdir(".."); +- } +-} +- +-void +-file_chmod(int x) +-{ +- int i,j,k,y; +- char buf[100]; +- stats[_STAT_CHMOD].best=(double)999999.9; +- stats[_STAT_CHMOD].worst=(double)0.0; +- for(i=0;i stats[_STAT_CHMOD].worst) +- stats[_STAT_CHMOD].worst=stats[_STAT_CHMOD].speed; +- } +- junk=chdir(".."); +- } +- junk=chdir(".."); +- } +-} +- +-void +-file_readdir(int x) +-{ +- int i,j,ret1; +- char buf[100]; +- DIR *dirbuf; +- struct dirent *y; +- stats[_STAT_READDIR].best=(double)999999.9; +- stats[_STAT_READDIR].worst=(double)0.0; +- for(i=0;i stats[_STAT_READDIR].worst) +- stats[_STAT_READDIR].worst=stats[_STAT_READDIR].speed; +- ret1=closedir(dirbuf); +- if(ret1 < 0) +- { +- printf("closedir failed\n"); +- exit(1); +- } +- junk=chdir(".."); +- } +- junk=chdir(".."); +- } +-} +- +-void +-file_link(int x) +-{ +- int i,j,k,y; +- char buf[100]; +- char bufn[100]; +- stats[_STAT_LINK].best=(double)999999.9; +- stats[_STAT_LINK].worst=(double)0.0; +- for(i=0;i stats[_STAT_LINK].worst) +- stats[_STAT_LINK].worst=stats[_STAT_LINK].speed; +- } +- junk=chdir(".."); +- } +- junk=chdir(".."); +- } +-} +- +-void +-file_unlink(int x) +-{ +- int i,j,k,y; +- char buf[100]; +- char bufn[100]; +- stats[_STAT_UNLINK].best=(double)999999.9; +- stats[_STAT_UNLINK].worst=(double)0.0; +- for(i=0;i stats[_STAT_UNLINK].worst) +- stats[_STAT_UNLINK].worst=stats[_STAT_UNLINK].speed; +- } +- junk=chdir(".."); +- } +- junk=chdir(".."); +- } +-} +- +-void +-dir_delete(int x) +-{ +- int i,j,k; +- char buf[100]; +- stats[_STAT_DIR_DELETE].best=(double)99999.9; +- stats[_STAT_DIR_DELETE].worst=(double)0.00000000; +- for(i=0;i stats[_STAT_DIR_DELETE].worst) +- stats[_STAT_DIR_DELETE].worst=stats[_STAT_DIR_DELETE].speed; +- } +- junk=chdir(".."); +- sprintf(buf,"fileop_L1_%d_L2_%d",i,j); +- stats[_STAT_DIR_DELETE].starttime=time_so_far(); +- rmdir(buf); +- stats[_STAT_DIR_DELETE].endtime=time_so_far(); +- stats[_STAT_DIR_DELETE].speed=stats[_STAT_DIR_DELETE].endtime-stats[_STAT_DIR_DELETE].starttime; +- if(stats[_STAT_DIR_DELETE].speed < (double)0.0) +- stats[_STAT_DIR_DELETE].speed=(double)0.0; +- stats[_STAT_DIR_DELETE].total_time+=stats[_STAT_DIR_DELETE].speed; +- stats[_STAT_DIR_DELETE].counter++; +- if(stats[_STAT_DIR_DELETE].speed < stats[_STAT_DIR_DELETE].best) +- stats[_STAT_DIR_DELETE].best=stats[_STAT_DIR_DELETE].speed; +- if(stats[_STAT_DIR_DELETE].speed > stats[_STAT_DIR_DELETE].worst) +- stats[_STAT_DIR_DELETE].worst=stats[_STAT_DIR_DELETE].speed; +- } +- junk=chdir(".."); +- sprintf(buf,"fileop_L1_%d",i); +- stats[_STAT_DIR_DELETE].starttime=time_so_far(); +- rmdir(buf); +- stats[_STAT_DIR_DELETE].endtime=time_so_far(); +- stats[_STAT_DIR_DELETE].speed=stats[_STAT_DIR_DELETE].endtime-stats[_STAT_DIR_DELETE].starttime; +- if(stats[_STAT_DIR_DELETE].speed < (double)0.0) +- stats[_STAT_DIR_DELETE].speed=(double)0.0; +- stats[_STAT_DIR_DELETE].total_time+=stats[_STAT_DIR_DELETE].speed; +- stats[_STAT_DIR_DELETE].counter++; +- if(stats[_STAT_DIR_DELETE].speed < stats[_STAT_DIR_DELETE].best) +- stats[_STAT_DIR_DELETE].best=stats[_STAT_DIR_DELETE].speed; +- if(stats[_STAT_DIR_DELETE].speed > stats[_STAT_DIR_DELETE].worst) +- stats[_STAT_DIR_DELETE].worst=stats[_STAT_DIR_DELETE].speed; +- } +-} +- +-void +-file_delete(int x) +-{ +- int i,j,k; +- char buf[100]; +- stats[_STAT_DELETE].best=(double)999999.9; +- stats[_STAT_DELETE].worst=(double)0.0; +- for(i=0;i stats[_STAT_DELETE].worst) +- stats[_STAT_DELETE].worst=stats[_STAT_DELETE].speed; +- } +- junk=chdir(".."); +- sprintf(buf,"fileop_L1_%d_L2_%d",i,j); +- rmdir(buf); +- } +- junk=chdir(".."); +- sprintf(buf,"fileop_L1_%d",i); +- rmdir(buf); +- } +-} +-void +-file_read(int x) +-{ +- int i,j,k,y,fd; +- char buf[100]; +- char value; +- stats[_STAT_READ].best=(double)99999.9; +- stats[_STAT_READ].worst=(double)0.00000000; +- stats[_STAT_OPEN].best=(double)99999.9; +- stats[_STAT_OPEN].worst=(double)0.00000000; +- for(i=0;i stats[_STAT_OPEN].worst) +- stats[_STAT_OPEN].worst=stats[_STAT_OPEN].speed; +- +- stats[_STAT_READ].starttime=time_so_far(); +- y=read(fd,mbuffer,sz); +- if(y < 0) +- { +- printf("Read failed\n"); +- exit(1); +- } +- if(validate(mbuffer,sz, value) !=0) +- printf("Error: Data Mis-compare\n");; +- stats[_STAT_READ].endtime=time_so_far(); +- close(fd); +- stats[_STAT_READ].speed=stats[_STAT_READ].endtime-stats[_STAT_READ].starttime; +- if(stats[_STAT_READ].speed < (double)0.0) +- stats[_STAT_READ].speed=(double)0.0; +- stats[_STAT_READ].total_time+=stats[_STAT_READ].speed; +- stats[_STAT_READ].counter++; +- if(stats[_STAT_READ].speed < stats[_STAT_READ].best) +- stats[_STAT_READ].best=stats[_STAT_READ].speed; +- if(stats[_STAT_READ].speed > stats[_STAT_READ].worst) +- stats[_STAT_READ].worst=stats[_STAT_READ].speed; +- } +- junk=chdir(".."); +- } +- junk=chdir(".."); +- } +-} +- +-/************************************************************************/ +-/* Time measurement routines. Thanks to Iozone :-) */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-static double +-time_so_far(void) +-#else +-static double +-time_so_far() +-#endif +-{ +-#ifdef Windows +- LARGE_INTEGER freq,counter; +- double wintime,bigcounter; +- /* For Windows the time_of_day() is useless. It increments in 55 milli second */ +- /* increments. By using the Win32api one can get access to the high performance */ +- /* measurement interfaces. With this one can get back into the 8 to 9 */ +- /* microsecond resolution. */ +- QueryPerformanceFrequency(&freq); +- QueryPerformanceCounter(&counter); +- bigcounter=(double)counter.HighPart *(double)0xffffffff + +- (double)counter.LowPart; +- wintime = (double)(bigcounter/(double)freq.LowPart); +- return((double)wintime); +-#else +-#if defined (OSFV4) || defined(OSFV3) || defined(OSFV5) +- struct timespec gp; +- +- if (getclock(TIMEOFDAY, (struct timespec *) &gp) == -1) +- perror("getclock"); +- return (( (double) (gp.tv_sec)) + +- ( ((float)(gp.tv_nsec)) * 0.000000001 )); +-#else +- struct timeval tp; +- +- if (gettimeofday(&tp, (struct timezone *) NULL) == -1) +- perror("gettimeofday"); +- return ((double) (tp.tv_sec)) + +- (((double) tp.tv_usec) * 0.000001 ); +-#endif +-#endif +-} +- +-void +-splash(void) +-{ +- printf("\n"); +- printf(" --------------------------------------\n"); +- printf(" | Fileop | \n"); +- printf(" | %s | \n",version); +- printf(" | | \n"); +- printf(" | by |\n"); +- printf(" | | \n"); +- printf(" | Don Capps |\n"); +- printf(" --------------------------------------\n"); +- printf("\n"); +-} +- +-void +-usage(void) +-{ +- splash(); +- printf(" fileop [-f X ]|[-l # -u #] [-s Y] [-e] [-b] [-w] [-d ] [-t] [-v] [-h]\n"); +- printf("\n"); +- printf(" -f # Force factor. X^3 files will be created and removed.\n"); +- printf(" -l # Lower limit on the value of the Force factor.\n"); +- printf(" -u # Upper limit on the value of the Force factor.\n"); +- printf(" -s # Optional. Sets filesize for the create/write. May use suffix 'K' or 'M'.\n"); +- printf(" -e Excel importable format.\n"); +- printf(" -b Output best case results.\n"); +- printf(" -i # Increment force factor by this increment.\n"); +- printf(" -w Output worst case results.\n"); +- printf(" -d Specify starting directory.\n"); +- printf(" -U Mount point to remount between tests.\n"); +- printf(" -t Verbose output option.\n"); +- printf(" -v Version information.\n"); +- printf(" -h Help text.\n"); +- printf("\n"); +- printf(" The structure of the file tree is:\n"); +- printf(" X number of Level 1 directories, with X number of\n"); +- printf(" level 2 directories, with X number of files in each\n"); +- printf(" of the level 2 directories.\n"); +- printf("\n"); +- printf(" Example: fileop 2\n"); +- printf("\n"); +- printf(" dir_1 dir_2\n"); +- printf(" / \\ / \\ \n"); +- printf(" sdir_1 sdir_2 sdir_1 sdir_2\n"); +- printf(" / \\ / \\ / \\ / \\ \n"); +- printf(" file_1 file_2 file_1 file_2 file_1 file_2 file_1 file_2\n"); +- printf("\n"); +- printf(" Each file will be created, and then Y bytes is written to the file.\n"); +- printf("\n"); +-} +-void +-clear_stats() +-{ +- int i; +- for(i=0;i<_NUM_STATS;i++) +- bzero((char *)&stats[i],sizeof(struct stat_struct)); +-} +-int +-validate(char *buffer, int size, char value) +-{ +- register int i; +- register char *cp; +- register int size1; +- register char v1; +- v1=value; +- cp = buffer; +- size1=size; +- for(i=0;i " >> /dev/stderr ; +- echo "filename is the output of iozone -a" >> /dev/stderr ; +- echo "test is one of write rewrite read reread randread randwrite bkwdread recrewrite strideread fwrite frewrite fread freread" >> /dev/stderr ;; +- esac } +- +-#filename=$1 +-filename=iozone_gen_out +-query=$2 +-if (! [ -e $query ] ) ; then mkdir $query; fi +-if ( [ $# -eq 2 ] ) ; +- then +- write_gnuplot_file > $query/`basename $file_name.gnuplot` +- else +- echo "Usage : gengnuplot.sh " 2>&1 +- echo "filename is the output of iozone -a" 2>&1 +- echo "test is one of write rewrite read reread randread randwrite bkwdread recrewrite strideread fwrite frewrite fread freread" 2>&1 +-fi +diff --git a/src/components/appio/tests/iozone/gnu3d.dem b/src/components/appio/tests/iozone/gnu3d.dem +deleted file mode 100644 +index df14ef1f0..000000000 +--- a/src/components/appio/tests/iozone/gnu3d.dem ++++ /dev/null +@@ -1,146 +0,0 @@ +-# +-# $Id: 3D plot of performance +-# +-# Processes files that were created by Generate_Graphs +-# and displays the results. Also, saves a postscript copy. +-# +-# Don Capps +- +-dirs = "write rewrite read reread randread randwrite bkwdread recrewrite strideread fwrite frewrite fread freread" +-titles = "Write ReWrite Read Reread Random_read Random_write Read_Backwards Record_rewrite Stride_read Fwrite Frewrite Fread Freread" +- +-file(n) = sprintf("%s/iozone_gen_out.gnuplot", word(dirs,n)) +-outfile(n) = sprintf("%s/%s.ps", word(dirs,n), word(dirs,n)) +-title(n) = word(titles,n) +- +-set title "Iozone performance" +-set grid lt 2 lw 1 +-set surface +-set parametric +-set xtics +-set ytics +-set logscale x 2 +-set logscale y 2 +-set xlabel "File size in 2^n KBytes" +-set ylabel "Record size in 2^n Kbytes" +-set zlabel "Kbytes/sec" +-set style data lines +-set dgrid3d 80,80,3 +- +-i = 1 +-set terminal x11 +-set output +-splot file(i) title title(i) +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 2 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 3 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 4 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 5 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 6 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 7 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 8 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 9 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 10 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 11 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 12 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +-i = 13 +-set terminal x11 +-set output +-replot +-pause -1 "Hit return to continue" +-set terminal postscript color +-set output outfile(i) +-replot +- +diff --git a/src/components/appio/tests/iozone/gnuplot.dem b/src/components/appio/tests/iozone/gnuplot.dem +deleted file mode 100644 +index d1abdf500..000000000 +--- a/src/components/appio/tests/iozone/gnuplot.dem ++++ /dev/null +@@ -1,60 +0,0 @@ +-# +-# $Id: Plot of latency versus offset in a file +-# +-# Requires data file "wol.dat" from this directory, +-# so change current working directory to this directory before running. +-# +- +-set title "File system write latency " +-set autoscale x +-set xtics +-set xlabel "Offset in file (KB)" +-set ylabel "Latency in Microseconds" +-plot 'wol.dat' using 1:2 title "Latency Plot" with lines +-pause -1 "Hit return to continue" +- +-# +-# $Id: Plot of latency versus offset in a file +-# +-# Requires data file "rwol.dat" from this directory, +-# so change current working directory to this directory before running. +-# +- +-set title "File system re-write latency " +-set autoscale x +-set xtics +-set xlabel "Offset in file (KB)" +-set ylabel "Latency in Microseconds" +-plot 'rwol.dat' using 1:2 title "Latency Plot" with lines +-pause -1 "Hit return to continue" +- +-# +-# $Id: Plot of latency versus offset in a file +-# +-# Requires data file "rol.dat" from this directory, +-# so change current working directory to this directory before running. +-# +- +-set title "File system read latency " +-set autoscale x +-set xtics +-set xlabel "Offset in file (KB)" +-set ylabel "Latency in Microseconds" +-plot 'rol.dat' using 1:2 title "Latency Plot" with lines +-pause -1 "Hit return to continue" +- +-# +-# $Id: Plot of latency versus offset in a file +-# +-# Requires data file "rrol.dat" from this directory, +-# so change current working directory to this directory before running. +-# +- +-set title "File system re-read latency " +-set autoscale x +-set xtics +-set xlabel "Offset in file (KB)" +-set ylabel "Latency in Microseconds" +-plot 'rrol.dat' using 1:2 title "Latency Plot" with lines +-pause -1 "Hit return to continue" +- +diff --git a/src/components/appio/tests/iozone/gnuplotps.dem b/src/components/appio/tests/iozone/gnuplotps.dem +deleted file mode 100644 +index 39e1c71af..000000000 +--- a/src/components/appio/tests/iozone/gnuplotps.dem ++++ /dev/null +@@ -1,63 +0,0 @@ +-# +-# $Id: Plot of latency versus offset in a file +-# +-# Requires data file "wol.dat" from this directory, +-# so change current working directory to this directory before running. +-# +- +-set title "File system write latency " +-set terminal postscript +-set output "gnu_wol.ps" +-set autoscale x +-set xtics +-set xlabel "Offset in file (KB)" +-set ylabel "Latency in Microseconds" +-plot 'wol.dat' using 1:2 title "Latency Plot" with lines +-# +-# $Id: Plot of latency versus offset in a file +-# +-# Requires data file "rwol.dat" from this directory, +-# so change current working directory to this directory before running. +-# +- +-set title "File system re-write latency " +-set terminal postscript +-set output "gnu_rwol.ps" +-set autoscale x +-set xtics +-set xlabel "Offset in file (KB)" +-set ylabel "Latency in Microseconds" +-plot 'rwol.dat' using 1:2 title "Latency Plot" with lines +- +-# +-# $Id: Plot of latency versus offset in a file +-# +-# Requires data file "rol.dat" from this directory, +-# so change current working directory to this directory before running. +-# +- +-set title "File system read latency " +-set autoscale x +-set xtics +-set xlabel "Offset in file (KB)" +-set ylabel "Latency in Microseconds" +-set terminal postscript +-set output "gnu_rol.ps" +-plot 'rol.dat' using 1:2 title "Latency Plot" with lines +- +-# +-# $Id: Plot of latency versus offset in a file +-# +-# Requires data file "rrol.dat" from this directory, +-# so change current working directory to this directory before running. +-# +- +-set title "File system re-read latency " +-set terminal postscript +-set output "gnu_rrol.ps" +-set autoscale x +-set xtics +-set xlabel "Offset in file (KB)" +-set ylabel "Latency in Microseconds" +-plot 'rrol.dat' using 1:2 title "Latency Plot" with lines +- +diff --git a/src/components/appio/tests/iozone/iozone.c b/src/components/appio/tests/iozone/iozone.c +deleted file mode 100644 +index 7708cd76c..000000000 +--- a/src/components/appio/tests/iozone/iozone.c ++++ /dev/null +@@ -1,25297 +0,0 @@ +-/************************************************************************/ +-/* Original Author: */ +-/* William Norcott (wnorcott@us.oracle.com) */ +-/* 4 Dunlap Drive */ +-/* Nashua, NH 03060 */ +-/* */ +-/************************************************************************/ +-/* Enhancements by: */ +-/* Don Capps (capps@iozone.org) */ +-/* 7417 Crenshaw */ +-/* Plano, TX 75025 */ +-/* */ +-/************************************************************************/ +-/* Copyright 1991, 1992, 1994, 1998, 2000, 2001 William D. Norcott */ +-/************************************************************************/ +-/* */ +-/* Iozone is based on the original work done by William Norrcot. It has */ +-/* been enhanced so that it provides a more complete filesystem */ +-/* characterization. */ +-/* Its purpose is to provide automated filesystem characterization. */ +-/* Enhancements have been made by: */ +-/* */ +-/* Don Capps capps@iozone.org */ +-/* */ +-/* Iozone can perform single stream and multi stream I/O */ +-/* also it now performs read, write, re-read, re-write, */ +-/* read backwards, read/write random, re-read record, */ +-/* pread, re-pread, re-pwrite, preadv, re-preadv, pwritev, */ +-/* stride read, and re-pwritev,mmap, POSIX async I/O, NFS */ +-/* cluster testing and much more. */ +-/* */ +-/* The frontend now uses getopt() and the user can control many more */ +-/* of the actions. */ +-/* */ +-/* */ +-/************************************************************************/ +-/* THIS SOFTWARE IS PROVIDED BY DON CAPPS AND THE IOZONE CREW "AS IS */ +-/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ +-/* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A */ +-/* PARTICULAR PURPOSE ARE DISCLAIMED. */ +-/* */ +-/* IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY */ +-/* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL */ +-/* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */ +-/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS */ +-/* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER */ +-/* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ +-/* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE. */ +-/************************************************************************/ +- +-/************************************************************************/ +-/* For the beginner... */ +-/* */ +-/* 1. make linux (linux, hpux, convex, hpux_no_ansi) */ +-/* 2. type ./iozone -Ra */ +-/* */ +-/* Hint: Type make (it will give you a list of valid targets) */ +-/* */ +-/************************************************************************/ +- +- +-/* The version number */ +-#define THISVERSION " Version $Revision$" +- +-#if defined(linux) +- #define _GNU_SOURCE +-#endif +-/* Include for Cygnus development environment for Windows */ +-#if defined (Windows) +-#include +-#include +-#else +-#if defined(linux) || defined(solaris) || defined(macosx) || defined(__AIX__) || defined(FreeBSD) || defined(_HPUX_SOURCE) +-#include +-#else +-extern int errno; /* imported for errors */ +-extern int h_errno; /* imported for errors */ +-#endif +-#endif +- +- +-#include +-#include +-#if defined (__LP64__) || defined(OSF_64) || defined(__alpha__) || defined(__arch64__) || defined(_LP64) || defined(__s390x__) || defined(__AMD64__) +-#define MODE "\tCompiled for 64 bit mode." +-#define _64BIT_ARCH_ +-#else +-#define MODE "\tCompiled for 32 bit mode." +-#endif +- +-#ifndef NO_THREADS +-#include +-#endif +- +-#if defined(HAVE_ANSIC_C) && defined(linux) +-#include +-#include +-#endif +- +-#ifdef HAVE_PROTO +-#include "proto.h" +-#else +-int atoi(); +-int close(); +-int unlink(); +-int main(); +-void record_command_line(); +-#if !defined(linux) +-int wait(); +-#endif +-int fsync(); +-void srand48(); +-long lrand48(); +-void create_list(); +-void Poll(); +-void print_header(); +-void Kill(); +-long long l_min(); +-long long l_max(); +-long long mythread_create(); +-int gen_new_buf(); +-void touch_dedup(); +-void init_by_array64(unsigned long long *, unsigned long long ); +-unsigned long long genrand64_int64(void); +-#endif +- +-#include +- +-char *help[] = { +-" Usage: iozone [-s filesize_Kb] [-r record_size_Kb] [-f [path]filename] [-h]", +-" [-i test] [-E] [-p] [-a] [-A] [-z] [-Z] [-m] [-M] [-t children]", +-" [-l min_number_procs] [-u max_number_procs] [-v] [-R] [-x] [-o]", +-" [-d microseconds] [-F path1 path2...] [-V pattern] [-j stride]", +-" [-T] [-C] [-B] [-D] [-G] [-I] [-H depth] [-k depth] [-U mount_point]", +-" [-S cache_size] [-O] [-L cacheline_size] [-K] [-g maxfilesize_Kb]", +-" [-n minfilesize_Kb] [-N] [-Q] [-P start_cpu] [-e] [-c] [-b Excel.xls]", +-" [-J milliseconds] [-X write_telemetry_filename] [-w] [-W]", +-" [-Y read_telemetry_filename] [-y minrecsize_Kb] [-q maxrecsize_Kb]", +-" [-+u] [-+m cluster_filename] [-+d] [-+x multiplier] [-+p # ]", +-" [-+r] [-+t] [-+X] [-+Z] [-+w percent dedupable] [-+y percent_interior_dedup]", +-" [-+C percent_dedup_within]", +-" ", +-" -a Auto mode", +-" -A Auto2 mode", +-" -b Filename Create Excel worksheet file", +-" -B Use mmap() files", +-" -c Include close in the timing calculations", +-" -C Show bytes transferred by each child in throughput testing", +-" -d # Microsecond delay out of barrier", +-" -D Use msync(MS_ASYNC) on mmap files", +-" -e Include flush (fsync,fflush) in the timing calculations", +-" -E Run extension tests", +-" -f filename to use", +-" -F filenames for each process/thread in throughput test", +-" -g # Set maximum file size (in Kbytes) for auto mode (or #m or #g)", +-" -G Use msync(MS_SYNC) on mmap files", +-" -h help", +-" -H # Use POSIX async I/O with # async operations", +-" -i # Test to run (0=write/rewrite, 1=read/re-read, 2=random-read/write", +-" 3=Read-backwards, 4=Re-write-record, 5=stride-read, 6=fwrite/re-fwrite", +-" 7=fread/Re-fread, 8=random_mix, 9=pwrite/Re-pwrite, 10=pread/Re-pread", +-" 11=pwritev/Re-pwritev, 12=preadv/Re-preadv)", +-" -I Use VxFS VX_DIRECT, O_DIRECT,or O_DIRECTIO for all file operations", +-" -j # Set stride of file accesses to (# * record size)", +-" -J # milliseconds of compute cycle before each I/O operation", +-" -k # Use POSIX async I/O (no bcopy) with # async operations", +-" -K Create jitter in the access pattern for readers", +-" -l # Lower limit on number of processes to run", +-" -L # Set processor cache line size to value (in bytes)", +-" -m Use multiple buffers", +-" -M Report uname -a output", +-" -n # Set minimum file size (in Kbytes) for auto mode (or #m or #g)", +-" -N Report results in microseconds per operation", +-" -o Writes are synch (O_SYNC)", +-" -O Give results in ops/sec.", +-" -p Purge on", +-" -P # Bind processes/threads to processors, starting with this cpu", +-" -q # Set maximum record size (in Kbytes) for auto mode (or #m or #g)", +-" -Q Create offset/latency files", +-" -r # record size in Kb", +-" or -r #k .. size in Kb", +-" or -r #m .. size in Mb", +-" or -r #g .. size in Gb", +-" -R Generate Excel report", +-" -s # file size in Kb", +-" or -s #k .. size in Kb", +-" or -s #m .. size in Mb", +-" or -s #g .. size in Gb", +-" -S # Set processor cache size to value (in Kbytes)", +-" -t # Number of threads or processes to use in throughput test", +-" -T Use POSIX pthreads for throughput tests", +-" -u # Upper limit on number of processes to run", +-" -U Mount point to remount between tests", +-" -v version information", +-" -V # Verify data pattern write/read", +-" -w Do not unlink temporary file", +-" -W Lock file when reading or writing", +-" -x Turn off stone-walling", +-" -X filename Write telemetry file. Contains lines with (offset reclen compute_time) in ascii", +-" -y # Set minimum record size (in Kbytes) for auto mode (or #m or #g)", +-" -Y filename Read telemetry file. Contains lines with (offset reclen compute_time) in ascii", +-" -z Used in conjunction with -a to test all possible record sizes", +-" -Z Enable mixing of mmap I/O and file I/O", +-" -+E Use existing non-Iozone file for read-only testing", +-" -+K Sony special. Manual control of test 8.", +-" -+m Cluster_filename Enable Cluster testing", +-" -+d File I/O diagnostic mode. (To troubleshoot a broken file I/O subsystem)", +-" -+u Enable CPU utilization output (Experimental)", +-" -+x # Multiplier to use for incrementing file and record sizes", +-" -+p # Percentage of mix to be reads", +-" -+r Enable O_RSYNC|O_SYNC for all testing.", +-" -+t Enable network performance test. Requires -+m ", +-" -+n No retests selected.", +-" -+k Use constant aggregate data set size.", +-" -+q Delay in seconds between tests.", +-" -+l Enable record locking mode.", +-" -+L Enable record locking mode, with shared file.", +-" -+B Sequential mixed workload.", +-#if defined(O_DSYNC) +-" -+D Enable O_DSYNC mode.", +-#endif +-#ifndef NO_MADVISE +-" -+A # Enable madvise. 0 = normal, 1=random, 2=sequential", +-" 3=dontneed, 4=willneed", +-#endif +-" -+N Do not truncate existing files on sequential writes.", +-" -+S # Dedup-able data is limited to sharing within each numerically", +-" identified file set", +-" -+V Enable shared file. No locking.", +-#if defined(Windows) +-" -+U Windows Unbufferd I/O API (Very Experimental)", +-#endif +-" -+X Enable short circuit mode for filesystem testing ONLY", +-" ALL Results are NOT valid in this mode.", +-" -+Z Enable old data set compatibility mode. WARNING.. Published", +-" hacks may invalidate these results and generate bogus, high", +-" values for results.", +-" -+w ## Percent of dedup-able data in buffers.", +-" -+y ## Percent of dedup-able within & across files in buffers.", +-" -+C ## Percent of dedup-able within & not across files in buffers.", +-" -+H Hostname Hostname of the PIT server.", +-" -+P Service Service of the PIT server.", +-" -+z Enable latency histogram logging.", +-"" }; +- +-char *head1[] = { +- " 'Iozone' Filesystem Benchmark Program", +- " ", +-THISVERSION, +- MODE, +- " ", +- " Original Author: William Norcott (wnorcott@us.oracle.com)", +- " 4 Dunlap Drive", +- " Nashua, NH 03060", +- " ", +- " Enhancements: Don Capps (capps@iozone.org)", +- " 7417 Crenshaw", +- " Plano, TX 75025", +- " ", +- " Copyright 1991, 1992, 1994, 1998, 1999, 2002 William D. Norcott", +- " ", +- " License to freely use and distribute this software is hereby granted ", +- " by the author, subject to the condition that this copyright notice ", +- " remains intact. The author retains the exclusive right to publish ", +- " derivative works based on this work, including, but not limited to, ", +- " revised versions of this work", +- " ", +- " Other contributors:", +- " ", +- " Don Capps (Network Appliance) capps@iozone.org", +- " ", +- ""}; +- +-/****************************************************************** +- +- INCLUDE FILES (system-dependent) +- +-******************************************************************/ +-#include +-#include +-#include +-#include +- +-#include +-#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__APPLE__) && !defined(__DragonFly__) +-#include +-#endif +-#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__DragonFly__) +-#include +-#include +-#endif +- +-#if defined (__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__) || defined(__DragonFly__) +-#ifndef O_SYNC +-#define O_SYNC O_FSYNC +-#endif +-#endif +- +-#if defined (__FreeBSD__) +-#ifndef O_RSYNC +-#define O_RSYNC O_FSYNC +-#endif +-#endif +- +-#if ((defined(solaris) && defined(__LP64__)) || defined(__s390x__)) +-/* If we are building for 64-bit Solaris, all functions that return pointers +- * must be declared before they are used; otherwise the compiler will assume +- * that they return ints and the top 32 bits of the pointer will be lost, +- * causing segmentation faults. The following includes take care of this. +- * It should be safe to add these for all other OSs too, but we're only +- * doing it for Solaris now in case another OS turns out to be a special case. +- */ +-#include +-#include +-#include +-#include +-#include +- +-#endif +-#if ( defined(solaris) && defined(studio11) ) +-#include +-#include +-#endif +- +-#if defined(OSFV5) || defined(linux) +-#include +-#endif +- +-#if defined(linux) +-#include +-#include +-#include +-#endif +- +-#ifndef MAP_FAILED +-#define MAP_FAILED -1 +-#endif +- +-#ifdef generic +-typedef long long off64_t; +-#endif +- +-#if defined(__DragonFly__) +-#define __off64_t_defined +-typedef off_t off64_t; +-#endif +- +- +-#ifndef solaris +-#ifndef off64_t +-#ifndef _OFF64_T +-#ifndef __AIX__ +-#ifndef __off64_t_defined +-#ifndef SCO_Unixware_gcc +-#ifndef UWIN +-#ifndef __DragonFly__ +-typedef long long off64_t; +-#endif +-#endif +-#endif +-#endif +-#endif +-#endif +-#endif +-#endif +- +-#ifdef __AIX__ +-#include +-#endif +- +-#ifdef VXFS +-#include +-#endif +- +-#ifdef unix +-#if defined (__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) \ +- || defined(_SUA_) +-#include +-#endif +-#include +-#include +-#include +-#ifndef NULL +-#define NULL 0 +-#endif +- +-#ifndef nolimits +-#include +-#endif +-#endif +- +-#ifdef HAVE_ANSIC_C +-#define VOLATILE volatile +-#else +-#define VOLATILE +-#endif +- +-#include +- +-#ifdef SHARED_MEM +-#include +-#endif +- +-#if defined(bsd4_2) && !defined(MS_SYNC) +-#define MS_SYNC 0 +-#define MS_ASYNC 0 +-#endif +- +-#if defined(bsd4_4) || defined(__DragonFly__) +-#define MAP_ANONYMOUS MAP_ANON +-#endif +- +-#if defined(SCO_Unixware_gcc) || defined(solaris) || defined(UWIN) || defined(SCO) +-#define MAP_FILE (0) +-#endif +- +-#if defined(IRIX) || defined(IRIX64) || defined(Windows) || defined(bsd4_2) || defined(bsd4_4) || defined(SCO) || defined(Solaris) || defined(SCO_Unixware_gcc) +-long long page_size = 4096; +-#define GOT_PAGESIZE 1 +-#elif defined(NBPG) +-long long page_size = NBPG; +-#define GOT_PAGESIZE 1 +-#elif defined(old_linux) +-#include +-long long page_size = PAGE_SIZE; +-#define GOT_PAGESIZE 1 +-#elif !defined(GOT_PAGESIZE) +-long long page_size = 4096; /* Used when all else fails */ +-#endif +- +-#ifdef HAVE_PREAD +-#ifdef HAVE_PREADV +-#define PVECMAX 16 +- +-#ifdef _HPUX_SOURCE +-#define PER_VECTOR_OFFSET +-#include +-struct piovec piov[PVECMAX]; +-#else +-#include +-struct iovec piov[PVECMAX]; +-#define piov_base iov_base +-#define piov_len iov_len +-#endif +- +-#endif +-#endif +- +-#define DEDUPSEED 0x2719362 +- +- +-/* +- * In multi thread/process throughput mode each child keeps track of +- * statistics and communicates them through various flavors of +- * shared memory, and via messages. +- */ +-struct child_stats { +- long long flag; /* control space */ +- long long flag1; /* pad */ +- float walltime; /* child elapsed time */ +- float cputime; /* child CPU time */ +- float throughput; /* Throughput in either kb/sec or ops/sec */ +- float actual; /* Either actual kb read or # of ops performed */ +-} VOLATILE *child_stat; +- +-/* +- * Used for cpu time statistics. +- */ +-struct runtime { +- float walltime; +- float cputime; +- float cpuutil; +-}; +- +-#ifdef __convex_spp +-#include +-#endif +- +-#include +-#include +-#include +- +- +-/* +- * Messages the controlling process sends to children. +- * Internal representation that is arch specific. +- * This is used when using the network distributed mode. +- */ +-struct client_command { +- char c_host_name[100]; +- char c_pit_hostname[40]; +- char c_pit_service[8]; +- char c_client_name[100]; +- char c_working_dir[200]; +- char c_file_name[200]; +- char c_path_dir[200]; +- char c_execute_name[200]; +- char c_write_traj_filename[200]; +- char c_read_traj_filename[200]; +- int c_oflag; +- int c_mfflag; +- int c_unbuffered; +- int c_noretest; +- int c_notruncate; +- int c_read_sync; +- int c_jflag; +- int c_async_flag; +- int c_k_flag; +- int c_h_flag; +- int c_mflag; +- int c_pflag; +- int c_stride_flag; +- int c_verify; +- int c_sverify; +- int c_odsync; +- int c_diag_v; +- int c_dedup; +- int c_dedup_interior; +- int c_dedup_compress; +- int c_dedup_mseed; +- int c_hist_summary; +- int c_op_rate; +- int c_op_rate_flag; +- int c_Q_flag; +- int c_L_flag; +- int c_OPS_flag; +- int c_mmapflag; +- int c_mmapasflag; +- int c_mmapnsflag; +- int c_mmapssflag; +- int c_no_copy_flag; +- int c_include_close; +- int c_include_flush; +- int c_disrupt_flag; +- int c_compute_flag; +- int c_xflag; +- int c_MS_flag; +- int c_mmap_mix; +- int c_Kplus_flag; +- int c_stop_flag; +- int c_w_traj_flag; +- int c_r_traj_flag; +- int c_direct_flag; +- int c_cpuutilflag; +- int c_seq_mix; +- int c_client_number; +- int c_command; +- int c_testnum; +- int c_no_unlink; +- int c_no_write; +- int c_file_lock; +- int c_rec_lock; +- int c_Kplus_readers; +- int c_multiplier; +- int c_share_file; +- int c_pattern; +- int c_version; +- int c_base_time; +- int c_num_child; +- int c_pct_read; +- int c_advise_op; +- int c_advise_flag; +- int c_restf; +- int c_mygen; +- long long c_stride; +- long long c_rest_val; +- long long c_delay; +- long long c_purge; +- long long c_fetchon; +- long long c_numrecs64; +- long long c_reclen; +- long long c_child_flag; +- long long c_delay_start; +- long long c_depth; +- float c_compute_time; +-}; +- +-/* +- * All data in this is in string format for portability in a +- * hetrogeneous environment. +- * +- * Messages that the master will send to the clients +- * over the socket. This provides neutral format +- * so that heterogeneous clusters will work. +- * This is used when using the network distributed mode. +- * WARNING !!! This data structure MUST not be bigger +- * than 1448 bytes or fragmentation will kick your butt. +- */ +-struct client_neutral_command { +- char c_host_name[100]; +- char c_pit_hostname[40]; +- char c_pit_service[8]; +- char c_client_name[100]; +- char c_working_dir[200]; +- char c_file_name[200]; +- char c_path_dir[200]; +- char c_execute_name[200]; +- char c_write_traj_filename[200]; +- char c_read_traj_filename[200]; +- char c_oflag[2]; +- char c_mfflag[2]; +- char c_unbuffered[2]; +- char c_noretest[2]; +- char c_notruncate[2]; +- char c_read_sync[2]; +- char c_jflag[2]; +- char c_async_flag[2]; +- char c_k_flag[2]; +- char c_h_flag[2]; +- char c_mflag[2]; +- char c_pflag[2]; +- char c_stride_flag[2]; +- char c_verify[2]; +- char c_sverify[2]; +- char c_odsync[2]; +- char c_diag_v[2]; +- char c_dedup[4]; +- char c_dedup_interior[4]; +- char c_dedup_compress[4]; +- char c_dedup_mseed[4]; +- char c_hist_summary[4]; +- char c_op_rate[4]; +- char c_op_rate_flag[2]; +- char c_Q_flag[2]; +- char c_L_flag[2]; +- char c_OPS_flag[2]; +- char c_mmapflag[2]; +- char c_mmapasflag[2]; +- char c_mmapnsflag[2]; +- char c_mmapssflag[2]; +- char c_no_copy_flag[2]; +- char c_include_close[2]; +- char c_include_flush[2]; +- char c_disrupt_flag[2]; +- char c_compute_flag[2]; +- char c_stop_flag[2]; +- char c_xflag[2]; +- char c_MS_flag[2]; +- char c_mmap_mix[2]; +- char c_Kplus_flag[2]; +- char c_w_traj_flag[2]; /* small int */ +- char c_r_traj_flag[2]; /* small int */ +- char c_direct_flag[2]; /* small int */ +- char c_cpuutilflag[2]; /* small int */ +- char c_seq_mix[2]; /* small int */ +- char c_stride[10]; /* small long long */ +- char c_rest_val[10]; /* small long long */ +- char c_purge[10]; /* very small long long */ +- char c_fetchon[10]; /* very small long long */ +- char c_multiplier[10]; /* small int */ +- char c_share_file[10]; /* small int */ +- char c_file_lock[10]; /* small int */ +- char c_rec_lock[10]; /* small int */ +- char c_Kplus_readers[10]; /* small int */ +- char c_client_number[20]; /* int */ +- char c_command[20]; /* int */ +- char c_testnum[20]; /* int */ +- char c_no_unlink[4]; /* int */ +- char c_no_write[4]; /* int */ +- char c_pattern[20]; /* int */ +- char c_version[20]; /* int */ +- char c_base_time[20]; /* int */ +- char c_num_child[20]; /* int */ +- char c_pct_read[6]; /* small int */ +- char c_advise_op[4]; /* small int */ +- char c_advise_flag[4]; /* small int */ +- char c_restf[4]; /* small int */ +- char c_mygen[20]; /* long */ +- char c_depth[20]; /* small long long */ +- char c_child_flag[40]; /* small long long */ +- char c_delay[80]; /* long long */ +- char c_numrecs64[80]; /* long long */ +- char c_reclen[80]; /* long long */ +- char c_delay_start[80]; /* long long */ +- char c_compute_time[80]; /* float */ +-}; +- +-/* +- * Messages the clients will send to the master. +- * Internal representation on each client and the master. +- * This is used when using the network distributed mode. +- */ +-struct master_command { +- char m_host_name[100]; +- char m_client_name[100]; +- char m_stop_flag; +- int m_client_number; +- int m_client_error; +- int m_child_port; +- int m_child_async_port; +- int m_command; +- int m_testnum; +- int m_version; +- int m_mygen; +- float m_throughput; +- float m_cputime; +- float m_walltime; +- float m_actual; +- long long m_child_flag; +-}; +- +-/* +- * Messages that the clients will send to the master +- * over the socket. This provides neutral format +- * so that heterogeneous clusters will work. +- * This is used when using the network distributed mode. +- */ +-struct master_neutral_command { +- char m_host_name[100]; +- char m_client_name[100]; +- char m_client_number[20]; /* int */ +- char m_client_error[20]; /* int */ +- char m_stop_flag[4]; /* char +space */ +- char m_child_port[20]; /* int */ +- char m_child_async_port[20]; /* int */ +- char m_command[20]; /* int */ +- char m_testnum[20]; /* int */ +- char m_version[20]; /* int */ +- char m_mygen[20]; /* int */ +- char m_throughput[80]; /* float */ +- char m_cputime[80]; /* float */ +- char m_walltime[80]; /* float */ +- char m_actual[80]; /* float */ +- char m_child_flag[80]; /* long long */ +-}; +- +- +-/* +- * Possible values for the commands sent to the master +- */ +-#define R_CHILD_JOIN 1 +-#define R_STAT_DATA 2 +-#define R_FLAG_DATA 3 +- +-/* +- * Possible values for the master's commands sent to a client +- * +- * The R_FLAG_DATA is also used by the master to tell the +- * client to update its flags. +- */ +-#define R_JOIN_ACK 4 +-#define R_STOP_FLAG 5 +-#define R_TERMINATE 6 +-#define R_DEATH 7 +- +- +-/* These are the defaults for the processor. They can be +- * over written by the command line options. +- */ +-#define CACHE_LINE_SIZE 32 +-#define CACHE_SIZE ( 1024 * 1024 ) +- +- +-#define MEG (1024 * 1024) +- +-/* +- * For stride testing use a prime number to avoid stripe +- * wrap hitting the same spindle. +- */ +-#define STRIDE 17 +- +- +- +-/************************************************************************/ +-/* */ +-/* DEFINED CONSTANTS */ +-/* */ +-/* Never add a comment to the end of a #define. Some compilers will */ +-/* choke and fail the compile. */ +-/************************************************************************/ +- +-/* +- * Size of buffer for capturing the machine's name. +- */ +-#define IBUFSIZE 100 +-/* +- * How many I/Os before a non-uniform access. +- */ +-#define DISRUPT 100 +- +-/* +- * Set the crossover size. This is where the small transfers +- * are skipped to save time. There is an option to +- * disable the skipping. +- */ +-#define LARGE_REC 65536 +- +-/* Default number of kilobytes in file */ +-#define KILOBYTES 512 +- +-/* Default number of bytes in a record */ +-#define RECLEN 1024 +- +-/* Default size of file in bytes*/ +-#define FILESIZE (KILOBYTES*1024) +- +-/* Default number of records */ +-#define NUMRECS FILESIZE/RECLEN +- +-#ifdef __bsdi__ +-/* At 8 Meg switch to large records */ +-#define CROSSOVER (8*1024) +-/*maximum buffer size*/ +-#define MAXBUFFERSIZE (8*1024*1024) +-#else +-/* At 16 Meg switch to large records */ +-#define CROSSOVER (16*1024) +-/* Maximum buffer size*/ +-#define MAXBUFFERSIZE (16*1024*1024) +-#endif +- +-/* Maximum number of children. Threads/procs/clients */ +-#define MAXSTREAMS 256 +- +-/* Minimum buffer size */ +-#define MINBUFFERSIZE 128 +-/* If things ran way too fast */ +-#define TOOFAST 10 +-/* Set the maximum number of types of tests */ +-#define MAXTESTS 12 +-/* Default fill pattern for verification */ +-#define PATTERN get_pattern(); +-#define PATTERN1 0xBB +-/* Used for Excel internal tables */ +-#define MAX_X 100 +-/* Used for Excel internal tables */ +-#define MAX_Y 512 +- +-#define USAGE "\tUsage: For usage information type iozone -h \n\n" +- +- +-/* Maximum number of characters in filename */ +-#define MAXNAMESIZE 1000 +- +-/* +- * Define the typical output that the user will see on their +- * screen. +- */ +-#ifdef NO_PRINT_LLD +-#ifdef HAVE_PREAD +-#include +-#if defined(HAVE_PREAD) && defined(HAVE_PREADV) +-#define CONTROL_STRING1 "%16ld%8ld%8ld%8ld%8ld%8ld%8ld%8ld%8ld %8ld %8ld%8ld%8ld%9ld%9ld%8ld%10ld%9ld%10ld%9ld%10ld%10ld%9ld\n" +-#define CONTROL_STRING2 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s%8s%9s%7s%10s%10s%10s%9s%9s\n" +-#define CONTROL_STRING3 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s\n" +-#define CONTROL_STRING4 "%16s%8s%8s%8s%8s%10s\n" +-#else +-#define CONTROL_STRING1 "%16ld%8ld%8ld%8ld%8ld%8ld%8ld%8ld%8ld %8ld %8ld%8ld%8ld%9ld%9ld%8ld%10ld%9ld%10ld\n" +-#define CONTROL_STRING2 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s%8s%9s%7s%10s\n" +-#define CONTROL_STRING3 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s\n" +-#define CONTROL_STRING4 "%16s%8s%8s%8s%8s%10s\n" +-#endif +-#else +-#define CONTROL_STRING1 "%16ld%8ld%8ld%8ld%8ld%8ld%8ld%8ld%8ld %8ld %8ld%8ld%8ld%9ld%9ld\n" +-#define CONTROL_STRING2 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s\n" +-#define CONTROL_STRING3 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s\n" +-#define CONTROL_STRING4 "%16s%8s%8s%8s%8s%10s\n" +-#endif +-#endif +- +-#ifndef NO_PRINT_LLD +-#ifdef HAVE_PREAD +-#include +-#if defined(HAVE_PREAD) && defined(HAVE_PREADV) +-#define CONTROL_STRING1 "%16lld%8ld%8ld%8ld%8ld%8ld%8ld%8ld%8ld %8ld %8ld%8ld%8ld%9ld%9ld%8ld%10ld%9ld%10ld%9ld%10ld%10ld%9ld\n" +-#define CONTROL_STRING2 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s%8s%9s%7s%10s%10s%10s%9s%9s\n" +-#define CONTROL_STRING3 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s\n" +-#define CONTROL_STRING4 "%16s%8s%8s%8s%8s%10s\n" +-#else +-#define CONTROL_STRING1 "%16lld%8ld%8ld%8ld%8ld%8ld%8ld%8ld%8ld %8ld %8ld%8ld%8ld%9ld%9ld%8ld%10ld%9ld%10ld\n" +-#define CONTROL_STRING2 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s%8s%9s%7s%10s\n" +-#define CONTROL_STRING3 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s\n" +-#define CONTROL_STRING4 "%16s%8s%8s%8s%8s%10s\n" +-#endif +-#else +-#define CONTROL_STRING1 "%16lld%8ld%8ld%8ld%8ld%8ld%8ld%8ld %8ld %8ld%8ld%8ld%8ld%9ld%9ld\n" +-#define CONTROL_STRING2 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s\n" +-#define CONTROL_STRING3 "%16s%8s%8s%8s%8s%10s%8s%8s%8s %8s %8s%9s%9s%8s%9s\n" +-#define CONTROL_STRING4 "%16s%8s%8s%8s%8s%10s\n" +-#endif +-#endif +- +-/* +- For 'auto mode', these defines determine the number of iterations +- to perform for both the file size and the record length. +-*/ +- +-/* Start with 64 kbyte minimum file size by default */ +-#define KILOBYTES_START 64 +-/* Default maximum file size. This is 512 Mbytes */ +-#define KILOBYTES_END (1024*512) +-/* Default starting record size */ +-#define RECLEN_START 4096 +-/* Default maximum record size */ +-#define RECLEN_END (MAXBUFFERSIZE) +-/* Multiplier for each itteration on file and record size */ +-#define MULTIPLIER 2 +- +-/* +- * Assign numeric values to each of the tests. +- */ +-#define WRITER_TEST 0 +-#define READER_TEST 1 +-#define RANDOM_RW_TEST 2 +-#define REVERSE_TEST 3 +-#define REWRITE_REC_TEST 4 +-#define STRIDE_READ_TEST 5 +-#define FWRITER_TEST 6 +-#define FREADER_TEST 7 +-#define RANDOM_MIX_TEST 8 +-#ifdef HAVE_PREAD +-#define PWRITER_TEST 9 +-#define PREADER_TEST 10 +-#endif /* HAVE_PREAD */ +-#ifdef HAVE_PREADV +-#define PWRITEV_TEST 11 +-#define PREADV_TEST 12 +-#endif /* HAVE_PREADV */ +- +-#define WRITER_MASK (1 << WRITER_TEST) +-#define READER_MASK (1 << READER_TEST) +-#define RANDOM_RW_MASK (1 << RANDOM_RW_TEST) +-#define RANDOM_MIX_MASK (1 << RANDOM_MIX_TEST) +-#define REVERSE_MASK (1 << REVERSE_TEST) +-#define REWRITE_REC_MASK (1 << REWRITE_REC_TEST) +-#define STRIDE_READ_MASK (1 << STRIDE_READ_TEST) +-#define FWRITER_MASK (1 << FWRITER_TEST) +-#define FREADER_MASK (1 << FREADER_TEST) +-#ifdef HAVE_PREAD +-#define PWRITER_MASK (1 << PWRITER_TEST) +-#define PREADER_MASK (1 << PREADER_TEST) +-#endif /* HAVE_PREAD */ +-#ifdef HAVE_PREADV +-#define PWRITEV_MASK (1 << PWRITEV_TEST) +-#define PREADV_MASK (1 << PREADV_TEST) +-#endif /* HAVE_PREADV */ +- +-/* +- * child_stat->flag values and transitions +- */ +-/* Parent initializes children to HOLD */ +-#define CHILD_STATE_HOLD 0 +-/* Child tells master when it's READY */ +-#define CHILD_STATE_READY 1 +-/* Parent tells child to BEGIN */ +-#define CHILD_STATE_BEGIN 2 +-/* Child tells parent that it's DONE */ +-#define CHILD_STATE_DONE 3 +- +-#define MERSENNE +- +-/******************************************************************/ +-/* */ +-/* FUNCTION DECLARATIONS */ +-/* */ +-/******************************************************************/ +-char *initfile(); +-/*int pit_gettimeofday( struct timeval *, struct timezone *, char *, char *);*/ +-int pit_gettimeofday( ); +-static int openSckt( const char *, const char *, unsigned int ); +-static void pit( int, struct timeval *); +-void mmap_end(); +-void alloc_pbuf(); +-void auto_test(); /* perform automatic test series */ +-void show_help(); /* show development help */ +-static double time_so_far(); /* time since start of program */ +-#ifdef unix +-static double utime_so_far(); /* user time */ +-static double stime_so_far(); /* system time */ +-static double clk_tck(); /* Get clocks/tick */ +-static double cputime_so_far(); +-#else +-#define cputime_so_far() time_so_far() +-#endif +-static double time_so_far1(); /* time since start of program */ +-void get_resolution(); +-void get_rusage_resolution(); +-void signal_handler(); /* clean up if user interrupts us */ +-void begin(); /* The main worker in the app */ +-void fetchit(); /* Prime on chip cache */ +-void purgeit(); /* Purge on chip cache */ +-void throughput_test(); /* Multi process throughput */ +-void multi_throughput_test(); /* Multi process throughput */ +-void prepage(); /* Pre-fault user buffer */ +-void get_date(); +-int get_pattern(); /* Set pattern based on version */ +-#ifdef HAVE_ANSIC_C +-float do_compute(float); /* compute cycle simulation */ +-#else +-float do_compute(); /* compute cycle simulation */ +-#endif +-void write_perf_test(); /* write/rewrite test */ +-void fwrite_perf_test(); /* fwrite/refwrite test */ +-void fread_perf_test(); /* fread/refread test */ +-void read_perf_test(); /* read/reread test */ +-void mix_perf_test(); /* read/reread test */ +-void random_perf_test(); /* random read/write test */ +-void reverse_perf_test(); /* reverse read test */ +-void rewriterec_perf_test(); /* rewrite record test */ +-void read_stride_perf_test(); /* read with stride test */ +-#ifdef HAVE_PREAD +-void pread_perf_test(); /* pread/re-pread test */ +-void pwrite_perf_test(); /* pwrite/re-pwrite test */ +-#endif /* HAVE_PREAD */ +-#ifdef HAVE_PREADV +-void preadv_perf_test(); /* preadv/re-preadv test */ +-void pwritev_perf_test(); /* pwritev/re-pwritev test */ +-#endif /* HAVE_PREADV */ +-void store_dvalue(); /* Store doubles array */ +-void dump_excel(); +-void dump_throughput(); +-int sp_start_child_send(); +-int sp_start_master_listen(); +-#ifdef HAVE_ANSIC_C +-#if defined (HAVE_PREAD) && defined(_LARGEFILE64_SOURCE) +-ssize_t pwrite64(); +-ssize_t pread64(); +-#endif +-#if !defined(linux) +-char *getenv(); +-char *inet_ntoa(); +-int system(); +-#endif +-void my_nap(); +-void my_unap(); +-int thread_exit(); +-#ifdef ASYNC_IO +-size_t async_write(); +-void async_release(); +-int async_read(); +-int async_read_no_copy(); +-size_t async_write_no_copy(); +-void end_async(); +-void async_init(); +-#else +-size_t async_write(); +-size_t async_write_no_copy(); +-void async_release(); +-#endif +-void do_float(); +-int create_xls(); +-void close_xls(); +-void do_label(); +-int mylockf(int, int, int); +-int mylockr(int,int, int, off64_t, off64_t); +-int rand(void); +-void srand(unsigned int); +-int get_client_info(void); +-void exit(int); +-void find_remote_shell(char *); +-void find_external_mon(char *,char *); +-void start_monitor(char *); +-void stop_monitor(char *); +-void takeoff_cache(); +-void del_cache(); +-void fill_area(long long *, long long *, long long); +-void fill_buffer(char *,long long ,long long ,char, long long ); +-void store_value(off64_t); +-void store_times(double, double); +-static double cpu_util(double, double); +-void dump_cputimes(void); +-void purge_buffer_cache(void); +-char *alloc_mem(long long,int); +-void *(thread_rwrite_test)(void *); +-void *(thread_write_test)(void *); +-void *(thread_fwrite_test)(void *); +-void *(thread_fread_test)(void *); +-void *(thread_read_test)(void*); +-#ifdef HAVE_PREAD +-void *(thread_pread_test)(void*); +-void *(thread_pwrite_test)(void*); +-#endif +-void *(thread_cleanup_test)(void*); +-void *(thread_cleanup_quick)(void*); +-void *(thread_ranread_test)(void *); +-void *(thread_mix_test)(void *); +-void *(thread_ranwrite_test)(void *); +-void *(thread_rread_test)(void *); +-void *(thread_reverse_read_test)(void *); +-void *(thread_stride_read_test)(void *); +-void *(thread_set_base)(void *); +-void *(thread_join)(long long, void *); +-void disrupt(int); +-#if defined(Windows) +-void disruptw(HANDLE); +-#endif +-long long get_traj(FILE *, long long *, float *, long); +-void create_temp(off64_t, long long ); +-FILE *open_w_traj(void); +-FILE *open_r_traj(void); +-void traj_vers(void); +-void r_traj_size(void); +-long long w_traj_size(void); +-void init_file_sizes(); +-off64_t get_next_file_size(off64_t); +-void add_file_size(off64_t); +-void init_file_sizes( off64_t, off64_t); +-off64_t get_next_record_size(off64_t); +-void add_record_size(off64_t); +-void init_record_sizes( off64_t, off64_t); +-void del_record_sizes( void ); +-void hist_insert(double ); +-void dump_hist(char *,int ); +-void do_speed_check(int); +-#else +-void do_speed_check(); +-#if !defined(linux) +-char *getenv(); +-char *inet_ntoa(); +-int system(); +-#endif +-void my_nap(); +-void my_unap(); +-int thread_exit(); +-void close_xls(); +-void do_label(); +-int create_xls(); +-void do_float(); +-#ifdef ASYNC_IO +-void async_release(); +-size_t async_write(); +-size_t async_write_no_copy(); +-int async_read(); +-int async_read_no_copy(); +-#endif +-int mylockf(); +-int mylockr(); +-int rand(); +-void srand(); +-int get_client_info(); +-void exit(); +-void find_remote_shell(); +-void traj_vers(); +-void r_traj_size(); +-long long w_traj_size(); +-FILE *open_w_traj(); +-FILE *open_r_traj(); +-void create_temp(); +-void fill_buffer(); +-char *alloc_mem(); +-void *(thread_rwrite_test)(); +-void *(thread_write_test)(); +-void *(thread_fwrite_test)(); +-void *(thread_fread_test)(); +-void *(thread_read_test)(); +-void *(thread_cleanup_test)(); +-void *(thread_ranread_test)(); +-void *(thread_mix_test)(); +-void *(thread_ranwrite_test)(); +-void *(thread_rread_test)(); +-void *(thread_reverse_read_test)(); +-void *(thread_stride_read_test)(); +-void *(thread_set_base)(); +-void *(thread_join)(); +-void disrupt(); +-long long get_traj(); +-void init_file_sizes(); +-off64_t get_next_file_size(); +-void add_file_size(); +-void init_record_sizes(); +-off64_t get_next_record_size(); +-void add_record_size(); +-void dump_cputimes(); +-static double cpu_util(); +-void del_record_sizes(); +-void hist_insert(); +-void dump_hist(); +-#endif +- +-#ifdef _LARGEFILE64_SOURCE +-#define I_LSEEK(x,y,z) lseek64(x,(off64_t)(y),z) +-#define I_OPEN(x,y,z) open64(x,(int)(y),(int)(z)) +-#define I_CREAT(x,y) creat64(x,(int)(y)) +-#define I_FOPEN(x,y) fopen64(x,y) +-#define I_STAT(x,y) stat64(x,y) +-#ifdef HAVE_PREAD +-#define I_PREAD(a,b,c,d) pread64(a,b,(size_t)(c),(off64_t)(d)) +-#define I_PWRITE(a,b,c,d) pwrite64(a,b,(size_t)(c),(off64_t)(d)) +-#endif +-#define I_MMAP(a,b,c,d,e,f) mmap64((void *)(a),(size_t)(b),(int)(c),(int)(d),(int)(e),(off64_t)(f)) +-#else +-#define I_LSEEK(x,y,z) lseek(x,(off_t)(y),z) +-#define I_OPEN(x,y,z) open(x,(int)(y),(int)(z)) +-#define I_CREAT(x,y) creat(x,(int)(y)) +-#define I_FOPEN(x,y) fopen(x,y) +-#define I_STAT(x,y) stat(x,y) +-#ifdef HAVE_PREAD +-#define I_PREAD(a,b,c,d) pread(a,b,(size_t)(c),(off_t)(d)) +-#define I_PWRITE(a,b,c,d) pwrite(a,b,(size_t)(c),(off_t)(d)) +-#endif +-#define I_MMAP(a,b,c,d,e,f) mmap((void *)(a),(size_t)(b),(int)(c),(int)(d),(int)(e),(off_t)(f)) +-#endif +- +- +-/************************************************************************/ +-/* The list of tests to be called. */ +-/************************************************************************/ +-void (*func[])() = { +- write_perf_test, +- read_perf_test, +- random_perf_test, +- reverse_perf_test, +- rewriterec_perf_test, +- read_stride_perf_test, +- fwrite_perf_test, +- fread_perf_test, +- mix_perf_test +-#ifdef HAVE_PREAD +- , +- pwrite_perf_test, +- pread_perf_test +-#ifdef HAVE_PREADV +- , +- pwritev_perf_test, +- preadv_perf_test +-#endif /* HAVE_PREADV */ +-#endif /* HAVE_PREAD */ +- }; +- +-/* +-char *test_output[] = {" ", +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- " \n" }; +-*/ +-char *test_output[] = {" ", +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- "", +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- " \n" }; +-long long test_soutput[] = {2,2,2,1,1,1,2,2,2,2,2,2,2,2}; +- +- +-/******************************************************************/ +-/* */ +-/* GLOBAL VARIABLES */ +-/* */ +-/*******************************************************************/ +- +-/* +- * Set the size of the shared memory segment for the children +- * to put their results. +- */ +-#define SHMSIZE ((( sizeof(struct child_stats) * MAXSTREAMS) )+4096 ) +-/* +- * Pointer to the shared memory segment. +- */ +-VOLATILE struct child_stats *shmaddr; +-double totaltime,total_time, temp_time ,total_kilos; +-off64_t report_array[MAX_X][MAX_Y]; +-double report_darray[MAX_X][MAXSTREAMS]; +-double time_res,cputime_res; +-long long throughput_array[MAX_X]; /* Filesize & record size are constants */ +-short current_x, current_y; +-long long orig_size; +-long long max_x, max_y; +-unsigned long long goodkilos; +-off64_t kilobytes64 = (off64_t)KILOBYTES; +-long long goodrecl; +-off64_t offset = 0; /*offset for random I/O */ +-off64_t offset64 = 0; /*offset for random I/O */ +-off64_t filebytes64; +-off64_t r_range[100]; +-off64_t s_range[100]; +-int t_range[100]; +-int t_count = 0; +-int r_count,s_count; +-char *barray[MAXSTREAMS]; +-char *haveshm; +-extern int optind; +-long long onetime, auto_mode, sfd, multi_buffer; +-int fd; +-int sp_msfd,sp_mrfd,sp_csfd,sp_crfd; +-int begin_proc,num_processors,ioz_processor_bind; +-long long res_prob,rec_prob; +-char silent,read_sync; +-char master_iozone, client_iozone,distributed; +-int bif_fd,s_count; +-int bif_row,bif_column; +-int dedup_mseed = 1; +-int hist_summary; +-int op_rate; +-int op_rate_flag; +-char aflag, Eflag, hflag, Rflag, rflag, sflag; +-char diag_v,sent_stop,dedup,dedup_interior,dedup_compress; +-char *dedup_ibuf; +-char *dedup_temp; +-char bif_flag; +-int rlocking; +-int share_file; +-int ecount; +-char gflag,nflag; +-char yflag,qflag; +-#ifdef Windows +-char *build_name = "Windows"; +-#else +-char *build_name = NAME; +-#endif +-char imon_start[256],imon_stop[256]; +-char imon_sync; +-char trflag; +-char cpuutilflag; +-char seq_mix; +-long base_time; +-long long mint, maxt; +-long long w_traj_ops, r_traj_ops, w_traj_fsize,r_traj_fsize; +-long long r_traj_ops_completed,r_traj_bytes_completed; +-long long w_traj_ops_completed,w_traj_bytes_completed; +-int w_traj_items, r_traj_items; +-char fflag, Uflag,uflag,lflag,include_tflag; +-struct runtime runtimes [MAX_X] [MAX_Y]; /* in parallel with report_array[][] */ +-long long include_test[50]; +-long long include_mask; +-char RWONLYflag, NOCROSSflag; /*auto mode 2 - kcollins 8-21-96*/ +-char mfflag; +-long long status, x, y, childids[MAXSTREAMS+1], myid, num_child; +-int pct_read,speed_code; +-#ifndef NO_THREADS +-pthread_t p_childids[MAXSTREAMS+1]; +-#endif +-off64_t next64; +-char wol_opened, rol_opened; +-FILE *wqfd,*rwqfd,*rqfd,*rrqfd; +- +-extern char *optarg; +-#ifndef __AIX__ +-long long ret; +-#else +-short ret; +-#endif +-struct size_entry { +- struct size_entry *next; +- off64_t size; +-}; +-struct size_entry *size_list=0; +-struct size_entry *rec_size_list=0; +-off64_t maximum_file_size; +-off64_t minimum_file_size; +- +-char bif_filename [MAXNAMESIZE]; /* name of biff file */ +-char filename [MAXNAMESIZE]; /* name of temporary file */ +-char mountname [MAXNAMESIZE]; /* name of device */ +-char dummyfile [MAXSTREAMS][MAXNAMESIZE]; /* name of dummy file */ +-char dummyfile1 [MAXNAMESIZE]; /* name of dummy file */ +-char *filearray[MAXSTREAMS]; /* array of file names */ +-char tfile[] = "iozone"; +-char *buffer,*buffer1, *mbuffer,*mainbuffer; +-FILE *pi,*r_traj_fd,*w_traj_fd; +-VOLATILE char *pbuffer; +-char *default_filename="iozone.tmp"; /*default name of temporary file*/ +-VOLATILE char stoptime; +-char Cflag; +-char use_thread = 0; +-long long debug1=0; +-long long debug=0; +-unsigned long cache_size=CACHE_SIZE; +-unsigned long cache_line_size=CACHE_LINE_SIZE; +-long long *pstatus; +-off64_t min_file_size = KILOBYTES_START; +-off64_t max_file_size = KILOBYTES_END; +-long long min_rec_size = RECLEN_START; +-long long max_rec_size = RECLEN_END; +-long long orig_min_rec_size = RECLEN_START; +-long long orig_max_rec_size = RECLEN_END; +-long long xover = CROSSOVER; +-char *throughput_tests[] = {"Initial write","Rewrite","Read","Re-read", +- "Reverse Read","Stride read","Random read","Mixed workload","Random write","Pwrite","Pread","Fwrite","Fread"}; +-char command_line[1024] = "\0"; +-#ifdef unix +-double sc_clk_tck; +-#endif +- +-int argcsave; +-char **argvsave; +-char splash[80][80]; +-int splash_line; +-char client_filename[256]; +-char remote_shell[256]; +-int client_error; +- +-char pit_hostname[40]; +-char pit_service[8]; +-int junk; +- +-/* +- * Host ports used to listen, and handle errors. +- */ +-#define HOST_LIST_PORT 20000 +-#define HOST_ESEND_PORT (HOST_LIST_PORT+MAXSTREAMS) +-#define HOST_ASEND_PORT (HOST_ESEND_PORT+MAXSTREAMS) +-int controlling_host_port = HOST_LIST_PORT; +- +-/* +- * Childs ports used to listen, and handle errors. +- */ +-#define CHILD_ESEND_PORT (HOST_ASEND_PORT+MAXSTREAMS) +-#define CHILD_LIST_PORT (CHILD_ESEND_PORT+MAXSTREAMS) +- +-/* Childs async message port. Used for stop flag and terminate */ +-#define CHILD_ALIST_PORT (CHILD_LIST_PORT+MAXSTREAMS) +- +-/* Ports for the network speed code */ +-#define SP_CHILD_LISTEN_PORT 31000 +-#define SP_CHILD_ESEND_PORT (SP_CHILD_LISTEN_PORT+10) +-#define SP_MASTER_LISTEN_PORT (SP_CHILD_ESEND_PORT+10) +-#define SP_MASTER_ESEND_PORT (SP_MASTER_LISTEN_PORT+10) +-#define SP_MASTER_RESULTS_PORT (SP_MASTER_ESEND_PORT+10) +- +- +-#define THREAD_WRITE_TEST 1 +-#define THREAD_REWRITE_TEST 2 +-#define THREAD_READ_TEST 3 +-#define THREAD_REREAD_TEST 4 +-#define THREAD_STRIDE_TEST 5 +-#define THREAD_RANDOM_READ_TEST 6 +-#define THREAD_RANDOM_WRITE_TEST 7 +-#define THREAD_REVERSE_READ_TEST 8 +-#define THREAD_RANDOM_MIX_TEST 9 +-#define THREAD_PWRITE_TEST 10 +-#define THREAD_PREAD_TEST 11 +-#define THREAD_FWRITE_TEST 12 +-#define THREAD_FREAD_TEST 13 +-#define THREAD_CLEANUP_TEST 14 +- +-/* +- * Child states that the master is tracking. +- * The master uses these to determine how to shutdown +- * the clients when some fool hits control-C. +- */ +-#define C_STATE_ZERO 1 +-#define C_STATE_WAIT_WHO 2 +-#define C_STATE_WAIT_BARRIER 3 +- +- +-int c_port,a_port; /* port number */ +-int child_port; /* Virtualized due to fork */ +-int child_async_port; /* Virtualized due to fork */ +-int client_listen_pid; /* Virtualized due to fork */ +-int master_join_count; /* How many children have joined */ +-int l_sock,l_async_sock; /* Sockets for listening */ +-char master_rcv_buf[4096]; /* Master's receive buffer */ +-int master_listen_pid; /* Pid of the master's async listener proc */ +-char master_send_buf[4096]; /* Master's send buffer */ +-char child_rcv_buf[4096]; /* Child's receive buffer */ +-char child_async_rcv_buf[4096]; /* Child's async recieve buffer */ +-char child_send_buf[4096]; /* Child's send buffer */ +-int child_send_socket; /* Child's send socket */ +-int child_listen_socket; /* Child's listener socket */ +-int child_listen_socket_async; /* Child's async listener socket */ +-int master_send_socket; /* Needs to be an array. One for each child*/ +-int master_send_sockets[MAXSTREAMS]; /* Needs to be an array. One for each child*/ +-int master_send_async_sockets[MAXSTREAMS]; /* Needs to be an array. One for each child*/ +-int master_listen_port; /* Master's listener port number */ +-int master_listen_socket; /* Master's listener socket */ +-int clients_found; /* Number of clients found in the client file */ +-FILE *newstdin, *newstdout, *newstderr; /* used for debug in cluster mode.*/ +-char toutput[20][20]; /* Used to help format the output */ +-int toutputindex; /* Index to the current output line */ +-int cdebug = 0; /* Use to turn on child/client debugging in cluster mode. */ +-int mdebug = 0; /* Use to turn on master debug in cluster mode */ +-int aggflag; /* Used to indicate constant aggregate data set size */ +-struct sockaddr_in child_sync_sock, child_async_sock; +- +-/* +- * Change this whenever you change the message format of master or client. +- */ +-int proto_version = 25; +- +-/******************************************************************************/ +-/* Tele-port zone. These variables are updated on the clients when one is */ +-/* using cluster mode. (-+m) */ +-/* Do not touch these unless you have become one with the universe !! */ +-/******************************************************************************/ +-char controlling_host_name[100]; +-struct child_ident { +- char child_name[100]; +- char workdir[200]; +- char execute_path[200]; +- char file_name[200]; +- int state; +- int child_number; +- int child_port; +- int child_async_port; +- int master_socket_num; +- int master_async_socket_num; +-}child_idents[MAXSTREAMS]; +-int Kplus_readers; +-char write_traj_filename [MAXNAMESIZE]; /* name of write telemetry file */ +-char read_traj_filename [MAXNAMESIZE]; /* name of read telemetry file */ +-char oflag,jflag,k_flag,h_flag,mflag,pflag,unbuffered,Kplus_flag; +-char noretest; +-char notruncate; /* turn off truncation of files */ +-char async_flag,stride_flag,mmapflag,mmapasflag,mmapssflag,mmapnsflag,mmap_mix; +-char verify = 1; +-int restf; +-char sverify = 1; +-char odsync = 0; +-char Q_flag,OPS_flag; +-char L_flag=0; +-char no_copy_flag,include_close,include_flush; +-char disrupt_flag,compute_flag,xflag,Z_flag, X_flag; +-int no_unlink = 0; +-int no_write = 0; +-int r_traj_flag,w_traj_flag; +-int mygen; +-char MS_flag; +-int advise_op,advise_flag; +-int direct_flag; +-int current_client_number; +-long long chid; +-int file_lock; +-unsigned int pattern; +-long long stride = STRIDE; +-long long delay,purge,fetchon; +-off64_t numrecs64 = (off64_t)NUMRECS; +-long long reclen = RECLEN; +-long long delay_start,depth; +-VOLATILE char *stop_flag; /* Used to stop all children */ +-float compute_time; +-int multiplier = MULTIPLIER; +-long long rest_val; +-#if defined(Windows) +- HANDLE hand; +-#endif +- +-/******************************************************************************/ +-/* End of Tele-port zone. */ +-/******************************************************************************/ +- +- +-/* +- * Prototypes +- * Sort of... Full prototypes break non-ansi C compilers. No protos is +- * a bit sloppy, so the compromise is this. +- */ +-void child_send(); +-int start_child_listen(); +-int start_child_listen_async(); +-void start_child_listen_loop(); +-void child_listen(); +-void child_listen_async(); +-void stop_child_send(); +-void stop_child_listen(); +-void cleanup_comm(); +-void master_send(); +-int start_master_send(); +-int start_master_listen(); +-int check_filename(); +-void master_listen(); +-void stop_master_send(); +-void stop_master_listen(); +-long long start_child_proc(); +-int parse_client_line(); +-void wait_dist_join(); +-void tell_children_begin(); +-void start_master_listen_loop(); +-void wait_for_master_go(); +-void tell_master_ready(); +-void stop_master_listen_loop(); +-void tell_master_stats(); +-void become_client(); +-int pick_client(); +-long long start_child_proc(); +-int start_master_send(); +-void child_listen(); +-int start_child_listen(); +-void stop_master_send(); +-void stop_master_listen(); +-void stop_child_send(); +-void stop_child_listen(); +-void master_send(); +-void child_send(); +-void master_listen(); +-int start_master_listen(); +-void child_remove_files(); +-void terminate_child_async(); +-void distribute_stop(); +-void send_stop(); +-void cleanup_children(); +- +- +-/****************************************************************/ +-/* */ +-/* MAIN () */ +-/* */ +-/****************************************************************/ +- +-int +-main(argc,argv) +-int argc; +-char **argv; +-{ +- +- long long fileindx,i,tval; +- long long ind; +- int ret; +- FILE *pi; +- char reply[IBUFSIZE]; +- unsigned char inp_pat; +- time_t time_run; +- char *port,*m,*subarg; +- int num_child1; +- int cret; +- int anwser,bind_cpu; +- char *evalue; +- +- +- anwser=bind_cpu=0; +- /* Used to make fread/fwrite do something better than their defaults */ +- setvbuf( stdout, NULL, _IONBF, (size_t) NULL ); +- setvbuf( stderr, NULL, _IONBF, (size_t) NULL ); +- +- /* Save the master's name */ +- gethostname(controlling_host_name,100); +- +- /* Let user activate mdebug or cdebug via environmental variables */ +- evalue = (char *)NULL; +- evalue=(char *)getenv("CDEBUG"); +- if(evalue) +- cdebug=atoi(evalue); +- evalue = (char *)NULL; +- evalue=(char *)getenv("MDEBUG"); +- if(evalue) +- mdebug=atoi(evalue); +- +- srand(time(0)); +- mygen=rand(); /* Pick a random generation number */ +- +- /* Try to find the actual VM page size, if possible */ +-#if defined (solaris) || defined (_HPUX_SOURCE) || defined (linux) || defined(IRIX) || defined (IRIX64) +-#ifndef __convex_spp +- page_size=getpagesize(); +-#endif +-#endif +- /* Try to find the actual number of ticks per second */ +-#ifdef unix +- sc_clk_tck = clk_tck(); +-#endif +- for(ind=0;ind 60) +- depth=60; +- */ +-#ifdef NO_PRINT_LLD +- sprintf(splash[splash_line++],"\tPOSIX Async I/O (no bcopy). Depth %ld \n",depth); +-#else +- sprintf(splash[splash_line++],"\tPOSIX Async I/O (no bcopy). Depth %lld \n",depth); +-#endif +- no_copy_flag=1; +- async_flag++; +- k_flag++; +- break; +- case 'T': /* Switch to POSIX thread based */ +-#ifndef NO_THREADS +- use_thread++; +-#else +- printf("\tThreads not supported in this version\n"); +- exit(2); +-#endif +- break; +- case 'H': /* Use POSIX async_io */ +- h_flag++; +- depth = (long long)(atoi(optarg)); +- if(depth <0) +- depth=0; +- /* +- * Hmmm. many systems fail is strange ways when the maximum +- * number of async I/Os per user or proc is exceeded. +- */ +- /* +- if(depth > 60) +- depth=60; +- */ +-#ifdef NO_PRINT_LLD +- sprintf(splash[splash_line++],"\tPOSIX async I/O (with bcopy). Depth %ld\n",depth); +-#else +- sprintf(splash[splash_line++],"\tPOSIX async I/O (with bcopy). Depth %lld\n",depth); +-#endif +- async_flag++; +- break; +- case 'I': /* Use VXFS direct advisory or O_DIRECT from Linux or AIX , or O_DIRECTIO for TRU64 or Solaris directio */ +-#ifdef VXFS +- direct_flag++; +- sprintf(splash[splash_line++],"\tVxFS advanced feature SET_CACHE, VX_DIRECT enabled\n"); +- break; +-#endif +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined(__FreeBSD__) || defined(solaris) +- direct_flag++; +- sprintf(splash[splash_line++],"\tO_DIRECT feature enabled\n"); +- break; +-#endif +-#if defined(TRU64) +- direct_flag++; +- sprintf(splash[splash_line++],"\tO_DIRECTIO feature enabled\n"); +- break; +-#endif +-#else +- break; +-#endif +-#if defined(Windows) +- sprintf(splash[splash_line++],"\tO_DIRECTIO feature not available in Windows version.\n"); +- break; +-#endif +- case 'B': /* Use mmap file for test file */ +- sprintf(splash[splash_line++],"\tUsing mmap files\n"); +- mmapflag++; +- mmapnsflag++; +- break; +- case 'D': /* Use async msync mmap file */ +- sprintf(splash[splash_line++],"\tUsing msync(MS_ASYNC) on mmap files\n"); +- mmapflag++; +- mmapasflag++; +- mmapnsflag=0; +- break; +- case 'G': /* Use msync sync for mmap file */ +- sprintf(splash[splash_line++],"\tUsing msync(MS_SYNC) on mmap files\n"); +- mmapssflag++; +- mmapnsflag=0; +- break; +- case 'C': /* show children xfer counts */ +- Cflag++; +- break; +- case 'Q': /* Enable output offset/latency files */ +- sprintf(splash[splash_line++],"\tOffset/latency files enabled.\n"); +- Q_flag++; +- break; +- case 'x': /* Disable stone_wall */ +- sprintf(splash[splash_line++],"\tStonewall disabled\n"); +- xflag++; +- break; +- +- case 'a': /* auto mode */ +- fetchon=1; +- purge=0; +- multi_buffer=0; +- auto_mode = 1; +- aflag++; +- sprintf(splash[splash_line++],"\tAuto Mode\n"); +- break; +- case 'c': /* Include close in timing */ +- include_close++; +- sprintf(splash[splash_line++],"\tInclude close in write timing\n"); +- break; +- case 'e': /* Include fsync in timing */ +- include_flush++; +- sprintf(splash[splash_line++],"\tInclude fsync in write timing\n"); +- break; +- case 'A': /* auto2 mode. Soon to go away. Please use -az */ +- fetchon=1; +- purge=0; +- multi_buffer=0; +- auto_mode = 1; +- aflag++; +- sprintf(splash[splash_line++],"\tAuto Mode 2. This option is obsolete. Use -az -i0 -i1 \n"); +- RWONLYflag++; +- NOCROSSflag++; +- include_tflag++; /* automatically set WRITER_TEST and READER_TEST */ +- include_test[WRITER_TEST]++; +- include_test[READER_TEST]++; +- break; +- case 's': /* Set file size */ +-#ifdef NO_PRINT_LLD +- sscanf(optarg,"%ld",&kilobytes64); +-#else +- sscanf(optarg,"%lld",&kilobytes64); +-#endif +- if(optarg[strlen(optarg)-1]=='k' || +- optarg[strlen(optarg)-1]=='K'){ +- ; +- } +- if(optarg[strlen(optarg)-1]=='m' || +- optarg[strlen(optarg)-1]=='M'){ +- kilobytes64 = kilobytes64 * 1024; +- } +- if(optarg[strlen(optarg)-1]=='g' || +- optarg[strlen(optarg)-1]=='G'){ +- kilobytes64 = kilobytes64 *1024 * 1024; +- } +- if(kilobytes64 <= 0) +- kilobytes64=512; +- +- s_range[s_count++]=kilobytes64; +- max_file_size = (off64_t)s_range[s_count-1]; /* Make visable globally */ +- min_file_size = (off64_t)s_range[0]; /* Make visable globally */ +- +-#ifdef NO_PRINT_LLD +- sprintf(splash[splash_line++],"\tFile size set to %ld KB\n",kilobytes64); +-#else +- sprintf(splash[splash_line++],"\tFile size set to %lld KB\n",kilobytes64); +-#endif +- sflag++; +- break; +- case 'l': /* Set lower thread/proc limit */ +- mint = (long long)(atoi(optarg)); +- if(mint <= 0) +- { +- mint=1; +- num_child=1; +- }else +- num_child=mint; +- if(mint > (unsigned long long)MAXSTREAMS){ +- printf("Invalid options: maximum streams for "); +- printf("throughput is MAXSTREAMS\n"); +- exit(4); +- } +- lflag++; +- trflag++; +- if(Uflag) +- { +- printf("Can not run throughput tests with unmount & remounts.\n"); +- exit(5); +- } +- break; +- case 'u': /* Set upper thread/proc limit */ +- maxt = (long long)(atoi(optarg)); +- if(maxt <= 0) +- maxt=1; +- if(maxt > MAXSTREAMS){ +- printf("Invalid options: maximum streams for "); +- printf("throughput is MAXSTREAMS\n"); +- exit(6); +- } +- uflag++; +- trflag++; +- if(Uflag) +- { +- printf("Can not run throughput tests with unmount & remounts.\n"); +- exit(7); +- } +- break; +- case 'm': /* Use multiple buffers */ +- fetchon=0; +- multi_buffer=1; +- mflag++; +- mbuffer = (char *) alloc_mem((long long)MAXBUFFERSIZE,(int)0); +- if(mbuffer == 0) { +- perror("Memory allocation failed:"); +- exit(8); +- } +- sprintf(splash[splash_line++],"\tMulti_buffer. Work area %d bytes\n", +- MAXBUFFERSIZE); +- break; +- case 'M': /* Report machine name and OS */ +- bzero(reply,sizeof(reply)); +- pi=popen("uname -a", "r"); +- if(pi == (FILE *)0) +- { +- sprintf(splash[splash_line++],"\n\tError using popen() on uname\n"); +- sprintf(splash[splash_line++],"\t-M option suppressed.\n"); +- } +- else +- { +- junk=fread(reply,IBUFSIZE-1,1,pi); +- pclose(pi); +- m=reply; +- while(*m) /* Strip new line */ +- { +- if(*m=='\n') +- *m=0; +- else +- m++; +- } +- sprintf(splash[splash_line++],"\n\tMachine = %s\n",reply); +- } +- break; +- +- case 'P': /* Set beginning processor for binding. */ +-#ifndef NO_THREADS +-#if defined(_HPUX_SOURCE) || defined(linux) +-#if defined(_HPUX_SOURCE) +- num_processors= pthread_num_processors_np(); +-#else +- num_processors = sysconf(_SC_NPROCESSORS_ONLN); +-#endif +- begin_proc = atoi(optarg); +- if(begin_proc < 0) +- begin_proc=0; +- if(begin_proc > num_processors) +- begin_proc=0; +- sprintf(splash[splash_line++],"\tBinding of processors beginning with %d \n",begin_proc); +- ioz_processor_bind++; +-#else +- sprintf(splash[splash_line++],"\tProcessor binding not available in this version\n"); +-#endif +-#endif +- break; +- case 'p': /* purge the processor cache */ +- sprintf(splash[splash_line++],"\tPurge Mode On\n"); +- fetchon=0; +- pflag++; +- purge=1; +- break; +- case 'h': /* show help */ +- hflag++; +- show_help(); +- exit(0); +- break; +- case 'E': /* Extended testing for pread/pwrite... */ +- Eflag++; +- break; +- case 'R': /* Generate Excel compatible Report */ +- Rflag++; +- sprintf(splash[splash_line++],"\tExcel chart generation enabled\n"); +- break; +- case 'o': /* Open OSYNC */ +- sprintf(splash[splash_line++],"\tSYNC Mode. \n"); +- oflag++; +- break; +- case 'O': /* Report in Ops/sec instead of KB/sec */ +- sprintf(splash[splash_line++],"\tOPS Mode. Output is in operations per second.\n"); +- OPS_flag++; +- break; +- case 'N': /* Report in usec/op */ +- sprintf(splash[splash_line++],"\tMicroseconds/op Mode. Output is in microseconds per operation.\n"); +- MS_flag++; +- break; +- case 'V': /* Turn on Verify every byte */ +- sverify=0; +- inp_pat = (char)(atoi(optarg)); +- if(inp_pat == 0) +- inp_pat = PATTERN; +- pattern = ((inp_pat << 24) | (inp_pat << 16) | (inp_pat << 8) +- | inp_pat); +- verify=1; +- sprintf(splash[splash_line++],"\tVerify Mode. Pattern %x\n",pattern); +- sprintf(splash[splash_line++],"\tPerformance measurements are invalid in this mode.\n"); +- break; +- case 'S': /* Set the processor cache size */ +- cache_size = (long)(atoi(optarg)*1024); +- if(cache_size == 0) +- cache_size = CACHE_SIZE; +- break; +- case 'L': /* Set processor cache line size */ +- cache_line_size = (long)(atoi(optarg)); +- if(cache_line_size == 0) +- cache_line_size = CACHE_LINE_SIZE; +- break; +- case 'f': /* Specify the file name */ +- if(mfflag) { +- printf("invalid options: -f and -F are mutually exclusive\n"); +- exit(10); +- } +- fflag++; +- strcpy(filename,optarg); +- sprintf(dummyfile[0],"%s.DUMMY",optarg); +- break; +- case 'b': /* Specify the biff file name */ +- Rflag++; +- bif_flag++; +- strcpy(bif_filename,optarg); +- break; +- case 'F': /* Specify multiple file names for -t */ +- mfflag++; +- if(fflag) { +- printf("invalid options: -f and -F are mutually exclusive\n"); +- exit(11); +- } +- if(!trflag) { +- printf("invalid options: must specify -t N before -F\n"); +- exit(12); +- } +- optind--; +- for(fileindx=0;fileindx argc) { +-#ifdef NO_PRINT_LLD +- printf("invalid options: not enough filenames for %ld streams\n",num_child); +-#else +- printf("invalid options: not enough filenames for %lld streams\n",num_child); +-#endif +- exit(13); +- } +- } +- break; +- case 'r': /* Specify the record size to use */ +- rflag++; +- reclen = ((long long)(atoi(optarg))*1024); +- if(optarg[strlen(optarg)-1]=='k' || +- optarg[strlen(optarg)-1]=='K'){ +- reclen = (long long)(1024 * atoi(optarg)); +- } +- if(optarg[strlen(optarg)-1]=='m' || +- optarg[strlen(optarg)-1]=='M'){ +- reclen = (long long)(1024 * 1024 * atoi(optarg)); +- } +- if(optarg[strlen(optarg)-1]=='g' || +- optarg[strlen(optarg)-1]=='G'){ +- reclen = (long long)(1024 * 1024 * 1024 *(long long)atoi(optarg)); +- } +- if(reclen <= 0) +- reclen=(long long)4096; +- +- r_range[r_count++]=reclen; +- max_rec_size = (off64_t)r_range[r_count-1]; /* Make visable globally */ +- min_rec_size = (off64_t)r_range[0]; /* Make visable globally */ +-#ifdef NO_PRINT_LLD +- sprintf(splash[splash_line++],"\tRecord Size %ld KB\n",reclen/1024); +-#else +- sprintf(splash[splash_line++],"\tRecord Size %lld KB\n",reclen/1024); +-#endif +- if(max_rec_size > MAXBUFFERSIZE) { +-#ifdef NO_PRINT_LLD +- printf("Error: maximum record size %ld KB is greater than maximum buffer size %ld KB\n ", +- max_rec_size/1024, MAXBUFFERSIZE/1024); +-#else +- printf("Error: maximum record size %lld KB is greater than maximum buffer size %lld KB\n ", +- (long long)(max_rec_size/1024LL), (long long)MAXBUFFERSIZE/1024LL); +-#endif +- exit(23); +- } +- break; +- case 'J': /* Specify the compute time in millisecs */ +- compute_time = (float)(atoi(optarg)); +- compute_time=compute_time/1000; +- if(compute_time < (float)0) +- compute_time=(float)0; +- else +- compute_flag=1; +- jflag++; +- break; +- case 'j': /* Specify the stride in records */ +- stride = (long long)(atoi(optarg)); +- if(stride < 0) +- stride=0; +- stride_flag=1; +- break; +- case 't': /* Specify the number of children to run */ +- num_child1=(atoi(optarg)); +- num_child = (long long)num_child1; +- if(num_child > (long long)MAXSTREAMS) { +- printf("invalid options: maximum streams for throughput is MAXSTREAMS\n"); +-#ifdef NO_PRINT_LLD +- printf("Numchild %ld %s\n",num_child,optarg); +-#else +- printf("Numchild %lld %s\n",num_child,optarg); +-#endif +- exit(14); +- } +- if(num_child <= 0) +- num_child = 8; +- if(num_child == 0) +- num_child=1; +- t_range[t_count++]=num_child; +- maxt = (maxt>num_child?maxt:num_child); +- trflag++; +- if(Uflag) +- { +- printf("Can not run throughput tests with unmount & remounts.\n"); +- exit(15); +- } +- break; +- case 'd': /* Specify the delay of children to run */ +- delay_start = (long long)(atoi(optarg)); +- if(delay_start < 0) +- delay_start=0; +- break; +- case 'i': /* Specify specific tests */ +- tval=(long long)(atoi(optarg)); +- if(tval < 0) tval=0; +-#ifndef HAVE_PREAD +- if(tval > RANDOM_MIX_TEST) +- { +- printf("\tPread tests not available on this operating system.\n"); +- exit(183); +- } +-#endif +- if(tval > sizeof(func)/sizeof(char *)) +- { +- tval=0; +- sprintf(splash[splash_line++],"\tSelected test not available on the version.\n"); +- } +- include_test[tval]++; +- include_tflag++; +- break; +- case 'v': /* Show version information */ +- for(ind=0; strlen(head1[ind]); ind++) +- { +- printf("%s\n", head1[ind]); +- } +- exit(0); +- break; +- case 'U': /* Specify the dev name for umount/mount*/ +- Uflag++; +- strcpy(mountname,optarg); +- if(trflag) +- { +- printf("Can not run throughput tests with unmount & remounts.\n"); +- exit(16); +- } +- break; +- case 'w': /* Do not unlink files */ +- sprintf(splash[splash_line++],"\tSetting no_unlink\n"); +- no_unlink = 1; +- break; +- case 'Z': /* Turn on the mmap and file I/O mixing */ +- sprintf(splash[splash_line++],"\tEnable mmap & file I/O mixing.\n"); +- mmap_mix = 1; +- break; +- case 'W': /* Read/Write with file locked */ +- file_lock=1; +- sprintf(splash[splash_line++],"\tLock file when reading/writing.\n"); +- break; +- case 'K': /* Cause disrupted read pattern */ +- disrupt_flag=1; +- sprintf(splash[splash_line++],"\tDisrupted read patterns selected.\n"); +- break; +- case 'X': /* Open write telemetry file */ +- compute_flag=1; +- sverify=2; /* touch lightly */ +- w_traj_flag=1; +- strcpy(write_traj_filename,optarg); +- traj_vers(); +- w_traj_size(); +- sprintf(splash[splash_line++],"\tUsing write telemetry file \"%s\"\n", +- write_traj_filename); +- w_traj_fd=open_w_traj(); +- if(w_traj_fd == (FILE *)0) +- exit(200); +- break; +- case 'Y': /* Open Read telemetry file */ +- compute_flag=1; +- sverify=2; /* touch lightly */ +- r_traj_flag=1; +- strcpy(read_traj_filename,optarg); +- sprintf(splash[splash_line++],"\tUsing read telemetry file \"%s\"\n", +- read_traj_filename); +- traj_vers(); +- r_traj_size(); +- r_traj_fd=open_r_traj(); +- if(r_traj_fd == (FILE*) 0) +- exit(200); +- break; +- case 'n': /* Set min file size for auto mode */ +- nflag=1; +- minimum_file_size = (off64_t)atoi(optarg); +- if(optarg[strlen(optarg)-1]=='k' || +- optarg[strlen(optarg)-1]=='K'){ +- ; +- } +- if(optarg[strlen(optarg)-1]=='m' || +- optarg[strlen(optarg)-1]=='M'){ +- minimum_file_size = (long long)(1024 * atoi(optarg)); +- } +- if(optarg[strlen(optarg)-1]=='g' || +- optarg[strlen(optarg)-1]=='G'){ +- minimum_file_size = (long long)(1024 * 1024 * (long long)atoi(optarg)); +- } +- if(minimum_file_size < RECLEN_START/1024) +- minimum_file_size=(off64_t)(RECLEN_START/1024); +- if(minimum_file_size < page_size/1024) +- minimum_file_size=(off64_t)(page_size/1024); +-#ifdef NO_PRINT_LLD +- sprintf(splash[splash_line++],"\tUsing minimum file size of %ld kilobytes.\n",minimum_file_size); +-#else +- sprintf(splash[splash_line++],"\tUsing minimum file size of %lld kilobytes.\n",minimum_file_size); +-#endif +- break; +- case 'g': /* Set maximum file size for auto mode */ +- gflag=1; +- maximum_file_size = (off64_t)atoi(optarg); +- if(optarg[strlen(optarg)-1]=='k' || +- optarg[strlen(optarg)-1]=='K'){ +- ; +- } +- if(optarg[strlen(optarg)-1]=='m' || +- optarg[strlen(optarg)-1]=='M'){ +- maximum_file_size = (long long)(1024 * atoi(optarg)); +- } +- if(optarg[strlen(optarg)-1]=='g' || +- optarg[strlen(optarg)-1]=='G'){ +- maximum_file_size = (long long)(1024 * 1024 * (long long)atoi(optarg)); +- } +- if(maximum_file_size < RECLEN_START/1024) +- maximum_file_size=(off64_t)(RECLEN_START/1024); +-#ifdef NO_PRINT_LLD +- sprintf(splash[splash_line++],"\tUsing maximum file size of %ld kilobytes.\n",maximum_file_size); +-#else +- sprintf(splash[splash_line++],"\tUsing maximum file size of %lld kilobytes.\n",maximum_file_size); +-#endif +- break; +- case 'z': /* Set no cross over */ +- sprintf(splash[splash_line++],"\tCross over of record size disabled.\n"); +- NOCROSSflag=1; +- break; +- case 'y': /* Set min record size for auto mode */ +- yflag=1; +- min_rec_size = ((long long)(atoi(optarg))*1024); +- if(optarg[strlen(optarg)-1]=='k' || +- optarg[strlen(optarg)-1]=='K'){ +- min_rec_size = (long long)(1024 * atoi(optarg)); +- } +- if(optarg[strlen(optarg)-1]=='m' || +- optarg[strlen(optarg)-1]=='M'){ +- min_rec_size = (long long)(1024 * 1024 * atoi(optarg)); +- } +- if(optarg[strlen(optarg)-1]=='g' || +- optarg[strlen(optarg)-1]=='G'){ +- min_rec_size = (long long)(1024 * 1024 * 1024 *(long long)atoi(optarg)); +- } +- if(min_rec_size <= 0) +- min_rec_size=(long long)RECLEN_START; +-#ifdef NO_PRINT_LLD +- sprintf(splash[splash_line++],"\tUsing Minimum Record Size %ld KB\n", min_rec_size/1024); +-#else +- sprintf(splash[splash_line++],"\tUsing Minimum Record Size %lld KB\n", min_rec_size/1024); +-#endif +- break; +- case 'q': /* Set max record size for auto mode */ +- qflag=1; +- max_rec_size = ((long long)(atoi(optarg))*1024); +- if(optarg[strlen(optarg)-1]=='k' || +- optarg[strlen(optarg)-1]=='K'){ +- max_rec_size = (long long)(1024 * atoi(optarg)); +- } +- if(optarg[strlen(optarg)-1]=='m' || +- optarg[strlen(optarg)-1]=='M'){ +- max_rec_size = (long long)(1024 * 1024 * atoi(optarg)); +- } +- if(optarg[strlen(optarg)-1]=='g' || +- optarg[strlen(optarg)-1]=='G'){ +- max_rec_size = (long long)(1024 * 1024 * 1024 *(long long)atoi(optarg)); +- } +- if(max_rec_size <= 0) +- min_rec_size=(long long)RECLEN_END; +- if(max_rec_size > MAXBUFFERSIZE) { +-#ifdef NO_PRINT_LLD +- printf("Error: maximum record size %ld KB is greater than maximum buffer size %ld KB\n ", +- max_rec_size/1024, MAXBUFFERSIZE/1024); +-#else +- printf("Error: maximum record size %lld KB is greater than maximum buffer size %lld KB\n ", +- (long long)(max_rec_size/1024LL), (long long)MAXBUFFERSIZE/1024LL); +-#endif +- exit(23); +- } +-#ifdef NO_PRINT_LLD +- sprintf(splash[splash_line++],"\tUsing Maximum Record Size %ld KB\n", max_rec_size/1024); +-#else +- sprintf(splash[splash_line++],"\tUsing Maximum Record Size %lld KB\n", max_rec_size/1024); +-#endif +- break; +- +- /* +- * The + operator is for the new extended options mechanism +- * Syntax is -+ followed by option leter, and if the optino +- * takes an operand then it is implemented below. An example +- * -+a arg is shown below. This is a sub option with an argument. +- * -+b is shown below. This is a sub option with no argument. +- */ +- case '+': +- /* printf("Plus option = >%s<\n",optarg);*/ +- switch (*((char *)optarg)) +- { +- case 'a': /* Example: Has argument */ +- subarg=argv[optind++]; +- /* if(subarg!=(char *)0) Error checking. */ +- /* printf("Plus option argument = >%s<\n",subarg);*/ +- break; +- case 'b': /* Example: Does not have an argument */ +- break; +- case 'c': /* Argument is the controlling host name */ +- /* I am a client for distributed Iozone */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+c takes an operand !!\n"); +- exit(200); +- } +- strcpy(controlling_host_name,subarg); +- distributed=1; +- client_iozone=1; +- master_iozone=0; +- break; +- case 'h': /* Argument is the controlling host name */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+h takes an operand !!\n"); +- exit(200); +- } +- strcpy(controlling_host_name,subarg); +- sprintf(splash[splash_line++],"\tHostname = %s\n",controlling_host_name); +- break; +- case 'm': /* I am the controlling process for distributed Iozone */ +- /* Does not have an argument */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+m takes an operand. ( filename )\n"); +- exit(201); +- } +- strcpy(client_filename,subarg); +- ret=get_client_info(); +- if(ret <= 0) +- { +- printf("Error reading client file\n"); +- exit(178); +- } +- clients_found=ret; +- distributed=1; +- master_iozone=1; +- client_iozone=0; +- sprintf(splash[splash_line++],"\tNetwork distribution mode enabled.\n"); +- break; +- case 'N': /* turn off truncating the file before write test */ +- notruncate = 1; +- break; +- case 'u': /* Set CPU utilization output flag */ +- cpuutilflag = 1; /* only used if R(eport) flag is also set */ +- get_rusage_resolution(); +- sprintf(splash[splash_line++],"\tCPU utilization Resolution = %5.3f seconds.\n",cputime_res); +- sprintf(splash[splash_line++],"\tCPU utilization Excel chart enabled\n"); +- break; +- case 's': /* Clients operate in silent mode. */ +- /* Does not have an argument */ +- silent=1; +- break; +- case 'd': /* Diagnostics mode */ +- sprintf(splash[splash_line++],"\t>>> I/O Diagnostic mode enabled. <<<\n"); +- sprintf(splash[splash_line++],"\tPerformance measurements are invalid in this mode.\n"); +- diag_v=1; +- sverify=0; +- break; +- case 'x': /* Argument is the multiplier for rec size and file size */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+c takes an operand !!\n"); +- exit(200); +- } +- multiplier = atoi(subarg); +- if(multiplier <=1) +- multiplier = 2; +- break; +- case 'i': /* Argument is the host port */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+i takes an operand !!\n"); +- exit(200); +- } +- controlling_host_port = atoi(subarg); +- break; +- case 'p': /* Argument is the percentage read */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+p takes an operand !!\n"); +- exit(200); +- } +- pct_read = atoi(subarg); +- if(pct_read < 1) +- pct_read = 1; +- if(pct_read >=100) +- pct_read = 100; +- sprintf(splash[splash_line++],"\tPercent read in mix test is %d\n",pct_read); +- break; +- case 't': /* Speed code activated */ +- speed_code=1; +- break; +-#if defined(_HPUX_SOURCE) || defined(linux) || defined(solaris) +- case 'r': /* Read sync too */ +- read_sync=1; +- sprintf(splash[splash_line++],"\tRead & Write sync mode active.\n"); +- break; +-#endif +-#ifndef NO_MADVISE +- case 'A': /* Argument is madvise selector */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+A take an operand !!\n"); +- exit(200); +- } +- advise_flag=1; +- advise_op=atoi(subarg); +- sprintf(splash[splash_line++],"\tMadvise enabled: %d\n",advise_op); +- break; +-#endif +- case 'n': /* Set no-retest */ +- noretest = 1; +- sprintf(splash[splash_line++],"\tNo retest option selected\n"); +- break; +- case 'k': /* Constant aggregate data set size */ +- aggflag=1; +- break; +- case 'q': /* Argument is the rest time between tests in seconds */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+q takes an operand !!\n"); +- exit(200); +- } +- rest_val = (long long)atoi(subarg); +- if(rest_val <=0) +- rest_val = 0; +- restf=1; +- sprintf(splash[splash_line++],"\tDelay %d seconds between tests enabled.\n",atoi(subarg)); +- break; +-#if defined(O_DSYNC) +- case 'D': /* O_DSYNC mode */ +- sprintf(splash[splash_line++],"\t>>> O_DSYNC mode enabled. <<<\n"); +- odsync=1; +- break; +-#endif +- case 'l': /* Record locking mode */ +- sprintf(splash[splash_line++],"\t>>> Record locking mode enabled. <<<\n"); +- rlocking=1; +- break; +- case 'L': /* Record locking mode shared files*/ +- sprintf(splash[splash_line++],"\t>>> Record locking, shared file mode enabled. <<<\n"); +- share_file=1; +- rlocking=1; +- break; +- case 'V': /* No Record locking shared files*/ +- sprintf(splash[splash_line++],"\t>>> Shared file mode enabled. <<<\n"); +- share_file=1; +- break; +- case 'B': /* Sequential mix */ +- sprintf(splash[splash_line++],"\t>>> Sequential Mixed workload. <<<\n"); +- seq_mix=1; +- break; +- /* Use an existing user file, that does +- not contain Iozone's pattern. Use file +- for testing, but read only, and no +- delete at the end of the test. Also, +- no pattern verification, but do touch +- the pages. */ +- case 'E': +- sprintf(splash[splash_line++],"\t>>> No Verify mode. <<<\n"); +- sverify=2; +- no_unlink=1; +- no_write=1; +- break; +- case 'T': /* Time stamps on */ +- L_flag=1; +- break; +- case 'X': /* Short circuit test mode */ +- X_flag = 1; +- sverify=1; +- verify=1; +- inp_pat = 0xBB; +- pattern = ((inp_pat << 24) | +- (inp_pat << 16) | (inp_pat << 8) | +- inp_pat); +- sprintf(splash[splash_line++],"\tShort circuit mode. For\n"); +- sprintf(splash[splash_line++],"\t filesystem development testing ONLY !\n"); +- break; +- case 'Z': /* Compatibility mode for 0xA5 */ +- Z_flag = 1; +- sverify=1; +- verify=1; +- inp_pat = 0xA5; +- pattern = ((inp_pat << 24) | +- (inp_pat << 16) | (inp_pat << 8) | +- inp_pat); +- sprintf(splash[splash_line++],"\tUsing old data sets.\n"); +- sprintf(splash[splash_line++],"\t Performance measurements may be invalid in this\n"); +- sprintf(splash[splash_line++],"\t mode due to published hack.\n"); +- break; +-#if defined(Windows) +- case 'U': /* Windows only Unbufferd I/O */ +- unbuffered=1; +- sprintf(splash[splash_line++],"\tUnbuffered Windows API usage. >>> Very Experimental <<<\n"); +- break; +-#endif +- case 'K': /* Sony special for manual control of test 8 */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+K takes an operand !!\n"); +- exit(204); +- } +- Kplus_readers = (int)atoi(subarg); +- if(Kplus_readers <=0) +- Kplus_readers = 1; +- Kplus_flag=1; +- sprintf(splash[splash_line++],"\tManual control of test 8. >>> Very Experimental. Sony special <<<\n"); +- break; +- case 'w': /* Argument is the percent of dedup */ +- /* Sets size of dedup region across files */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+w takes an operand !!\n"); +- exit(200); +- } +- dedup = atoi(subarg); +- if(dedup <=0) +- dedup = 0; +- if(dedup >100) +- dedup = 100; +- sprintf(splash[splash_line++],"\tDedup activated %d percent.\n",dedup); +- break; +- case 'y': /* Argument is the percent of interior dedup */ +- /* Sets size of dedup region within and across files */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+y takes an operand !!\n"); +- exit(200); +- } +- dedup_interior = atoi(subarg); +- if(dedup_interior <0) +- dedup_interior = 0; +- if(dedup_interior >100) +- dedup_interior = 100; +- sprintf(splash[splash_line++],"\tDedupe within & across %d percent.\n",dedup_interior); +- break; +- case 'C': /* Argument is the percent of dedupe within & !across */ +- /* Sets size of dedup region within and !across files */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+C takes an operand !!\n"); +- exit(200); +- } +- dedup_compress = atoi(subarg); +- if(dedup_compress <0) +- dedup_compress = 0; +- if(dedup_compress >100) +- dedup_compress = 100; +- sprintf(splash[splash_line++],"\tDedupe within %d percent.\n",dedup_compress); +- break; +- case 'S': /* Argument is the seed for dedup */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+S takes an operand !!\n"); +- exit(200); +- } +- dedup_mseed = atoi(subarg); +- if(dedup_mseed ==0) +- dedup_mseed = 1; +- sprintf(splash[splash_line++],"\tDedup manual seed %d .\n",dedup_mseed); +- break; +- case 'H': /* Argument is hostname of the PIT */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+H takes operand !!\n"); +- exit(200); +- } +- strcpy(pit_hostname,subarg); +- sprintf(splash[splash_line++],"\tPIT_host %s\n",pit_hostname); +- +- break; +- case 'P': /* Argument is port of the PIT */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+P takes operand !!\n"); +- exit(200); +- } +- strcpy(pit_service,subarg); +- sprintf(splash[splash_line++],"\tPIT_port %s\n",pit_service); +- break; +- case 'z': /* Enable hist summary*/ +- hist_summary=1; +- sprintf(splash[splash_line++],"\tHistogram summary enabled.\n"); +- break; +- case 'O': /* Argument is the Op rate */ +- subarg=argv[optind++]; +- if(subarg==(char *)0) +- { +- printf("-+O takes an operand !!\n"); +- exit(200); +- } +- op_rate = atoi(subarg); +- if(op_rate <= 0) +- op_rate = 1; +- op_rate_flag = 1; +- sprintf(splash[splash_line++],"\tRate control active %d Ops/sec .\n",op_rate); +- break; +- default: +- printf("Unsupported Plus option -> %s <-\n",optarg); +- exit(255); +- break; +- } +- break; +- default: +- printf("Unsupported option -> %s <-\n",optarg); +- exit(255); +- } +- } +- base_time=(long)time_so_far(); +- get_resolution(); /* Get clock resolution */ +- if(speed_code) +- { +- do_speed_check(client_iozone); +- exit(0); +- } +- if(r_count > 1) +- { +- aflag=1; +- rflag=0; +- NOCROSSflag=1; +- } +- if(s_count > 1) +- { +- aflag=1; +- sflag=0; +- NOCROSSflag=1; +- } +- /* +- * If not in silent mode then display the splash screen. +- */ +- for(i=0;i clients_found) +- { +- printf("You can not specify more threads/processes than you have in the client file list\n"); +- exit(202); +- } +- } +- +- if(!OPS_flag && !MS_flag) +- { +- if(!silent) printf("\tOutput is in Kbytes/sec\n"); +- } +- if (min_rec_size > max_rec_size) { +-#ifdef NO_PRINT_LLD +- printf("Error: minimum record size %ld KB is greater than maximum record size %ld KB\n ", +- min_rec_size/1024, max_rec_size/1024); +-#else +- printf("Error: minimum record size %lld KB is greater than maximum record size %lld KB\n ", +- min_rec_size/1024, max_rec_size/1024); +-#endif +- exit(23); +- } +- orig_min_rec_size=min_rec_size; +- orig_max_rec_size=max_rec_size; +- /* +- * No telemetry files... just option selected +- */ +- if(compute_flag && jflag && !(r_traj_flag || w_traj_flag)) +- if(!silent) printf("\tCompute time %f seconds for reads and writes.\n",compute_time); +- /* +- * Read telemetry file and option selected +- */ +- if(compute_flag && r_traj_flag && !w_traj_flag) +- { +- if(r_traj_items==3) +- { +- if(!silent) printf("\tCompute time from telemetry files for reads.\n"); +- } +- else +- { +- if(jflag) +- if(!silent) printf("\tCompute time %f seconds for reads.\n",compute_time); +- } +- if(jflag) +- if(!silent) printf("\tCompute time %f seconds for writes.\n",compute_time); +- } +- /* +- * Write telemetry file and option selected +- */ +- if(compute_flag && !r_traj_flag && w_traj_flag) +- { +- if(w_traj_items==3) +- { +- if(!silent) printf("\tCompute time from telemetry files for writes.\n"); +- } +- else +- { +- if(jflag) +- if(!silent) printf("\tCompute time %f seconds for writes.\n",compute_time); +- } +- if(jflag) +- if(!silent) printf("\tCompute time %f seconds for reads.\n",compute_time); +- } +- if(compute_flag && r_traj_flag && w_traj_flag && jflag) +- { +- if(r_traj_items==3) +- { +- if(!silent) printf("\tCompute time from telemetry files for reads.\n"); +- } +- else +- { +- if(!silent) printf("\tCompute time %f seconds for reads.\n",compute_time); +- } +- if(w_traj_items==3) +- { +- if(!silent) printf("\tCompute time from telemetry files for writes.\n"); +- } +- else +- { +- if(!silent) printf("\tCompute time %f seconds for writes.\n",compute_time); +- } +- } +- if(compute_flag && r_traj_flag && w_traj_flag && !jflag) +- { +- if(r_traj_items==3) +- { +- if(!silent) printf("\tCompute time from telemetry files for reads.\n"); +- } +- else +- { +- if(!silent) printf("\tNo compute time for reads.\n"); +- } +- +- if(w_traj_items==3) +- { +- if(!silent) printf("\tCompute time from telemetry files for writes.\n"); +- } +- else +- { +- if(!silent) printf("\tNo compute time for writes.\n"); +- } +- } +- +- /* Enforce only write,rewrite,read,reread */ +- if(w_traj_flag || r_traj_flag) +- { +- for(i=2;i> %llx",include_mask); HERE */ +- } +- if(no_write) /* Disable if any writer would disturbe existing file */ +- { +- if(include_test[0] || include_test[4] || +- include_test[6] || include_test[8] || include_test[9] || +- include_test[11]) +- { +- printf("You must disable any test that writes when using -+E\n"); +- exit(20); +- } +- } +- if(no_write) /* User must specify the existing file name */ +- { +- if(!(fflag | mfflag)) +- { +- printf("You must use -f or -F when using -+E\n"); +- exit(20); +- } +- } +- if(h_flag && k_flag) +- { +- printf("\n\tCan not do both -H and -k\n"); +- exit(20); +- } +- if((dedup | dedup_interior) && diag_v) +- { +- printf("\n\tCan not do both -+d and -+w\n"); +- exit(20); +- } +- +- if(!aflag && !rflag) +- max_rec_size=min_rec_size; +- +- init_record_sizes(min_rec_size,max_rec_size); +- if(!silent) printf("\tTime Resolution = %1.6f seconds.\n",time_res); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tProcessor cache size set to %ld Kbytes.\n",cache_size/1024); +- if(!silent) printf("\tProcessor cache line size set to %ld bytes.\n",cache_line_size); +- if(!silent) printf("\tFile stride size set to %ld * record size.\n",stride); +-#else +- if(!silent) printf("\tProcessor cache size set to %ld Kbytes.\n",cache_size/1024); +- if(!silent) printf("\tProcessor cache line size set to %ld bytes.\n",cache_line_size); +- if(!silent) printf("\tFile stride size set to %lld * record size.\n",stride); +-#endif +- if(!rflag) +- reclen=(long long)4096; +- +- if(uflag && !lflag) +- num_child=mint = 1; +- if(lflag && !uflag) +- maxt = mint; +- if(use_thread) +- port="thread"; +- else +- port="process"; +- if(lflag || uflag){ +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tMin %s = %ld \n",port,mint); +- if(!silent) printf("\tMax %s = %ld \n",port,maxt); +-#else +- if(!silent) printf("\tMin %s = %lld \n",port,mint); +- if(!silent) printf("\tMax %s = %lld \n",port,maxt); +-#endif +- } +- if(trflag) +- { +- if(num_child > 1) +- { +- if(use_thread) +- { +- port="threads"; +- } +- else +- { +- port="processes"; +- } +- } +- +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tThroughput test with %ld %s\n", num_child,port); +-#else +- if(!silent) printf("\tThroughput test with %lld %s\n", num_child,port); +-#endif +- } +- numrecs64 = (long long)(kilobytes64*1024)/reclen; +- if (reclen > (long long)MAXBUFFERSIZE) { +-#ifdef NO_PRINT_LLD +- printf("Error: Maximum record length is %ld bytes\n", +- MAXBUFFERSIZE); +-#else +- printf("Error: Maximum record length is %lld bytes\n", +- (long long)MAXBUFFERSIZE); +-#endif +- exit(21); +- } +- if (reclen < (long long)MINBUFFERSIZE) { +-#ifdef NO_PRINT_LLD +- printf("Error: Minimum record length is %ld bytes\n", +- MINBUFFERSIZE); +-#else +- printf("Error: Minimum record length is %lld bytes\n", +- (long long)MINBUFFERSIZE); +-#endif +- exit(22); +- } +- /* Only bzero or fill that which you will use. The buffer is very large */ +- if(verify ) +- { +- fill_buffer((char *)buffer,l_min(reclen,(long long)cache_size),(long long)pattern,(char)sverify,(long long)0); +- if(pflag) +- fill_buffer((char *)pbuffer,l_min(reclen,(long long)cache_size),(long long)pattern,(char)sverify,(long long)0); +- if(mflag) +- fill_buffer((char *)mbuffer,l_min(reclen,(long long)cache_size),(long long)pattern,(char)sverify,(long long)0); +- } +- else +- { +- bzero(buffer,(size_t)l_min(reclen,(long long)cache_size)); +- } +- +-#ifndef NO_THREADS +-#if defined( _HPUX_SOURCE ) || defined ( linux ) +- if(ioz_processor_bind) +- { +- bind_cpu=begin_proc; +-#if defined( _HPUX_SOURCE ) +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +-#else +- cpu_set_t cpuset; +- CPU_ZERO(&cpuset); +- CPU_SET(bind_cpu, &cpuset); +- +- pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); +-#endif +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- orig_size=kilobytes64; +- if(trflag){ +- (void)multi_throughput_test(mint,maxt); +- goto out; +- } +- if(trflag && (mint == maxt)){ +- auto_mode=0; +- throughput_test(); +- goto out; +- } +- if (aflag) { +- print_header(); +- auto_test(); +- goto out; +- } +- print_header(); +- (void) begin(kilobytes64,reclen); +-out: +- if(r_traj_flag) +- fclose(r_traj_fd); +- if(w_traj_flag) +- fclose(w_traj_fd); +- if (!no_unlink) +- { +- if(check_filename(dummyfile[0])) +- unlink(dummyfile[0]); /* delete the file */ +- } +- if(!silent) printf("\niozone test complete.\n"); +- if(res_prob) +- { +- printf("Timer resolution is poor. Some small transfers may have \n"); +- printf("reported inaccurate results. Sizes %ld Kbytes and below.\n", +- (long)(rec_prob/(long long)1024)); +- } +- +- if(Rflag && !trflag){ +- dump_excel(); +- } +- return(0); +-} +- +-#ifdef HAVE_ANSIC_C +-void +-record_command_line(int argc, char **argv) +-#else +-void +-record_command_line(argc, argv) +-int argc; +-char **argv; +-#endif +-{ +- int ix, len = 0; +- +- /* print and save the entire command line */ +- if(!silent) printf("\tCommand line used:"); +- for (ix=0; ix < argc; ix++) { +- if(!silent) printf(" %s", argv[ix]); +- if ((len + strlen(argv[ix])) < sizeof(command_line)) { +- strcat (command_line, argv[ix]); +- strcat (command_line, " "); +- len += strlen(argv[ix]) + 1; +- } +- else { +- printf ("Command line too long to save completely.\n"); +- break; +- } +- } +- if(!silent) printf("\n"); +-} +- +-/*************************************************************************/ +-/* BEGIN() */ +-/* This is the main work horse. It is called from main and from */ +-/* auto_test. The caller provides the size of file and the record length.*/ +-/*************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-begin(off64_t kilos64,long long reclength) +-#else +-void +-begin(kilos64,reclength) +-off64_t kilos64; +-long long reclength; +-#endif +-{ +- long long num_tests,test_num,i,j; +- long long data1[MAXTESTS], data2[MAXTESTS]; +- num_tests = sizeof(func)/sizeof(char *); +-#if defined(HAVE_PREAD) +- if(!Eflag) +- { +-#if defined(HAVE_PREAD) && defined(HAVE_PREADV) +- num_tests -= 4; +-#else +- num_tests -= 2; +-#endif +- if(mmapflag || async_flag) +- { +- num_tests -= 2; +- } +- } +- else +- { +- if(mmapflag || async_flag) +-#if defined(HAVE_PREAD) && defined(HAVE_PREADV) +- num_tests -= 6; +-#else +- num_tests -= 4; +-#endif +- } +-#else +- if(mmapflag || async_flag) +- { +- num_tests -= 2; +- } +-#endif +- +- if(RWONLYflag) num_tests = 2; /* kcollins 8-21-96*/ +- sync(); /* just in case there were some dirty */ +- sync(); +- kilobytes64=kilos64; +- reclen=reclength; +- numrecs64 = (kilobytes64*1024)/reclen; +- store_value(kilobytes64); +- if(r_traj_flag || w_traj_flag) +- store_value((off64_t)0); +- else +- store_value((off64_t)(reclen/1024)); +- +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%16ld",kilobytes64); +- if(r_traj_flag || w_traj_flag) +- { +- if(!silent) printf("%8ld",0); +- } +- else +- { +- if(!silent) printf("%8ld",reclen/1024); +- } +-#else +- if(!silent) printf("%16lld",kilobytes64); +- if(r_traj_flag || w_traj_flag) +- { +- if(!silent) printf("%8lld",(long long )0); +- } +- else +- { +- if(!silent) printf("%8lld",reclen/1024); +- } +-#endif +- if(include_tflag) +- { +- for(i=0;i (long long)(min_file_size*1024)) { +-#ifdef NO_PRINT_LLD +- printf("Error: record length %ld is greater than filesize %ld KB\n ", +- min_rec_size,min_file_size); +-#else +- printf("Error: record length %lld is greater than filesize %lld KB\n ", +- min_rec_size,min_file_size); +-#endif +- exit(23); +- } +- +- if(NOCROSSflag) xover = max_file_size; +- +- init_file_sizes(min_file_size, max_file_size); +- del_record_sizes(); +- orig_min_rec_size=min_rec_size; +- orig_max_rec_size=max_rec_size; +- init_record_sizes(min_rec_size, max_rec_size); +- +- for(kilosi=get_next_file_size((off64_t)0); kilosi>0; kilosi=get_next_file_size(kilosi)) +- { +- /****************************************************************/ +- /* Start with record size of min_rec_size bytes and repeat the */ +- /* test, multiplying the record size by MULTIPLIER each time, */ +- /* until we reach max_rec_size. At the CROSSOVER we stop doing */ +- /* small buffers as it takes forever and becomes very */ +- /* un-interesting. */ +- /****************************************************************/ +- if(!rflag && !sflag && !yflag && !qflag) +- if(kilosi > xover){ +- min_rec_size = LARGE_REC; +- mult = orig_min_rec_size/1024; +- del_record_sizes(); +- init_record_sizes(min_rec_size, max_rec_size); +- /************************************/ +- /* Generate dummy entries in the */ +- /* Excel buffer for skipped */ +- /* record sizes */ +- /************************************/ +- for(count1=min_rec_size; +- (count1 != orig_min_rec_size) && ( +- mult <= (kilosi*1024)) ; +- count1=(count1>>1)) +- { +- current_x=0; +- store_value((off64_t)kilosi); +- store_value((off64_t)mult); +- for(xx=0;xx<20;xx++) +- store_value((off64_t)0); +- mult=mult*2; +- current_y++; +- if(current_y>max_y) +- max_y=current_y; +- current_x=0; +- } +- } +- +- for (recszi=get_next_record_size((off64_t)0);recszi!=0;recszi=get_next_record_size(recszi)) +- { +- if(recszi > (kilosi*1024)) +- break; +- begin(kilosi, recszi ); +- current_x=0; +- current_y++; +- } +- } +-} +- +- +-/****************************************************************/ +-/* */ +-/* THROUGHPUT_TEST () Multi process throughput test */ +-/* */ +-/* Note: States for share memory barrier are: */ +-/* 0 = Child not running or has finished. */ +-/* 1 = Child is ready to begin. */ +-/* 2 = Child is told to begin. */ +-/****************************************************************/ +-/* Data in shared memory format is: */ +-/* */ +-/* struct child_stats { */ +-/* long long flag; Used to barrier */ +-/* double walltime; Child's elapsed time */ +-/* double cputime; Child's CPU time */ +-/* double throughput; Child's throughput */ +-/* double actual; Child's actual read/written */ +-/* } */ +-/* */ +-/* There is an array of child_stat structures layed out in */ +-/* shared memory. */ +-/* */ +-/****************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-void +-throughput_test(void) +-#else +-void +-throughput_test() +-#endif +-{ +- char *unit; +- double starttime1 = 0; +- double jstarttime = 0; +- double jtime = 0; +- double walltime = 0; +- double cputime = 0; +- char *port; +- char getout; +- long long throughsize = KILOBYTES; +- long long xx,xy,i; +- long long xyz; +- double ptotal; +- off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; +- VOLATILE char *temp; +- double min_throughput = 0; +- double max_throughput = 0; +- double avg_throughput = 0; +- double min_xfer = 0; +- +- +- toutputindex=0; +- strcpy(&toutput[0][0],throughput_tests[0]); +- ptotal=written_so_far=read_so_far=re_written_so_far=re_read_so_far=0 ; +- +- if(OPS_flag) +- unit="ops"; +- else +- unit="KB"; +- +- if(!haveshm) +- { +- shmaddr=(struct child_stats *)alloc_mem((long long)SHMSIZE,(int)1); +-#ifdef _64BIT_ARCH_ +- if((long long)shmaddr==(long long)-1) +-#else +- if((long )shmaddr==(long)-1) +-#endif +- { +- printf("\nShared memory not working\n"); +- exit(24); +- } +- haveshm=(char*)shmaddr; +- } +- else +- shmaddr=(struct child_stats *)haveshm; +- +- if(use_thread) +- stop_flag = &stoptime; +- else +- { +- temp = (char *)&shmaddr[0]; +- stop_flag = (char *)&temp[(long long)SHMSIZE]-4; +- } +- for(xyz=0;xyzflag=CHILD_STATE_HOLD; +- child_stat->actual=0; +- child_stat->throughput=0; +- child_stat->cputime=0; +- child_stat->walltime=0; +- } +- *stop_flag = 0; +- if(!sflag) +- kilobytes64=throughsize; +- if(!rflag) +- reclen=(long long)4096; +- if(aggflag) +- kilobytes64=orig_size/num_child; +- numrecs64 = (long long)(kilobytes64*1024)/reclen; +- buffer=mainbuffer; +- if(use_thread) +- port="thread"; +- else +- port="process"; +- if(w_traj_flag) +- { +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tEach %s writes a %ld Kbyte file in telemetry controlled records\n", +- port,kilobytes64); +-#else +- if(!silent) printf("\tEach %s writes a %lld Kbyte file in telemetry controlled records\n", +- port,kilobytes64); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tEach %s writes a %ld Kbyte file in %ld Kbyte records\n", +- port,kilobytes64,reclen/1024); +-#else +- if(!silent) printf("\tEach %s writes a %lld Kbyte file in %lld Kbyte records\n", +- port,kilobytes64,reclen/1024); +-#endif +- } +- +- if(fflag) /* Each child has a file name to write */ +- for(xx=0;xxflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag=CHILD_STATE_BEGIN; +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); /* Start parents timer */ +- goto waitout; +- } +- +-waitout: +- getout=0; +- if((long long)getpid() == myid) { /* Parent only */ +- starttime1 = time_so_far(); /* Wait for all children */ +- for( i = 0; i < num_child; i++){ +- child_stat = (struct child_stats *) &shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* get parents total time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- +- total_kilos=0; +- ptotal=0; +- walltime = 0.0; +- cputime = 0.0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; /* add up the children */ +- ptotal += child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- /* Add up the cpu times of all children */ +- cputime += child_stat->cputime; +- +- /* and find the child with the longest wall time */ +- /* Get the earliest start time and latest fini time to calc. elapsed time. */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- +- for(xyz=0;xyzflag = CHILD_STATE_HOLD; /* Start children at state 0 (HOLD) */ +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %2ld initial writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %2ld initial writers \t= %10.2f %s/sec\n",num_child,((double)(ptotal)/total_time),unit); +-#else +- if(!silent) printf("\tChildren see throughput for %2lld initial writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %2lld initial writers \t= %10.2f %s/sec\n",num_child,((double)(ptotal)/total_time),unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU Utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Write"); +- /**********************************************************/ +- /*************** End of intitial writer *******************/ +- /**********************************************************/ +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- *stop_flag=0; +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +- +- /**********************************************************/ +- /* Re-write throughput performance test. ******************/ +- /**********************************************************/ +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- total_kilos=0; +- toutputindex=1; +- strcpy(&toutput[1][0],throughput_tests[1]); +- if(noretest) +- { +- store_dvalue( (double)0); +- goto next0; +- } +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Rewrite"); +- /* Hooks to start the distributed Iozone client/server code */ +- if(distributed) +- { +- use_thread=0; /* Turn of any Posix threads */ +- if(master_iozone) +- master_listen_socket = start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_REWRITE_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(28); +- } +- if(childids[xx] == 0){ +-#ifdef _64BIT_ARCH_ +- thread_rwrite_test((void *)xx); +-#else +- thread_rwrite_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_rwrite_test,xx); +-#else +- childids[xx] = mythread_create( thread_rwrite_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)myid,(long long)SIGTERM); +- } +- exit(29); +- } +- } +- } +-#endif +- if((long long)myid == getpid()) +- { +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- goto jump3; +- } +- +-jump3: +- getout=0; +- if((long long)myid == getpid()){ /* Parent only here */ +- for( i = 0; i < num_child; i++){ +- child_stat=(struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents total time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- +- +- total_kilos=0; +- ptotal=0; +- +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- cputime += child_stat->cputime; +- /* Get the earliest start time and latest fini time to calc. elapsed time. */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +-/* +- if (walltime < cputime_res) +- walltime = 0.0; +-*/ +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- +- for(xyz=0;xyzflag = CHILD_STATE_HOLD; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %2ld rewriters \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %2ld rewriters \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %2lld rewriters \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %2lld rewriters \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- *stop_flag=0; +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Rewrite"); +- /**********************************************************/ +- /*************** End of rewrite throughput ****************/ +- /**********************************************************/ +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +-next0: +- if(include_tflag) +- if(!(include_mask & (long long)READER_MASK)) +- goto next1; +- /**************************************************************/ +- /*** Reader throughput tests **********************************/ +- /**************************************************************/ +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Read"); +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[2]); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- total_kilos=0; +- if(distributed) +- { +- use_thread=0; +- if(master_iozone) +- master_listen_socket=start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_READ_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(30); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_read_test((void *)xx); +-#else +- thread_read_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_read_test,xx); +-#else +- childids[xx] = mythread_create( thread_read_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(31); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- goto jumpend4; +- } +-jumpend4: +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- +- total_kilos=0; +- ptotal=0; +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- cputime += child_stat->cputime; +- /* Get the earliest start time and latest fini time to calc. elapsed time. */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %2ld readers \t\t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %2ld readers \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %2lld readers \t\t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %2lld readers \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Read"); +- /**********************************************************/ +- /*************** End of readers throughput ****************/ +- /**********************************************************/ +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +- +- /**************************************************************/ +- /*** ReReader throughput tests **********************************/ +- /**************************************************************/ +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[3]); +- if(noretest) +- { +- store_dvalue( (double)0); +- goto next1; +- } +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Reread"); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- *stop_flag=0; +- total_kilos=0; +- /* Hooks to start the distributed Iozone client/server code */ +- if(distributed) +- { +- use_thread=0; /* Turn of any Posix threads */ +- if(master_iozone) +- master_listen_socket = start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_REREAD_TEST, numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(32); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_rread_test((void *)xx); +-#else +- thread_rread_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- chid=xx; +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_rread_test,xx); +-#else +- childids[xx] = mythread_create( thread_rread_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(33); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- goto jumpend2; +- } +- +-jumpend2: +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ /* wait for children to stop */ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- min_throughput=max_throughput=min_xfer=0; +- total_kilos=0; +- ptotal=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- cputime += child_stat->cputime; +- /* Get the earliest start time and latest fini time to calc. elapsed time. */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +-/* +- if (walltime < cputime_res) +- walltime = 0.0; +-*/ +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %ld re-readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %ld re-readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %lld re-readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %lld re-readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Reread"); +- /**********************************************************/ +- /*************** End of re-readers throughput ****************/ +- /**********************************************************/ +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +- +-next1: +- if(include_tflag) +- if(!(include_mask & (long long)REVERSE_MASK)) +- goto next2; +- sync(); +- sleep(2); +- +- /**************************************************************/ +- /*** Reverse reader throughput tests **************************/ +- /**************************************************************/ +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[4]); +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Revread"); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- *stop_flag=0; +- total_kilos=0; +- /* Hooks to start the distributed Iozone client/server code */ +- if(distributed) +- { +- use_thread=0; /* Turn of any Posix threads */ +- if(master_iozone) +- master_listen_socket = start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_REVERSE_READ_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(34); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_reverse_read_test((void *)xx); +-#else +- thread_reverse_read_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- chid=xx; +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_reverse_read_test,xx); +-#else +- childids[xx] = mythread_create( thread_reverse_read_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(35); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- } +- +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ /* wait for children to stop */ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- total_kilos=0; +- ptotal=0; +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- /* walltime += child_stat->walltime; */ +- cputime += child_stat->cputime; +- /* Get the earliest start time and latest fini time to calc. elapsed time. */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +-/* +- if (walltime < cputime_res) +- walltime = 0.0; +-*/ +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %ld reverse readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %ld reverse readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %lld reverse readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %lld reverse readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Revread"); +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +-next2: +- if(include_tflag) +- if(!(include_mask & (long long)STRIDE_READ_MASK)) +- goto next3; +- /**************************************************************/ +- /*** stride reader throughput tests **************************/ +- /**************************************************************/ +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[5]); +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Strideread"); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- sync(); +- sleep(2); +- *stop_flag=0; +- total_kilos=0; +- /* Hooks to start the distributed Iozone client/server code */ +- if(distributed) +- { +- use_thread=0; /* Turn of any Posix threads */ +- if(master_iozone) +- master_listen_socket = start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_STRIDE_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(36); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_stride_read_test((void *)xx); +-#else +- thread_stride_read_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- chid=xx; +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_stride_read_test,xx); +-#else +- childids[xx] = mythread_create( thread_stride_read_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(37); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- } +- +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ /* wait for children to stop */ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- total_kilos=0; +- ptotal=0; +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- /* walltime += child_stat->walltime; */ +- cputime += child_stat->cputime; +- /* Get the biggest walltime */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +-/* +- if (walltime < cputime_res) +- walltime = 0.0; +-*/ +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %ld stride readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %ld stride readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %lld stride readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %lld stride readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Strideread"); +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +- /**************************************************************/ +- /*** random reader throughput tests ***************************/ +- /**************************************************************/ +-next3: +- if(include_tflag) +- if(!(include_mask & (long long)RANDOM_RW_MASK)) +- goto next4; +- +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[6]); +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Randread"); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- sync(); +- sleep(2); +- *stop_flag=0; +- total_kilos=0; +- /* Hooks to start the distributed Iozone client/server code */ +- if(distributed) +- { +- use_thread=0; /* Turn of any Posix threads */ +- if(master_iozone) +- master_listen_socket = start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_RANDOM_READ_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(38); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_ranread_test((void *)xx); +-#else +- thread_ranread_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- chid=xx; +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_ranread_test,xx); +-#else +- childids[xx] = mythread_create( thread_ranread_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(39); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- } +- +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ /* wait for children to stop */ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- total_kilos=0; +- ptotal=0; +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- cputime += child_stat->cputime; +- /* Get the biggest walltime */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %ld random readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %ld random readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %lld random readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %lld random readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Randread"); +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +- /**************************************************************/ +- /*** mixed workload throughput tests ***************************/ +- /**************************************************************/ +-next4: +- if(include_tflag) +- if(!(include_mask & (long long)RANDOM_MIX_MASK)) +- goto next5; +- +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[7]); +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Mixed"); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- sync(); +- sleep(2); +- *stop_flag=0; +- total_kilos=0; +- /* Hooks to start the distributed Iozone client/server code */ +- if(distributed) +- { +- use_thread=0; /* Turn of any Posix threads */ +- if(master_iozone) +- master_listen_socket = start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_RANDOM_MIX_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(38); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_mix_test((void *)xx); +-#else +- thread_mix_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- chid=xx; +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_mix_test,xx); +-#else +- childids[xx] = mythread_create( thread_mix_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(39); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- } +- +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ /* wait for children to stop */ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- total_kilos=0; +- ptotal=0; +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- cputime += child_stat->cputime; +- /* Get the biggest walltime */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %ld mixed workload \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %ld mixed workload \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %lld mixed workload \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %lld mixed workload \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Mixed"); +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +-next5: +- /**************************************************************/ +- /*** random writer throughput tests **************************/ +- /**************************************************************/ +- if(include_tflag) +- if(!(include_mask & (long long)RANDOM_RW_MASK) || no_write) +- goto next6; +- +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[8]); +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Randwrite"); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- sync(); +- sleep(2); +- *stop_flag=0; +- total_kilos=0; +- /* Hooks to start the distributed Iozone client/server code */ +- if(distributed) +- { +- use_thread=0; /* Turn of any Posix threads */ +- if(master_iozone) +- master_listen_socket = start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_RANDOM_WRITE_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(38); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_ranwrite_test((void *)xx); +-#else +- thread_ranwrite_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- chid=xx; +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_ranwrite_test,xx); +-#else +- childids[xx] = mythread_create( thread_ranwrite_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(39); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- } +- +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ /* wait for children to stop */ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- total_kilos=0; +- ptotal=0; +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- cputime += child_stat->cputime; +- /* Get the biggest walltime */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %ld random writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %ld random writers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %lld random writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %lld random writers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Randwrite"); +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +-next6: +- /**************************************************************/ +- /*** Pwrite writer throughput tests **************************/ +- /**************************************************************/ +-#ifndef HAVE_PREAD +- goto next7; +-#else +- if(include_tflag) +- if(!(include_mask & (long long)PWRITER_MASK)) +- goto next7; +- +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[9]); +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Pwrite"); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- sync(); +- sleep(2); +- *stop_flag=0; +- total_kilos=0; +- /* Hooks to start the distributed Iozone client/server code */ +- if(distributed) +- { +- use_thread=0; /* Turn of any Posix threads */ +- if(master_iozone) +- master_listen_socket = start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_PWRITE_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(38); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_pwrite_test((void *)xx); +-#else +- thread_pwrite_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- chid=xx; +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_pwrite_test,xx); +-#else +- childids[xx] = mythread_create( thread_pwrite_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(39); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- } +- +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ /* wait for children to stop */ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- total_kilos=0; +- ptotal=0; +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- cputime += child_stat->cputime; +- /* Get the biggest walltime*/ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %ld pwrite writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %ld pwrite writers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %lld pwrite writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %lld pwrite writers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Pwrite"); +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +-#endif +- /**************************************************************/ +- /*** Pread reader throughput tests **************************/ +- /**************************************************************/ +-next7: +- +-#ifndef HAVE_PREAD +- goto next8; +-#else +- if(include_tflag) +- if(!(include_mask & (long long)PREADER_MASK)) +- goto next8; +- +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[10]); +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Pread"); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- sync(); +- sleep(2); +- *stop_flag=0; +- total_kilos=0; +- /* Hooks to start the distributed Iozone client/server code */ +- if(distributed) +- { +- use_thread=0; /* Turn of any Posix threads */ +- if(master_iozone) +- master_listen_socket = start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_PREAD_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(38); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_pread_test((void *)xx); +-#else +- thread_pread_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- chid=xx; +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_pread_test,xx); +-#else +- childids[xx] = mythread_create( thread_pread_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(39); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- } +- +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ /* wait for children to stop */ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- total_kilos=0; +- ptotal=0; +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- cputime += child_stat->cputime; +- /* Get the biggest walltime*/ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %ld pread readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %ld pread readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %lld pread readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %lld pread readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Pread"); +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +-#endif +-next8: +- if(include_tflag) +- if(!(include_mask & (long long)FWRITER_MASK)) +- goto next9; +- /**************************************************************/ +- /*** fwriter throughput tests *********************************/ +- /**************************************************************/ +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Fwrite"); +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[11]); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- total_kilos=0; +- if(distributed) +- { +- use_thread=0; +- if(master_iozone) +- master_listen_socket=start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_FWRITE_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(30); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_fwrite_test((void *)xx); +-#else +- thread_fwrite_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_fwrite_test,xx); +-#else +- childids[xx] = mythread_create( thread_fwrite_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(31); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- goto jumpend1; +- } +-jumpend1: +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- +- total_kilos=0; +- ptotal=0; +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- cputime += child_stat->cputime; +- /* Get the earliest start time and latest fini time to calc. elapsed time. */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %2ld fwriters \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %2ld fwriters \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %2lld fwriters \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %2lld fwriters \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Fwrite"); +- /**********************************************************/ +- /*************** End of fwrite throughput ****************/ +- /**********************************************************/ +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +-next9: +- if(include_tflag) +- if(!(include_mask & (long long)FREADER_MASK)) +- goto next10; +- /**************************************************************/ +- /*** freader throughput tests *********************************/ +- /**************************************************************/ +- if((!distributed) || (distributed && master_iozone)) +- start_monitor("Fread"); +- toutputindex++; +- strcpy(&toutput[toutputindex][0],throughput_tests[12]); +- walltime = 0.0; +- cputime = 0.0; +- jstarttime=0; +- total_kilos=0; +- if(distributed) +- { +- use_thread=0; +- if(master_iozone) +- master_listen_socket=start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_FREAD_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(30); +- } +- if(childids[xx]==0){ +-#ifdef _64BIT_ARCH_ +- thread_fread_test((void *)xx); +-#else +- thread_fread_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +- if(!barray[xx]) +- { +- barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+cache_size),(int)0); +- if(barray[xx] == 0) { +- perror("Memory allocation failed:"); +- exit(26); +- } +- barray[xx] =(char *)(((long)barray[xx] + cache_size ) & +- ~(cache_size-1)); +- } +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_fread_test,xx); +-#else +- childids[xx] = mythread_create( thread_fread_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- kill((pid_t)myid,(int)SIGTERM); +- } +- exit(31); +- } +- } +- } +-#endif +- if(myid == (long long)getpid()){ +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- starttime1 = time_so_far(); +- goto jumpend3; +- } +-jumpend3: +- getout=0; +- if(myid == (long long)getpid()){ /* Parent here */ +- for( i = 0; i < num_child; i++){ +- child_stat = (struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest running:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- if(!jstarttime) +- jstarttime = time_so_far(); +- } +- jtime = (time_so_far()-jstarttime)-time_res; +- if(jtime < (double).000001) +- { +- jtime=time_res; +- } +- } +- total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ +- if(total_time < (double).000001) +- { +- total_time=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +-#ifdef JTIME +- total_time=total_time-jtime;/* Remove the join time */ +- if(!silent) printf("\nJoin time %10.2f\n",jtime); +-#endif +- +- total_kilos=0; +- ptotal=0; +- min_throughput=max_throughput=min_xfer=0; +- if(!silent) printf("\n"); +- for(xyz=0;xyzthroughput; +- ptotal+=child_stat->actual; +- if(!min_xfer) +- min_xfer=child_stat->actual; +- if(child_stat->actual < min_xfer) +- min_xfer=child_stat->actual; +- if(!min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput < min_throughput) +- min_throughput=child_stat->throughput; +- if(child_stat->throughput > max_throughput) +- max_throughput=child_stat->throughput; +- cputime += child_stat->cputime; +- /* Get the earliest start time and latest fini time to calc. elapsed time. */ +- if (child_stat->walltime < child_stat->cputime) +- child_stat->walltime = child_stat->cputime; +- if (child_stat->walltime > walltime) +- walltime = child_stat->walltime; +- } +- avg_throughput=total_kilos/num_child; +- if(cpuutilflag) +- { +- if (cputime < cputime_res) +- cputime = 0.0; +- } +- if(cpuutilflag) +- store_times (walltime, cputime); /* Must be Before store_dvalue(). */ +- store_dvalue(total_kilos); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\tChildren see throughput for %2ld freaders \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %2ld freaders \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#else +- if(!silent) printf("\tChildren see throughput for %2lld freaders \t= %10.2f %s/sec\n", num_child, total_kilos,unit); +- if(!silent && !distributed) printf("\tParent sees throughput for %2lld freaders \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); +-#endif +- if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); +- if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); +- if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); +- if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); +- /* CPU% can be > 100.0 for multiple CPUs */ +- if(cpuutilflag) +- { +- if(walltime == 0.0) +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 0.0); +- } +- else +- { +- if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", +- walltime, cputime, 100.0 * cputime / walltime); +- } +- } +- if(Cflag) +- { +- for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, +- child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); +- } +- else +- { +- if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", +- (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); +- } +- } +- } +- if((!distributed) || (distributed && master_iozone)) +- stop_monitor("Fread"); +- /**********************************************************/ +- /*************** End of fread throughput ******************/ +- /**********************************************************/ +- sync(); +- sleep(2); +- if(restf) +- sleep((int)rest_val); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +- cleanup_comm(); +- } +-next10: +- sleep(2); /* You need this. If you stop and restart the +- master_listen it will fail on Linux */ +- if (!no_unlink) { +- /**********************************************************/ +- /* Cleanup all of the temporary files */ +- /* This is not really a test. It behaves like a test so */ +- /* it can unlink all of the same files that the other */ +- /* tests left hanging around. */ +- /**********************************************************/ +- /* Hooks to start the distributed Iozone client/server code */ +- if(distributed) +- { +- use_thread=0; /* Turn of any Posix threads */ +- if(master_iozone) +- master_listen_socket = start_master_listen(); +- else +- become_client(); +- } +- if(!use_thread) +- { +- for(xx = 0; xx< num_child ; xx++){ +- chid=xx; +- childids[xx] = start_child_proc(THREAD_CLEANUP_TEST,numrecs64,reclen); +- if(childids[xx]==-1){ +- printf("\nFork failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)childids[xy],(long long)SIGTERM); +- } +- exit(28); +- } +- if(childids[xx] == 0){ +-#ifdef _64BIT_ARCH_ +- thread_cleanup_test((void *)xx); +-#else +- thread_cleanup_test((void *)((long)xx)); +-#endif +- } +- } +- } +-#ifndef NO_THREADS +- else +- { +- for(xx = 0; xx< num_child ; xx++){ /* Create the children */ +-#ifdef _64BIT_ARCH_ +- childids[xx] = mythread_create( thread_cleanup_test,xx); +-#else +- childids[xx] = mythread_create( thread_cleanup_test,(void *)(long)xx); +-#endif +- if(childids[xx]==-1){ +- printf("\nThread create failed\n"); +- for(xy = 0; xy< xx ; xy++){ +- Kill((long long)myid,(long long)SIGTERM); +- } +- exit(29); +- } +- } +- } +-#endif +- if((long long)myid == getpid()) +- { +- if(distributed && master_iozone) +- { +- start_master_listen_loop((int) num_child); +- } +- for(i=0;iflag==CHILD_STATE_HOLD) +- Poll((long long)1); +- } +- for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ +- if(delay_start!=0) +- Poll((long long)delay_start); +- if(distributed && master_iozone) +- tell_children_begin(i); +- } +- } +- +- getout=0; +- if((long long)myid == getpid()){ /* Parent only here */ +- for( i = 0; i < num_child; i++){ +- child_stat=(struct child_stats *)&shmaddr[i]; +- if(distributed && master_iozone) +- { +- printf("\n\tTest cleanup:"); +- wait_dist_join(); +- break; +- } +- else +- { +- if(use_thread) +- { +- thread_join(childids[i],(void *)&pstatus); +- } +- else +- { +- wait(0); +- } +- } +- } +- } +- +- for(xyz=0;xyzflag = CHILD_STATE_HOLD; +- } +- sync(); +- sleep(2); +- if(distributed && master_iozone) +- { +- stop_master_listen(master_listen_socket); +-#ifdef Windows +- /* windows needs time before shutting down sockets */ +- sleep(1); +-#endif +- cleanup_comm(); +- } +- } +- /********************************************************/ +- /* End of cleanup */ +- /********************************************************/ +- sync(); +- if(!silent) printf("\n"); +- if(!silent) printf("\n"); +- return; +-} +- +- +-/************************************************************************/ +-/* Time measurement routines. */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-static double +-time_so_far(void) +-#else +-static double +-time_so_far() +-#endif +-{ +-#ifdef Windows +- LARGE_INTEGER freq,counter; +- double wintime,bigcounter; +- struct timeval tp; +- /* For Windows the time_of_day() is useless. It increments in 55 milli +- * second increments. By using the Win32api one can get access to the +- * high performance measurement interfaces. With this one can get back +- * into the 8 to 9 microsecond resolution. +- */ +- if(pit_hostname[0]){ +- if (pit_gettimeofday(&tp, (struct timezone *) NULL, pit_hostname, +- pit_service) == -1) +- perror("pit_gettimeofday"); +- return ((double) (tp.tv_sec)) + (((double) tp.tv_usec) * 0.000001 ); +- } +- else +- { +- QueryPerformanceFrequency(&freq); +- QueryPerformanceCounter(&counter); +- bigcounter=(double)counter.HighPart *(double)0xffffffff + +- (double)counter.LowPart; +- wintime = (double)(bigcounter/(double)freq.LowPart); +- return((double)wintime); +- } +-#else +-#if defined (OSFV4) || defined(OSFV3) || defined(OSFV5) +- struct timespec gp; +- +- if (getclock(TIMEOFDAY, (struct timespec *) &gp) == -1) +- perror("getclock"); +- return (( (double) (gp.tv_sec)) + +- ( ((float)(gp.tv_nsec)) * 0.000000001 )); +-#else +- struct timeval tp; +- +- if(pit_hostname[0]){ +- if (pit_gettimeofday(&tp, (struct timezone *) NULL, pit_hostname, pit_service) == -1) +- perror("pit_gettimeofday"); +- return ((double) (tp.tv_sec)) + (((double) tp.tv_usec) * 0.000001 ); +- } +- else +- { +- if (gettimeofday(&tp, (struct timezone *) NULL) == -1) +- perror("gettimeofday"); +- return ((double) (tp.tv_sec)) + (((double) tp.tv_usec) * 0.000001 ); +- } +-#endif +-#endif +-} +- +-/************************************************************************/ +-/* FETCHIT () */ +-/* */ +-/* Routine to make the on chip data cache hot for this buffer. The */ +-/* on chip cache may have been blown by other code in the application */ +-/* or in the OS. Remember, on some machines, the data cache is direct */ +-/* mapped and virtual indexed. */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-void fetchit(char *buffer,long long length) +-#else +-void fetchit(buffer,length) +-char *buffer; +-long long length; +-#endif +-{ +- char *where; +- volatile long long x[4]; +- long long i; +- where=(char *)buffer; +- for(i=0;i<(length/cache_line_size);i++) +- { +- x[(i & 3)]=*(where); +- where+=cache_line_size; +- +- } +-} +- +-/************************************************************************/ +-/* Verify that the buffer contains expected pattern */ +-/************************************************************************/ +-/* sverify == 0 means full check of pattern for every byte. */ +-/* severify == 1 means partial check of pattern for each page. */ +-/* sverify == 2 means no check, but partial touch for each page. */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-long long +-verify_buffer(volatile char *buffer,long long length, off64_t recnum, long long recsize,unsigned long long patt, +- char sverify) +-#else +-long long +-verify_buffer(buffer,length, recnum, recsize,patt,sverify) +-char *buffer; +-long long length; +-off64_t recnum; +-long long recsize; +-unsigned long long patt; +-char sverify; +-#endif +-{ +- volatile unsigned long long *where; +- volatile unsigned long long dummy; +- long *de_ibuf, *de_obuf; +- long long j,k; +- off64_t file_position=0; +- off64_t i; +- char *where2; +- char *pattern_ptr; +- long long mpattern,xx2; +- unsigned int seed; +- unsigned long x; +- unsigned long long value,value1; +- unsigned long long a= 0x01020304; +- unsigned long long b = 0x05060708; +- unsigned long long c= 0x01010101; +- unsigned long long d = 0x01010101; +- unsigned long long pattern_buf; +- int lite = 1; /* Only validate 1 long when running +- de-deup validation */ +- +- value = (a<<32) | b; +- value1 = (c<<32) | d; +- +- /* printf("Verify Sverify %d verify %d diag_v %d\n",sverify,verify,diag_v); */ +- x=0; +- xx2=chid; +- if(share_file) +- xx2=(long long)0; +- mpattern=patt; +- pattern_buf=patt; +- where=(unsigned long long *)buffer; +- if(sverify == 2) +- { +- for(i=0;i<(length);i+=page_size) +- { +- dummy = *where; +- where+=(page_size/sizeof(long long)); +- } +- return(0); +- } +- if(dedup) +- { +- gen_new_buf((char *)dedup_ibuf,(char *)dedup_temp, (long)recnum, (int)length,(int)dedup, (int) dedup_interior, dedup_compress, 0); +- de_ibuf = (long *)buffer; +- de_obuf = (long *)dedup_temp; +- if(lite) /* short touch to reduce intrusion */ +- length = (long) sizeof(long); +- for(i=0;i>%c<< Expecting >>%c<<\n", *where2,*pattern_ptr); +- printf("Found pattern: Hex >>%x<< Expecting >>%x<<\n", *where2,*pattern_ptr); +- return(1); +- } +- where++; +- if(diag_v) +- mpattern=mpattern+value1; +- } +- } +- } +- return(0); +-} +-/************************************************************************/ +-/* Fill the buffer */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-fill_buffer(char *buffer,long long length,long long pattern,char sverify,long long recnum) +-#else +-void +-fill_buffer(buffer,length,pattern,sverify,recnum) +-char *buffer; +-long long length; +-long long pattern; +-long long recnum; +-char sverify; +-#endif +-{ +- unsigned long long *where; +- long long i,j,xx2; +- long long mpattern; +- unsigned int seed; +- unsigned long x; +- unsigned long long value,value1; +- unsigned long long a = 0x01020304; +- unsigned long long b = 0x05060708; +- unsigned long long c = 0x01010101; +- unsigned long long d = 0x01010101; +- +- value = (a << 32) | b; +- value1 = (c << 32) | d; +- +- xx2=chid; +- if(share_file) +- xx2=(long long)0; +- x=0; +- mpattern=pattern; +- /* printf("Fill: Sverify %d verify %d diag_v %d\n",sverify,verify,diag_v);*/ +- if(dedup) +- { +- gen_new_buf((char *)dedup_ibuf,(char *)buffer, (long)recnum, (int)length,(int)dedup, (int) dedup_interior, dedup_compress, 1); +- return; +- } +- if(diag_v) +- { +- /*if(client_iozone) +- base_time=0; +- */ +- if(no_unlink) +- base_time=0; +- seed= (unsigned int)(base_time+xx2+recnum); +- srand(seed); +- mpattern=(long long)rand(); +- mpattern=(mpattern<<48) | (mpattern<<32) | (mpattern<<16) | mpattern; +- mpattern=mpattern+value; +- } +- where=(unsigned long long *)buffer; +- if(sverify == 1) +- { +- for(i=0;i<(length);i+=page_size) +- { +- *where = (long long)((pattern<<32) | pattern); +- where+=(page_size/sizeof(long long)); +- /* printf("Filling page %lld \n",i/page_size);*/ +- } +- } +- else +- { +- for(i=0;i<(length/cache_line_size);i++) +- { +- for(j=0;j<(cache_line_size/sizeof(long long));j++) +- { +- if(diag_v) +- { +- *where = (long long)(mpattern); +- mpattern=mpattern+value1; +- } +- else +- *where = (long long)((pattern<<32) | pattern); +- where++; +- } +- } +- } +-} +- +-/************************************************************************/ +-/* PURGEIT() */ +-/* */ +-/* Routine to make the on chip data cache cold for this buffer. */ +-/* Remember, on some machines, the data cache is direct mapped and */ +-/* virtual indexed. */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-void +-purgeit(char *buffer,long long reclen) +-#else +-void +-purgeit(buffer,reclen) +-char *buffer; +-long long reclen; +-#endif +-{ +- char *where; +- long rsize; +- long tsize; +- VOLATILE long long x[200]; +- long i,cache_lines_per_rec; +- long cache_lines_per_cache; +- tsize = 200; +- cache_lines_per_rec = (long)(reclen/cache_line_size); +- cache_lines_per_cache = (long)(cache_size/cache_line_size); +- rsize = (long)l_min((long long)cache_lines_per_rec,(long long)cache_lines_per_cache); +-#ifdef _64BIT_ARCH_ +- where=(char *)pbuffer + ((unsigned long long)buffer & (cache_size-1)); +-#else +- where=(char *)pbuffer + ((long)buffer & ((long)cache_size-1)); +-#endif +- for(i=0;i<(rsize);i++) +- { +- x[i%tsize]=*(where); +- where+=cache_line_size; +- +- } +-} +- +-#ifdef HAVE_ANSIC_C +-void +-prepage(char *buffer,long long reclen) +-#else +-void +-prepage(buffer, reclen) +-char *buffer; +-long long reclen; +-#endif +-{ +- char *where; +- long long i; +- where=(char *)buffer; +- for(i=0;i<(reclen/cache_line_size);i++) +- { +- *(where)=PATTERN; +- where+=cache_line_size; +- } +-} +- +-/************************************************************************/ +-/* write_perf_test () */ +-/* Write and re-write test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void write_perf_test(off64_t kilo64,long long reclen ,long long *data1,long long *data2) +-#else +-void write_perf_test(kilo64,reclen ,data1,data2) +-off64_t kilo64; +-long long reclen; +-long long *data1; +-long long *data2; +-#endif +-{ +- double starttime1; +- double writetime[2]; +- double walltime[2], cputime[2]; +- double qtime_start,qtime_stop; +- double hist_time; +- double compute_val = (double)0; +-#ifdef unix +- double qtime_u_start,qtime_u_stop; +- double qtime_s_start,qtime_s_stop; +-#endif +- long long i,j; +- off64_t numrecs64,traj_offset; +- off64_t lock_offset=0; +- long long Index = 0; +- long long file_flags = 0; +- long long traj_size; +- unsigned long long writerate[2]; +- off64_t filebytes64; +- int ltest; +- char *maddr; +- char *wmaddr,*free_addr; +- char *pbuff; +- char *nbuff; +- int fd,wval; +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +- +- int test_foo; +- +-#ifdef unix +- qtime_u_start=qtime_u_stop=0; +- qtime_s_start=qtime_s_stop=0; +-#endif +- nbuff=wmaddr=free_addr=0; +- traj_offset=0; +- test_foo=0; +- hist_time=qtime_start=qtime_stop=0; +- maddr=0; +- pbuff=mainbuffer; +- if(w_traj_flag) +- { +- filebytes64 = w_traj_fsize; +- numrecs64=w_traj_ops; +- } +- else +- { +- numrecs64 = (kilo64*1024)/reclen; +- filebytes64 = numrecs64*reclen; +- } +- +- if(Q_flag && (!wol_opened)) +- { +- wol_opened++; +- wqfd=fopen("wol.dat","a"); +- if(wqfd==0) +- { +- printf("Unable to open wol.dat\n"); +- exit(40); +- } +- fprintf(wqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- rwqfd=fopen("rwol.dat","a"); +- if(rwqfd==0) +- { +- printf("Unable to open rwol.dat\n"); +- exit(41); +- } +- fprintf(rwqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- fd = 0; +- if(oflag) +- file_flags = O_RDWR|O_SYNC; +- else +- file_flags = O_RDWR; +-#if defined(O_DSYNC) +- if(odsync) +- file_flags |= O_DSYNC; +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) || defined(__FreeBSD__) || defined(__DragonFly__) +- if(read_sync) +- file_flags |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- file_flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- file_flags |=O_DIRECTIO; +-#endif +-#endif +- +-/* Sanity check */ +-/* Some filesystems do not behave correctly and fail +- * when this sequence is performned. This is a very +- * bad thing. It breaks many applications and lurks +- * around quietly. This code should never get +- * triggered, but in the case of running iozone on +- * an NFS client, the filesystem type on the server +- * that is being exported can cause this failure. +- * If this failure happens, then the NFS client is +- * going to going to have problems, but the acutal +- * problem is the filesystem on the NFS server. +- * It's not NFS, it's the local filesystem on the +- * NFS server that is not correctly permitting +- * the sequence to function. +- */ +-/* _SUA_ Services for Unix Applications, under Windows +- does not have a truncate, so this must be skipped */ +-#if !defined(_SUA_) +- if((fd = I_OPEN(filename, (int)O_CREAT|O_WRONLY,0))<0) +- { +- printf("\nCan not open temp file: %s\n", +- filename); +- perror("open"); +- exit(44); +- } +- if(!notruncate) +- { +- if(check_filename(filename)) +- { +- wval=ftruncate(fd,0); +- if(wval < 0) +- { +- printf("\n\nSanity check failed. Do not deploy this filesystem in a production environment !\n"); +- exit(44); +- } +- } +- close(fd); +- +- if(check_filename(filename)) +- unlink(filename); +- } +-/* Sanity check */ +- +-#endif +- if(noretest) +- ltest=1; +- else +- ltest=2; +- +- for( j=0; j (MAXBUFFERSIZE-reclen)) +- Index=0; +- pbuff = mbuffer + Index; +- if(verify || dedup || dedup_interior) +- fill_buffer(pbuff,reclen,(long long)pattern,sverify,(long long)0); +- } +- if(async_flag && no_copy_flag) +- { +- free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); +- nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); +- if(verify || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,i); +- if(purge) +- purgeit(nbuff,reclen); +- } +- if(purge) +- purgeit(pbuff,reclen); +- if(Q_flag || hist_summary) +- { +- qtime_start=time_so_far(); +- } +- if(mmapflag) +- { +- wmaddr = &maddr[i*reclen]; +- fill_area((long long*)pbuff,(long long*)wmaddr,(long long)reclen); +- if(!mmapnsflag) +- { +- if(mmapasflag) +- msync(wmaddr,(size_t)reclen,MS_ASYNC); +- if(mmapssflag) +- msync(wmaddr,(size_t)reclen,MS_SYNC); +- } +- } +- else +- { +- if(async_flag) +- { +- if(no_copy_flag) +- async_write_no_copy(gc, (long long)fd, nbuff, reclen, (i*reclen), depth,free_addr); +- else +- async_write(gc, (long long)fd, pbuff, reclen, (i*reclen), depth); +- } +- else +- { +-#if defined(Windows) +- if(unbuffered) +- { +- WriteFile(hand, pbuff, reclen,(LPDWORD)&wval, +- 0); +- } +- else +- { +-#endif +- wval=write(fd, pbuff, (size_t ) reclen); +- if(wval != reclen) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError writing block %ld, fd= %d\n", i, +- fd); +-#else +- printf("\nError writing block %lld, fd= %d\n", i, +- fd); +-#endif +- if(wval == -1) +- perror("write"); +- signal_handler(); +- } +-#if defined(Windows) +- } +-#endif +- } +- } +- if(hist_summary) +- { +- qtime_stop=time_so_far(); +- hist_time =(qtime_stop-qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(Q_flag) +- { +- qtime_stop=time_so_far(); +- if(j==0) +-#ifdef NO_PRINT_LLD +- fprintf(wqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((qtime_stop-qtime_start-time_res))*1000000,reclen); +- else +- fprintf(rwqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((qtime_stop-qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(wqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((qtime_stop-qtime_start-time_res))*1000000,reclen); +- else +- fprintf(rwqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((qtime_stop-qtime_start-time_res))*1000000,reclen); +-#endif +- } +- w_traj_ops_completed++; +- w_traj_bytes_completed+=reclen; +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)0, +- lock_offset, reclen); +- } +- } +-#ifdef unix +- if(Q_flag) +- { +- qtime_u_stop=utime_so_far(); +- qtime_s_stop=stime_so_far(); +- if(j==0) +- fprintf(wqfd,"\nSystem time %10.3f User time %10.3f Real %10.3f (seconds)\n", +- (qtime_s_stop-qtime_s_start)/sc_clk_tck, +- (qtime_u_stop-qtime_u_start)/sc_clk_tck, +- time_so_far()-starttime1); +- else +- fprintf(rwqfd,"\nSystem time %10.3f User time %10.3f Real %10.3f (seconds)\n", +- (qtime_s_stop-qtime_s_start)/sc_clk_tck, +- (qtime_u_stop-qtime_u_start)/sc_clk_tck, +- time_so_far()-starttime1); +- } +-#endif +- +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag){ +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- } +- else +- { +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- } +- } +- if(file_lock) +- if(mylockf((int) fd,(int)0,(int)0)) +- printf("Unlock failed %d\n",errno); +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- wval=close(fd); +- if(wval==-1){ +- perror("close"); +- signal_handler(); +- } +- } +- writetime[j] = ((time_so_far() - starttime1)-time_res) +- -compute_val; +- if(writetime[j] < (double).000001) +- { +- writetime[j]=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(!include_close) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC);/* Clean up before read starts */ +- else +- { +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- } +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- wval=close(fd); +- if(wval==-1){ +- perror("close"); +- signal_handler(); +- } +- } +- if(cpuutilflag) +- { +- cputime[j] = cputime_so_far() - cputime[j]; +- if (cputime[j] < cputime_res) +- cputime[j] = 0.0; +- walltime[j] = time_so_far() - walltime[j]; +- if (walltime[j] < cputime[j]) +- walltime[j] = cputime[j]; +- } +- if(restf) +- sleep((int)rest_val); +- } +- if(OPS_flag || MS_flag){ +- filebytes64=w_traj_ops_completed; +- /*filebytes64=filebytes64/reclen;*/ +- }else +- filebytes64=w_traj_bytes_completed; +- +- for(j=0;j>= 10; +- } +- data1[0]=writerate[0]; +- if(noretest) +- { +- writerate[1]=(long long) 0; +- if(cpuutilflag) +- { +- walltime[1]=0.0; +- cputime[1]=0.0; +- } +- } +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(cpuutilflag) +- store_times(walltime[0], cputime[0]); +- store_value((off64_t)writerate[0]); +- if(cpuutilflag) +- store_times(walltime[1], cputime[1]); +- store_value((off64_t)writerate[1]); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%8ld",writerate[0]); +- if(!silent) printf("%8ld",writerate[1]); +- if(!silent) fflush(stdout); +-#else +- if(!silent) printf("%8lld",writerate[0]); +- if(!silent) printf("%8lld",writerate[1]); +- if(!silent) fflush(stdout); +-#endif +-} +-/************************************************************************/ +-/* fwrite_perf_test () */ +-/* fWrite and fre-write test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void fwrite_perf_test(off64_t kilo64,long long reclen ,long long *data1,long long *data2) +-#else +-void fwrite_perf_test(kilo64,reclen ,data1,data2) +-off64_t kilo64; +-long long reclen; +-long long *data1; +-long long *data2; +-#endif +-{ +- double starttime1; +- double writetime[2]; +- double walltime[2], cputime[2]; +- double compute_val = (double)0; +- long long i,j; +- off64_t numrecs64; +- long long Index = 0; +- unsigned long long writerate[2]; +- off64_t filebytes64; +- FILE *stream = NULL; +- int fd; +- int wval; +- int ltest; +- char *how; +- char *stdio_buf; +- +- if(mmapflag || async_flag) +- return; +- numrecs64 = (kilo64*1024)/reclen; +- filebytes64 = numrecs64*reclen; +- stdio_buf=(char *)malloc((size_t)reclen); +- if(noretest) +- ltest=1; +- else +- ltest=2; +- +- for( j=0; j (MAXBUFFERSIZE-reclen)) +- Index=0; +- buffer = mbuffer + Index; +- } +- if((verify & diag_v) || dedup || dedup_interior) +- fill_buffer(buffer,reclen,(long long)pattern,sverify,i); +- if(purge) +- purgeit(buffer,reclen); +- if(fwrite(buffer, (size_t) reclen, 1, stream) != 1) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError fwriting block %ld, fd= %d\n", i, +- fd); +-#else +- printf("\nError fwriting block %lld, fd= %d\n", i, +- fd); +-#endif +- perror("fwrite"); +- signal_handler(); +- } +- } +- +- if(include_flush) +- { +- fflush(stream); +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- } +- if(include_close) +- { +- wval=fclose(stream); +- if(wval==-1){ +- perror("fclose"); +- signal_handler(); +- } +- } +- writetime[j] = ((time_so_far() - starttime1)-time_res) +- -compute_val; +- if(writetime[j] < (double).000001) +- { +- writetime[j]= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(!include_close) +- { +- wval=fflush(stream); +- if(wval==-1){ +- perror("fflush"); +- signal_handler(); +- } +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- wval=fclose(stream); +- if(wval==-1){ +- perror("fclose"); +- signal_handler(); +- } +- } +- +- if(cpuutilflag) +- { +- cputime[j] = cputime_so_far() - cputime[j]; +- if (cputime[j] < cputime_res) +- cputime[j] = 0.0; +- walltime[j] = time_so_far() - walltime[j]; +- if (walltime[j] < cputime[j]) +- walltime[j] = cputime[j]; +- } +- if(restf) +- sleep((int)(int)rest_val); +- } +- free(stdio_buf); +- if(OPS_flag || MS_flag){ +- filebytes64=filebytes64/reclen; +- } +- for(j=0;j>= 10; +- } +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(noretest) +- { +- writerate[1]=(long long)0; +- if(cpuutilflag) +- { +- walltime[1]=0.0; +- cputime[1]=0.0; +- } +- } +- if(cpuutilflag) +- store_times(walltime[0], cputime[0]); +- store_value((off64_t)writerate[0]); +- if(cpuutilflag) +- store_times(walltime[1], cputime[1]); +- store_value((off64_t)writerate[1]); +- data1[0]=writerate[0]; +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%9ld",writerate[0]); +- if(!silent) printf("%9ld",writerate[1]); +- if(!silent) fflush(stdout); +-#else +- if(!silent) printf("%9lld",writerate[0]); +- if(!silent) printf("%9lld",writerate[1]); +- if(!silent) fflush(stdout); +-#endif +-} +- +-/************************************************************************/ +-/* fread_perf_test */ +-/* fRead and fre-read test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void fread_perf_test(off64_t kilo64,long long reclen,long long *data1,long long *data2) +-#else +-void fread_perf_test(kilo64,reclen,data1,data2) +-off64_t kilo64; +-long long reclen; +-long long *data1,*data2; +-#endif +-{ +- double starttime2; +- double readtime[2]; +- double walltime[2], cputime[2]; +- double compute_val = (double)0; +- long long j; +- off64_t i,numrecs64; +- long long Index = 0; +- unsigned long long readrate[2]; +- off64_t filebytes64; +- FILE *stream = 0; +- char *stdio_buf; +- int fd,ltest; +- +- if(mmapflag || async_flag) +- return; +- numrecs64 = (kilo64*1024)/reclen; +- filebytes64 = numrecs64*reclen; +- stdio_buf=(char *)malloc((size_t)reclen); +- +- if(noretest) +- ltest=1; +- else +- ltest=2; +- +- for( j=0; j (MAXBUFFERSIZE-reclen)) +- Index=0; +- buffer = mbuffer + Index; +- } +- if(purge) +- purgeit(buffer,reclen); +- if(fread(buffer, (size_t) reclen,1, stream) != 1) +- { +-#ifdef _64BIT_ARCH_ +-#ifdef NO_PRINT_LLD +- printf("\nError freading block %lu %lx\n", i, +- (unsigned long long)buffer); +-#else +- printf("\nError freading block %llu %llx\n", i, +- (unsigned long long)buffer); +-#endif +-#else +-#ifdef NO_PRINT_LLD +- printf("\nError freading block %lu %lx\n", i, +- (long)buffer); +-#else +- printf("\nError freading block %llu %lx\n", i, +- (long)buffer); +-#endif +-#endif +- perror("read"); +- exit(54); +- } +- if(verify){ +- if(verify_buffer(buffer,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- exit(55); +- } +- } +- } +- if(include_flush) +- fflush(stream); +- if(include_close) +- { +- fclose(stream); +- } +- readtime[j] = ((time_so_far() - starttime2)-time_res) +- -compute_val; +- if(readtime[j] < (double).000001) +- { +- readtime[j]= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(!include_close) +- { +- fflush(stream); +- fclose(stream); +- } +- stream = NULL; +- if(cpuutilflag) +- { +- cputime[j] = cputime_so_far() - cputime[j]; +- if (cputime[j] < cputime_res) +- cputime[j] = 0.0; +- walltime[j] = time_so_far() - walltime[j]; +- if (walltime[j] < cputime[j]) +- walltime[j] = cputime[j]; +- } +- if(restf) +- sleep((int)rest_val); +- } +- free(stdio_buf); +- if(OPS_flag || MS_flag){ +- filebytes64=filebytes64/reclen; +- } +- for(j=0;j>= 10; +- } +- data1[0]=readrate[0]; +- data2[0]=1; +- if(noretest) +- { +- readrate[1]=(long long)0; +- if(cpuutilflag) +- { +- walltime[1]=0.0; +- cputime[1]=0.0; +- } +- } +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(cpuutilflag) +- store_times(walltime[0], cputime[0]); +- store_value((off64_t)readrate[0]); +- if(cpuutilflag) +- store_times(walltime[1], cputime[1]); +- store_value((off64_t)readrate[1]); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%8ld",readrate[0]); +- if(!silent) printf("%9ld",readrate[1]); +- if(!silent) fflush(stdout); +-#else +- if(!silent) printf("%8lld",readrate[0]); +- if(!silent) printf("%9lld",readrate[1]); +- if(!silent) fflush(stdout); +-#endif +-} +- +-/************************************************************************/ +-/* read_perf_test */ +-/* Read and re-fread test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-read_perf_test(off64_t kilo64,long long reclen,long long *data1,long long *data2) +-#else +-void +-read_perf_test(kilo64,reclen,data1,data2) +-off64_t kilo64; +-long long reclen; +-long long *data1,*data2; +-#endif +-{ +- double starttime2; +- double compute_val = (double)0; +- double readtime[2]; +- double walltime[2], cputime[2]; +-#ifdef unix +- double qtime_u_start,qtime_u_stop; +- double qtime_s_start,qtime_s_stop; +-#endif +- long long j; +- long long traj_size; +- off64_t i,numrecs64,traj_offset; +- off64_t lock_offset=0; +- long long Index = 0; +- unsigned long long readrate[2]; +- off64_t filebytes64; +- volatile char *buffer1; +- char *nbuff; +- char *maddr; +- char *wmaddr; +- int fd,open_flags; +- int test_foo,ltest; +- long wval; +- double qtime_start,qtime_stop; +- double hist_time; +-#ifdef ASYNC_IO +- struct cache *gc=0; +- +-#else +- long long *gc=0; +-#endif +-#ifdef unix +- qtime_u_start=qtime_u_stop=0; +- qtime_s_start=qtime_s_stop=0; +-#endif +- hist_time=qtime_start=qtime_stop=0; +- maddr=0; +- traj_offset=0; +- test_foo=0; +- numrecs64 = (kilo64*1024)/reclen; +- +- open_flags = O_RDONLY; +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- open_flags |=O_RSYNC|O_SYNC; +-#endif +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- open_flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- open_flags |=O_DIRECTIO; +-#endif +-#endif +- if(r_traj_flag) +- { +- numrecs64=r_traj_ops; +- filebytes64 = r_traj_fsize; +- } else +- filebytes64 = numrecs64*reclen; +- fd = 0; +- if(Q_flag && (!rol_opened)) +- { +- rol_opened++; +- rqfd=fopen("rol.dat","a"); +- if(rqfd==0) +- { +- printf("Unable to open rol.dat\n"); +- exit(56); +- } +- fprintf(rqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- rrqfd=fopen("rrol.dat","a"); +- if(rrqfd==0) +- { +- printf("Unable to open rrol.dat\n"); +- exit(57); +- } +- fprintf(rrqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- /* +- * begin real testing +- */ +- if(noretest) +- ltest=1; +- else +- ltest=2; +- +- for( j=0; j (MAXBUFFERSIZE-reclen)) +- Index=0; +- nbuff = mbuffer + Index; +- } +- if(purge) +- purgeit(nbuff,reclen); +- if(Q_flag || hist_summary) +- qtime_start=time_so_far(); +- if(mmapflag) +- { +- wmaddr=&maddr[i*reclen]; +- fill_area((long long*)wmaddr,(long long*)nbuff,(long long)reclen); +- } +- else +- { +- if(async_flag) +- { +- if(no_copy_flag) +- async_read_no_copy(gc, (long long)fd, &buffer1, (i*reclen), reclen, +- 1LL,(numrecs64*reclen),depth); +- else +- async_read(gc, (long long)fd, nbuff, (i*reclen),reclen, +- 1LL,(numrecs64*reclen),depth); +- } +- else +- { +-#if defined(Windows) +- if(unbuffered) +- { +- ReadFile(hand, nbuff, reclen,(LPDWORD)&wval, +- 0); +- } +- else +-#endif +- wval=read((int)fd, (void*)nbuff, (size_t) reclen); +- if(wval != reclen) +- { +-#ifdef _64BIT_ARCH_ +-#ifdef NO_PRINT_LLD +- printf("\nError reading block %ld %lx\n", i, +- (unsigned long long)nbuff); +-#else +- printf("\nError reading block %lld %llx\n", i, +- (unsigned long long)nbuff); +-#endif +-#else +-#ifdef NO_PRINT_LLD +- printf("\nError reading block %ld %x\n", i, +- (long)nbuff); +-#else +- printf("\nError reading block %lld %lx\n", i, +- (long)nbuff); +-#endif +-#endif +- perror("read"); +- exit(61); +- } +- } +- } +- if(verify) { +- if(async_flag && no_copy_flag) +- { +- if(verify_buffer(buffer1,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- exit(62); +- } +- } +- else +- { +- if(verify_buffer(nbuff,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- exit(63); +- } +- } +- } +- if(async_flag && no_copy_flag) +- async_release(gc); +- buffer1=0; +- if(hist_summary) +- { +- qtime_stop=time_so_far(); +- hist_time =(qtime_stop-qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(Q_flag) +- { +- qtime_stop=time_so_far(); +- if(j==0) +-#ifdef NO_PRINT_LLD +- fprintf(rqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,(qtime_stop-qtime_start-time_res)*1000000,reclen); +- else +- fprintf(rrqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,(qtime_stop-qtime_start-time_res)*1000000,reclen); +-#else +- fprintf(rqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,(qtime_stop-qtime_start-time_res)*1000000,reclen); +- else +- fprintf(rrqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,(qtime_stop-qtime_start-time_res)*1000000,reclen); +-#endif +- } +- r_traj_ops_completed++; +- r_traj_bytes_completed+=reclen; +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)1, +- lock_offset, reclen); +- } +- if(file_lock) +- if(mylockf((int) fd, (int) 0, (int)1)) +- printf("Read unlock failed. %d\n",errno); +-#ifdef unix +- if(Q_flag) +- { +- qtime_u_stop=utime_so_far(); +- qtime_s_stop=stime_so_far(); +- if(j==0) +- fprintf(rqfd,"\nSystem time %10.3f User time %10.3f Real %10.3f (seconds)\n", +- (qtime_s_stop-qtime_s_start)/sc_clk_tck, +- (qtime_u_stop-qtime_u_start)/sc_clk_tck, +- time_so_far()-starttime2); +- else +- fprintf(rrqfd,"\nSystem time %10.3f User time %10.3f Real %10.3f (seconds)\n", +- (qtime_s_stop-qtime_s_start)/sc_clk_tck, +- (qtime_u_stop-qtime_u_start)/sc_clk_tck, +- time_so_far()-starttime2); +- } +-#endif +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- close(fd); +- } +- readtime[j] = ((time_so_far() - starttime2)-time_res)-compute_val; +- if(readtime[j] < (double).000001) +- { +- readtime[j]= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(!include_close) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- close(fd); +- } +- if(cpuutilflag) +- { +- cputime[j] = cputime_so_far() - cputime[j]; +- if (cputime[j] < cputime_res) +- cputime[j] = 0.0; +- walltime[j] = time_so_far() - walltime[j]; +- if (walltime[j] < cputime[j]) +- walltime[j] = cputime[j]; +- } +- if(restf) +- sleep((int)rest_val); +- } +- if(OPS_flag || MS_flag){ +- filebytes64=r_traj_ops_completed; +- /*filebytes64=filebytes64/reclen;*/ +- } else +- filebytes64=r_traj_bytes_completed; +- +- for(j=0;j>= 10; +- +- } +- data1[0]=readrate[0]; +- data2[0]=1; +- if(noretest) +- { +- readrate[1]=(long long)0; +- if(cpuutilflag) +- { +- walltime[1]=0.0; +- cputime[1]=0.0; +- } +- } +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(cpuutilflag) +- store_times(walltime[0], cputime[0]); +- store_value((off64_t)readrate[0]); +- if(cpuutilflag) +- store_times(walltime[1], cputime[1]); +- store_value((off64_t)readrate[1]); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%9ld",readrate[0]); +- if(!silent) printf("%9ld",readrate[1]); +- if(!silent) fflush(stdout); +-#else +- if(!silent) printf("%9lld",readrate[0]); +- if(!silent) printf("%9lld",readrate[1]); +- if(!silent) fflush(stdout); +-#endif +-} +- +- +-/************************************************************************/ +-/* random_perf_test */ +-/* Random read and write test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void random_perf_test(off64_t kilo64,long long reclen,long long *data1,long long *data2) +-#else +-void random_perf_test(kilo64,reclen,data1,data2) +-off64_t kilo64; +-long long reclen; +-long long *data1, *data2; +-#endif +-{ +- double randreadtime[2]; +- double starttime2; +- double walltime[2], cputime[2]; +- double compute_val = (double)0; +-#if defined (bsd4_2) || defined(Windows) +- long long rand1,rand2,rand3; +-#endif +- unsigned long long big_rand; +- long long j; +- off64_t i,numrecs64; +- long long Index=0; +- int flags; +- unsigned long long randreadrate[2]; +- off64_t filebytes64; +- off64_t lock_offset=0; +- volatile char *buffer1; +- char *wmaddr,*nbuff; +- char *maddr,*free_addr; +- int fd,wval; +- long long *recnum= 0; +-#if defined(VXFS) || defined(solaris) +- int test_foo=0; +-#endif +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +-#ifdef MERSENNE +- unsigned long long init[4]={0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL}; +- unsigned long long length=4; +-#endif +- +- maddr=free_addr=0; +- numrecs64 = (kilo64*1024)/reclen; +-#ifdef MERSENNE +- init_by_array64(init, length); +-#else +-#ifdef bsd4_2 +- srand(0); +-#else +-#ifdef Windows +- srand(0); +-#else +- srand48(0); +-#endif +-#endif +-#endif +- recnum = (long long *)malloc(sizeof(*recnum)*numrecs64); +- if (recnum){ +- /* pre-compute random sequence based on +- Fischer-Yates (Knuth) card shuffle */ +- for(i = 0; i < numrecs64; i++){ +- recnum[i] = i; +- } +- for(i = 0; i < numrecs64; i++) { +- long long tmp; +-#ifdef MERSENNE +- big_rand=genrand64_int64(); +-#else +-#ifdef bsd4_2 +- rand1=(long long)rand(); +- rand2=(long long)rand(); +- rand3=(long long)rand(); +- big_rand=(rand1<<32)|(rand2<<16)|(rand3); +-#else +-#ifdef Windows +- rand1=(long long)rand(); +- rand2=(long long)rand(); +- rand3=(long long)rand(); +- big_rand=(rand1<<32)|(rand2<<16)|(rand3); +-#else +- big_rand = lrand48(); +-#endif +-#endif +-#endif +- big_rand = big_rand%numrecs64; +- tmp = recnum[i]; +- recnum[i] = recnum[big_rand]; +- recnum[big_rand] = tmp; +- } +- } +- else +- { +- fprintf(stderr,"Random uniqueness fallback.\n"); +- } +- flags = O_RDWR; +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +- fd=0; +- if(oflag) +- flags |= O_SYNC; +-#if defined(O_DSYNC) +- if(odsync) +- flags |= O_DSYNC; +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +- filebytes64 = numrecs64*reclen; +- for( j=0; j<2; j++ ) +- { +- if(j==0) +- flags |=O_CREAT; +- if (no_write && (j == 1)) +- continue; +- if(cpuutilflag) +- { +- walltime[j] = time_so_far(); +- cputime[j] = cputime_so_far(); +- } +- if(Uflag) /* Unmount and re-mount the mountpoint */ +- { +- purge_buffer_cache(); +- } +- if((fd = I_OPEN(filename, ((int)flags),0640))<0){ +- printf("\nCan not open temporary file for read/write\n"); +- perror("open"); +- exit(66); +- } +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +- +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,filebytes64,0,PROT_READ|PROT_WRITE); +- } +- nbuff=mainbuffer; +- if(fetchon) +- fetchit(nbuff,reclen); +-#ifdef MERSENNE +- init_by_array64(init, length); +-#else +-#ifdef bsd4_2 +- srand(0); +-#else +-#ifdef Windows +- srand(0); +-#else +- srand48(0); +-#endif +-#endif +-#endif +- compute_val=(double)0; +- starttime2 = time_so_far(); +- if ( j==0 ){ +- for(i=0; i (MAXBUFFERSIZE-reclen)) +- Index=0; +- nbuff = mbuffer + Index; +- } +- if(purge) +- purgeit(nbuff,reclen); +- if (recnum) { +- offset64 = reclen * (long long)recnum[i]; +- } +- else +- { +- +-#ifdef MERSENNE +- big_rand =genrand64_int64(); +- offset64 = reclen * (big_rand%numrecs64); +-#else +-#ifdef bsd4_2 +- rand1=(long long)rand(); +- rand2=(long long)rand(); +- rand3=(long long)rand(); +- big_rand=(rand1<<32)|(rand2<<16)|(rand3); +- offset64 = reclen * (big_rand%numrecs64); +-#else +-#ifdef Windows +- rand1=(long long)rand(); +- rand2=(long long)rand(); +- rand3=(long long)rand(); +- big_rand=(rand1<<32)|(rand2<<16)|(rand3); +- offset64 = reclen * (big_rand%numrecs64); +-#else +- offset64 = reclen * (lrand48()%numrecs64); +-#endif +-#endif +-#endif +- } +- +- if( !(h_flag || k_flag || mmapflag)) +- { +- if(I_LSEEK( fd, offset64, SEEK_SET )<0) +- { +- perror("lseek"); +- exit(68); +- }; +- } +- if(rlocking) +- { +- lock_offset=I_LSEEK(fd,0,SEEK_CUR); +- mylockr((int) fd, (int) 1, (int)1, +- lock_offset, reclen); +- } +- if(mmapflag) +- { +- wmaddr=&maddr[offset64]; +- fill_area((long long*)wmaddr,(long long*)nbuff,(long long)reclen); +- } +- else +- { +- if(async_flag) +- { +- if(no_copy_flag) +- async_read_no_copy(gc, (long long)fd, &buffer1, offset64,reclen, +- 0LL,(numrecs64*reclen),depth); +- else +- async_read(gc, (long long)fd, nbuff, (offset64),reclen, +- 0LL,(numrecs64*reclen),0LL); +- } +- else +- { +- if(read(fd, (void *)nbuff, (size_t)reclen) != reclen) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError reading block at %ld\n", +- offset64); +-#else +- printf("\nError reading block at %lld\n", +- offset64); +-#endif +- perror("read"); +- exit(70); +- } +- } +- } +- if(verify){ +- if(async_flag && no_copy_flag) +- { +- if(verify_buffer(buffer1,reclen,(off64_t)offset64/reclen,reclen,(long long)pattern,sverify)){ +- exit(71); +- } +- } +- else +- { +- if(verify_buffer(nbuff,reclen,(off64_t)offset64/reclen,reclen,(long long)pattern,sverify)){ +- exit(72); +- } +- } +- } +- if(async_flag && no_copy_flag) +- async_release(gc); +- if(rlocking) +- { +- lock_offset=I_LSEEK(fd,0,SEEK_CUR); +- mylockr((int) fd, (int) 1, (int)1, +- lock_offset, reclen); +- } +- } +- } +- else +- { +- if(verify || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); +- for(i=0; i (MAXBUFFERSIZE-reclen)) +- Index=0; +- nbuff = mbuffer + Index; +- } +- if (recnum) { +- offset64 = reclen * (long long)recnum[i]; +- } +- else +- { +-#ifdef bsd4_2 +- rand1=(long long)rand(); +- rand2=(long long)rand(); +- rand3=(long long)rand(); +- big_rand=(rand1<<32)|(rand2<<16)|(rand3); +- offset64 = reclen * (big_rand%numrecs64); +-#else +-#ifdef Windows +- rand1=(long long)rand(); +- rand2=(long long)rand(); +- rand3=(long long)rand(); +- big_rand=(rand1<<32)|(rand2<<16)|(rand3); +- offset64 = reclen * (big_rand%numrecs64); +-#else +- offset64 = reclen * (lrand48()%numrecs64); +-#endif +-#endif +- } +- if(async_flag && no_copy_flag) +- { +- free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); +- nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); +- if(verify || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,offset64/reclen); +- } +- if(purge) +- purgeit(nbuff,reclen); +- +- if((verify & diag_v) || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,offset64/reclen); +- +- if (!(h_flag || k_flag || mmapflag)) +- { +- I_LSEEK( fd, offset64, SEEK_SET ); +- } +- if(rlocking) +- { +- lock_offset=I_LSEEK(fd,0,SEEK_CUR); +- mylockr((int) fd, (int) 1, (int)0, +- lock_offset, reclen); +- } +- if(mmapflag) +- { +- wmaddr=&maddr[offset64]; +- fill_area((long long*)nbuff,(long long*)wmaddr,(long long)reclen); +- if(!mmapnsflag) +- { +- if(mmapasflag) +- msync(wmaddr,(size_t)reclen,MS_ASYNC); +- if(mmapssflag) +- msync(wmaddr,(size_t)reclen,MS_SYNC); +- } +- } +- else +- { +- if(async_flag) +- { +- if(no_copy_flag) +- async_write_no_copy(gc, (long long)fd, nbuff, reclen, offset64, +- depth,free_addr); +- else +- async_write(gc, (long long)fd, nbuff, reclen, offset64, depth); +- } +- else +- { +- wval=write(fd, nbuff,(size_t)reclen); +- if(wval != reclen) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError writing block at %ld\n", +- offset64); +-#else +- printf("\nError writing block at %lld\n", +- offset64); +-#endif +- if(wval==-1) +- perror("write"); +- signal_handler(); +- } +- } +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)0, +- lock_offset, reclen); +- } +- } +- } /* end of modifications *kcollins:2-5-96 */ +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC);/* Clean up before read starts running */ +- else +- { +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- } +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +- wval=close(fd); +- if(wval==-1){ +- perror("close"); +- signal_handler(); +- } +- } +- randreadtime[j] = ((time_so_far() - starttime2)-time_res)- +- compute_val; +- if(randreadtime[j] < (double).000001) +- { +- randreadtime[j]=time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)filebytes64,MS_SYNC);/* Clean up before read starts running */ +- } +- else +- { +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- } +- if(mmapflag) +- mmap_end(maddr,(unsigned long long)filebytes64); +- wval=close(fd); +- if(wval==-1){ +- perror("close"); +- signal_handler(); +- } +- } +- if(cpuutilflag) +- { +- cputime[j] = cputime_so_far() - cputime[j]; +- if (cputime[j] < cputime_res) +- cputime[j] = 0.0; +- walltime[j] = time_so_far() - walltime[j]; +- if (walltime[j] < cputime[j]) +- walltime[j] = cputime[j]; +- } +- if(restf) +- sleep((int)rest_val); +- } +- if(OPS_flag || MS_flag){ +- filebytes64=filebytes64/reclen; +- } +- for(j=0;j<2;j++) +- { +- if(no_write && (j==1)) +- { +- randreadrate[1] = 0.0; +- continue; +- } +- if(MS_flag) +- { +- randreadrate[j]=1000000.0*(randreadtime[j] / (double)filebytes64); +- continue; +- } +- else +- { +- randreadrate[j] = +- (unsigned long long) ((double) filebytes64 / randreadtime[j]); +- } +- if(!(OPS_flag || MS_flag)) +- randreadrate[j] >>= 10; +- } +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(cpuutilflag) +- store_times(walltime[0], cputime[0]); +- store_value((off64_t)randreadrate[0]); +- if(cpuutilflag) +- store_times(walltime[1], cputime[1]); +- store_value((off64_t)randreadrate[1]); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%8ld",randreadrate[0]); +- if(!silent) printf("%8ld",randreadrate[1]); +- if(!silent) fflush(stdout); +-#else +- if(!silent) printf("%8lld",randreadrate[0]); +- if(!silent) printf("%8lld",randreadrate[1]); +- if(!silent) fflush(stdout); +-#endif +- if(recnum) +- free(recnum); +-} +- +-/************************************************************************/ +-/* reverse_perf_test */ +-/* Reverse read test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void reverse_perf_test(off64_t kilo64,long long reclen,long long *data1,long long *data2) +-#else +-void reverse_perf_test(kilo64,reclen,data1,data2) +-off64_t kilo64; +-long long reclen; +-long long *data1,*data2; +-#endif +-{ +- double revreadtime[2]; +- double starttime2; +- double walltime[2], cputime[2]; +- double compute_val = (double)0; +- long long j; +- off64_t i,numrecs64; +- long long Index = 0; +- unsigned long long revreadrate[2]; +- off64_t filebytes64; +- off64_t lock_offset=0; +- int fd,open_flags; +- char *maddr,*wmaddr; +- volatile char *buffer1; +- int ltest; +- char *nbuff; +-#if defined(VXFS) || defined(solaris) +- int test_foo=0; +-#endif +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +- +- maddr=wmaddr=0; +- open_flags=O_RDONLY; +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- open_flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- open_flags |=O_DIRECTIO; +-#endif +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- open_flags |=O_RSYNC|O_SYNC; +-#endif +- numrecs64 = (kilo64*1024)/reclen; +- filebytes64 = numrecs64*reclen; +- fd = 0; +- if(noretest) +- ltest=1; +- else +- ltest=2; +- for( j=0; j (MAXBUFFERSIZE-reclen)) +- Index=0; +- nbuff = mbuffer + Index; +- } +- +- if(purge) +- purgeit(nbuff,reclen); +- if(mmapflag) +- { +- wmaddr = &maddr[((numrecs64-1)-i)*reclen]; +- fill_area((long long*)wmaddr,(long long*)nbuff,(long long)reclen); +- } +- else +- if(async_flag) +- { +- if(no_copy_flag) +- async_read_no_copy(gc, (long long)fd, &buffer1, ((((numrecs64-1)-i)*reclen)), +- reclen, -1LL,(numrecs64*reclen),depth); +- else +- async_read(gc, (long long)fd, nbuff, (((numrecs64-1)-i)*reclen), +- reclen,-1LL,(numrecs64*reclen),depth); +- }else +- { +- if(read((int)fd, (void*)nbuff, (size_t) reclen) != reclen) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError reading block %ld\n", i); +-#else +- printf("\nError reading block %lld\n", i); +-#endif +- perror("read"); +- exit(79); +- } +- } +- if(verify){ +- if(async_flag && no_copy_flag) +- { +- if(verify_buffer(buffer1,reclen,(off64_t)(numrecs64-1)-i,reclen,(long long)pattern,sverify)){ +- exit(80); +- } +- } +- else +- { +- if(verify_buffer(nbuff,reclen,(off64_t)(numrecs64-1)-i,reclen,(long long)pattern,sverify)){ +- exit(81); +- } +- } +- } +- if(async_flag && no_copy_flag) +- async_release(gc); +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)1, +- lock_offset, reclen); +- } +- if (!(h_flag || k_flag || mmapflag)) +- { +- I_LSEEK( fd, (off64_t)-2*reclen, SEEK_CUR ); +- } +- } +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +- close(fd); +- } +- revreadtime[j] = ((time_so_far() - starttime2)-time_res) +- -compute_val; +- if(revreadtime[j] < (double).000001) +- { +- revreadtime[j]= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(!include_close) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +- close(fd); +- } +- if(cpuutilflag) +- { +- cputime[j] = cputime_so_far() - cputime[j]; +- if (cputime[j] < cputime_res) +- cputime[j] = 0.0; +- walltime[j] = time_so_far() - walltime[j]; +- if (walltime[j] < cputime[j]) +- walltime[j] = cputime[j]; +- } +- if(restf) +- sleep((int)rest_val); +- } +- if(OPS_flag || MS_flag){ +- filebytes64=filebytes64/reclen; +- } +- for(j=0;j>= 10; +- } +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(cpuutilflag) +- store_times(walltime[0], cputime[0]); +- store_value((off64_t)revreadrate[0]); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%8ld",revreadrate[0]); +-#else +- if(!silent) printf("%8lld",revreadrate[0]); +-#endif +- if(!silent) fflush(stdout); +-} +- +-/************************************************************************/ +-/* rewriterec_perf_test */ +-/* Re-write the same record */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void rewriterec_perf_test(off64_t kilo64 ,long long reclen,long long *data1,long long *data2) +-#else +-void rewriterec_perf_test(kilo64 ,reclen,data1,data2) +-off64_t kilo64; +-long long reclen; +-long long *data1,*data2; +-#endif +-{ +- double writeintime; +- double starttime1; +- double walltime, cputime; +- double compute_val = (double)0; +- long long i; +- off64_t numrecs64; +- long long flags; +- long long Index=0; +- unsigned long long writeinrate; +- off64_t filebytes64; +- off64_t lock_offset=0; +- int fd,wval; +- char *maddr; +- char *wmaddr,*free_addr,*nbuff; +-#if defined(VXFS) || defined(solaris) +- int test_foo=0; +-#endif +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +- +- walltime=cputime=0; +- maddr=wmaddr=free_addr=nbuff=0; +- numrecs64 = (kilo64*1024)/reclen; +- filebytes64 = numrecs64*reclen; +-/* flags = O_RDWR|O_CREAT|O_TRUNC;*/ +- flags = O_RDWR|O_CREAT; +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +- if(oflag) +- flags |= O_SYNC; +-#if defined(O_DSYNC) +- if(odsync) +- flags |= O_DSYNC; +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +-/* +- if (!no_unlink) +- { +- if(check_filename(filename)) +- unlink(filename); +- } +-*/ +- if(Uflag) /* Unmount and re-mount the mountpoint */ +- { +- purge_buffer_cache(); +- } +- if((fd = I_OPEN(filename, (int)flags,0640))<0) +- { +- printf("\nCan not open temporary file %s for write.\n",filename); +- perror("open"); +- exit(84); +- } +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,filebytes64,1,PROT_READ|PROT_WRITE); +- } +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- nbuff=mainbuffer; +- mbuffer=mainbuffer; +- if(fetchon) +- fetchit(nbuff,reclen); +- /* +- wval=write(fd, nbuff, (size_t) reclen); +- if(wval != reclen) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError writing block %ld, fd= %d\n", 0, fd); +-#else +- printf("\nError writing block %lld, fd= %d\n", 0, fd); +-#endif +- if(wval==-1) +- perror("write"); +- signal_handler(); +- } +- */ +- if(verify || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = time_so_far(); +- cputime = cputime_so_far(); +- } +- for(i=0; i (MAXBUFFERSIZE-reclen)) +- Index=0; +- nbuff = mbuffer + Index; +- } +- if(async_flag && no_copy_flag) +- { +- free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); +- nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); +- if(verify || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); +- } +- if((verify & diag_v) || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); +- if(purge) +- purgeit(nbuff,reclen); +- if(mmapflag) +- { +- wmaddr = &maddr[i*reclen]; +- fill_area((long long*)nbuff,(long long*)wmaddr,(long long)reclen); +- if(!mmapnsflag) +- { +- if(mmapasflag) +- msync(wmaddr,(size_t)reclen,MS_ASYNC); +- if(mmapssflag) +- msync(wmaddr,(size_t)reclen,MS_SYNC); +- } +- } +- else +- { +- if(async_flag) +- { +- if(no_copy_flag) +- async_write_no_copy(gc, (long long)fd, nbuff, reclen, (i*reclen), depth,free_addr); +- else +- async_write(gc, (long long)fd, nbuff, reclen, (i*reclen), depth); +- } +- else +- { +- wval=write(fd, nbuff, (size_t) reclen); +- if(wval != reclen) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError writing block %ld, fd= %d\n", i, fd); +-#else +- printf("\nError writing block %lld, fd= %d\n", i, fd); +-#endif +- if(wval==-1) +- perror("write"); +- signal_handler(); +- } +- } +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)0, +- lock_offset, reclen); +- } +- if (!(h_flag || k_flag || mmapflag)) +- { +- I_LSEEK(fd, (off64_t)0,SEEK_SET); +- } +- } +- +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC);/* Clean up before read starts running */ +- else +- { +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- } +- } +- if(include_close) +- { +- if(mmapflag) +- mmap_end(maddr,(unsigned long long)filebytes64); +- wval=close(fd); +- if(wval==-1){ +- perror("close"); +- signal_handler(); +- } +- } +- writeintime = ((time_so_far() - starttime1)-time_res)- +- compute_val; +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- walltime = time_so_far() - walltime; +- if (walltime < cputime) +- walltime = cputime; +- } +- if(writeintime < (double).000001) +- { +- writeintime= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(!include_close) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC);/* Clean up before read starts running */ +- else +- { +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- } +- if(mmapflag) +- mmap_end(maddr,(unsigned long long)filebytes64); +- wval=close(fd); +- if(wval==-1){ +- perror("close"); +- signal_handler(); +- } +- +- } +- +- if(OPS_flag || MS_flag){ +- filebytes64=filebytes64/reclen; +- } +- if(MS_flag) +- { +- writeinrate=1000000.0*(writeintime / (double)filebytes64); +- } +- else +- { +- writeinrate = (unsigned long long) ((double) filebytes64 / writeintime); +- } +- if(!(OPS_flag || MS_flag)) +- writeinrate >>= 10; +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(cpuutilflag) +- store_times(walltime, cputime); +- store_value((off64_t)writeinrate); +-#ifdef NO_PRINT_LLD +- if(!silent) printf(" %8ld",writeinrate); +-#else +- if(!silent) printf(" %8lld",writeinrate); +-#endif +- if(!silent) fflush(stdout); +- if(restf) +- sleep((int)rest_val); +-} +- +-/************************************************************************/ +-/* read_stride_perf_test */ +-/* Read with a constant stride test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void read_stride_perf_test(off64_t kilos64,long long reclen,long long *data1,long long *data2) +-#else +-void read_stride_perf_test(kilos64,reclen,data1,data2) +-off64_t kilos64; +-long long reclen; +-long long *data1, *data2; +-#endif +-{ +- double strideintime; +- double starttime1; +- double compute_val = (double)0; +- double walltime, cputime; +- off64_t numrecs64,current_position; +- long long Index = 0; +- off64_t i,savepos64 = 0; +- unsigned long long strideinrate; +- off64_t filebytes64; +- off64_t lock_offset=0; +- long long uu; +- off64_t stripewrap=0; +- int fd,open_flags; +- volatile char *buffer1; +- char *nbuff; +- char *maddr; +- char *wmaddr; +-#if defined(VXFS) || defined(solaris) +- int test_foo=0; +-#endif +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +- +- walltime=cputime=0; +- nbuff=maddr=wmaddr=0; +- open_flags=O_RDONLY; +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- open_flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- open_flags |=O_DIRECTIO; +-#endif +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- open_flags |=O_RSYNC|O_SYNC; +-#endif +- next64 = (off64_t)0; +- numrecs64 = (kilos64*1024)/reclen; +- filebytes64 = numrecs64*reclen; +- if(Uflag) /* Unmount and re-mount the mountpoint */ +- { +- purge_buffer_cache(); +- } +- if((fd = I_OPEN(filename, (int)open_flags, 0640))<0) +- { +- printf("\nCan not open temporary file for read\n"); +- perror("open"); +- exit(86); +- } +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +- +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,filebytes64,0,PROT_READ); +- } +- fsync(fd); +- current_position=0; +- nbuff=mainbuffer; +- mbuffer=mainbuffer; +- if(fetchon) +- fetchit(nbuff,reclen); +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = time_so_far(); +- cputime = cputime_so_far(); +- } +- for(i=0; i (MAXBUFFERSIZE-reclen)) +- Index=0; +- nbuff = mbuffer + Index; +- } +- if(purge) +- purgeit(nbuff,reclen); +- if(verify) +- { +- savepos64=current_position/reclen; +- } +- if(mmapflag) +- { +- wmaddr = &maddr[current_position]; +- fill_area((long long*)wmaddr,(long long*)nbuff,(long long)reclen); +- } +- else +- { +- if(async_flag) +- { +- if(no_copy_flag) +- async_read_no_copy(gc, (long long)fd, &buffer1, current_position, +- reclen, stride,(numrecs64*reclen),depth); +- else +- async_read(gc, (long long)fd, nbuff, current_position, reclen, +- stride,(numrecs64*reclen),depth); +- } +- else +- { +- if((uu=read((int)fd, (void*)nbuff, (size_t) reclen)) != reclen) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError reading block %ld, fd= %d Filename %s Read returned %ld\n", i, fd,filename,uu); +- printf("\nSeeked to %ld Reclen = %ld\n", savepos64,reclen); +-#else +- printf("\nError reading block %lld, fd= %d Filename %s Read returned %lld\n", i, fd,filename,uu); +- printf("\nSeeked to %lld Reclen = %lld\n", savepos64,reclen); +-#endif +- perror("read"); +- exit(88); +- } +- } +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)1, +- lock_offset, reclen); +- } +- current_position+=reclen; +- if(verify){ +- if(async_flag && no_copy_flag) +- { +- if(verify_buffer(buffer1,reclen, (off64_t)savepos64 ,reclen,(long long)pattern,sverify)){ +- exit(89); +- } +- } +- else +- { +- if(verify_buffer(nbuff,reclen, (off64_t)savepos64 ,reclen,(long long)pattern,sverify)){ +- exit(90); +- } +- } +- } +- if(async_flag && no_copy_flag) +- async_release(gc); +- +- /* This is a bit tricky. The goal is to read with a stride through +- the file. The problem is that you need to touch all of the file +- blocks. So.. the first pass through you read with a constant stride. +- When you hit eof then add 1 to the beginning offset of the next +- time through the file. The rub here is that eventually adding +- 1 will cause the initial start location plus the STRIDE to be +- beyond eof. So... when this happens the initial offset for the +- next pass needs to be set back to 0. +- */ +- if(current_position + (stride * reclen) >= (numrecs64 * reclen)-reclen) +- { +- current_position=0; +- +- stripewrap++; +- +- if(numrecs64 <= stride) +- { +- current_position=0; +- } +- else +- { +- current_position = (off64_t)((stripewrap)%numrecs64)*reclen; +- } +- +- if (!(h_flag || k_flag || mmapflag)) +- { +- if(I_LSEEK(fd,current_position,SEEK_SET)<0) +- { +- perror("lseek"); +- exit(91); +- } +- } +- } +- else +- { +- current_position+=(stride*reclen)-reclen; +- if (!(h_flag || k_flag || mmapflag)) +- { +- if(I_LSEEK(fd,current_position,SEEK_SET)<0) +- { +- perror("lseek"); +- exit(93); +- }; +- } +- } +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- walltime = time_so_far() - walltime; +- if (walltime < cputime) +- walltime = cputime; +- } +- +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +- close(fd); +- } +- strideintime = ((time_so_far() - starttime1)-time_res) +- -compute_val; +- if(strideintime < (double).000001) +- { +- strideintime= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(!include_close) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +- close(fd); +- } +- +- if(OPS_flag || MS_flag){ +- filebytes64=filebytes64/reclen; +- } +- if(MS_flag) +- { +- strideinrate=1000000.0*(strideintime / (double)filebytes64); +- } +- else +- { +- strideinrate = (unsigned long long) ((double) filebytes64 / strideintime); +- } +- if(!(OPS_flag || MS_flag)) +- strideinrate >>= 10; +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(cpuutilflag) +- store_times(walltime, cputime); +- store_value((off64_t)strideinrate); +-#ifdef NO_PRINT_LLD +- if(!silent) printf(" %8ld",strideinrate); +-#else +- if(!silent) printf(" %8lld",strideinrate); +-#endif +- if(!silent) fflush(stdout); +- if(restf) +- sleep((int)rest_val); +-} +- +-#ifdef HAVE_PREAD +-/************************************************************************/ +-/* pwrite_perf_test */ +-/* pwrite and re-write test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void pwrite_perf_test(off64_t kilos64,long long reclen,long long *data1,long long *data2) +-#else +-void pwrite_perf_test(kilos64,reclen,data1,data2) +-off64_t kilos64; +-long long reclen; +-long long *data1,*data2; +-#endif +-{ +- double pwritetime[2]; +- double starttime1; +- double walltime[2], cputime[2]; +- double compute_val = (double)0; +- long long i,j; +- long long Index = 0; +- unsigned long long pwriterate[2]; +- off64_t filebytes64; +- long long flags_here = 0; +- int fd,ltest,wval; +- off64_t numrecs64,traj_offset; +- off64_t lock_offset=0; +- long long traj_size; +-#if defined(VXFS) || defined(solaris) +- int test_foo=0; +-#endif +- char *nbuff; +- +- traj_offset=0; +- nbuff=mainbuffer; +- if(w_traj_flag) +- { +- filebytes64 = w_traj_fsize; +- numrecs64=w_traj_ops; +- } +- else +- { +- numrecs64 = (kilos64*1024)/reclen; +- filebytes64 = numrecs64*reclen; +- } +- fd = 0; +- if(oflag){ +- flags_here = O_SYNC|O_RDWR; +- } +- else +- { +- flags_here = O_RDWR; +- } +-#if defined(O_DSYNC) +- if(odsync) +- flags_here |= O_DSYNC; +-#endif +- +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags_here |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags_here |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags_here |=O_DIRECTIO; +-#endif +-#endif +- if(noretest) +- ltest=1; +- else +- ltest=2; +- for( j=0; j (MAXBUFFERSIZE-reclen)) +- Index=0; +- nbuff = mbuffer + Index; +- } +- if((verify && diag_v) || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,i); +- if(purge) +- purgeit(nbuff,reclen); +- if(I_PWRITE(fd, nbuff, reclen, traj_offset) != reclen) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError pwriting block %ld, fd= %d\n", i, +- fd); +-#else +- printf("\nError pwriting block %lld, fd= %d\n", i, +- fd); +-#endif +- perror("pwrite"); +- signal_handler(); +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)0, +- lock_offset, reclen); +- } +- } +- if(include_flush) +- { +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- } +- if(include_close) +- { +- wval=close(fd); +- if(wval==-1){ +- perror("close"); +- signal_handler(); +- } +- } +- pwritetime[j] = ((time_so_far() - starttime1)-time_res) +- -compute_val; +- if(pwritetime[j] < (double).000001) +- { +- pwritetime[j]= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(!include_close) +- { +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- wval=close(fd); +- if(wval==-1){ +- perror("close"); +- signal_handler(); +- } +- } +- +- if(cpuutilflag) +- { +- cputime[j] = cputime_so_far() - cputime[j]; +- if (cputime[j] < cputime_res) +- cputime[j] = 0.0; +- walltime[j] = time_so_far() - walltime[j]; +- if (walltime[j] < cputime[j]) +- walltime[j] = cputime[j]; +- } +- if(restf) +- sleep((int)rest_val); +- } +- if(OPS_flag || MS_flag){ +- filebytes64=filebytes64/reclen; +- } +- for(j=0;j>= 10; +- } +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(noretest) +- { +- pwriterate[1]=(long long)0; +- if(cpuutilflag) +- { +- walltime[1]=0.0; +- cputime[1]=0.0; +- } +- } +- +- if(cpuutilflag) +- store_times(walltime[0], cputime[0]); +- store_value((off64_t)pwriterate[0]); +- if(cpuutilflag) +- store_times(walltime[1], cputime[1]); +- store_value((off64_t)pwriterate[1]); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%8ld",pwriterate[0]); +- if(!silent) printf("%9ld",pwriterate[1]); +- if(!silent) fflush(stdout); +-#else +- if(!silent) printf("%8lld",pwriterate[0]); +- if(!silent) printf("%9lld",pwriterate[1]); +- if(!silent) fflush(stdout); +-#endif +-} +- +-/************************************************************************/ +-/* pread_perf_test */ +-/* pread and re-pread test */ +-/************************************************************************/ +-#ifdef HAVE_PREAD +-#ifdef HAVE_ANSIC_C +-void pread_perf_test(off64_t kilos64,long long reclen,long long *data1,long long *data2) +-#else +-void pread_perf_test(kilos64,reclen,data1,data2) +-off64_t kilos64; +-long long reclen; +-long long *data1, *data2; +-#endif +-{ +- double starttime2; +- double preadtime[2]; +- double walltime[2], cputime[2]; +- double compute_val = (double)0; +- long long numrecs64,i; +- long long j; +- long long Index = 0; +- unsigned long long preadrate[2]; +- off64_t filebytes64; +- off64_t lock_offset=0; +- int fd,open_flags; +- int ltest; +- off64_t traj_offset; +- long long traj_size; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +- char *nbuff; +- +- traj_offset=0; +- nbuff=mainbuffer; +- open_flags=O_RDONLY; +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- open_flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- open_flags |=O_DIRECTIO; +-#endif +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) || defined(__FreeBSD__) || defined(__DragonFly__) +- if(read_sync) +- open_flags |=O_RSYNC|O_SYNC; +-#endif +- if(r_traj_flag) +- { +- filebytes64 = r_traj_fsize; +- numrecs64=r_traj_ops; +- } +- else +- { +- numrecs64 = (kilos64*1024)/reclen; +- filebytes64 = numrecs64*reclen; +- } +- +- fd = 0; +- if(noretest) +- ltest=1; +- else +- ltest=2; +- for( j=0; j (MAXBUFFERSIZE-reclen)) +- Index=0; +- nbuff = mbuffer + Index; +- } +- +- if(purge) +- purgeit(nbuff,reclen); +- if(I_PREAD(((int)fd), ((void*)nbuff), ((size_t) reclen),traj_offset ) +- != reclen) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError reading block %ld %lx\n", i,(unsigned long)nbuff); +-#else +- printf("\nError reading block %lld %lx\n", i,(unsigned long)nbuff); +-#endif +- perror("pread"); +- exit(103); +- } +- if(verify){ +- if(verify_buffer(nbuff,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- exit(104); +- } +- } +- if(rlocking) +- { +- lock_offset=I_LSEEK(fd,0,SEEK_CUR); +- mylockr((int) fd, (int) 1, (int)1, +- lock_offset, reclen); +- } +- } +- if(include_flush) +- fsync(fd); +- if(include_close) +- close(fd); +- preadtime[j] = ((time_so_far() - starttime2)-time_res) +- -compute_val; +- if(preadtime[j] < (double).000001) +- { +- preadtime[j]= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(!include_close) +- { +- fsync(fd); +- close(fd); +- } +- +- if(cpuutilflag) +- { +- cputime[j] = cputime_so_far() - cputime[j]; +- if (cputime[j] < cputime_res) +- cputime[j] = 0.0; +- walltime[j] = time_so_far() - walltime[j]; +- if (walltime[j] < cputime[j]) +- walltime[j] = cputime[j]; +- } +- if(restf) +- sleep((int)rest_val); +- } +- +- filebytes64 = numrecs64*reclen; +- if(OPS_flag || MS_flag){ +- filebytes64=filebytes64/reclen; +- } +- for(j=0;j>= 10; +- } +- if(noretest) +- { +- preadrate[1]=(long long)0; +- if(cpuutilflag) +- { +- walltime[1]=0.0; +- cputime[1]=0.0; +- } +- } +- +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(cpuutilflag) +- store_times(walltime[0], cputime[0]); +- store_value((off64_t)preadrate[0]); +- if(cpuutilflag) +- store_times(walltime[1], cputime[1]); +- store_value((off64_t)preadrate[1]); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%8ld",preadrate[0]); +- if(!silent) printf("%9ld",preadrate[1]); +- if(!silent) fflush(stdout); +-#else +- if(!silent) printf("%8lld",preadrate[0]); +- if(!silent) printf("%9lld",preadrate[1]); +- if(!silent) fflush(stdout); +-#endif +-} +-#endif +- +-#ifdef HAVE_PREADV +-/************************************************************************/ +-/* pwritev_perf_test */ +-/* pwritev and re-pwritev test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void pwritev_perf_test(off64_t kilos64,long long reclen,long long *data1,long long *data2) +-#else +-void pwritev_perf_test(kilos64,reclen,data1,data2) +-off64_t kilos64; +-long long reclen; +-long long *data1,*data2; +-#endif +-{ +- int wval; +- double starttime1; +- double pwritevtime[2]; +- double walltime[2], cputime[2]; +- double compute_val = (double)0; +- long long list_off[PVECMAX]; +- long long numvecs,j,xx; +- unsigned long long pwritevrate[2]; +- off64_t filebytes64,i; +- off64_t numrecs64; +- int fd,ltest; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +- long long flags_here; +- char *nbuff; +-#ifdef MERSENNE +- unsigned long long init[4]={0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL}, length=4; +-#endif +- +- numrecs64 = (kilos64*1024)/reclen; +- filebytes64 = numrecs64*reclen; +- nbuff = mainbuffer; +- fd = 0; +- if(oflag) +- flags_here = O_SYNC|O_RDWR; +- else +- flags_here = O_RDWR; +-#if defined(O_DSYNC) +- if(odsync) +- flags_here |= O_DSYNC; +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags_here |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags_here |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags_here |=O_DIRECTIO; +-#endif +-#endif +- +- if(noretest) +- ltest=1; +- else +- ltest=2; +- +- for( j=0; j>= 10; +- } +- if(noretest) +- { +- pwritevrate[1]=(long long)0; +- if(cpuutilflag) +- { +- walltime[1]=0.0; +- cputime[1]=0.0; +- } +- } +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(cpuutilflag) +- store_times(walltime[0], cputime[0]); +- store_value((off64_t)pwritevrate[0]); +- if(cpuutilflag) +- store_times(walltime[1], cputime[1]); +- store_value((off64_t)pwritevrate[1]); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%9ld",pwritevrate[0]); +- if(!silent) printf("%10ld",pwritevrate[1]); +- if(!silent) fflush(stdout); +-#else +- if(!silent) printf("%9lld",pwritevrate[0]); +- if(!silent) printf("%10lld",pwritevrate[1]); +- if(!silent) fflush(stdout); +-#endif +-} +-#endif +- +- +-#ifdef HAVE_PREADV +-/**************************************************************************/ +-/* create_list() */ +-/* Creates a list of PVECMAX entries that are unique (non over lapping ). */ +-/* Each of these offsets are then used in a vector (preadv/pwritev) */ +-/**************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void create_list(long long *list_off, long long reclen, off64_t numrecs64) +-#else +-void create_list(list_off, reclen, numrecs64) +-long long *list_off; +-long long reclen; +-off64_t numrecs64; +-#endif +-{ +- long long found,i,j; +- long long numvecs; +- unsigned long long big_rand = -1; +-#if defined (bsd4_2) || defined(Windows) +- long long rand1,rand2,rand3; +-#endif +- +- numvecs = PVECMAX; +- if(numrecs64< numvecs) +- numvecs = numrecs64; +- for(j=0;j>= 10; +- } +- if(noretest) +- { +- preadvrate[1]=(long long)0; +- if(cpuutilflag) +- { +- walltime[1]=0.0; +- cputime[1]=0.0; +- } +- } +- +- /* Must save walltime & cputime before calling store_value() for each/any cell.*/ +- if(cpuutilflag) +- store_times(walltime[0], cputime[0]); +- store_value((off64_t)preadvrate[0]); +- if(cpuutilflag) +- store_times(walltime[1], cputime[1]); +- store_value((off64_t)preadvrate[1]); +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%10ld",preadvrate[0]); +- if(!silent) printf("%9ld",preadvrate[1]); +- if(!silent) printf("\n"); +- if(!silent) fflush(stdout); +-#else +- if(!silent) printf("%10lld",preadvrate[0]); +- if(!silent) printf("%9lld",preadvrate[1]); +- if(!silent) printf("\n"); +- if(!silent) fflush(stdout); +-#endif +-} +-#endif +- +-/************************************************************************/ +-/* print_header() */ +-/* Prints the header for the output from Iozone. */ +-/************************************************************************/ +-#endif +-#ifdef HAVE_ANSIC_C +-void print_header(void) +-#else +-void print_header() +-#endif +-{ +- if(Eflag) +- { +- if(!silent) printf(CONTROL_STRING2, +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- "random", /*kcollins:2-5-96*/ +- "random", /*kcollins:2-5-96*/ +- "bkwd", +- "record", +- "stride", +- " ", +- " ", +- " ", +- " " +-#ifdef HAVE_PREAD +- ," ", +- " ", +- " ", +- " " +-#ifdef HAVE_PREADV +- ," ", +- " ", +- " ", +- " " +-#endif +-#endif +- ); +- if(!silent) printf(CONTROL_STRING2, +- "KB", +- "reclen", +- "write", +- "rewrite", +- "read", +- "reread", +- "read", /*kcollins:2-5-96*/ +- "write", /*kcollins:2-5-96*/ +- "read", +- "rewrite", +- "read", +- "fwrite", +- "frewrite", +- "fread", +- "freread" +-#ifdef HAVE_PREAD +- ,"pwrite", +- "repwrite", +- "pread", +- "repread" +-#ifdef HAVE_PREADV +- ,"pwritev", +- "repwritev", +- "preadv", +- "repreadv" +-#endif +-#endif +- ); +- }else +- if(RWONLYflag){ /*kcollins 8-21-96*/ +- if(!silent) printf(CONTROL_STRING4, /*kcollins 8-21-96*/ +- " ", /*kcollins 8-21-96*/ +- " ", /*kcollins 8-21-96*/ +- " ", /*kcollins 8-21-96*/ +- " ", /*kcollins 8-21-96*/ +- " ", /*kcollins 8-21-96*/ +- " " /*kcollins 8-21-96*/ +- ); /*kcollins 8-21-96*/ +- if(!silent) printf(CONTROL_STRING4, /*kcollins 8-21-96*/ +- "KB", /*kcollins 8-21-96*/ +- "reclen", /*kcollins 8-21-96*/ +- "write", /*kcollins 8-21-96*/ +- "rewrite", /*kcollins 8-21-96*/ +- "read", /*kcollins 8-21-96*/ +- "reread" /*kcollins 8-21-96*/ +- ); /*kcollins 8-21-96*/ +- }else{ +- if(!(mmapflag || async_flag)) +- { +- if(!silent) printf(CONTROL_STRING3, +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- "random", /*kcollins:2-5-96*/ +- "random", /*kcollins:2-5-96*/ +- "bkwd", +- "record", +- "stride", +- "", +- "", +- "", +- "" +- ); +- if(!silent) printf(CONTROL_STRING3, +- "KB", +- "reclen", +- "write", +- "rewrite", +- "read", +- "reread", +- "read", /*kcollins:2-5-96*/ +- "write", /*kcollins:2-5-96*/ +- "read", +- "rewrite", +- "read", +- "fwrite", +- "frewrite", +- "fread", +- "freread" +- ); +- }else +- { +- if(!silent) printf(CONTROL_STRING3, +- " ", +- " ", +- " ", +- " ", +- " ", +- " ", +- "random", /*kcollins:2-5-96*/ +- "random", /*kcollins:2-5-96*/ +- "bkwd", +- "record", +- "stride", +- "", +- "", +- "", +- "" +- ); +- if(!silent) printf(CONTROL_STRING3, +- "KB", +- "reclen", +- "write", +- "rewrite", +- "read", +- "reread", +- "read", /*kcollins:2-5-96*/ +- "write", /*kcollins:2-5-96*/ +- "read", +- "rewrite", +- "read", +- "", +- "", +- "", +- "" +- ); +- } +- } +-} +- +-/************************************************************************/ +-/* store_value() */ +-/* Stores a value in an in memory array. Used by the report function */ +-/* to re-organize the output for Excel */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-store_value(off64_t value) +-#else +-store_value(value) +-off64_t value; +-#endif +-{ +- report_array[current_x][current_y]=value; +- current_x++; +- if(current_x > max_x) +- max_x=current_x; +- if(current_y > max_y) +- max_y=current_y; +- if(max_x >= MAX_X) +- { +- printf("\nMAX_X too small\n"); +- exit(117); +- } +- if(max_y >= MAX_Y) +- { +- printf("\nMAX_Y too small\n"); +- exit(118); +- } +-} +- +-/************************************************************************/ +-/* store_times() */ +-/* Stores runtime (walltime & cputime) in a memory array. */ +-/* Used by the report function to re-organize the output for Excel */ +-/* For now, must be called immediately before calling store_value() for */ +-/* each cell. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-store_times(double walltime, double cputime) +-#else +-store_times(walltime, cputime) +-double walltime, cputime; +-#endif +-{ +- runtimes [current_x][current_y].walltime = walltime; +- runtimes [current_x][current_y].cputime = cputime; +- runtimes [current_x][current_y].cpuutil = cpu_util(cputime, walltime); +-} +- +-/************************************************************************/ +-/* dump_report() */ +-/* Dumps the Excel report on standard output. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void dump_report(long long who) +-#else +-dump_report(who) +-long long who; +-#endif +-{ +- long long i; +- off64_t current_file_size; +- off64_t rec_size; +- +- if(bif_flag) +- bif_column++; +- if(!silent) printf(" "); +- +- /* +- * Need to reconstruct the record size list +- * as the crossover in -a changed the list. +- */ +- del_record_sizes(); +- init_record_sizes(orig_min_rec_size, orig_max_rec_size); +- +- for(rec_size=get_next_record_size(0); rec_size <= orig_max_rec_size; +- rec_size=get_next_record_size(rec_size)) +- { +- if (rec_size == 0) break; +- if(bif_flag) +- do_float(bif_fd,(double)(rec_size/1024),bif_row,bif_column++); +-#ifdef NO_PRINT_LLD +- if(!silent) printf(" %c%ld%c",'"',rec_size/1024,'"'); +-#else +- if(!silent) printf(" %c%lld%c",'"',rec_size/1024,'"'); +-#endif +- } +- if(!silent) printf("\n"); +- if(bif_flag) +- { +- bif_column=0; +- bif_row++; +- } +- +- current_file_size = report_array[0][0]; +- if(bif_flag) +- { +- do_float(bif_fd,(double)(current_file_size),bif_row,bif_column++); +- } +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%c%ld%c ",'"',current_file_size,'"'); +-#else +- if(!silent) printf("%c%lld%c ",'"',current_file_size,'"'); +-#endif +- for(i=0;i<=max_y;i++){ +- if(report_array[0][i] != current_file_size){ +- if(!silent) printf("\n"); +- current_file_size = report_array[0][i]; +- if(bif_flag) +- { +- bif_row++; +- bif_column=0; +- do_float(bif_fd,(double)(current_file_size),bif_row,bif_column++); +- } +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%c%ld%c ",'"',current_file_size,'"'); +-#else +- if(!silent) printf("%c%lld%c ",'"',current_file_size,'"'); +-#endif +- } +- if(bif_flag) +- do_float(bif_fd,(double)(report_array[who][i]),bif_row,bif_column++); +-#ifdef NO_PRINT_LLD +- if(!silent) printf(" %ld ",report_array[who][i]); +-#else +- if(!silent) printf(" %lld ",report_array[who][i]); +-#endif +- } +- if(bif_flag) +- { +- bif_row++; +- bif_column=0; +- } +- if(!silent) printf("\n"); +-} +- +-/************************************************************************/ +-/* Wrapper that dumps each of the collected data sets. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void dump_excel(void) +-#else +-void dump_excel() +-#endif +-{ +- if(bif_flag) +- { +- bif_fd=create_xls(bif_filename); +- do_label(bif_fd,command_line,bif_row++,bif_column); +- do_label(bif_fd," ",bif_row++,bif_column); +- do_label(bif_fd,"The top row is records sizes, the left column is file sizes",bif_row++,bif_column); +- } +- if(!silent) printf("Excel output is below:\n"); +- +- if ((!include_tflag) || (include_mask & (long long)WRITER_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Writer Report",bif_row++,bif_column); +- if(!silent) printf("\n%cWriter report%c\n",'"','"'); +- dump_report(2); +- if(bif_flag) +- do_label(bif_fd,"Re-writer Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRe-writer report%c\n",'"','"'); +- dump_report(3); +- } +- +- if ((!include_tflag) || (include_mask & (long long)READER_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Reader Report",bif_row++,bif_column); +- if(!silent) printf("\n%cReader report%c\n",'"','"'); +- dump_report(4); +- if(bif_flag) +- do_label(bif_fd,"Re-reader Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRe-Reader report%c\n",'"','"'); +- dump_report(5); +- } +- +- if ((!include_tflag) || (include_mask & (long long)RANDOM_RW_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Random Read Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRandom read report%c\n",'"','"'); +- dump_report(6); +- if(bif_flag) +- do_label(bif_fd,"Random Write Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRandom write report%c\n",'"','"'); +- dump_report(7); +- } +- +- if ((!include_tflag) || (include_mask & (long long)REVERSE_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Backward Read Report",bif_row++,bif_column); +- if(!silent) printf("\n%cBackward read report%c\n",'"','"'); +- dump_report(8); +- } +- +- if ((!include_tflag) || (include_mask & (long long)REWRITE_REC_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Record Rewrite Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRecord rewrite report%c\n",'"','"'); +- dump_report(9); +- } +- +- if ((!include_tflag) || (include_mask & (long long)STRIDE_READ_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Stride Read Report",bif_row++,bif_column); +- if(!silent) printf("\n%cStride read report%c\n",'"','"'); +- dump_report(10); +- } +- +- if ((!include_tflag) || (include_mask & (long long)FWRITER_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Fwrite Report",bif_row++,bif_column); +- if(!silent) printf("\n%cFwrite report%c\n",'"','"'); +- dump_report(11); +- if(bif_flag) +- do_label(bif_fd,"Re-fwrite Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRe-Fwrite report%c\n",'"','"'); +- dump_report(12); +- } +- +- if ((!include_tflag) || (include_mask & (long long)FREADER_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Fread Report",bif_row++,bif_column); +- if(!silent) printf("\n%cFread report%c\n",'"','"'); +- dump_report(13); +- if(bif_flag) +- do_label(bif_fd,"Re-fread Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRe-Fread report%c\n",'"','"'); +- dump_report(14); +- } +- +-#ifdef HAVE_PREAD +- if(Eflag) +- { +- if ((!include_tflag) || (include_mask & (long long)PWRITER_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Pwrite Report",bif_row++,bif_column); +- if(!silent) printf("\n%cPwrite report%c\n",'"','"'); +- dump_report(15); +- if(bif_flag) +- do_label(bif_fd,"Re-pwrite Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRe-Pwrite report%c\n",'"','"'); +- dump_report(16); +- } +- +- if ((!include_tflag) || (include_mask & (long long)PREADER_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Pread Report",bif_row++,bif_column); +- if(!silent) printf("\n%cPread report%c\n",'"','"'); +- dump_report(17); +- if(bif_flag) +- do_label(bif_fd,"Re-pread Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRe-Pread report%c\n",'"','"'); +- dump_report(18); +- } +- +-#ifdef HAVE_PREADV +- if ((!include_tflag) || (include_mask & (long long)PWRITEV_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Pwritev Report",bif_row++,bif_column); +- if(!silent) printf("\n%cPwritev report%c\n",'"','"'); +- dump_report(19); +- if(bif_flag) +- do_label(bif_fd,"Re-pwritev Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRe-Pwritev report%c\n",'"','"'); +- dump_report(20); +- } +- +- if ((!include_tflag) || (include_mask & (long long)PREADV_MASK)) { +- if(bif_flag) +- do_label(bif_fd,"Preadv Report",bif_row++,bif_column); +- if(!silent) printf("\n%cPreadv report%c\n",'"','"'); +- dump_report(21); +- if(bif_flag) +- do_label(bif_fd,"Re-preadv Report",bif_row++,bif_column); +- if(!silent) printf("\n%cRe-Preadv report%c\n",'"','"'); +- dump_report(22); +- } +-#endif +- } +-#endif +- if (cpuutilflag) +- dump_cputimes(); +- if(bif_flag) +- close_xls(bif_fd); +-} +- +-/************************************************************************/ +-/* dump_times() */ +-/* Dumps the Excel CPU times report to stdout and to the bif file. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void dump_times(long long who) +-#else +-dump_times(who) +-long long who; +-#endif +-{ +- long long i; +- off64_t current_file_size; +- off64_t rec_size; +- +- if (bif_flag) +- bif_column++; +- if(!silent) printf(" "); +- +- for (rec_size = get_next_record_size(0); rec_size <= orig_max_rec_size; +- rec_size = get_next_record_size(rec_size)) +- { +- if (rec_size == 0) break; +- if (bif_flag) +- do_float(bif_fd, (double)(rec_size/1024), bif_row, bif_column++); +-#ifdef NO_PRINT_LLD +- if(!silent) printf(" %c%ld%c",'"',rec_size/1024,'"'); +-#else +- if(!silent) printf(" %c%lld%c",'"',rec_size/1024,'"'); +-#endif +- } +- if(!silent) printf("\n"); +- if (bif_flag) +- { +- bif_column=0; +- bif_row++; +- } +- +- current_file_size = report_array[0][0]; +- if (bif_flag) +- { +- do_float(bif_fd, (double)(current_file_size), bif_row, bif_column++); +- } +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%c%ld%c ",'"',current_file_size,'"'); +-#else +- if(!silent) printf("%c%lld%c ",'"',current_file_size,'"'); +-#endif +- for (i = 0; i <= max_y; i++) { +- if (report_array[0][i] != current_file_size) { +- if(!silent) printf("\n"); +- current_file_size = report_array[0][i]; +- if (bif_flag) +- { +- bif_row++; +- bif_column=0; +- do_float(bif_fd, (double)(current_file_size), bif_row, bif_column++); +- } +-#ifdef NO_PRINT_LLD +- if(!silent) printf("%c%ld%c ",'"',current_file_size,'"'); +-#else +- if(!silent) printf("%c%lld%c ",'"',current_file_size,'"'); +-#endif +- } +- if (bif_flag) +- do_float(bif_fd, (double)(runtimes [who][i].cpuutil), bif_row, bif_column++); +- if(!silent) printf(" %6.2f", runtimes [who][i].cpuutil); +- } +- if(!silent) printf("\n"); +- if (bif_flag) +- { +- bif_row++; +- bif_column=0; +- } +-} +- +-/************************************************************************/ +-/* Wrapper that dumps each of the collected data sets. */ +-/* This one dumps only the collected CPU times. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void dump_cputimes(void) +-#else +-void dump_cputimes(void) +-#endif +-{ +- bif_row++; +- bif_column = 0; +- +- if ((!include_tflag) || (include_mask & (long long)WRITER_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Writer CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cWriter CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(2); +- if(bif_flag) +- do_label(bif_fd, "Re-writer CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRe-writer CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(3); +- } +- +- if ((!include_tflag) || (include_mask & (long long)READER_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Reader CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cReader CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(4); +- if(bif_flag) +- do_label(bif_fd, "Re-reader CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRe-Reader CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(5); +- } +- +- if ((!include_tflag) || (include_mask & (long long)RANDOM_RW_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Random Read CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRandom read CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(6); +- if(bif_flag) +- do_label(bif_fd, "Random Write CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRandom write CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(7); +- } +- +- if ((!include_tflag) || (include_mask & (long long)REVERSE_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Backward Read CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cBackward read CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(8); +- } +- +- if ((!include_tflag) || (include_mask & (long long)REWRITE_REC_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Record Rewrite CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRecord rewrite CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(9); +- } +- +- if ((!include_tflag) || (include_mask & (long long)STRIDE_READ_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Stride Read CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cStride read CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(10); +- } +- +- if ((!include_tflag) || (include_mask & (long long)FWRITER_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Fwrite CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cFwrite CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(11); +- if(bif_flag) +- do_label(bif_fd, "Re-fwrite CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRe-Fwrite CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(12); +- } +- +- if ((!include_tflag) || (include_mask & (long long)FREADER_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Fread CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cFread CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(13); +- if(bif_flag) +- do_label(bif_fd, "Re-fread CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRe-Fread CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(14); +- } +- +-#ifdef HAVE_PREAD +- if(Eflag) +- { +- if ((!include_tflag) || (include_mask & (long long)PWRITER_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Pwrite CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cPwrite CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(15); +- if(bif_flag) +- do_label(bif_fd, "Re-pwrite CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRe-Pwrite CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(16); +- } +- +- if ((!include_tflag) || (include_mask & (long long)PREADER_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Pread CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cPread CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(17); +- if(bif_flag) +- do_label(bif_fd, "Re-pread CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRe-Pread CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(18); +- } +- +-#ifdef HAVE_PREADV +- if ((!include_tflag) || (include_mask & (long long)PWRITEV_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Pwritev CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cPwritev CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(19); +- if(bif_flag) +- do_label(bif_fd, "Re-pwritev CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRe-Pwritev CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(20); +- } +- +- if ((!include_tflag) || (include_mask & (long long)PREADV_MASK)) { +- if(bif_flag) +- do_label(bif_fd, "Preadv CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cPreadv CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(21); +- if(bif_flag) +- do_label(bif_fd, "Re-preadv CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); +- if(!silent) printf("\n%cRe-Preadv CPU utilization report (Zero values should be ignored)%c\n",'"','"'); +- dump_times(22); +- } +-#endif +- } +-#endif +-} +- +-/************************************************************************/ +-/* Internal memory allocation mechanism. Uses shared memory or mmap */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-char * +-alloc_mem(long long size, int shared_flag) +-#else +-char * +-alloc_mem(size,shared_flag) +-long long size; +-int shared_flag; +-#endif +-{ +- long long size1; +- char *addr,*dumb; +- int shmid; +- int tfd; +- long long tmp; +-#if defined(solaris) +- char mmapFileName[]="mmap_tmp_XXXXXX"; +-#endif +- +- tmp = 0; +- dumb = (char *)0; +- tfd=0; +- size1=l_max(size,page_size); +- if(!distributed) +- { +- if(!trflag) +- { +- addr=(char *)malloc((size_t)size1); +- return(addr); +- } +- if(use_thread) +- { +- addr=(char *)malloc((size_t)size1); +- return(addr); +- } +- } +- if(!shared_flag) +- { +- addr=(char *)malloc((size_t)size1); +- return(addr); +- } +-#ifdef SHARED_MEM +- size1=l_max(size,page_size); +- size1=(size1 +page_size) & ~(page_size-1); +- shmid=(int)shmget((key_t)(IPC_PRIVATE), (size_t)size1 , (int)(IPC_CREAT|0666)); +- if(shmid < (int)0) +- { +- printf("\nUnable to get shared memory segment(shmget)\n"); +-#ifdef NO_PRINT_LLD +- printf("shmid = %d, size = %ld, size1 = %lu, Error %d\n",shmid,size,(size_t)size1,errno); +-#else +- printf("shmid = %d, size = %lld, size1 = %lu, Error %d\n",shmid,size,(unsigned long)size1,errno); +-#endif +- exit(119); +- } +- /*addr = (char *)shmat(shmid, 0, SHM_W);*/ +- /* Some systems will not take the above but +- * will default to read/write if no flags +- * are provided. (AIX) +- * The POSIX standard states that if SHM_RDONLY +- * is not specified then it will be read/write. +- */ +- addr = (char *)shmat((int)shmid, 0, 0); +-#ifdef _64BIT_ARCH_ +- if((long long)addr == (long long)-1) +-#else +- if((long)addr == (long)-1) +-#endif +- { +- printf("\nUnable to get shared memory segment\n"); +- printf("..Error %d\n",errno); +- exit(120); +- } +- shmctl(shmid, IPC_RMID, 0); +- return(addr); +-#else +- +- size1=l_max(size,page_size); +- size1=(size1 +page_size) & ~(page_size-1); +-#if defined(bsd4_2) && !defined(macosx) +- if((tfd = creat("mmap.tmp", 0666))<0) +- { +- printf("Unable to create tmp file\n"); +- exit(121); +- } +- addr=(char *)mmap(0,&size1,PROT_WRITE|PROT_READ, +- MAP_ANON|MAP_SHARED, tfd, 0); +- unlink("mmap.tmp"); +-#else +- +- +-#if defined(solaris) +- tfd=mkstemp(mmapFileName); +- if(tfd < 0) +- { +- printf("Unable to create tmp file\n"); +- exit(121); +- } +- dumb=(char *)malloc((size_t)size1); +- bzero(dumb,size1); +- write(tfd,dumb,size1); +- free(dumb); +- addr=(char *)mmap(0,(size_t)size1,PROT_WRITE|PROT_READ, +- MAP_SHARED, tfd, 0); +- unlink(mmapFileName); +-#else +-#if defined(SCO) || defined(SCO_Unixware_gcc) || defined(Windows) +- char mmapFileName[]="mmap_tmp_XXXXXX"; +- tfd=mkstemp(mmapFileName); +- if(tfd < 0) +- { +- printf("Unable to create tmp file\n"); +- exit(121); +- } +- dumb=(char *)malloc((size_t)size1); +- bzero(dumb,size1); +- write(tfd,dumb,size1); +- free(dumb); +- addr=(char *)mmap(0,(size_t)size1,PROT_WRITE|PROT_READ, +- MAP_SHARED, tfd, 0); +- unlink(mmapFileName); +-#else +- addr=(char *)mmap(0,(size_t)size1,PROT_WRITE|PROT_READ, +- MAP_ANONYMOUS|MAP_SHARED, -1, 0); +-#endif +-#endif +-#endif +- if((char *)addr == (char *)-1) +- { +- printf("\nUnable to get memory segment\n"); +- printf("Error %d\n",errno); +- exit(122); +- } +- if(debug1) +- printf("Got shared memory for size %d\n",size1); +- +- return(addr); +-#endif +-} +- +-/************************************************************************/ +-/* Implementation of poll() function. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void Poll(long long time1) +-#else +-void Poll(time1) +-long long time1; +-#endif +-{ +- struct timeval howlong; +- howlong.tv_sec=(int)(time1/100000); +- howlong.tv_usec=(int)(time1%100000); /* Get into u.s. */ +- select(0, 0, 0, 0, &howlong); +-} +- +-/************************************************************************/ +-/* Implementation of max() function. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-long long l_max(long long one,long long two) +-#else +-long long l_max(one,two) +-long long one,two; +-#endif +-{ +- if(one > two) +- return(one); +- else +- return(two); +-} +- +-/************************************************************************/ +-/* Internal Kill. With stonewalling disabled, kill does nothing */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void Kill(long long pid,long long sig) +-#else +-void Kill(pid,sig) +-long long pid,sig; +-#endif +-{ +- if(!xflag) +- { +- /*printf("Killing %d\n",pid);*/ +- kill((pid_t)pid,(int)sig); +- } +-} +-/************************************************************************/ +-/* Implementation of min() function. */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-long long l_min(long long num1,long long num2) +-#else +-long long l_min(num1,num2) +-long long num1,num2; +-#endif +-{ +- if(num1 >= num2) +- return num2; +- else +- return num1; +-} +- +-/************************************************************************/ +-/* Routine to call throughput tests many times. */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-void +-multi_throughput_test(long long mint,long long maxt) +-#else +-void multi_throughput_test(mint, maxt) +-long long mint, maxt; +-#endif +-{ +- int *t_rangeptr, *t_rangecurs; +- int *saveptr = (int *)0; +- int tofree = 0; +- long long i; +- if(t_count == 0){ +- t_count = (int) maxt - mint + 1; +- t_rangeptr = (int *) malloc((size_t)sizeof(int)*t_count); +- saveptr = t_rangeptr; +- tofree = 1; +- t_rangecurs = t_rangeptr; +- for(i=mint; i<= maxt; i++) { +- *(t_rangecurs++) = i; +- } +- } +- else { +- t_rangeptr = &t_range[0]; +- } +- for(i=0; i < t_count; i++){ +- num_child = *(t_rangeptr++); +- current_client_number=0; /* Need to start with 1 */ +- throughput_test(); +- current_x=0; +- current_y++; +- } +- if(Rflag) +- dump_throughput(); +- if(tofree) +- free(saveptr); +- +-} +- +- +- +-/************************************************************************/ +-/* Routine to purge the buffer cache by unmounting drive. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-purge_buffer_cache() +-#else +-purge_buffer_cache() +-#endif +-{ +- char command[1024]; +- int ret,i; +- strcpy(command,"umount "); +- strcat(command, mountname); +- /* +- umount might fail if the device is still busy, so +- retry unmounting several times with increasing delays +- */ +- for (i = 1; i < 200; ++i) { +- ret = system(command); +- if (ret == 0) +- break; +- sleep(i); /* seconds */ +- } +- strcpy(command,"mount "); +- strcat(command, mountname); +- /* +- mount might fail if the device is still busy, so +- retry mounting several times with increasing delays +- */ +- for (i = 1; i < 10; ++i) { +- ret = system(command); +- if (ret == 0) +- break; +- sleep(i); /* seconds */ +- } +-} +- +-/************************************************************************/ +-/* Thread write test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_write_test(void *x) +-#else +-void * +-thread_write_test( x) +-#endif +-{ +- +- struct child_stats *child_stat; +- double starttime1 = 0; +- double temp_time; +- double walltime, cputime; +- double compute_val = (double)0; +- float delay = (float)0; +- double thread_qtime_stop,thread_qtime_start; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- off64_t traj_offset; +- off64_t lock_offset=0; +- off64_t save_offset=0; +- long long flags,traj_size; +- long long w_traj_bytes_completed; +- long long w_traj_ops_completed; +- FILE *w_traj_fd; +- int fd; +- long long recs_per_buffer; +- long long stopped,i; +- off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; +- long long xx,xx2; +- char *dummyfile [MAXSTREAMS]; /* name of dummy file */ +- char *nbuff; +- char *maddr; +- char *wmaddr,*free_addr; +- char now_string[30]; +- int anwser,bind_cpu,wval; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +- off64_t filebytes64; +- char tmpname[256]; +- FILE *thread_wqfd; +- FILE *thread_Lwqfd; +- +-#ifdef ASYNC_IO +- struct cache *gc=0; +- +-#else +- long long *gc=0; +-#endif +- +- if(compute_flag) +- delay=compute_time; +- nbuff=maddr=wmaddr=free_addr=0; +- hist_time=thread_qtime_stop=thread_qtime_start=0; +- thread_wqfd=w_traj_fd=thread_Lwqfd=(FILE *)0; +- traj_offset=walltime=cputime=0; +- anwser=bind_cpu=0; +- if(w_traj_flag) +- { +- filebytes64 = w_traj_fsize; +- numrecs64=w_traj_ops; +- } +- else +- { +- filebytes64 = numrecs64*reclen; +- } +- written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; +- w_traj_bytes_completed=w_traj_ops_completed=0; +- recs_per_buffer = cache_size/reclen ; +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- { +- xx = (long long)((long)x); +- } +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +-#if defined(_HPUX_SOURCE) +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +-#else +- cpu_set_t cpuset; +- +- CPU_ZERO(&cpuset); +- CPU_SET(bind_cpu, &cpuset); +- +- pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); +-#endif +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- if(debug1 ) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- /*****************/ +- /* Children only */ +- /*******************************************************************/ +- /* Initial write throughput performance test. **********************/ +- /*******************************************************************/ +-#if defined(Windows) +- if(unbuffered) +- { +- hand=CreateFile(dummyfile[xx], +- GENERIC_READ|GENERIC_WRITE, +- FILE_SHARE_WRITE|FILE_SHARE_READ, +- NULL,OPEN_ALWAYS,FILE_FLAG_NO_BUFFERING| +- FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, +- NULL); +- CloseHandle(hand); +- } +-#endif +- if(oflag) +- flags=O_RDWR|O_SYNC|O_CREAT; +- else +- flags=O_RDWR|O_CREAT; +-#if defined(O_DSYNC) +- if(odsync) +- flags |= O_DSYNC; +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +-#if defined(Windows) +- if(unbuffered) +- { +- hand=CreateFile(dummyfile[xx], +- GENERIC_READ|GENERIC_WRITE, +- FILE_SHARE_WRITE|FILE_SHARE_READ, +- NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| +- FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, +- NULL); +- } +- else +- { +-#endif +- if((fd = I_OPEN(dummyfile[xx], (int)flags,0640))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("\nCan not open temp file: %s\n", +- filename); +- perror("open"); +- exit(125); +- } +-#if defined(Windows) +- } +-#endif +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,(filebytes64),1,PROT_READ|PROT_WRITE); +- } +- if(reclen < cache_size ) +- { +- recs_per_buffer = cache_size/reclen ; +- nbuff=&nbuff[(xx%recs_per_buffer)*reclen]; +- } +- if(fetchon) /* Prefetch into processor cache */ +- fetchit(nbuff,reclen); +- if((verify && !no_copy_flag) || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); +- +- if(w_traj_flag) +- w_traj_fd=open_w_traj(); +- +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- child_stat->flag=CHILD_STATE_READY; /* Tell parent child is ready to go */ +- if(distributed && client_iozone) +- tell_master_ready(chid); +- if(distributed && client_iozone) +- { +- if(cdebug) +- { +- fprintf(newstdout,"Child %d waiting for go from master\n",(int)xx); +- fflush(newstdout); +- } +- wait_for_master_go(chid); +- if(cdebug) +- { +- fprintf(newstdout,"Child %d received go from master\n",(int)xx); +- fflush(newstdout); +- } +- } +- else +- { +- while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ +- Poll((long long)1); +- } +- +- written_so_far=0; +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->actual = 0; +- child_stat->throughput = 0; +- stopped=0; +- if(file_lock) +- if(mylockf((int) fd, (int) 1, (int)0) != 0) +- printf("File lock for write failed. %d\n",errno); +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_wol.dat",(int)xx); +- thread_wqfd=fopen(tmpname,"a"); +- if(thread_wqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_wqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Write test start: ",now_string); +- } +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- if(w_traj_flag) +- rewind(w_traj_fd); +- for(i=0; ithroughput = +- (time_so_far() - starttime1)-time_res; +- if(include_close) +- { +- if((fd = I_OPEN(dummyfile[xx], (int)flags,0))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("\nCan not open temp file: %s\n", +- filename); +- perror("open"); +- exit(125); +- } +- I_LSEEK(fd,save_offset,SEEK_SET); +- } +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput = time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- if(debug1) +- { +- printf("\n(%ld) Stopped by another\n", (long)xx); +- } +- stopped=1; +- } +- if(purge) +- purgeit(nbuff,reclen); +- if(Q_flag || hist_summary || op_rate_flag) +- { +- thread_qtime_start=time_so_far(); +- } +-again: +- if(mmapflag) +- { +- wmaddr = &maddr[i*reclen]; +- fill_area((long long*)nbuff,(long long*)wmaddr,(long long)reclen); +- /*printf("CHid: %lld Writing offset %lld for length of %lld\n",chid,i*reclen,reclen);*/ +- if(!mmapnsflag) +- { +- if(mmapasflag) +- msync(wmaddr,(size_t)reclen,MS_ASYNC); +- if(mmapssflag) +- msync(wmaddr,(size_t)reclen,MS_SYNC); +- } +- } +- else +- { +- if(async_flag) +- { +- if(no_copy_flag) +- { +- free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); +- nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); +- if(verify || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,i); +- async_write_no_copy(gc, (long long)fd, nbuff, reclen, (i*reclen), depth,free_addr); +- } +- else +- async_write(gc, (long long)fd, nbuff, reclen, (i*reclen), depth); +- } +- else +- { +-#if defined(Windows) +- if(unbuffered) +- { +- WriteFile(hand,nbuff,reclen, (LPDWORD)&wval,0); +- } +- else +- { +-#endif +- wval=write(fd, nbuff, (size_t) reclen); +-#if defined(Windows) +- } +-#endif +- if(wval != reclen) +- { +- if(*stop_flag && !stopped){ +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- } +- temp_time = time_so_far(); +- child_stat->throughput = +- (temp_time - starttime1)-time_res; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- if(debug1) +- { +- printf("\n(%ld) Stopped by another\n", (long)xx); +- } +- stopped=1; +- goto again; +- } +- /* Note: Writer must finish even though told +- to stop. Otherwise the readers will fail. +- The code will capture bytes transfered +- before told to stop but let the writer +- complete. +- */ +-#ifdef NO_PRINT_LLD +- printf("\nError writing block %ld, fd= %d\n", i, +- fd); +-#else +- printf("\nError writing block %lld, fd= %d\n", i, +- fd); +-#endif +- if(wval==-1) +- perror("write"); +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(127); +- } +- } +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +-/* +-printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, +- actual_rate, (desired_op_rate_time-actual_rate)); +-*/ +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long)((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_wqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_wqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- w_traj_ops_completed++; +- w_traj_bytes_completed+=reclen; +- written_so_far+=reclen/1024; +- if(*stop_flag) +- { +- written_so_far-=reclen/1024; +- w_traj_bytes_completed-=reclen; +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)0, +- lock_offset, reclen); +- } +- } +- +- +- if(file_lock) +- if(mylockf((int) fd, (int) 0, (int)0)) +- printf("Write unlock failed. %d\n",errno); +- +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(!xflag) +- { +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- } +- +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- mmap_end(maddr,(unsigned long long)filebytes64); +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- close(fd); +- } +- if(!stopped){ +- temp_time = time_so_far(); +- child_stat->throughput = ((temp_time - starttime1)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- } +- if(cdebug) +- { +- fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid, child_stat->throughput, +- child_stat->actual); +- fflush(newstdout); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- tell_master_stats(THREAD_WRITE_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- +- if (debug1) { +- printf(" child/slot: %lld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n", +- xx, walltime, cputime, +- cpu_util(cputime, walltime)); +- } +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- stopped=0; +- /*******************************************************************/ +- /* End write performance test. *************************************/ +- /*******************************************************************/ +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)numrecs64*reclen,MS_SYNC); /*Clean up before read starts running*/ +- mmap_end(maddr,(unsigned long long)numrecs64*reclen); +- }else +- fsync(fd); +- +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- close(fd); +- } +- if(Q_flag && (thread_wqfd !=0) ) +- fclose(thread_wqfd); +- free(dummyfile[xx]); +- if(w_traj_flag) +- fclose(w_traj_fd); +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Write test finished: ",now_string); +- fclose(thread_Lwqfd); +- } +- if(hist_summary) +- dump_hist("write",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +- +-#ifdef HAVE_PREAD +-/************************************************************************/ +-/* Thread pwrite test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_pwrite_test(void *x) +-#else +-void * +-thread_pwrite_test( x) +-#endif +-{ +- +- struct child_stats *child_stat; +- double starttime1 = 0; +- double temp_time; +- double walltime, cputime; +- double compute_val = (double)0; +- float delay = (float)0; +- double thread_qtime_stop,thread_qtime_start; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- off64_t traj_offset; +- off64_t lock_offset=0; +- long long flags,traj_size; +- long long w_traj_bytes_completed; +- long long w_traj_ops_completed; +- FILE *w_traj_fd; +- int fd; +- long long recs_per_buffer; +- long long stopped,i; +- off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; +- long long xx,xx2; +- char *dummyfile [MAXSTREAMS]; /* name of dummy file */ +- char *nbuff; +- char *maddr; +- char *wmaddr,*free_addr; +- char now_string[30]; +- int anwser,bind_cpu,wval; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +- off64_t filebytes64; +- char tmpname[256]; +- FILE *thread_wqfd; +- FILE *thread_Lwqfd; +- +-#ifdef ASYNC_IO +- struct cache *gc=0; +- +-#else +- long long *gc=0; +-#endif +- +- if(compute_flag) +- delay=compute_time; +- nbuff=maddr=wmaddr=free_addr=0; +- hist_time=thread_qtime_stop=thread_qtime_start=0; +- thread_wqfd=w_traj_fd=thread_Lwqfd=(FILE *)0; +- traj_offset=walltime=cputime=0; +- anwser=bind_cpu=0; +- if(w_traj_flag) +- { +- filebytes64 = w_traj_fsize; +- numrecs64=w_traj_ops; +- } +- else +- { +- filebytes64 = numrecs64*reclen; +- } +- written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; +- w_traj_bytes_completed=w_traj_ops_completed=0; +- recs_per_buffer = cache_size/reclen ; +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- { +- xx = (long long)((long)x); +- } +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#if defined( _HPUX_SOURCE ) || defined ( linux ) +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +-#if defined( _HPUX_SOURCE ) +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +-#else +- cpu_set_t cpuset; +- CPU_ZERO(&cpuset); +- CPU_SET(bind_cpu, &cpuset); +- +- pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); +-#endif +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- if(debug1 ) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- /*****************/ +- /* Children only */ +- /*******************************************************************/ +- /* Initial pwrite throughput performance test. *********************/ +- /*******************************************************************/ +- if(!notruncate) +- { +- if((fd = I_CREAT(dummyfile[xx], 0640))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror(dummyfile[xx]); +- exit(123); +- } +- close(fd); +- } +- if(oflag) +- flags=O_RDWR|O_SYNC|O_CREAT; +- else +- flags=O_RDWR|O_CREAT; +-#if defined(O_DSYNC) +- if(odsync) +- flags |= O_DSYNC; +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +- if((fd = I_OPEN(dummyfile[xx], (int)flags,0640))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("\nCan not open temp file: %s\n", +- filename); +- perror("open"); +- exit(125); +- } +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,(filebytes64),1,PROT_READ|PROT_WRITE); +- } +- if(reclen < cache_size ) +- { +- recs_per_buffer = cache_size/reclen ; +- nbuff=&nbuff[(xx%recs_per_buffer)*reclen]; +- } +- if(fetchon) /* Prefetch into processor cache */ +- fetchit(nbuff,reclen); +- if((verify && !no_copy_flag) || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); +- +- if(w_traj_flag) +- w_traj_fd=open_w_traj(); +- +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- child_stat->flag=CHILD_STATE_READY; /* Tell parent child is ready to go */ +- if(distributed && client_iozone) +- tell_master_ready(chid); +- if(distributed && client_iozone) +- { +- if(cdebug) +- { +- fprintf(newstdout,"Child %d waiting for go from master\n",(int)xx); +- fflush(newstdout); +- } +- wait_for_master_go(chid); +- if(cdebug) +- { +- fprintf(newstdout,"Child %d received go from master\n",(int)xx); +- fflush(newstdout); +- } +- } +- else +- { +- while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ +- Poll((long long)1); +- } +- +- written_so_far=0; +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->actual = 0; +- child_stat->throughput = 0; +- stopped=0; +- if(file_lock) +- if(mylockf((int) fd, (int) 1, (int)0) != 0) +- printf("File lock for write failed. %d\n",errno); +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_pwol.dat",(int)xx); +- thread_wqfd=fopen(tmpname,"a"); +- if(thread_wqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_wqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Pwrite test start: ",now_string); +- } +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- if(w_traj_flag) +- rewind(w_traj_fd); +- for(i=0; ithroughput = +- (time_so_far() - starttime1)-time_res; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput = time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- if(debug1) +- { +- printf("\n(%ld) Stopped by another\n", (long)xx); +- } +- stopped=1; +- } +- if(purge) +- purgeit(nbuff,reclen); +- if(Q_flag || hist_summary || op_rate_flag) +- { +- thread_qtime_start=time_so_far(); +- } +-again: +- if(mmapflag) +- { +- wmaddr = &maddr[traj_offset]; +- fill_area((long long*)nbuff,(long long*)wmaddr,(long long)reclen); +- /*printf("CHid: %lld Writing offset %lld for length of %lld\n",chid,i*reclen,reclen);*/ +- if(!mmapnsflag) +- { +- if(mmapasflag) +- msync(wmaddr,(size_t)reclen,MS_ASYNC); +- if(mmapssflag) +- msync(wmaddr,(size_t)reclen,MS_SYNC); +- } +- } +- else +- { +- if(async_flag) +- { +- if(no_copy_flag) +- { +- free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); +- nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); +- if(verify || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,i); +- async_write_no_copy(gc, (long long)fd, nbuff, reclen, (traj_offset), depth,free_addr); +- } +- else +- async_write(gc, (long long)fd, nbuff, reclen, (traj_offset), depth); +- } +- else +- { +- wval=I_PWRITE(fd, nbuff, reclen, traj_offset); +- if(wval != reclen) +- { +- if(*stop_flag && !stopped){ +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- } +- temp_time = time_so_far(); +- child_stat->throughput = +- (temp_time - starttime1)-time_res; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- if(debug1) +- { +- printf("\n(%ld) Stopped by another\n", (long)xx); +- } +- stopped=1; +- goto again; +- } +- /* Note: Writer must finish even though told +- to stop. Otherwise the readers will fail. +- The code will capture bytes transfered +- before told to stop but let the writer +- complete. +- */ +-#ifdef NO_PRINT_LLD +- printf("\nError pwriting block %ld, fd= %d\n", i, +- fd); +-#else +- printf("\nError pwriting block %lld, fd= %d\n", i, +- fd); +-#endif +- if(wval==-1) +- perror("pwrite"); +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(127); +- } +- } +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)0, +- lock_offset, reclen); +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +-/* +-printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, +- actual_rate, (desired_op_rate_time-actual_rate)); +-*/ +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_wqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_wqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- w_traj_ops_completed++; +- w_traj_bytes_completed+=reclen; +- written_so_far+=reclen/1024; +- if(*stop_flag) +- { +- written_so_far-=reclen/1024; +- w_traj_bytes_completed-=reclen; +- } +- } +- +- +- if(file_lock) +- if(mylockf((int) fd, (int) 0, (int)0)) +- printf("Write unlock failed. %d\n",errno); +- +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(!xflag) +- { +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- } +- +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- mmap_end(maddr,(unsigned long long)filebytes64); +- close(fd); +- } +- if(!stopped){ +- temp_time = time_so_far(); +- child_stat->throughput = ((temp_time - starttime1)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- } +- if(cdebug) +- { +- fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid, child_stat->throughput, +- child_stat->actual); +- fflush(newstdout); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- tell_master_stats(THREAD_PWRITE_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- +- if (debug1) { +- printf(" child/slot: %lld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n", +- xx, walltime, cputime, +- cpu_util(cputime, walltime)); +- } +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- stopped=0; +- /*******************************************************************/ +- /* End pwrite performance test. *************************************/ +- /*******************************************************************/ +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)numrecs64*reclen,MS_SYNC); /*Clean up before read starts running*/ +- mmap_end(maddr,(unsigned long long)numrecs64*reclen); +- }else +- fsync(fd); +- +- close(fd); +- } +- if(Q_flag && (thread_wqfd !=0) ) +- fclose(thread_wqfd); +- free(dummyfile[xx]); +- if(w_traj_flag) +- fclose(w_traj_fd); +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Pwrite test finished: ",now_string); +- fclose(thread_Lwqfd); +- } +- if(hist_summary) +- dump_hist("Pwrite",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +-#endif +- +-/************************************************************************/ +-/* Thread re-write test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_rwrite_test(void *x) +-#else +-void * +-thread_rwrite_test(x) +-#endif +-{ +- /************************/ +- /* Children only here */ +- /************************/ +- struct child_stats *child_stat; +- long long xx,xx2; +- double compute_val = (double)0; +- double walltime, cputime; +- float delay = (float)0; +- double thread_qtime_stop,thread_qtime_start; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- off64_t traj_offset; +- off64_t lock_offset=0; +- long long w_traj_bytes_completed; +- long long w_traj_ops_completed; +- int fd; +- FILE *w_traj_fd; +- long long flags = 0; +- double starttime1 = 0; +- double temp_time; +- long long recs_per_buffer,traj_size; +- long long i; +- off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far=0; +- char *dummyfile [MAXSTREAMS]; /* name of dummy file */ +- char *nbuff; +- char *maddr,*free_addr; +- char *wmaddr; +- char now_string[30]; +- int anwser,bind_cpu,wval; +- FILE *thread_rwqfd,*thread_Lwqfd; +- char tmpname[256]; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +-#ifdef ASYNC_IO +- struct cache *gc=0; +- +-#else +- long long *gc=0; +-#endif +- +- if(compute_flag) +- delay=compute_time; +- wmaddr=nbuff=maddr=free_addr=0; +- thread_rwqfd=w_traj_fd=thread_Lwqfd=(FILE *)0; +- hist_time=traj_offset=thread_qtime_stop=thread_qtime_start=0; +- walltime=cputime=0; +- anwser=bind_cpu=0; +- w_traj_bytes_completed=w_traj_ops_completed=0; +- written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; +- recs_per_buffer = cache_size/reclen ; +- if(w_traj_flag) +- { +- filebytes64 = w_traj_fsize; +- numrecs64=w_traj_ops; +- } +- else +- { +- filebytes64 = numrecs64*reclen; +- } +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- xx=(long long)((long)x); +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#if defined( _HPUX_SOURCE ) || defined ( linux ) +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +-#if defined( _HPUX_SOURCE ) +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +-#else +- cpu_set_t cpuset; +- CPU_ZERO(&cpuset); +- CPU_SET(bind_cpu, &cpuset); +- +- pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); +-#endif +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- if(debug1) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- flags = O_RDWR; +- if(oflag) +- flags|= O_SYNC; +-#if defined(O_DSYNC) +- if(odsync) +- flags|= O_DSYNC; +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +- +-#if defined(Windows) +- if(unbuffered) +- { +- hand=CreateFile(dummyfile[xx], +- GENERIC_READ|GENERIC_WRITE, +- FILE_SHARE_WRITE|FILE_SHARE_READ, +- NULL,OPEN_ALWAYS,FILE_FLAG_NO_BUFFERING| +- FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, +- NULL); +- } +- else +- { +-#endif +- if((fd = I_OPEN(dummyfile[xx], (int)flags,0))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +-#ifdef NO_PRINT_LLD +- printf("\nChild %ld\n",xx); +-#else +- printf("\nChild %lld\n",xx); +-#endif +- child_stat->flag = CHILD_STATE_HOLD; +- perror(dummyfile[xx]); +- exit(128); +- } +-#if defined(Windows) +- } +-#endif +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,(numrecs64*reclen),1,PROT_READ|PROT_WRITE); +- } +- if(fetchon) +- fetchit(nbuff,reclen); +- if(w_traj_flag) +- w_traj_fd=open_w_traj(); +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_rwol.dat",(int)xx); +- thread_rwqfd=fopen(tmpname,"a"); +- if(thread_rwqfd==0) +- { +- printf("Unable to open %s\n",tmpname); +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- exit(40); +- } +- fprintf(thread_rwqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Rewrite test start: ",now_string); +- } +- child_stat->flag = CHILD_STATE_READY; +- if(distributed && client_iozone) +- tell_master_ready(chid); +- if(distributed && client_iozone) +- { +- if(cdebug) +- { +- fprintf(newstdout,"Child %d waiting for go from master\n",(int)xx); +- fflush(newstdout); +- } +- wait_for_master_go(chid); +- if(cdebug) +- { +- fprintf(newstdout,"Child %d received go from master\n",(int)xx); +- fflush(newstdout); +- } +- } +- else +- { +- while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ +- Poll((long long)1); +- } +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- if(file_lock) +- if(mylockf((int) fd, (int) 1, (int)0) != 0) +- printf("File lock for write failed. %d\n",errno); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- if(w_traj_flag) +- rewind(w_traj_fd); +- if((verify && !no_copy_flag) || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); +- for(i=0; iflag = CHILD_STATE_HOLD; +- signal_handler(); +- } +- } +- } +- re_written_so_far+=reclen/1024; +- w_traj_ops_completed++; +- w_traj_bytes_completed+=reclen; +- if(*stop_flag) +- { +- re_written_so_far-=reclen/1024; +- w_traj_bytes_completed-=reclen; +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +-/* +-printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, +- actual_rate, (desired_op_rate_time-actual_rate)); +-*/ +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_rwqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_rwqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)0, +- lock_offset, reclen); +- } +- } +- if(file_lock) +- if(mylockf((int) fd, (int) 0, (int)0)) +- printf("Write unlock failed. %d\n",errno); +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(filebytes64),MS_SYNC); +- }else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- close(fd); +- } +- temp_time=time_so_far(); +- child_stat=(struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = ((temp_time - starttime1)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*re_written_so_far=(re_written_so_far*1024)/reclen;*/ +- re_written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)re_written_so_far/child_stat->throughput; +- child_stat->actual = (double)re_written_so_far; +- if(!xflag) +- { +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- } +- if(cdebug) +- { +- fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid, child_stat->throughput, +- child_stat->actual); +- fflush(newstdout); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- tell_master_stats(THREAD_REWRITE_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(filebytes64),MS_SYNC); +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +- else +- fsync(fd); +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- close(fd); +- } +- free(dummyfile[xx]); +- +- if(Q_flag && (thread_rwqfd !=0) ) +- fclose(thread_rwqfd); +- +- if(w_traj_flag) +- fclose(w_traj_fd); +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild Stopping %ld\n",xx); +-#else +- printf("\nChild Stopping %lld\n",xx); +-#endif +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Rewrite test finished: ",now_string); +- fclose(thread_Lwqfd); +- } +- if(hist_summary) +- dump_hist("Rewrite",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +- +-/************************************************************************/ +-/* Thread read test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_read_test(void *x) +-#else +-void * +-thread_read_test(x) +-#endif +-{ +- long long xx,xx2; +- struct child_stats *child_stat; +- double walltime, cputime; +- long long r_traj_bytes_completed; +- long long r_traj_ops_completed; +- int fd; +- FILE *r_traj_fd,*thread_rqfd; +- FILE *thread_Lwqfd; +- long long flags = 0; +- off64_t traj_offset; +- off64_t lock_offset=0; +- double starttime1 = 0; +- float delay = 0; +- double temp_time; +- double thread_qtime_start,thread_qtime_stop; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- double compute_val = (double)0; +- off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; +- long long recs_per_buffer,traj_size; +- off64_t i; +- char *dummyfile[MAXSTREAMS]; /* name of dummy file */ +- char *nbuff=0; +- char *maddr=0; +- char *wmaddr=0; +- char tmpname[256]; +- volatile char *buffer1; +- char now_string[30]; +- int anwser,bind_cpu; +- long wval; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +- +- if(compute_flag) +- delay=compute_time; +- thread_rqfd=thread_Lwqfd=r_traj_fd=(FILE *)0; +- hist_time=traj_offset=thread_qtime_stop=thread_qtime_start=0; +- walltime=cputime=0; +- anwser=bind_cpu=0; +- r_traj_bytes_completed=r_traj_ops_completed=0; +- written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; +- recs_per_buffer = cache_size/reclen ; +- if(r_traj_flag) +- { +- filebytes64 = r_traj_fsize; +- numrecs64=r_traj_ops; +- } +- else +- { +- filebytes64 = numrecs64*reclen; +- } +- +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- xx = (long long)((long)x); +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#if defined( _HPUX_SOURCE ) || defined ( linux ) +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +-#if defined(_HPUX_SOURCE) +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +-#else +- cpu_set_t cpuset; +- +- CPU_ZERO(&cpuset); +- CPU_SET(bind_cpu, &cpuset); +- +- pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); +-#endif +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- if(oflag) +- flags=O_RDONLY|O_SYNC; +- else +- flags=O_RDONLY; +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +-#if defined(Windows) +- if(unbuffered) +- { +- hand=CreateFile(dummyfile[xx], +- GENERIC_READ|GENERIC_WRITE, +- FILE_SHARE_WRITE|FILE_SHARE_READ, +- NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| +- FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, +- NULL); +- SetFilePointer(hand,(LONG)0,0,FILE_BEGIN); +- } +- else +- { +-#endif +- if((fd = I_OPEN(dummyfile[xx], (int)flags,0))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror(dummyfile[xx]); +- exit(130); +- } +-#if defined(Windows) +- } +-#endif +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,(numrecs64*reclen),0,PROT_READ); +- } +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- if(debug1) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- /*****************/ +- /* Children only */ +- /*****************/ +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_rol.dat",(int)xx); +- thread_rqfd=fopen(tmpname,"a"); +- if(thread_rqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_rqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Read test start: ",now_string); +- } +- +- if(r_traj_flag) +- r_traj_fd=open_r_traj(); +- if(fetchon) +- fetchit(nbuff,reclen); +- child_stat=(struct child_stats *)&shmaddr[xx]; +- child_stat->flag = CHILD_STATE_READY; +- if(distributed && client_iozone) +- { +- tell_master_ready(chid); +- wait_for_master_go(chid); +- } +- else +- { +- /* Wait for signal from parent */ +- while(child_stat->flag!=CHILD_STATE_BEGIN) +- Poll((long long)1); +- } +- if(file_lock) +- if(mylockf((int) fd, (int) 1, (int)1) != 0) +- printf("File lock for read failed. %d\n",errno); +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- +- if(r_traj_flag) +- rewind(r_traj_fd); +- for(i=0; iflag = CHILD_STATE_HOLD; +- exit(132); +- } +- } +- } +- if(verify){ +- if(async_flag && no_copy_flag) +- { +- if(verify_buffer(buffer1,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(133); +- } +- } +- else +- { +- if(verify_buffer(nbuff,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(134); +- } +- } +- } +- if(async_flag && no_copy_flag) +- async_release(gc); +- read_so_far+=reclen/1024; +- r_traj_bytes_completed+=reclen; +- r_traj_ops_completed++; +- if(*stop_flag) +- { +- read_so_far-=reclen/1024; +- r_traj_bytes_completed-=reclen; +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +-/* +-printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, +- actual_rate, (desired_op_rate_time-actual_rate)); +-*/ +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_rqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_rqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)1, +- lock_offset, reclen); +- } +- } +- if(file_lock) +- if(mylockf((int) fd, (int) 0, (int)1)) +- printf("Read unlock failed. %d\n",errno); +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(filebytes64),MS_SYNC); +- }else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- close(fd); +- } +- temp_time = time_so_far(); +- child_stat=(struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = ((temp_time - starttime1)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*read_so_far=(read_so_far*1024)/reclen;*/ +- read_so_far=r_traj_ops_completed; +- } +- child_stat->throughput = read_so_far/child_stat->throughput; +- child_stat->actual = read_so_far; +- if(!xflag) +- { +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- } +- if(cdebug) +- { +- fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid,child_stat->throughput, +- child_stat->actual); +- fflush(newstdout); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- tell_master_stats(THREAD_READ_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- /*fsync(fd);*/ +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(filebytes64),MS_SYNC); +- mmap_end(maddr,(unsigned long long)filebytes64); +- }else +- fsync(fd); +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- close(fd); +- } +- if(Q_flag && (thread_rqfd !=0) ) +- fclose(thread_rqfd); +- free(dummyfile[xx]); +- if(r_traj_flag) +- fclose(r_traj_fd); +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Read test finished: ",now_string); +- fclose(thread_Lwqfd); +- } +- if(hist_summary) +- dump_hist("Read",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +- +-#ifdef HAVE_PREAD +-/************************************************************************/ +-/* Thread pread test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_pread_test(void *x) +-#else +-void * +-thread_pread_test(x) +-#endif +-{ +- long long xx,xx2; +- struct child_stats *child_stat; +- double walltime, cputime; +- long long r_traj_bytes_completed; +- long long r_traj_ops_completed; +- int fd; +- FILE *r_traj_fd,*thread_rqfd; +- FILE *thread_Lwqfd; +- long long flags = 0; +- off64_t traj_offset; +- off64_t lock_offset=0; +- double starttime1 = 0; +- float delay = 0; +- double temp_time; +- double thread_qtime_start,thread_qtime_stop; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- double compute_val = (double)0; +- off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; +- long long recs_per_buffer,traj_size; +- off64_t i; +- char *dummyfile[MAXSTREAMS]; /* name of dummy file */ +- char *nbuff=0; +- char *maddr=0; +- char *wmaddr=0; +- char tmpname[256]; +- char now_string[30]; +- volatile char *buffer1; +- int anwser,bind_cpu; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +- +- if(compute_flag) +- delay=compute_time; +- thread_rqfd=thread_Lwqfd=r_traj_fd=(FILE *)0; +- hist_time=traj_offset=thread_qtime_stop=thread_qtime_start=0; +- walltime=cputime=0; +- anwser=bind_cpu=0; +- r_traj_bytes_completed=r_traj_ops_completed=0; +- written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; +- recs_per_buffer = cache_size/reclen ; +- if(r_traj_flag) +- { +- filebytes64 = r_traj_fsize; +- numrecs64=r_traj_ops; +- } +- else +- { +- filebytes64 = numrecs64*reclen; +- } +- +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- xx = (long long)((long)x); +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#ifdef _HPUX_SOURCE +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- if(oflag) +- flags=O_RDONLY|O_SYNC; +- else +- flags=O_RDONLY; +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +- if((fd = I_OPEN(dummyfile[xx], (int)flags,0))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror(dummyfile[xx]); +- exit(130); +- } +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,(numrecs64*reclen),0,PROT_READ); +- } +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- if(debug1) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- /*****************/ +- /* Children only */ +- /*****************/ +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_prol.dat",(int)xx); +- thread_rqfd=fopen(tmpname,"a"); +- if(thread_rqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_rqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Pread test start: ",now_string); +- } +- +- if(r_traj_flag) +- r_traj_fd=open_r_traj(); +- if(fetchon) +- fetchit(nbuff,reclen); +- child_stat=(struct child_stats *)&shmaddr[xx]; +- child_stat->flag = CHILD_STATE_READY; +- if(distributed && client_iozone) +- { +- tell_master_ready(chid); +- wait_for_master_go(chid); +- } +- else +- { +- /* Wait for signal from parent */ +- while(child_stat->flag!=CHILD_STATE_BEGIN) +- Poll((long long)1); +- } +- if(file_lock) +- if(mylockf((int) fd, (int) 1, (int)1) != 0) +- printf("File lock for read failed. %d\n",errno); +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- +- if(r_traj_flag) +- rewind(r_traj_fd); +- for(i=0; iflag = CHILD_STATE_HOLD; +- exit(132); +- } +- } +- } +- if(verify){ +- if(async_flag && no_copy_flag) +- { +- if(verify_buffer(buffer1,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(133); +- } +- } +- else +- { +- if(verify_buffer(nbuff,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(134); +- } +- } +- } +- if(async_flag && no_copy_flag) +- async_release(gc); +- read_so_far+=reclen/1024; +- r_traj_bytes_completed+=reclen; +- r_traj_ops_completed++; +- if(*stop_flag) +- { +- read_so_far-=reclen/1024; +- r_traj_bytes_completed-=reclen; +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +-/* +-printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, +- actual_rate, (desired_op_rate_time-actual_rate)); +-*/ +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_rqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_rqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)1, +- lock_offset, reclen); +- } +- } +- if(file_lock) +- if(mylockf((int) fd, (int) 0, (int)1)) +- printf("Read unlock failed. %d\n",errno); +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(filebytes64),MS_SYNC); +- }else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +- close(fd); +- } +- temp_time = time_so_far(); +- child_stat=(struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = ((temp_time - starttime1)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*read_so_far=(read_so_far*1024)/reclen;*/ +- read_so_far=r_traj_ops_completed; +- } +- child_stat->throughput = read_so_far/child_stat->throughput; +- child_stat->actual = read_so_far; +- if(!xflag) +- { +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- } +- if(cdebug) +- { +- fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid,child_stat->throughput, +- child_stat->actual); +- fflush(newstdout); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- tell_master_stats(THREAD_READ_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- /*fsync(fd);*/ +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(filebytes64),MS_SYNC); +- mmap_end(maddr,(unsigned long long)filebytes64); +- }else +- fsync(fd); +- close(fd); +- } +- if(Q_flag && (thread_rqfd !=0) ) +- fclose(thread_rqfd); +- free(dummyfile[xx]); +- if(r_traj_flag) +- fclose(r_traj_fd); +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Pread test finished: ", +- now_string); +- fclose(thread_Lwqfd); +- } +- if(hist_summary) +- dump_hist("Pread",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +-#endif +- +-/************************************************************************/ +-/* Thread re-read test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_rread_test(void *x) +-#else +-void * +-thread_rread_test(x) +-#endif +-{ +- long long xx,xx2; +- char *nbuff; +- struct child_stats *child_stat; +- int fd; +- FILE *r_traj_fd,*thread_rrqfd; +- FILE *thread_Lwqfd; +- long long r_traj_bytes_completed; +- double walltime, cputime; +- long long r_traj_ops_completed; +- off64_t traj_offset; +- off64_t lock_offset=0; +- long long flags = 0; +- double starttime1 = 0; +- float delay = 0; +- double temp_time; +- double thread_qtime_start,thread_qtime_stop; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- double compute_val = (double)0; +- long long recs_per_buffer,traj_size; +- off64_t i; +- off64_t written_so_far, read_so_far, re_written_so_far, +- re_read_so_far; +- char *dummyfile[MAXSTREAMS]; /* name of dummy file */ +- char *maddr=0; +- char *wmaddr=0; +- char now_string[30]; +- volatile char *buffer1; +- int anwser,bind_cpu; +- long wval; +- char tmpname[256]; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +- /*****************/ +- /* Children only */ +- /*****************/ +- if(compute_flag) +- delay=compute_time; +- hist_time=thread_qtime_stop=thread_qtime_start=0; +- thread_rrqfd=r_traj_fd=thread_Lwqfd=(FILE *)0; +- traj_offset=walltime=cputime=0; +- anwser=bind_cpu=0; +- r_traj_bytes_completed=r_traj_ops_completed=0; +- written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; +- recs_per_buffer = cache_size/reclen ; +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(r_traj_flag) +- { +- filebytes64 = r_traj_fsize; +- numrecs64=r_traj_ops; +- } +- else +- { +- filebytes64 = numrecs64*reclen; +- } +- if(use_thread) +- xx = (long long)((long)x); +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#if defined( _HPUX_SOURCE ) || defined ( linux ) +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +-#if defined(_HPUX_SOURCE) +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +-#else +- cpu_set_t cpuset; +- +- CPU_ZERO(&cpuset); +- CPU_SET(bind_cpu, &cpuset); +- +- pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); +-#endif +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- if(debug1) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- if(oflag) +- flags=O_RDONLY|O_SYNC; +- else +- flags=O_RDONLY; +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +- +-#if defined(Windows) +- if(unbuffered) +- { +- hand=CreateFile(dummyfile[xx], +- GENERIC_READ|GENERIC_WRITE, +- FILE_SHARE_WRITE|FILE_SHARE_READ, +- NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| +- FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, +- NULL); +- SetFilePointer(hand,(LONG)0,0,FILE_BEGIN); +- } +- else +- { +-#endif +- if((fd = I_OPEN(dummyfile[xx], ((int)flags),0))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror(dummyfile[xx]); +- exit(135); +- } +-#if defined(Windows) +- } +-#endif +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,(filebytes64),0,PROT_READ); +- } +- if(r_traj_flag) +- r_traj_fd=open_r_traj(); +- if(fetchon) +- fetchit(nbuff,reclen); +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_rrol.dat",(int)xx); +- thread_rrqfd=fopen(tmpname,"a"); +- if(thread_rrqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_rrqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Reread test start: ",now_string); +- } +- +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- child_stat->flag = CHILD_STATE_READY; +- +- if(distributed && client_iozone) +- { +- tell_master_ready(chid); +- wait_for_master_go(chid); +- } +- else +- +- /* Wait for signal from parent */ +- while(child_stat->flag!=CHILD_STATE_BEGIN) +- Poll((long long)1); +- if(file_lock) +- if(mylockf((int) fd, (int) 1, (int)1) != 0) +- printf("File lock for read failed. %d\n",errno); +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- +- if(r_traj_flag) +- rewind(r_traj_fd); +- for(i=0; iflag = CHILD_STATE_HOLD; +- exit(137); +- } +- } +- } +- if(verify){ +- if(async_flag && no_copy_flag) +- { +- if(verify_buffer(buffer1,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(138); +- } +- } +- else +- { +- if(verify_buffer(nbuff,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(139); +- } +- } +- } +- if(async_flag && no_copy_flag) +- async_release(gc); +- re_read_so_far+=reclen/1024; +- r_traj_bytes_completed+=reclen; +- r_traj_ops_completed++; +- if(*stop_flag) +- { +- re_read_so_far-=reclen/1024; +- r_traj_bytes_completed-=reclen; +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +-/* +-printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, +- actual_rate, (desired_op_rate_time-actual_rate)); +-*/ +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_rrqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_rrqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)1, +- lock_offset, reclen); +- } +- } +- if(file_lock) +- if(mylockf((int) fd, (int) 0, (int)1)) +- printf("Read unlock failed. %d\n",errno); +- /*fsync(fd);*/ +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(filebytes64),MS_SYNC); +- }else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)filebytes64); +- } +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- close(fd); +- } +- temp_time = time_so_far(); +- child_stat->throughput = ((temp_time - starttime1)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*re_read_so_far=(re_read_so_far*1024)/reclen;*/ +- re_read_so_far=r_traj_ops_completed; +- } +- child_stat->throughput = re_read_so_far/child_stat->throughput; +- child_stat->actual = re_read_so_far; +- if(!xflag) +- { +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- { +- tell_master_stats(THREAD_REREAD_TEST,chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- } +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(filebytes64),MS_SYNC); +- mmap_end(maddr,(unsigned long long)filebytes64); +- }else +- fsync(fd); +-#if defined(Windows) +- if(unbuffered) +- CloseHandle(hand); +- else +-#endif +- close(fd); +- } +- if(Q_flag && (thread_rrqfd !=0) ) +- fclose(thread_rrqfd); +- free(dummyfile[xx]); +- if(r_traj_flag) +- fclose(r_traj_fd); +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Reread test finished: ",now_string); +- fclose(thread_Lwqfd); +- } +- if(hist_summary) +- dump_hist("Reread",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +- +-/************************************************************************/ +-/* Thread_reverse_perf_test */ +-/* Reverse read test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_reverse_read_test(void *x) +-#else +-void * +-thread_reverse_read_test(x) +-#endif +-{ +- long long xx,xx2; +- char *nbuff; +- struct child_stats *child_stat; +- int fd; +- long long flags = 0; +- double walltime, cputime; +- double thread_qtime_stop,thread_qtime_start; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- double starttime2 = 0; +- float delay = 0; +- double temp_time; +- double compute_val = (double)0; +- long long recs_per_buffer; +- off64_t i,t_offset; +- off64_t lock_offset=0; +- off64_t current_position=0; +- off64_t written_so_far, reverse_read, re_read_so_far,read_so_far; +- char *dummyfile[MAXSTREAMS]; /* name of dummy file */ +- char *maddr=0; +- char *wmaddr=0; +- char now_string[30]; +- volatile char *buffer1; +- int anwser,bind_cpu; +- off64_t traj_offset; +- char tmpname[256]; +- FILE *thread_revqfd=0; +- FILE *thread_Lwqfd=0; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +- /*****************/ +- /* Children only */ +- /*****************/ +- if(compute_flag) +- delay=compute_time; +- hist_time=thread_qtime_stop=thread_qtime_start=0; +- traj_offset=walltime=cputime=0; +- anwser=bind_cpu=0; +- written_so_far=read_so_far=reverse_read=re_read_so_far=0; +- recs_per_buffer = cache_size/reclen ; +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- xx = (long long)((long)x); +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#if defined( _HPUX_SOURCE ) || defined ( linux ) +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +-#if defined(_HPUX_SOURCE) +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +-#else +- cpu_set_t cpuset; +- +- CPU_ZERO(&cpuset); +- CPU_SET(bind_cpu, &cpuset); +- +- pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); +-#endif +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- if(debug1) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- if(oflag) +- flags=O_RDONLY|O_SYNC; +- else +- flags=O_RDONLY; +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +-#if defined(Windows) +- if(unbuffered) +- { +- hand=CreateFile(dummyfile[xx], +- GENERIC_READ|GENERIC_WRITE, +- FILE_SHARE_WRITE|FILE_SHARE_READ, +- NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| +- FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, +- NULL); +- } +-#endif +- +- if((fd = I_OPEN(dummyfile[xx], ((int)flags),0))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror(dummyfile[xx]); +- exit(140); +- } +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,(numrecs64*reclen),0,PROT_READ); +- } +- if(fetchon) +- fetchit(nbuff,reclen); +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_revol.dat",(int)xx); +- thread_revqfd=fopen(tmpname,"a"); +- if(thread_revqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_revqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Reverse read start: ",now_string); +- } +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- child_stat->flag = CHILD_STATE_READY; +- if(distributed && client_iozone) +- { +- tell_master_ready(chid); +- wait_for_master_go(chid); +- } +- else +- { +- while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ +- Poll((long long)1); +- } +- starttime2 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime2; +- cputime = cputime_so_far(); +- } +- +- t_offset = (off64_t)reclen; +- if (!(h_flag || k_flag || mmapflag)) +- { +- if(check_filename(dummyfile[xx])) +- { +- if((I_LSEEK( fd, -t_offset, SEEK_END ))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror("lseek"); +- exit(142); +- } +- } +- else +- { +- if(I_LSEEK( fd, (numrecs64*reclen)-t_offset, SEEK_SET )<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror("lseek"); +- exit(77); +- } +- } +- } +- current_position=(reclen*numrecs64)-reclen; +- if(file_lock) +- if(mylockf((int) fd, (int) 1, (int)1)!=0) +- printf("File lock for read failed. %d\n",errno); +- for(i=0; iflag = CHILD_STATE_HOLD; +- exit(144); +- } +- } +- } +- if(verify){ +- if(async_flag && no_copy_flag) +- { +- if(verify_buffer(buffer1,reclen,(off64_t)(current_position/reclen),reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(145); +- } +- } +- else +- { +- if(verify_buffer(nbuff,reclen,(off64_t)(current_position/reclen),reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(146); +- } +- } +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)1, +- lock_offset, reclen); +- } +- current_position+=reclen; +- if(async_flag && no_copy_flag) +- async_release(gc); +- t_offset = (off64_t)reclen*2; +- if (!(h_flag || k_flag || mmapflag)) +- { +- I_LSEEK( fd, -t_offset, SEEK_CUR ); +- } +- current_position-=(2 *reclen); +- reverse_read +=reclen/1024; +- if(*stop_flag) +- { +- reverse_read -=reclen/1024; +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +-/* +-printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, +- actual_rate, (desired_op_rate_time-actual_rate)); +-*/ +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_revqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_revqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- } +- if(file_lock) +- if(mylockf((int) fd,(int)0, (int)1)) +- printf("Read unlock failed %d\n",errno); +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); +- }else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)numrecs64*reclen); +- } +- close(fd); +- } +- temp_time = time_so_far(); +- child_stat->throughput = ((temp_time - starttime2)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(OPS_flag){ +- reverse_read=(reverse_read*1024)/reclen; +- } +- child_stat->throughput = reverse_read/child_stat->throughput; +- child_stat->actual = reverse_read; +- if(!xflag) +- { +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- tell_master_stats(THREAD_REVERSE_READ_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); +- mmap_end(maddr,(unsigned long long)numrecs64*reclen); +- }else +- fsync(fd); +- close(fd); +- } +- free(dummyfile[xx]); +- if(Q_flag && (thread_revqfd !=0) ) +- fclose(thread_revqfd); +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Reverse read finished: ", +- now_string); +- fclose(thread_Lwqfd); +- } +- if(hist_summary) +- dump_hist("Read Backwards",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +-/************************************************************************/ +-/* Thread_stride_read_test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_stride_read_test(void *x) +-#else +-void * +-thread_stride_read_test(x) +-#endif +-{ +- long long xx,xx2; +- char *nbuff=0; +- struct child_stats *child_stat; +- double walltime, cputime; +- int fd; +- long long flags = 0; +- double thread_qtime_stop,thread_qtime_start; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- double starttime2 = 0; +- float delay = 0; +- double compute_val = (double)0; +- double temp_time; +- long long recs_per_buffer; +- off64_t i; +- off64_t lock_offset=0; +- off64_t savepos64=0; +- off64_t written_so_far, stride_read,re_read_so_far,read_so_far; +- off64_t stripewrap = 0; +- off64_t current_position = 0; +- char *dummyfile[MAXSTREAMS]; /* name of dummy file */ +- char *maddr=0; +- char *wmaddr=0; +- volatile char *buffer1; +- int anwser,bind_cpu; +- off64_t traj_offset; +- char tmpname[256]; +- char now_string[30]; +- FILE *thread_strqfd=0; +- FILE *thread_Lwqfd=0; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +- /*****************/ +- /* Children only */ +- /*****************/ +- if(compute_flag) +- delay=compute_time; +- hist_time=thread_qtime_stop=thread_qtime_start=0; +- traj_offset=walltime=cputime=0; +- anwser=bind_cpu=0; +- written_so_far=read_so_far=stride_read=re_read_so_far=0; +- recs_per_buffer = cache_size/reclen ; +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- xx = (long long)((long)x); +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#if defined( _HPUX_SOURCE ) || defined ( linux ) +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +-#if defined(_HPUX_SOURCE) +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +-#else +- cpu_set_t cpuset; +- +- CPU_ZERO(&cpuset); +- CPU_SET(bind_cpu, &cpuset); +- +- pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); +-#endif +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- if(debug1) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- if(oflag) +- flags=O_RDONLY|O_SYNC; +- else +- flags=O_RDONLY; +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +- +-#if defined(Windows) +- if(unbuffered) +- { +- hand=CreateFile(dummyfile[xx], +- GENERIC_READ|GENERIC_WRITE, +- FILE_SHARE_WRITE|FILE_SHARE_READ, +- NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| +- FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, +- NULL); +- } +-#endif +- if((fd = I_OPEN(dummyfile[xx], ((int)flags),0))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror(dummyfile[xx]); +- exit(147); +- } +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +- +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,(numrecs64*reclen),0,PROT_READ); +- } +- if(fetchon) +- fetchit(nbuff,reclen); +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_strol.dat",(int)xx); +- thread_strqfd=fopen(tmpname,"a"); +- if(thread_strqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_strqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Stride test start: ", +- now_string); +- } +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- child_stat->flag = CHILD_STATE_READY; +- if(distributed && client_iozone) +- { +- tell_master_ready(chid); +- wait_for_master_go(chid); +- } +- else +- +- /* wait for parent to say go */ +- while(child_stat->flag!=CHILD_STATE_BEGIN) +- Poll((long long)1); +- if(file_lock) +- if(mylockf((int) fd, (int) 1, (int)1)!=0) +- printf("File lock for write failed. %d\n",errno); +- starttime2 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime2; +- cputime = cputime_so_far(); +- } +- for(i=0; iflag = CHILD_STATE_HOLD; +- exit(149); +- } +- } +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)1, +- lock_offset, reclen); +- } +- current_position+=reclen; +- if(verify){ +- if(async_flag && no_copy_flag) +- { +- if(verify_buffer(buffer1,reclen,(off64_t)savepos64,reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(150); +- } +- } +- else +- { +- if(verify_buffer(nbuff,reclen,(off64_t)savepos64,reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(151); +- } +- } +- } +- if(async_flag && no_copy_flag) +- async_release(gc); +- if(current_position + (stride * reclen) >= (numrecs64 * reclen)-reclen) +- { +- current_position=0; +- +- stripewrap++; +- +- if(numrecs64 <= stride) +- { +- current_position=0; +- } +- else +- { +- current_position = (off64_t)((stripewrap)%numrecs64)*reclen; +- } +- if (!(h_flag || k_flag || mmapflag)) +- { +- if(I_LSEEK(fd,current_position,SEEK_SET)<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror("lseek"); +- exit(152); +- } +- } +- } +- else +- { +- current_position+=(stride*reclen)-reclen; +- if (!(h_flag || k_flag || mmapflag)) +- { +- if(I_LSEEK(fd,current_position,SEEK_SET)<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror("lseek"); +- exit(154); +- }; +- } +- } +- stride_read +=reclen/1024; +- if(*stop_flag) +- { +- stride_read -=reclen/1024; +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +-/* +-printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, +- actual_rate, (desired_op_rate_time-actual_rate)); +-*/ +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_strqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_strqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- } +- if(file_lock) +- if(mylockf((int) fd,(int)0,(int)1)) +- printf("Read unlock failed %d\n",errno); +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); +- }else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)numrecs64*reclen); +- } +- close(fd); +- } +- temp_time = time_so_far(); +- child_stat->throughput = ((temp_time - starttime2)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(OPS_flag){ +- stride_read=(stride_read*1024)/reclen; +- } +- child_stat->throughput = stride_read/child_stat->throughput; +- child_stat->actual = stride_read; +- if(!xflag) +- { +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- { +- tell_master_stats(THREAD_STRIDE_TEST,chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- } +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); +- mmap_end(maddr,(unsigned long long)numrecs64*reclen); +- }else +- fsync(fd); +- close(fd); +- } +- if(Q_flag && (thread_strqfd !=0) ) +- fclose(thread_strqfd); +- free(dummyfile[xx]); +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Stride test finished: ", +- now_string); +- fclose(thread_Lwqfd); +- } +- if(hist_summary) +- dump_hist("Stride Read",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +- +-/************************************************************************/ +-/* Thread random test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_mix_test(void *x) +-#else +-void * +-thread_mix_test(x) +-#endif +-{ +- int selector; +- int num_readers; +- long xx; +- +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- { +- xx = (long)x; +- } +- else +- { +- xx=(long)chid; +- } +-#endif +- if(pct_read!=0) +- { +- num_readers = (pct_read * num_child)/100; +- if(xx < num_readers) +- selector=0; +- else +- selector=1; +- } +- else +- { +- if(Kplus_flag) +- { +- if(xx+1 <= Kplus_readers) +- selector=0; +- else +- selector=1; +- } +- else +- { +- /* Simple round robin */ +- selector= ((int)xx) % 2; +- } +- } +- if(selector==0) +- { +- if(seq_mix) +- thread_read_test(x); +- else +- thread_ranread_test(x); +- } +- else +- { +- if(seq_mix) +- thread_write_test(x); +- else +- thread_ranwrite_test(x); +- } +- return(0); +-} +-/************************************************************************/ +-/* Thread random read test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_ranread_test(void *x) +-#else +-void * +-thread_ranread_test(x) +-#endif +-{ +- long long xx,xx2; +- struct child_stats *child_stat; +- double walltime, cputime; +- int fd; +- long long flags = 0; +- double thread_qtime_stop,thread_qtime_start; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- double starttime1 = 0; +- float delay = 0; +- double temp_time; +- double compute_val = (double)0; +- off64_t written_so_far, ranread_so_far, re_written_so_far,re_read_so_far; +- long long recs_per_buffer; +- off64_t current_offset=0; +- off64_t i; +- char *dummyfile[MAXSTREAMS]; /* name of dummy file */ +- char *nbuff=0; +- char *maddr=0; +- char *wmaddr=0; +- volatile char *buffer1; +- int anwser,bind_cpu; +- off64_t traj_offset; +- off64_t lock_offset=0; +- char tmpname[256]; +- char now_string[30]; +- FILE *thread_randrfd=0; +- FILE *thread_Lwqfd=0; +- long long *recnum=0; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +- long long save_pos; +-#if defined (bsd4_2) || defined(Windows) +- long long rand1,rand2,rand3; +-#endif +- unsigned long long big_rand; +-#ifdef ASYNC_IO +- struct cache *gc=0; +-#else +- long long *gc=0; +-#endif +-#ifdef MERSENNE +- unsigned long long init[4]={0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL}, length=4; +-#endif +- +-#ifdef MERSENNE +- init_by_array64(init, length); +-#else +-#ifdef bsd4_2 +- srand(0); +-#else +-#ifdef Windows +- srand(0); +-#else +- srand48(0); +-#endif +-#endif +-#endif +- recnum = (long long *)malloc(sizeof(*recnum)*numrecs64); +- if (recnum){ +- /* pre-compute random sequence based on +- Fischer-Yates (Knuth) card shuffle */ +- for(i = 0; i < numrecs64; i++){ +- recnum[i] = i; +- } +- for(i = 0; i < numrecs64; i++) { +- long long tmp = recnum[i]; +-#ifdef MERSENNE +- big_rand = genrand64_int64(); +-#else +-#ifdef bsd4_2 +- rand1=(long long)rand(); +- rand2=(long long)rand(); +- rand3=(long long)rand(); +- big_rand=(rand1<<32)|(rand2<<16)|(rand3); +-#else +-#ifdef Windows +- rand1=(long long)rand(); +- rand2=(long long)rand(); +- rand3=(long long)rand(); +- big_rand=(rand1<<32)|(rand2<<16)|(rand3); +-#else +- big_rand = lrand48(); +-#endif +-#endif +-#endif +- big_rand = big_rand%numrecs64; +- tmp = recnum[i]; +- recnum[i] = recnum[big_rand]; +- recnum[big_rand] = tmp; +- } +- } +- else +- { +- fprintf(stderr,"Random uniqueness fallback.\n"); +- } +- if(compute_flag) +- delay=compute_time; +- hist_time=thread_qtime_stop=thread_qtime_start=0; +- traj_offset=walltime=cputime=0; +- anwser=bind_cpu=0; +- written_so_far=ranread_so_far=re_written_so_far=re_read_so_far=0; +- recs_per_buffer = cache_size/reclen ; +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- xx = (long long)((long)x); +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#if defined( _HPUX_SOURCE ) || defined ( linux ) +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +-#if defined(_HPUX_SOURCE) +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +-#else +- cpu_set_t cpuset; +- +- CPU_ZERO(&cpuset); +- CPU_SET(bind_cpu, &cpuset); +- +- pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); +-#endif +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- if(oflag) +- { +- flags=O_RDONLY|O_SYNC; +- } +- else +- flags=O_RDONLY; +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +- +-#if defined(Windows) +- if(unbuffered) +- { +- hand=CreateFile(dummyfile[xx], +- GENERIC_READ|GENERIC_WRITE, +- FILE_SHARE_WRITE|FILE_SHARE_READ, +- NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| +- FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, +- NULL); +- } +-#endif +- if((fd = I_OPEN(dummyfile[xx], ((int)flags),0))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- perror(dummyfile[xx]); +- exit(156); +- } +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +- +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +- +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,(numrecs64*reclen),0,PROT_READ); +- } +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- if(debug1) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- /*****************/ +- /* Children only */ +- /*****************/ +- if(fetchon) +- fetchit(nbuff,reclen); +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_randrol.dat",(int)xx); +- thread_randrfd=fopen(tmpname,"a"); +- if(thread_randrfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_randrfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Random read start: ", +- now_string); +- } +- child_stat=(struct child_stats *)&shmaddr[xx]; +- child_stat->flag = CHILD_STATE_READY; +- if(distributed && client_iozone) +- { +- tell_master_ready(chid); +- wait_for_master_go(chid); +- } +- else +- { +- while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ +- Poll((long long)1); +- } +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- +-#ifdef MERSENNE +- init_by_array64(init, length); +-#else +-#ifdef bsd4_2 +- srand(0); +-#else +-#ifdef Windows +- srand(0); +-#else +- srand48(0); +-#endif +-#endif +-#endif +- if(file_lock) +- if(mylockf((int) fd, (int) 1, (int)1)!=0) +- printf("File lock for read failed. %d\n",errno); +- for(i=0; iflag = CHILD_STATE_HOLD; +- exit(160); +- } +- } +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)1, +- lock_offset, reclen); +- } +- save_pos=current_offset/reclen; +- current_offset+=reclen; +- if(verify){ +- if(async_flag && no_copy_flag) +- { +- if(verify_buffer(buffer1,reclen,(off64_t)save_pos,reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(161); +- } +- } +- else +- { +- if(verify_buffer(nbuff,reclen,(off64_t)save_pos,reclen,(long long)pattern,sverify)){ +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(162); +- } +- } +- } +- if(async_flag && no_copy_flag) +- async_release(gc); +- ranread_so_far+=reclen/1024; +- if(*stop_flag) +- { +- ranread_so_far-=reclen/1024; +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +-/* +-printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, +- actual_rate, (desired_op_rate_time-actual_rate)); +-*/ +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_randrfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_randrfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- } +- if(file_lock) +- if(mylockf((int) fd,(int)0,(int)1)) +- printf("Read unlock failed %d\n",errno); +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(include_flush) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); +- }else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- { +- mmap_end(maddr,(unsigned long long)numrecs64*reclen); +- } +- close(fd); +- } +- temp_time = time_so_far(); +- child_stat=(struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = ((temp_time - starttime1)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- if(OPS_flag){ +- ranread_so_far=(ranread_so_far*1024)/reclen; +- } +- child_stat->throughput = ranread_so_far/child_stat->throughput; +- child_stat->actual = ranread_so_far; +- if(!xflag) +- { +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- } +- if(cdebug) +- { +- fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid,child_stat->throughput, +- child_stat->actual); +- fflush(newstdout); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- tell_master_stats(THREAD_RANDOM_READ_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); +- mmap_end(maddr,(unsigned long long)numrecs64*reclen); +- }else +- fsync(fd); +- close(fd); +- } +- if(Q_flag && (thread_randrfd !=0) ) +- fclose(thread_randrfd); +- free(dummyfile[xx]); +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Random read finished: ",now_string); +- fclose(thread_Lwqfd); +- } +- if(recnum) +- free(recnum); +- if(hist_summary) +- dump_hist("Random Read",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +- +-/************************************************************************/ +-/* Thread random write test */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_ranwrite_test(void *x) +-#else +-void * +-thread_ranwrite_test( x) +-#endif +-{ +- +- struct child_stats *child_stat; +- double starttime1 = 0; +- double temp_time; +- double walltime, cputime; +- double compute_val = (double)0; +- float delay = (double)0; +- double thread_qtime_stop,thread_qtime_start; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- off64_t traj_offset; +- off64_t current_offset=0; +- long long flags; +- long long w_traj_bytes_completed; +- long long w_traj_ops_completed; +- int fd; +- long long recs_per_buffer; +- long long stopped,i; +- off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; +- long long xx,xx2; +- char *dummyfile [MAXSTREAMS]; /* name of dummy file */ +- char *nbuff=0; +- char *maddr=0; +- char *wmaddr=0; +- char *free_addr=0; +- int anwser,bind_cpu,wval; +- off64_t filebytes64; +- off64_t lock_offset=0; +- char tmpname[256]; +- char now_string[30]; +- FILE *thread_randwqfd=0; +- FILE *thread_Lwqfd=0; +- long long *recnum = 0; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +-#if defined (bsd4_2) || defined(Windows) +- long long rand1,rand2,rand3; +-#endif +- unsigned long long big_rand; +- +-#ifdef ASYNC_IO +- struct cache *gc=0; +- +-#else +- long long *gc=0; +-#endif +-#ifdef MERSENNE +- unsigned long long init[4]={0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL}, length=4; +-#endif +- +- if(compute_flag) +- delay=compute_time; +- hist_time=thread_qtime_stop=thread_qtime_start=0; +- traj_offset=walltime=cputime=0; +- anwser=bind_cpu=0; +- filebytes64 = numrecs64*reclen; +- written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; +- w_traj_bytes_completed=w_traj_ops_completed=0; +- recs_per_buffer = cache_size/reclen ; +-#ifdef MERSENNE +- init_by_array64(init, length); +-#else +-#ifdef bsd4_2 +- srand(0); +-#else +-#ifdef Windows +- srand(0); +-#else +- srand48(0); +-#endif +-#endif +-#endif +- recnum = (long long *) malloc(sizeof(*recnum)*numrecs64); +- if (recnum){ +- /* pre-compute random sequence based on +- Fischer-Yates (Knuth) card shuffle */ +- for(i = 0; i < numrecs64; i++){ +- recnum[i] = i; +- } +- for(i = 0; i < numrecs64; i++) { +- long long tmp = recnum[i]; +-#ifdef MERSENNE +- big_rand = genrand64_int64(); +-#else +-#ifdef bsd4_2 +- rand1=(long long)rand(); +- rand2=(long long)rand(); +- rand3=(long long)rand(); +- big_rand=(rand1<<32)|(rand2<<16)|(rand3); +-#else +-#ifdef Windows +- rand1=(long long)rand(); +- rand2=(long long)rand(); +- rand3=(long long)rand(); +- big_rand=(rand1<<32)|(rand2<<16)|(rand3); +-#else +- big_rand = lrand48(); +-#endif +-#endif +-#endif +- big_rand = big_rand%numrecs64; +- tmp = recnum[i]; +- recnum[i] = recnum[big_rand]; +- recnum[big_rand] = tmp; +- } +- } +- else +- { +- fprintf(stderr,"Random uniqueness fallback.\n"); +- } +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- { +- xx = (long long)((long)x); +- } +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#if defined( _HPUX_SOURCE ) || defined ( linux ) +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +-#if defined(_HPUX_SOURCE) +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +-#else +- cpu_set_t cpuset; +- +- CPU_ZERO(&cpuset); +- CPU_SET(bind_cpu, &cpuset); +- +- pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); +-#endif +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- if(debug1 ) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- /*****************/ +- /* Children only */ +- /*******************************************************************/ +- /* Random write throughput performance test. **********************/ +- /*******************************************************************/ +- if(oflag) +- flags=O_RDWR|O_SYNC|O_CREAT; +- else +- flags=O_RDWR|O_CREAT; +-#if defined(O_DSYNC) +- if(odsync) +- flags |= O_DSYNC; +-#endif +-#if defined(_HPUX_SOURCE) || defined(linux) +- if(read_sync) +- flags |=O_RSYNC|O_SYNC; +-#endif +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- if(direct_flag) +- flags |=O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- flags |=O_DIRECTIO; +-#endif +-#endif +-#if defined(Windows) +- if(unbuffered) +- { +- hand=CreateFile(dummyfile[xx], +- GENERIC_READ|GENERIC_WRITE, +- FILE_SHARE_WRITE|FILE_SHARE_READ, +- NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| +- FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, +- NULL); +- } +-#endif +- if((fd = I_OPEN(dummyfile[xx], ((int)flags),0640))<0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("\nCan not open temp file: %s\n", +- filename); +- perror("open"); +- exit(125); +- } +-#ifdef VXFS +- if(direct_flag) +- { +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +- ioctl(fd,VX_GETCACHE,&test_foo); +- if(test_foo == 0) +- { +- if(!client_iozone) +- printf("\nVxFS advanced setcache feature not available.\n"); +- exit(3); +- } +- } +-#endif +-#if defined(solaris) +- if(direct_flag) +- { +- test_foo = directio(fd, DIRECTIO_ON); +- if(test_foo != 0) +- { +- if(!client_iozone) +- printf("\ndirectio not available.\n"); +- exit(3); +- } +- } +-#endif +-#ifdef ASYNC_IO +- if(async_flag) +- async_init(&gc,fd,direct_flag); +-#endif +- if(mmapflag) +- { +- maddr=(char *)initfile(fd,(filebytes64),1,PROT_READ|PROT_WRITE); +- } +- if(reclen < cache_size ) +- { +- recs_per_buffer = cache_size/reclen ; +- nbuff=&nbuff[(xx%recs_per_buffer)*reclen]; +- } +- if(fetchon) /* Prefetch into processor cache */ +- fetchit(nbuff,reclen); +- +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- child_stat->flag=CHILD_STATE_READY; /* Tell parent child is ready to go */ +- if(distributed && client_iozone) +- { +- tell_master_ready(chid); +- wait_for_master_go(chid); +- } +- else +- { +- while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ +- Poll((long long)1); +- } +- written_so_far=0; +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->actual = 0; +- child_stat->throughput = 0; +- stopped=0; +- if(file_lock) +- if(mylockf((int) fd, (int) 1, (int)0) != 0) +- printf("File lock for write failed. %d\n",errno); +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_randwol.dat",(int)xx); +- thread_randwqfd=fopen(tmpname,"a"); +- if(thread_randwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_randwqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Random write start: ", +- now_string); +- } +- if((verify && !no_copy_flag) || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- for(i=0; ithroughput = +- (time_so_far() - starttime1)-time_res; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput = time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- if(debug1) +- { +- printf("\n(%ld) Stopped by another\n", (long)xx); +- } +- stopped=1; +- } +- if(purge) +- purgeit(nbuff,reclen); +- if(Q_flag || hist_summary) +- { +- thread_qtime_start=time_so_far(); +- } +-again: +- if(mmapflag) +- { +- wmaddr = &maddr[current_offset]; +- fill_area((long long*)nbuff,(long long*)wmaddr,(long long)reclen); +- if(!mmapnsflag) +- { +- if(mmapasflag) +- msync(wmaddr,(size_t)reclen,MS_ASYNC); +- if(mmapssflag) +- msync(wmaddr,(size_t)reclen,MS_SYNC); +- } +- } +- else +- { +- if(async_flag) +- { +- if(no_copy_flag) +- { +- free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); +- nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); +- if(verify || dedup || dedup_interior) +- fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)(current_offset/reclen)); +- async_write_no_copy(gc, (long long)fd, nbuff, reclen, (current_offset), depth,free_addr); +- } +- else +- async_write(gc, (long long)fd, nbuff, reclen, current_offset, depth); +- } +- else +- { +- wval = write(fd, nbuff, (size_t) reclen); +- if(wval != reclen) +- { +- if(*stop_flag && !stopped){ +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- } +- temp_time = time_so_far(); +- child_stat->throughput = +- (temp_time - starttime1)-time_res; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- if(debug1) +- { +- printf("\n(%ld) Stopped by another\n", (long)xx); +- } +- stopped=1; +- goto again; +- } +- /* Note: Writer must finish even though told +- to stop. Otherwise the readers will fail. +- The code will capture bytes transfered +- before told to stop but let the writer +- complete. +- */ +-#ifdef NO_PRINT_LLD +- printf("\nError writing block %ld, fd= %d\n", i, +- fd); +-#else +- printf("\nError writing block %lld, fd= %d\n", i, +- fd); +-#endif +- if(wval==-1) +- perror("write"); +- if (!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- child_stat->flag = CHILD_STATE_HOLD; +- exit(127); +- } +- } +- } +- if(rlocking) +- { +- mylockr((int) fd, (int) 0, (int)0, +- lock_offset, reclen); +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start-time_res); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +-/* +-printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, +- actual_rate, (desired_op_rate_time-actual_rate)); +-*/ +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_randwqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_randwqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- w_traj_ops_completed++; +- w_traj_bytes_completed+=reclen; +- written_so_far+=reclen/1024; +- if(*stop_flag) +- { +- written_so_far-=reclen/1024; +- w_traj_bytes_completed-=reclen; +- } +- } +- +- +- if(file_lock) +- if(mylockf((int) fd, (int) 0, (int)0)) +- printf("Write unlock failed. %d\n",errno); +- +-#ifdef ASYNC_IO +- if(async_flag) +- { +- end_async(gc); +- gc=0; +- } +-#endif +- if(!xflag) +- { +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- } +- +- if(include_flush) +- { +- if(mmapflag) +- msync(maddr,(size_t)filebytes64,MS_SYNC); +- else +- fsync(fd); +- } +- if(include_close) +- { +- if(mmapflag) +- mmap_end(maddr,(unsigned long long)filebytes64); +- close(fd); +- } +- if(!stopped){ +- temp_time = time_so_far(); +- child_stat->throughput = ((temp_time - starttime1)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- } +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- if(cdebug) +- { +- fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid,child_stat->throughput, +- child_stat->actual); +- fflush(newstdout); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- tell_master_stats(THREAD_RANDOM_WRITE_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- stopped=0; +- /*******************************************************************/ +- /* End random write performance test. ******************************/ +- /*******************************************************************/ +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- if(!include_close) +- { +- if(mmapflag) +- { +- msync(maddr,(size_t)numrecs64*reclen,MS_SYNC); /*Clean up before read starts running*/ +- mmap_end(maddr,(unsigned long long)numrecs64*reclen); +- }else +- fsync(fd); +- +- close(fd); +- } +- if(Q_flag && (thread_randwqfd !=0) ) +- fclose(thread_randwqfd); +- free(dummyfile[xx]); +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Random write finished: ", +- now_string); +- fclose(thread_Lwqfd); +- } +- if(recnum) +- free(recnum); +- if(hist_summary) +- dump_hist("Random Write",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +- +-/************************************************************************/ +-/* Thread cleanup test */ +-/* This is not a measurement. It is a mechanism to cleanup all of the */ +-/* temporary files that were being used. This becomes very important */ +-/* when testing multiple clients over a network :-) */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void * +-thread_cleanup_test(void *x) +-#else +-void * +-thread_cleanup_test(x) +-#endif +-{ +- long long xx; +- struct child_stats *child_stat; +- char *dummyfile[MAXSTREAMS]; /* name of dummy file */ +- +- +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- xx = (long long)((long)x); +- else +- { +- xx=chid; +- } +-#endif +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx],xx); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx],xx); +-#endif +- } +- if(!no_unlink) +- { +- if(check_filename(dummyfile[xx])) +- unlink(dummyfile[xx]); +- } +- +- child_stat = (struct child_stats *)&shmaddr[xx]; +- /*****************/ +- /* Children only */ +- /*****************/ +- child_stat=(struct child_stats *)&shmaddr[xx]; +- child_stat->flag = CHILD_STATE_READY; +- if(distributed && client_iozone) +- { +- tell_master_ready(chid); +- wait_for_master_go(chid); +- } +- else +- { +- while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ +- Poll((long long)1); +- } +- +- *stop_flag=1; +- if(distributed && client_iozone) +- send_stop(); +- if(distributed && client_iozone) +- tell_master_stats(THREAD_CLEANUP_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- free(dummyfile[xx]); +- +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +-return(0); +-} +- +- +-/************************************************************************/ +-/* mythread_create() Internal routine that calls pthread_create() */ +-/************************************************************************/ +-#ifndef NO_THREADS +-#ifdef HAVE_ANSIC_C +-long long +-mythread_create( void *(*func)(void *),void *x) +-#else +-long long +-mythread_create( func,x) +-void *(*func)(void *); +-void *x; +-#endif +-{ +- pthread_t ts; +- pthread_attr_t attr; +- int xx; +- int *yy; +-#ifdef _64BIT_ARCH_ +- long long meme; +- meme = (long long)x; +-#else +- long meme; +- meme = (long)x; +-#endif +- yy=(int *)x; +- +- +-#ifdef OSFV3 +- +- xx=(int )pthread_create(&ts, pthread_attr_default, +- func, (void *)yy); +- +-#else +- pthread_attr_init(&attr); +- xx=(int )pthread_create((pthread_t *)&ts, (pthread_attr_t *) &attr, +- func, (void *)yy); +-#endif +- bcopy(&ts,&p_childids[meme],sizeof(pthread_t)); +- if(xx < (int)0) +- printf("Thread create failed. Returned %d Errno = %d\n",xx,errno); +- if(debug1 ) +- { +- printf("\nthread created has an id of %lx\n",ts); +- printf("meme %ld\n",meme); +- } +- return((long long)meme); +-} +-#else +-#ifdef HAVE_ANSIC_C +-long long +-mythread_create( void *(*func)(void *),void *x) +-#else +-long long +-mythread_create( func,x) +-void *(*func)(void *); +-void *x; +-#endif +-{ +- printf("This version does not support threads\n"); +- return(-1); +-} +-#endif +- +-/************************************************************************/ +-/* thread_exit() Internal routine that calls pthread_exit() */ +-/************************************************************************/ +-#ifndef NO_THREADS +-#ifdef HAVE_ANSIC_C +-int +-thread_exit(void) +-#else +-int +-thread_exit() +-#endif +-{ +- pthread_exit((void *)NULL); +-return(0); +-} +-#else +-#ifdef HAVE_ANSIC_C +-int +-thread_exit(void) +-#else +-int +-thread_exit() +-#endif +-{ +- printf("This version does not support threads\n"); +- return(-1); +-} +-#endif +- +-/************************************************************************/ +-/* mythread_self() Internal function that calls pthread_self() */ +-/************************************************************************/ +-#ifndef NO_THREADS +-#ifdef HAVE_ANSIC_C +-pthread_t +-mythread_self(void) +-#else +-pthread_t +-mythread_self() +-#endif +-{ +- pthread_t xx; +- xx = pthread_self(); +- return(xx); +-} +-#else +-#ifdef HAVE_ANSIC_C +-int +-mythread_self(void) +-#else +-int +-mythread_self() +-#endif +-{ +- printf("This version does not support threads\n"); +- return(-1); +-} +-#endif +- +-/************************************************************************/ +-/* Internal thread_join routine... calls pthread_join */ +-/************************************************************************/ +-#ifndef NO_THREADS +-#ifdef HAVE_ANSIC_C +-void * +-thread_join( long long tid, void *status) +-#else +-void * +-thread_join( tid, status) +-long long tid; +-void *status; +-#endif +-{ +- int xx; +- pthread_t eek; +- pthread_attr_t foo; +- +- bcopy(&p_childids[tid],&eek,sizeof(pthread_t)); +- xx=pthread_join(eek,(void **)&foo); +- if(xx<0) +- printf("Thread join returned error %d\n",errno); +- return(0); +-} +-#else +-#ifdef HAVE_ANSIC_C +-void * +-thread_join( long long tid, void *status) +-#else +-void * +-thread_join( tid, status) +-long long tid; +-void *status; +-#endif +-{ +- printf("This version does not support threads\n"); +- return((void *)-1); +-} +-#endif +- +- +-/************************************************************************/ +-/* Dump the CPU utilization data. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-dump_throughput_cpu(void) +-#else +-void +-dump_throughput_cpu() +-#endif +-{ +- long long x,y,i,j; +- char *port; +- char *label; +- char print_str[300]; +- x=max_x; +- y=max_y; +- +- port = use_thread ? "threads" : "processes"; +- printf("\n\"CPU utilization report Y-axis is type of test X-axis is number of %s\"\n",port); +- if (bif_flag) +- { +- sprintf(print_str, "CPU utilization report Y-axis is type of test X-axis is number of %s", port); +- do_label(bif_fd, print_str, bif_row++, bif_column); +- } +- label = OPS_flag ? "ops/sec" : +- MS_flag ? "microseconds/op" : "Kbytes/sec"; +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\"Record size = %ld Kbytes \"\n", reclen/1024); +-#else +- if(!silent) printf("\"Record size = %lld Kbytes \"\n", reclen/1024); +-#endif +- if(!silent) printf("\"Output is in CPU%%\"\n\n"); +- if (bif_flag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(print_str, "Record size = %ld Kbytes", reclen/1024); +-#else +- sprintf(print_str, "Record size = %lld Kbytes", reclen/1024); +-#endif +- do_label(bif_fd, print_str, bif_row++, bif_column); +- sprintf(print_str, "Output is in CPU%%"); +- do_label(bif_fd, print_str, bif_row++, bif_column); +- } +- for (i = 0; i < x; i++) +- { +- if(!silent) printf("\"%15s \"", throughput_tests[i]); +- if (bif_flag) +- { +- sprintf(print_str, "%15s ", throughput_tests[i]); +- do_label(bif_fd, print_str, bif_row, bif_column++); +- bif_column++; +- } +- for (j = 0; j <= y; j++) +- { +- if (bif_flag) +- do_float(bif_fd, runtimes[i][j].cpuutil, bif_row, bif_column++); +- if(!silent) printf(" %10.2f ", runtimes[i][j].cpuutil); +- } +- if(!silent) printf("\n\n"); +- if (bif_flag) +- { +- bif_column=0; +- bif_row++; +- } +- } +-} +- +- +-/************************************************************************/ +-/* Dump the throughput graphs */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-dump_throughput(void) +-#else +-void +-dump_throughput() +-#endif +-{ +- long long x,y,i,j; +- char *port; +- char *label; +- char print_str[300]; +- x=max_x; +- y=max_y; +- +- if(use_thread) +- port="threads"; +- else +- port="processes"; +- if(!silent) printf("\n\"Throughput report Y-axis is type of test X-axis is number of %s\"\n",port); +- if(bif_flag) +- { +- bif_fd=create_xls(bif_filename); +- do_label(bif_fd,command_line,bif_row++,bif_column); +- sprintf(print_str,"Throughput report Y-axis is type of test X-axis is number of %s",port); +- do_label(bif_fd,print_str,bif_row++,bif_column); +- } +- if(OPS_flag) +- label="ops/sec"; +- else +- if(MS_flag) +- label="microseconds/op"; +- else +- label="Kbytes/sec"; +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\"Record size = %ld Kbytes \"\n",reclen/1024); +-#else +- if(!silent) printf("\"Record size = %lld Kbytes \"\n",reclen/1024); +-#endif +- if(!silent) printf("\"Output is in %s\"\n\n",label); +- if(bif_flag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(print_str,"Record size = %ld Kbytes",reclen/1024); +-#else +- sprintf(print_str,"Record size = %lld Kbytes",reclen/1024); +-#endif +- do_label(bif_fd,print_str,bif_row++,bif_column); +- sprintf(print_str,"Output is in %s",label); +- do_label(bif_fd,print_str,bif_row++,bif_column); +- } +- for(i=0;i<=toutputindex;i++) +- { +- if(!silent) printf("\"%15s \"",toutput[i]); +- if(bif_flag) +- { +- sprintf(print_str,"%15s ",toutput[i]); +- do_label(bif_fd,print_str,bif_row,bif_column++); +- bif_column++; +- } +- for(j=0;j<=y;j++) +- { +- if(bif_flag) +- { +- do_float(bif_fd,(double)report_darray[i][j],bif_row,bif_column++); +- } +- if(!silent) printf(" %10.2f ",report_darray[i][j]); +- } +- if(!silent) printf("\n\n"); +- if(bif_flag) +- { +- bif_column=0; +- bif_row++; +- } +- } +- if (cpuutilflag) +- dump_throughput_cpu(); +- if(bif_flag) +- close_xls(bif_fd); +-} +- +-/************************************************************************/ +-/* store_dvalue() */ +-/* Stores a value in an in memory array. Used by the report function */ +-/* to re-organize the output for Excel */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-store_dvalue(double value) +-#else +-void +-store_dvalue(value) +-double value; +-#endif +-{ +- report_darray[current_x][current_y]=value; +- current_x++; +- if(current_x > max_x) +- max_x=current_x; +- if(current_y > max_y) +- max_y=current_y; +- if(max_x >= MAX_X) +- { +- printf("\nMAX_X too small\n"); +- exit(163); +- } +- if(max_y >= MAXSTREAMS) +- { +- printf("\nMAXSTREAMS too small\n"); +- exit(164); +- } +-} +- +-/************************************************************************/ +-/* Initialize a file that will be used by mmap. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-char * +-initfile(int fd, off64_t filebytes,int flag,int prot) +-#else +-char * +-initfile(fd, filebytes,flag, prot) +-int fd; +-off64_t filebytes; +-int flag, prot; +-#endif +-{ +- char *pa; +- int mflags=0; +- long long x; +- char *tmp,*stmp; +- int file_flags; +- long long recs; +- long long i; +- int dflag = 0; +- +- if(flag) +- { +- +-#ifdef _HPUX_SOURCE +- /* +- * Save time, just have the operating system prealloc +- * the file +- */ +- prealloc(fd,filebytes); +-#else +- /* +- * Allocate a temporary buffer to meet any alignment +- * contraints of any method. +- */ +- tmp=(char *)malloc((size_t)reclen * 2); +- stmp=tmp; +- /* +- * Align to a reclen boundary. +- */ +- tmp = (char *)((((long)tmp + (long)reclen))& ~(((long)reclen-1))); +- /* +- * Special case.. Open O_DIRECT, and going to be mmap() +- * Under Linux, one can not create a sparse file using +- * a file that is opened with O_DIRECT +- */ +- file_flags=fcntl(fd,F_GETFL); +- +-#if ! defined(DONT_HAVE_O_DIRECT) +-#if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) +- dflag = O_DIRECT; +-#endif +-#if defined(TRU64) +- if(direct_flag) +- dflag = O_DIRECTIO; +-#endif +-#endif +- if((file_flags & dflag) !=0) +- { +- recs=filebytes/reclen; +- for (i =0; i microsecs) +- break; +- } +- +-/* +- select(0,0,0,0,&nap_time); +-*/ +- +- +-} +- +-/************************************************************************/ +-/* Function that establishes the resolution */ +-/* of the gettimeofday() function. */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-void +-get_resolution(void) +-#else +-void +-get_resolution() +-#endif +-{ +- double starttime, finishtime, besttime = 0; +- long j,delay; +- int k; +- +- finishtime=time_so_far1(); /* Warm up the instruction cache */ +- starttime=time_so_far1(); /* Warm up the instruction cache */ +- delay=j=0; /* Warm up the data cache */ +- for(k=0;k<10;k++) +- { +- while(1) +- { +- starttime=time_so_far1(); +- for(j=0;j< delay;j++) +- ; +- finishtime=time_so_far1(); +- if(starttime==finishtime) +- delay++; +- else +- { +- if(k==0) +- besttime=(finishtime-starttime); +- if((finishtime-starttime) < besttime) +- besttime=(finishtime-starttime); +- break; +- } +- } +- } +- time_res=besttime/1000000.0; +-} +- +-/************************************************************************/ +-/* Function that establishes the resolution */ +-/* of the getrusage() function. */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-void +-get_rusage_resolution(void) +-#else +-void +-get_rusage_resolution() +-#endif +-{ +- double starttime, finishtime; +- long j; +- +- finishtime=cputime_so_far(); /* Warm up the instruction cache */ +- starttime=cputime_so_far(); /* Warm up the instruction cache */ +- delay=j=0; /* Warm up the data cache */ +- while(1) +- { +- starttime=cputime_so_far(); +- for(j=0;j< delay;j++) +- ; +- finishtime=cputime_so_far(); +- if(starttime==finishtime) +- +- delay++; +- else +- break; +- } +- cputime_res = (finishtime-starttime); /* in seconds */ +-} +-/************************************************************************/ +-/* Time measurement routines. */ +-/* Return time in microseconds */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-static double +-time_so_far1(void) +-#else +-static double +-time_so_far1() +-#endif +-{ +- /* For Windows the time_of_day() is useless. It increments in +- 55 milli second increments. By using the Win32api one can +- get access to the high performance measurement interfaces. +- With this one can get back into the 8 to 9 microsecond resolution +- */ +-#ifdef Windows +- LARGE_INTEGER freq,counter; +- double wintime; +- double bigcounter; +- struct timeval tp; +- +- if(pit_hostname[0]){ +- pit_gettimeofday(&tp, (struct timezone *) NULL, pit_hostname, +- pit_service); +- return ((double) (tp.tv_sec)*1000000.0)+(((double)tp.tv_usec)); +- } +- else +- { +- +- QueryPerformanceFrequency(&freq); +- QueryPerformanceCounter(&counter); +- bigcounter=(double)counter.HighPart *(double)0xffffffff + +- (double)counter.LowPart; +- wintime = (double)(bigcounter/(double)freq.LowPart); +- return((double)wintime*1000000.0); +- } +-#else +-#if defined (OSFV4) || defined(OSFV3) || defined(OSFV5) +- struct timespec gp; +- +- if (getclock(TIMEOFDAY, (struct timespec *) &gp) == -1) +- perror("getclock"); +- return (( (double) (gp.tv_sec)*1000000.0) + +- ( ((float)(gp.tv_nsec)) * 0.001 )); +-#else +- struct timeval tp; +- +- if(pit_hostname[0]){ +- if (pit_gettimeofday(&tp, (struct timezone *) NULL, pit_hostname, +- pit_service) == -1) +- perror("pit_gettimeofday"); +- return ((double) (tp.tv_sec)*1000000.0) + (((double) tp.tv_usec) ); +- } +- else +- { +- if (gettimeofday(&tp, (struct timezone *) NULL) == -1) +- perror("gettimeofday"); +- return ((double) (tp.tv_sec)*1000000.0) + (((double) tp.tv_usec) ); +- } +-#endif +-#endif +-} +- +-/************************************************************************/ +-/* Return the clocks per tick for the times() call. */ +-/************************************************************************/ +-#ifdef unix +-#ifdef HAVE_ANSIC_C +-static double +-clk_tck(void) /* Get the clocks per tick for times */ +-#else +-static double +-clk_tck() /* Get the clocks per tick for times */ +-#endif +-{ +- return((double)sysconf(_SC_CLK_TCK)); +-} +- +-/************************************************************************/ +-/* Return the user time in tics as a double. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-static double +-utime_so_far(void) /* Return user time in ticks as double */ +-#else +-static double +-utime_so_far() +-#endif +-{ +- struct tms tp; +- +- times(&tp); +- return ((double) (tp.tms_utime)); +-} +- +-/************************************************************************/ +-/* Return the system time in tics as a double. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-static double +-stime_so_far(void) /* Return system time in ticks as double */ +-#else +-static double +-stime_so_far() +-#endif +-{ +- struct tms tp; +- +- times(&tp); +- return ((double) (tp.tms_stime)); +-} +- +-/************************************************************************/ +-/* Return the CPU (user + system) time in seconds as a double. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-static double +-cputime_so_far(void) /* Return CPU time in seconds as double */ +-#else +-static double +-cputime_so_far() +-#endif +-{ +-#if 0 +- struct tms tp; +- +- times(&tp); +- return ((double) (tp.tms_utime + tp.tms_stime) / sc_clk_tck); +-#else +- struct rusage ru; +- +- if (getrusage (RUSAGE_SELF, &ru)) +- perror ("getrusage"); +- return ((double)(ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) + +- .000001 *(ru.ru_utime.tv_usec + ru.ru_stime.tv_usec)); +-#endif +-} +-#endif +- +-/************************************************************************/ +-/* Return the CPU utilization ((user + system) / walltime) as a percentage. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-static double +-cpu_util(double cputime, double walltime) +-#else +-static double +-cpu_util(cputime, walltime) +-double cputime, walltime; +-#endif +-{ +- double cpu; +- +- if (walltime <= (double)0.0) +- { +- cpu = (double)0.0; +- return cpu; +- } +- if (cputime <= (double)0.0) +- cputime = 0.0; +- if (walltime <= (double)0.0) +- cpu = (double)100.0; +- else { +- cpu = (((double)100.0 * cputime) / walltime); +- /* +- if (cpu > (double)100.0) +- cpu = (double)99.99; +- */ +- } +- return cpu; +-} +- +-/************************************************************************/ +-/* This is a locking function that permits the writes and */ +-/* reads during the test to hold a file lock. Since each */ +-/* tmp file that Iozone creates is a private file, this seems */ +-/* like a no-op but it turns out that when using Iozone */ +-/* over NFS, life is very, very different. Some vendors */ +-/* read and write performance goes to zip when locks are held */ +-/* even if there is only one process using the file and having */ +-/* it locked. Some implementations of NFS transition from async */ +-/* to fully sync reads and writes if any locks are used. Euck... */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-int +-mylockf(int fd, int op, int rdwr) +-#else +-int +-mylockf(fd, op, rdwr) +-int fd, op, rdwr; +-#endif +-{ +- struct flock myflock; +- int ret; +- if(op==0) /* Generic unlock the whole file */ +- { +- myflock.l_type=F_UNLCK; +- myflock.l_whence=SEEK_SET; +- myflock.l_start=0; +- myflock.l_len=0; /* The whole file */ +- myflock.l_pid=getpid(); +- ret=fcntl(fd,F_SETLKW, &myflock); +- } +- else +- /* Generic lock the whole file */ +- { +- if(rdwr==0) +- myflock.l_type=F_WRLCK; /* Apply write lock */ +- else +- myflock.l_type=F_RDLCK; /* Apply read lock */ +- myflock.l_whence=SEEK_SET; +- myflock.l_start=0; +- myflock.l_len=0; /* The whole file */ +- myflock.l_pid=getpid(); +- ret=fcntl(fd,F_SETLKW, &myflock); +- } +- return(ret); +-} +- +-#ifdef HAVE_ANSIC_C +-int +-mylockr(int fd, int op, int rdwr, off64_t offset, off64_t size) +-#else +-int +-mylockr(fd, op, rdwr, offset, size) +-int fd, op, rdwr; +-off64_t offset; +-off64_t size; +-#endif +-{ +- struct flock myflock; +- int ret; +- if(op==0) /* Generic unlock the whole file */ +- { +- /*printf("Child: %lld Unlock offset %lld size %lld\n",chid,offset,size);*/ +- myflock.l_type=F_UNLCK; +- myflock.l_whence=SEEK_SET; +- myflock.l_start=offset; +- myflock.l_len=size; /* The whole file */ +- myflock.l_pid=getpid(); +- ret=fcntl(fd,F_SETLKW, &myflock); +- } +- else +- /* Generic lock the range */ +- { +- if(rdwr==0) +- { +- myflock.l_type=F_WRLCK; /* Apply write lock */ +- /* printf("Write ");*/ +- } +- else +- { +- myflock.l_type=F_RDLCK; /* Apply read lock */ +- /* printf("Read ");*/ +- } +- /*printf("Child: %lld Lock offset %lld size %lld\n",chid, offset,size);*/ +- myflock.l_whence=SEEK_SET; +- myflock.l_start=offset; +- myflock.l_len=size; /* The whole file */ +- myflock.l_pid=getpid(); +- ret=fcntl(fd,F_SETLKW, &myflock); +- } +- return(ret); +-} +-/************************************************************************/ +-/* This function is used to simulate compute time that does */ +-/* not involve the I/O subsystem. */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-float +-do_compute(float comp_delay) +-#else +-float +-do_compute(comp_delay) +-float comp_delay; +-#endif +-{ +- double starttime,tmptime; +- if(comp_delay == (float)0.0) +- return(0.0); +- starttime=time_so_far(); +- while(1) +- { +- tmptime=time_so_far()-starttime; +- if(tmptime >= (double)comp_delay) +- return(tmptime); +- } +- return(0.0); +-} +- +-/************************************************************************/ +-/* This function is intended to cause an interruption */ +-/* in the read pattern. It will make a reader have */ +-/* jitter in its access behavior. */ +-/* When using direct I/O one must use a pagesize transfer. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-disrupt(int fd) +-#else +-void +-disrupt(fd) +-int fd; +-#endif +-{ +- char *nbuff,*free_addr; +- off64_t current; +- +- free_addr=nbuff=(char *)malloc((size_t)page_size+page_size); +- nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); +- +- /* Save current position */ +- current = I_LSEEK(fd,0,SEEK_CUR); +- +- /* Move to beginning of file */ +- I_LSEEK(fd,0,SEEK_SET); +- +- /* Read a little of the file */ +- if(direct_flag) +- junk=read(fd,nbuff,page_size); +- else +- junk=read(fd,nbuff,1); +- +- /* Skip into the file */ +- I_LSEEK(fd,page_size,SEEK_SET); +- +- /* Read a little of the file */ +- if(direct_flag) +- junk=read(fd,nbuff,page_size); +- else +- junk=read(fd,nbuff,1); +- +- /* Restore current position in file, before disruption */ +- I_LSEEK(fd,current,SEEK_SET); +- free(free_addr); +- +-} +- +-#if defined(Windows) +-/************************************************************************/ +-/* This function is intended to cause an interruption */ +-/* in the read pattern. It will make a reader have */ +-/* jitter in its access behavior. */ +-/* When using direct I/O one must use a pagesize transfer. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-disruptw(HANDLE hand) +-#else +-void +-disruptw(HANDLE) +-int hand; +-#endif +-{ +- char *nbuff,*free_addr; +- off64_t current; +- long retval; +- +- free_addr=nbuff=(char *)malloc((size_t)page_size+page_size); +- nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); +- +- /* Save current position */ +- current=SetFilePointer(hand,(LONG)0,0,FILE_CURRENT); +- +- /* Move to beginning of file */ +- SetFilePointer(hand,(LONG)0,0,FILE_BEGIN); +- +- /* Read a little of the file */ +- ReadFile(hand, nbuff, reclen,(LPDWORD)&retval,0); +- +- /* Skip into the file */ +- SetFilePointer(hand,(LONG)page_size,0,FILE_BEGIN); +- +- /* Read a little of the file */ +- ReadFile(hand, nbuff, reclen,(LPDWORD)&retval,0); +- +- /* Restore current position in file, before disruption */ +- SetFilePointer(hand,(LONG)current,0,FILE_BEGIN); +- free(free_addr); +- +-} +-#endif +- +-/************************************************************************/ +-/* Read a telemetry file and return the the offset */ +-/* for the next operaton. Also, set the size */ +-/* in the variable given in the param list. */ +-/* which == 0 ... reader calling */ +-/* which == 1 ... writer calling */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-long long +-get_traj(FILE *traj_fd, long long *traj_size, float *delay, long which) +-#else +-long long +-get_traj(traj_fd, traj_size, delay, which) +-FILE *traj_fd; +-long long *traj_size; +-float *delay; +-long which; +-#endif +-{ +- long long traj_offset = 0; +- long long tmp2 = 0; +- int tmp = 0; +- int tokens; +- int ret=0; +- char *ret1,*where; +- char buf[200]; +- char sbuf[200]; +- int got_line; +- +- got_line=0; +- +- while(got_line==0) +- { +- tokens=0; +- ret1=fgets(buf,200,traj_fd); +- if(ret1==(char *)0) +- { +- printf("\n\n\tEarly end of telemetry file. Results not accurate.\n"); +- signal_handler(); +- } +- where=(char *)&buf[0]; +- strcpy(sbuf,buf); +- if((*where=='#') || (*where=='\n')) +- continue; +- tokens++; +- strtok(where," "); +- while( (char *)(strtok( (char *)0," ")) != (char *)0) +- { +- tokens++; +- } +- got_line=1; +- } +- if(tokens == 3) +- { +-#ifdef NO_PRINT_LLD +- ret=sscanf(sbuf,"%ld %ld %d\n",&traj_offset,&tmp2,&tmp); +-#else +- ret=sscanf(sbuf,"%lld %lld %d\n",&traj_offset,&tmp2,&tmp); +-#endif +- /*printf("\nReading %s trajectory with %d items\n",which?"write":"read",tokens);*/ +- *traj_size=tmp2; +- *delay= ((float)tmp/1000); +- } +- if(tokens == 2) +- { +-#ifdef NO_PRINT_LLD +- ret=sscanf(sbuf,"%ld %ld\n",&traj_offset,traj_size); +-#else +- ret=sscanf(sbuf,"%lld %lld\n",&traj_offset,traj_size); +-#endif +- *delay=compute_time; +- /*printf("\nReading %s trajectory with %d items\n",which?"write":"read",tokens);*/ +- } +- if((tokens != 2) && (tokens !=3)) +- { +- printf("\n\tInvalid entry in telemetry file. > %s <\n",sbuf); +- exit(178); +- } +- if(ret==EOF) +- { +- printf("\n\n\tEarly end of telemetry file. Results not accurate.\n"); +- signal_handler(); +- } +-#ifdef DEBUG +-#ifdef NO_PRINT_LLD +- if(!silent) printf("\nOffset %lld Size %ld Compute delay %f\n",traj_offset, *traj_size,*delay); +-#else +- if(!silent) printf("\nOffset %lld Size %lld Compute delay %f\n",traj_offset, *traj_size,*delay); +-#endif +-#endif +- return(traj_offset); +-} +- +-/************************************************************************/ +-/* Open the read telemetry file and return file pointer. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-FILE * +-open_r_traj(void) +-#else +-FILE * +-open_r_traj() +-#endif +-{ +- FILE *fd; +- fd=fopen(read_traj_filename,"r"); +- if(fd == (FILE *)0) +- { +- printf("Unable to open read telemetry file \"%s\"\n", +- read_traj_filename); +- exit(174); +- } +- return(fd); +-} +- +-/************************************************************************/ +-/* Open the write telemetry file and return file pointer. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-FILE * +-open_w_traj(void) +-#else +-FILE * +-open_w_traj() +-#endif +-{ +- FILE *fd; +- fd=fopen(write_traj_filename,"r"); +- if(fd == (FILE *)0) +- { +- printf("Unable to open write telemetry file \"%s\"\n", +- write_traj_filename); +- exit(175); +- } +- return(fd); +-} +- +-/************************************************************************/ +-/* r_traj_size(void) */ +-/* This function scans the read telemetry file */ +-/* and establishes the number of entries */ +-/* and the maximum file offset. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-r_traj_size(void) +-#else +-void +-r_traj_size() +-#endif +-{ +- FILE *fd; +- int ret; +- long long traj_offset = 0; +- long long traj_size = 0; +- long long max_offset = 0; +- int tokens; +- int dummy; +- int lines; +- char buf[200]; +- char sbuf[200]; +- char *ret1,*where; +- +- lines=0; +- fd=fopen(read_traj_filename,"r"); +- if(fd == (FILE *)0) +- { +- printf("Unable to open read telemetry file \"%s\"\n", +- read_traj_filename); +- exit(174); +- } +- while(1) +- { +- tokens=0; +- ret1=fgets(buf,200,fd); +- if(ret1==(char *)0) +- break; +- where=(char *)&buf[0]; +- strcpy(sbuf,buf); +- lines++; +- if((*where=='#') || (*where=='\n')) +- continue; +- tokens++; +- strtok(where," "); +- while( (char *)(strtok( (char *)0," ")) != (char *)0) +- { +- tokens++; +- } +- if(tokens==1) +- { +- printf("\n\tInvalid read telemetry file entry. Line %d", +- lines); +- signal_handler(); +- } +-#ifdef DEBUG +- printf("Tokens = %d\n",tokens); +-#endif +- if(tokens==3) +- { +-#ifdef NO_PRINT_LLD +- ret=sscanf(sbuf,"%ld %ld %d\n",&traj_offset,&traj_size,&dummy); +-#else +- ret=sscanf(sbuf,"%lld %lld %d\n",&traj_offset,&traj_size,&dummy); +-#endif +- } +- if(tokens==2) +- { +-#ifdef NO_PRINT_LLD +- ret=sscanf(sbuf,"%ld %ld\n",&traj_offset,&traj_size); +-#else +- ret=sscanf(sbuf,"%lld %lld\n",&traj_offset,&traj_size); +-#endif +- } +- if((tokens != 2) && (tokens !=3)) +- { +- printf("\n\tInvalid read telemetry file. Line %d\n",lines); +- exit(178); +- } +- if(traj_offset + traj_size > max_offset) +- max_offset=traj_offset + traj_size; +- +- r_traj_ops++; +- } +- r_traj_fsize=max_offset; +-#ifdef DEBUG +- printf("File size of read %lld Item count %lld\n",r_traj_fsize,r_traj_ops); +-#endif +- fclose(fd); +-} +- +-/************************************************************************/ +-/* w_traj_size(void) */ +-/* This function scans the write telemetry file */ +-/* and establishes the number of entries */ +-/* and the maximum file offset. */ +-/************************************************************************/ +-#ifdef HAVE_ANSIC_C +-long long +-w_traj_size(void) +-#else +-long long +-w_traj_size() +-#endif +-{ +- FILE *fd; +- int ret; +- long long traj_offset = 0; +- long long traj_size = 0; +- long long max_offset = 0; +- int dummy; +- int tokens,lines; +- char *ret1; +- char buf[200]; +- char sbuf[200]; +- char *where; +- +- lines=0; +- +- fd=fopen(write_traj_filename,"r"); +- if(fd == (FILE *)0) +- { +- printf("Unable to open write telemetry file \"%s\"\n", +- write_traj_filename); +- exit(174); +- } +- while(1) +- { +- tokens=0; +- ret1=fgets(buf,200,fd); +- if(ret1==(char *)0) +- break; +- lines++; +- where=(char *)&buf[0]; +- strcpy(sbuf,buf); +- if((*where=='#') || (*where=='\n')) +- continue; +- tokens++; +- strtok(where," "); +- while( (char *)(strtok( (char *)0," ")) != (char *)0) +- { +- tokens++; +- } +- if(tokens==1) +- { +- printf("\n\tInvalid write telemetry file entry. Line %d\n", +- lines); +- signal_handler(); +- } +- if(tokens==3) +- { +-#ifdef NO_PRINT_LLD +- ret=sscanf(sbuf,"%ld %ld %d\n",&traj_offset,&traj_size,&dummy); +-#else +- ret=sscanf(sbuf,"%lld %lld %d",&traj_offset,&traj_size,&dummy); +-#endif +- } +- if(tokens==2) +- { +-#ifdef NO_PRINT_LLD +- ret=sscanf(sbuf,"%ld %ld\n",&traj_offset,&traj_size); +-#else +- ret=sscanf(sbuf,"%lld %lld\n",&traj_offset,&traj_size); +-#endif +- } +- if(tokens > 3) +- { +- printf("\n\tInvalid write telemetry file entry. Line %d\n", +- lines); +- exit(174); +- } +- if(traj_offset + traj_size > max_offset) +- max_offset=traj_offset + traj_size; +- +- w_traj_ops++; +- } +- w_traj_fsize=max_offset; +-#ifdef DEBUG +- printf("File size of write %lld Item count %lld\n",w_traj_fsize,w_traj_ops); +-#endif +- fclose(fd); +- return(max_offset); +-} +- +-/************************************************************************/ +-/* Find which version of the telemetry file format is in use. */ +-/************************************************************************/ +- +-#ifdef HAVE_ANSIC_C +-void +-traj_vers(void) +-#else +-void +-traj_vers() +-#endif +-{ +- FILE *fd; +- char *where; +- char buf[200]; +- int things; +- char *ret1; +- +- if(r_traj_flag) +- { +- things=0; +- fd=fopen(read_traj_filename,"r"); +- if(fd == (FILE *)0) +- { +- printf("Unable to open read telemetry file \"%s\"\n", read_traj_filename); +- exit(174); +- } +-loop1: +- ret1=fgets(buf,200,fd); +- if(ret1==(char *)0) +- { +- fclose(fd); +- return; +- } +- where=(char *)&buf[0]; +- if((*where=='#') || (*where=='\n')) +- goto loop1; +- things++; +- strtok(where," "); +- while( (char *)(strtok( (char *)0," ")) != (char *)0) +- { +- things++; +- } +- r_traj_items=things; +-#ifdef DEBUG +- printf("Found %d items in the read telemetry file\n",things); +-#endif +- } +- if(w_traj_flag) +- { +- things=0; +- fd=fopen(write_traj_filename,"r"); +- if(fd == (FILE *)0) +- { +- printf("Unable to open write telemetry file \"%s\"\n", write_traj_filename); +- exit(174); +- } +-loop2: +- ret1=fgets(buf,200,fd); +- if(ret1==(char *)0) +- { +- fclose(fd); +- return; +- } +- where=(char *)&buf[0]; +- if((*where=='#') || (*where=='\n')) +- goto loop2; +- things++; +- strtok(where," "); +- while( (char *)(strtok( (char *)0," ")) != (char *)0) +- { +- things++; +- } +- fclose(fd); +- w_traj_items=things; +-#ifdef DEBUG +- printf("Found %d items in the write telemetry file\n",things); +-#endif +- } +-} +- +-/********************************************************************/ +-/* */ +-/* Today this initializes the default set of file sizes for Iozone. */ +-/* in the future it may take input from the command line or */ +-/* from a file. */ +-/* */ +-/********************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-init_file_sizes( off64_t min_f_size, off64_t max_f_size) +-#else +-void +-init_file_sizes(min_f_size, max_f_size) +-off64_t min_f_size; +-off64_t max_f_size; +-#endif +-{ +- off64_t kilosi; +- int x; +- if(s_count > 1) +- { +- for(x=0; x < s_count; x++) +- { +- kilosi=s_range[x]; +- add_file_size((off64_t)kilosi); +- } +- } +- else +- { +- for(kilosi=min_f_size;kilosi<=max_f_size;kilosi*=multiplier) +- { +- add_file_size((off64_t)kilosi); +- } +- } +-} +- +-/********************************************************************/ +-/* Used to constuct the list of file sizes to test. */ +-/********************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-add_file_size(off64_t size) +-#else +-void +-add_file_size(size) +-off64_t size; +-#endif +-{ +- struct size_entry *size_listp; +- struct size_entry *nsize_list; +- +- size_listp=size_list; +- +- if(size_list) +- { +- if(size_listp->next) +- while(size_listp->next!=0) +- size_listp=size_listp->next; +- } +- nsize_list=(struct size_entry *)malloc(sizeof(struct size_entry)); +- if(nsize_list==0) +- { +- printf("Malloc failed in add_file_size\n"); +- exit(180); +- } +- nsize_list->next=0; +- nsize_list->size=size; +- if(size_list == 0) +- size_list=nsize_list; +- else +- size_listp->next=nsize_list; +- size_listp=size_list; +-} +- +-/********************************************************************/ +-/* Return the next file size to test. */ +-/********************************************************************/ +-#ifdef HAVE_ANSIC_C +-off64_t +-get_next_file_size(off64_t size) +-#else +-off64_t +-get_next_file_size(size) +-off64_t size; +-#endif +-{ +- struct size_entry *size_listp; +- +- size_listp=size_list; +- +- for( ; size_listp ; size_listp=size_listp->next ) +- { +- if(size_listp->size > size) +- return(size_listp->size); +- } +- return((off64_t)0); +-} +- +- +-/**********************************************************************/ +-/* */ +-/* Today this initializes the default set of record sizes for Iozone. */ +-/* in the future it may take input from the command line or */ +-/* from a file. */ +-/* */ +-/**********************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-init_record_sizes( off64_t min_r_size, off64_t max_r_size) +-#else +-void +-init_record_sizes(min_r_size, max_r_size) +-off64_t min_r_size; +-off64_t max_r_size; +-#endif +-{ +- int x; +- off64_t size; +- if(r_count > 1) +- { +- for(x=0; x < r_count; x++) +- { +- size=r_range[x]; +- add_record_size((off64_t)size); +- } +- } +- else +- { +- for(size=min_r_size;size<=max_r_size;size*=multiplier) +- { +- add_record_size((off64_t)size); +- } +- } +-} +- +-#ifdef HAVE_ANSIC_C +-void +-del_record_sizes(void) +-#else +-void +-del_record_sizes() +-#endif +-{ +- struct size_entry *size_listp; +- struct size_entry *save_item; +- +- size_listp=rec_size_list; +- if(rec_size_list) +- { +- while(size_listp!=0) +- { +- save_item=size_listp->next; +- free(size_listp); +- size_listp=save_item; +- } +- } +- rec_size_list=0; +-} +- +-/********************************************************************/ +-/* Used to constuct the list of record sizes to test. */ +-/********************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-add_record_size(off64_t size) +-#else +-void +-add_record_size(size) +-off64_t size; +-#endif +-{ +- struct size_entry *size_listp; +- struct size_entry *nsize_list; +- +- size_listp=rec_size_list; +- +- if(rec_size_list) +- { +- if(size_listp->next) +- while(size_listp->next!=0) +- size_listp=size_listp->next; +- } +- nsize_list=(struct size_entry *)malloc(sizeof(struct size_entry)); +- if(nsize_list==0) +- { +- printf("Malloc failed in add_file_size\n"); +- exit(180); +- } +- nsize_list->next=0; +- nsize_list->size=size; +- if(rec_size_list == 0) +- rec_size_list=nsize_list; +- else +- size_listp->next=nsize_list; +- size_listp=rec_size_list; +-} +- +-/********************************************************************/ +-/* Return the next record size to test. */ +-/********************************************************************/ +-#ifdef HAVE_ANSIC_C +-off64_t +-get_next_record_size(off64_t size) +-#else +-off64_t +-get_next_record_size(size) +-off64_t size; +-#endif +-{ +- struct size_entry *size_listp; +- +- size_listp=rec_size_list; +- +- for( ; size_listp ; size_listp=size_listp->next ) +- { +- if(size_listp->size > size) +- return(size_listp->size); +- } +- return((off64_t)0); +-} +- +- +-/* +- * Socket based communication mechanism. +- * It's intended use is to be the communication mechanism +- * that will be used to get Iozone to run across +- * multiple clients. 1/11/2002 Don Capps +- * The communication model permits a master to send and receive +- * messages to and from clients, and for clients to be able to +- * send and receive messages to and from the master. +- */ +-/* +- * Interfaces are: +- Master: +- int start_master_listen(void) +- Called to create masters listening port. +- +- void master_listen(int sock, int size_of_message) +- Call when master wants to block and read +- a message. +- +- int start_master_send(char *child_host_name, int port) +- Call to start a send channel to a client. +- +- void master_send(int child_socket_val, char *host_name, +- char *send_buffer, int send_size) +- Call to send message to a client. +- +- void stop_master_listen(int master_socket_val) +- Call to release the masters listening port. +- +- void stop_master_send(int child_socket_val) +- Call to release the masters send port to a client. +- +- Clients: +- int start_child_listen(int size_of_message) +- Called to create clients listening port. +- +- void child_listen(int sock, int size_of_message) +- Call when client wants to block and read +- a message from the master. +- +- void child_send(int child_socket_val, char *controlling_host_name, +- char *send_buffer, int send_size) +- Call to send message to the master. +- +- void stop_child_listen(int child_socket_val) +- Call to release the clients listening port. +- +- void stop_child_send(int child_socket_val) +- Call to release the clients send port to the master. +- +- +- Messages are sent in command blocks. The structure is +- client_command for messages from the master to the +- client, and master_command for messages sent from +- a client to the master. +-*/ +- +- +-/* +- * Allocate the master listening port that +- * all children will use to send messages to the master. +- */ +-#ifdef HAVE_ANSIC_C +-int +-start_master_listen(void) +-#else +-int +-start_master_listen() +-#endif +-{ +- int s; +- int rc; +- int tmp_port; +- int sockerr; +- struct sockaddr_in addr; +- int recv_buf_size=65536*4; +- int optval=1; +- struct linger dummy={1,0}; +- +- s = socket(AF_INET, SOCK_STREAM, 0); +- if (s < 0) +- { +- perror("socket failed:"); +- exit(19); +- } +- sockerr = setsockopt (s, SOL_SOCKET, SO_RCVBUF, (char *) +- &recv_buf_size, sizeof(int)); +- if ( sockerr == -1 ) { +- perror("Error in setsockopt 1\n"); +- } +- sockerr = setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *) +- &optval, sizeof(int)); +- if ( sockerr == -1 ) { +- perror("Error in setsockopt 2\n"); +- } +- sockerr = setsockopt (s, SOL_SOCKET, SO_LINGER, (char *) +- &dummy, sizeof(struct linger)); +- if ( sockerr == -1 ) { +- perror("Error in setsockopt 2\n"); +- } +- tmp_port=HOST_LIST_PORT; +- bzero(&addr, sizeof(struct sockaddr_in)); +- addr.sin_port = htons(tmp_port); +- addr.sin_family = AF_INET; +- addr.sin_addr.s_addr = INADDR_ANY; +- rc = -1; +- while (rc < 0) +- { +- rc = bind(s, (struct sockaddr *)&addr, +- sizeof(struct sockaddr_in)); +- if(rc < 0) +- { +- tmp_port++; +- addr.sin_port=htons(tmp_port); +- continue; +- } +- master_listen_port = ntohs(addr.sin_port); +- } +- if(rc < 0) +- { +- perror("bind failed\n"); +- exit(20); +- } +- +- if(mdebug) +- printf("Master listening on socket %d Port %d\n",s,tmp_port); +- return(s); +-} +- +-/* +- * Master listens for messages and blocks until +- * something arrives. +- */ +-struct sockaddr_in listener_sync_sock; +- +-#ifdef HAVE_ANSIC_C +-void +-master_listen(int sock, int size_of_message) +-#else +-void +-master_listen(sock, size_of_message) +-int sock, size_of_message; +-#endif +-{ +- int tsize; +- int s; +- struct sockaddr_in *addr; +- unsigned int me; +- int ns,ret; +- struct master_neutral_command *mnc; +- +- mnc=(struct master_neutral_command *)&master_rcv_buf[0]; +- tsize = size_of_message; +- addr=&listener_sync_sock; +- s = sock; +- me=sizeof(struct sockaddr_in); +- +- if(mdebug) +- printf("Master in listening mode on socket %d\n",s); +-again: +- ret=listen(s,MAXSTREAMS); +- if(ret != 0) +- { +- perror("Master: listen returned error\n"); +- } +- if(mdebug) +- printf("Master in accepting connection\n"); +- ns=accept(s,(void *)addr,&me); +- if(ns < 0) +- { +- printf("Master socket %d\n",s); +- perror("Master: ***** accept returned error *****\n"); +- sleep(1); +- goto again; +- } +- if(mdebug) +- printf("Master in reading from connection\n"); +- +- ret=read(ns,mnc,tsize); +- if(ret < tsize) +- { +- printf("Master read failed. Ret %d Errno %d\n",ret,errno); +- } +- +- close(ns); +-} +- +-/* +- * Child sends message to master. +- */ +- +-#ifdef HAVE_ANSIC_C +-void +-child_send(char *controlling_host_name, struct master_command *send_buffer, int send_size) +-#else +-void +-child_send(controlling_host_name, send_buffer, send_size) +-char *controlling_host_name; +-struct master_command *send_buffer; +-int send_size; +-#endif +-{ +- +- int rc,child_socket_val; +- struct hostent *he; +- int tmp_port; +- struct in_addr *ip; +- struct sockaddr_in cs_addr,cs_raddr; +- struct master_neutral_command outbuf; +- struct timespec req,rem; +- +- req.tv_sec = 0; +- req.tv_nsec = 10000000; +- rem.tv_sec = 0; +- rem.tv_nsec = 10000000; +- +- if(cdebug) +- { +- fprintf(newstdout,"Start_child_send: %s Size %d\n",controlling_host_name,send_size); +- fflush(newstdout); +- } +- he = gethostbyname(controlling_host_name); +- if (he == NULL) +- { +- exit(22); +- } +- ip = (struct in_addr *)he->h_addr_list[0]; +- +-over: +- cs_raddr.sin_family = AF_INET; +- cs_raddr.sin_port = htons(controlling_host_port); +- cs_raddr.sin_addr.s_addr = ip->s_addr; +- child_socket_val = socket(AF_INET, SOCK_STREAM, 0); +- if (child_socket_val < 0) +- { +- perror("Child: socket failed:"); +- exit(23); +- } +- bzero(&cs_addr, sizeof(struct sockaddr_in)); +- tmp_port= CHILD_ESEND_PORT; +- cs_addr.sin_port = htons(tmp_port); +- cs_addr.sin_family = AF_INET; +- cs_addr.sin_addr.s_addr = INADDR_ANY; +- rc = -1; +- while (rc < 0) +- { +- rc = bind(child_socket_val, (struct sockaddr *)&cs_addr, +- sizeof(struct sockaddr_in)); +- if(rc < 0) +- { +- tmp_port++; +- cs_addr.sin_port=htons(tmp_port); +- continue; +- } +- } +- if (rc < 0) +- { +- perror("Child: bind failed\n"); +- exit(24); +- } +- if(cdebug) +- { +- fprintf(newstdout,"Child sender bound to port %d Master port %d \n",tmp_port,HOST_LIST_PORT); +- fflush(newstdout); +- } +-again: +- nanosleep(&req,&rem); +- rc = connect(child_socket_val, (struct sockaddr *)&cs_raddr, +- sizeof(struct sockaddr_in)); +- if (rc < 0) +- { +- if((ecount++ < 200) && (errno != EISCONN)) +- { +- nanosleep(&req,&rem); +- /*sleep(1);*/ +- goto again; +- } +- if(cdebug) +- { +- fprintf(newstdout,"Child: connect failed. Errno %d \n",errno); +- fflush(newstdout); +- } +- close(child_socket_val); +- nanosleep(&req,&rem); +- /*sleep(1);*/ +- ecount=0; +- goto over; +- } +- ecount=0; +- if(cdebug) +- { +- fprintf(newstdout,"Child connected\n"); +- fflush(newstdout); +- } +- +- /* NOW send */ +- +- bzero(&outbuf, sizeof(struct master_neutral_command)); +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d sending message to %s \n",(int)chid, controlling_host_name); +- fflush(newstdout); +- } +- /* +- * Convert internal commands to string format to neutral format for portability +- */ +- strcpy(outbuf.m_host_name,send_buffer->m_host_name); +- strcpy(outbuf.m_client_name,send_buffer->m_client_name); +- sprintf(outbuf.m_client_number,"%d",send_buffer->m_client_number); +- sprintf(outbuf.m_client_error,"%d",send_buffer->m_client_error); +- sprintf(outbuf.m_child_port,"%d",send_buffer->m_child_port); +- sprintf(outbuf.m_child_async_port,"%d",send_buffer->m_child_async_port); +- sprintf(outbuf.m_command,"%d",send_buffer->m_command); +- sprintf(outbuf.m_testnum,"%d",send_buffer->m_testnum); +- sprintf(outbuf.m_version,"%d",send_buffer->m_version); +- sprintf(outbuf.m_mygen,"%d",send_buffer->m_mygen); +- sprintf(outbuf.m_throughput,"%f",send_buffer->m_throughput); +- sprintf(outbuf.m_cputime,"%f", send_buffer->m_cputime); +- sprintf(outbuf.m_walltime,"%f",send_buffer->m_walltime); +- sprintf(outbuf.m_stop_flag,"%d",send_buffer->m_stop_flag); +- sprintf(outbuf.m_actual,"%f",send_buffer->m_actual); +-#ifdef NO_PRINT_LLD +- sprintf(outbuf.m_child_flag,"%ld",send_buffer->m_child_flag); +-#else +- sprintf(outbuf.m_child_flag,"%lld",send_buffer->m_child_flag); +-#endif +- rc=write(child_socket_val,&outbuf,sizeof(struct master_neutral_command)); +- if (rc < 0) { +- perror("write failed\n"); +- exit(26); +- } +- close(child_socket_val); +-} +- +- +-/* +- * Master sending message to a child +- * There should be a unique child_socket_val for each +- * child. +- */ +-#ifdef HAVE_ANSIC_C +-void +-master_send(int child_socket_val, char *host_name, struct client_command *send_buffer, int send_size) +-#else +-void +-master_send(child_socket_val, host_name, send_buffer, send_size) +-int child_socket_val; +-char *host_name; +-struct client_command *send_buffer; +-int send_size; +-#endif +-{ +- int rc; +- struct client_neutral_command outbuf; +- +- bzero(&outbuf,sizeof(struct client_neutral_command)); +- if(mdebug) +- { +- printf("Master_neutral_command size = %lu\n",(unsigned long)sizeof(struct master_neutral_command)); +- printf("Client_neutral_command size = %lu\n",(unsigned long)sizeof(struct client_neutral_command)); +- } +- /* +- * Convert internal commands to string format for neutral format/portability +- */ +- strcpy(outbuf.c_host_name,send_buffer->c_host_name); +- strcpy(outbuf.c_pit_hostname,send_buffer->c_pit_hostname); +- strcpy(outbuf.c_pit_service,send_buffer->c_pit_service); +- strcpy(outbuf.c_client_name,send_buffer->c_client_name); +- strcpy(outbuf.c_working_dir,send_buffer->c_working_dir); +- strcpy(outbuf.c_file_name,send_buffer->c_file_name); +- strcpy(outbuf.c_path_dir,send_buffer->c_path_dir); +- strcpy(outbuf.c_execute_name,send_buffer->c_execute_name); +- strcpy(outbuf.c_write_traj_filename,send_buffer->c_write_traj_filename); +- strcpy(outbuf.c_read_traj_filename,send_buffer->c_read_traj_filename); +- sprintf(outbuf.c_oflag,"%d",send_buffer->c_oflag); +- sprintf(outbuf.c_mfflag,"%d",send_buffer->c_mfflag); +- sprintf(outbuf.c_unbuffered,"%d",send_buffer->c_unbuffered); +- sprintf(outbuf.c_noretest,"%d",send_buffer->c_noretest); +- sprintf(outbuf.c_notruncate,"%d",send_buffer->c_notruncate); +- sprintf(outbuf.c_read_sync,"%d",send_buffer->c_read_sync); +- sprintf(outbuf.c_jflag,"%d",send_buffer->c_jflag); +- sprintf(outbuf.c_async_flag,"%d",send_buffer->c_async_flag); +- sprintf(outbuf.c_mmapflag,"%d",send_buffer->c_mmapflag); +- sprintf(outbuf.c_k_flag,"%d",send_buffer->c_k_flag); +- sprintf(outbuf.c_h_flag,"%d",send_buffer->c_h_flag); +- sprintf(outbuf.c_mflag,"%d",send_buffer->c_mflag); +- sprintf(outbuf.c_pflag,"%d",send_buffer->c_pflag); +- sprintf(outbuf.c_stride_flag,"%d",send_buffer->c_stride_flag); +- sprintf(outbuf.c_verify,"%d",send_buffer->c_verify); +- sprintf(outbuf.c_sverify,"%d",send_buffer->c_sverify); +- sprintf(outbuf.c_odsync,"%d",send_buffer->c_odsync); +- sprintf(outbuf.c_diag_v,"%d",send_buffer->c_diag_v); +- sprintf(outbuf.c_dedup,"%d",send_buffer->c_dedup); +- sprintf(outbuf.c_dedup_interior,"%d",send_buffer->c_dedup_interior); +- sprintf(outbuf.c_dedup_compress,"%d",send_buffer->c_dedup_compress); +- sprintf(outbuf.c_dedup_mseed,"%d",send_buffer->c_dedup_mseed); +- sprintf(outbuf.c_hist_summary,"%d",send_buffer->c_hist_summary); +- sprintf(outbuf.c_op_rate,"%d",send_buffer->c_op_rate); +- sprintf(outbuf.c_op_rate_flag,"%d",send_buffer->c_op_rate_flag); +- sprintf(outbuf.c_Q_flag,"%d",send_buffer->c_Q_flag); +- sprintf(outbuf.c_L_flag,"%d",send_buffer->c_L_flag); +- sprintf(outbuf.c_include_flush,"%d",send_buffer->c_include_flush); +- sprintf(outbuf.c_OPS_flag,"%d",send_buffer->c_OPS_flag); +- sprintf(outbuf.c_mmapnsflag,"%d",send_buffer->c_mmapnsflag); +- sprintf(outbuf.c_mmapssflag,"%d",send_buffer->c_mmapssflag); +- sprintf(outbuf.c_mmapasflag,"%d",send_buffer->c_mmapasflag); +- sprintf(outbuf.c_no_copy_flag,"%d",send_buffer->c_no_copy_flag); +- sprintf(outbuf.c_include_close,"%d",send_buffer->c_include_close); +- sprintf(outbuf.c_disrupt_flag,"%d",send_buffer->c_disrupt_flag); +- sprintf(outbuf.c_compute_flag,"%d",send_buffer->c_compute_flag); +- sprintf(outbuf.c_xflag,"%d",send_buffer->c_xflag); +- sprintf(outbuf.c_MS_flag,"%d",send_buffer->c_MS_flag); +- sprintf(outbuf.c_mmap_mix,"%d",send_buffer->c_mmap_mix); +- sprintf(outbuf.c_Kplus_flag,"%d",send_buffer->c_Kplus_flag); +- sprintf(outbuf.c_w_traj_flag,"%d",send_buffer->c_w_traj_flag); +- sprintf(outbuf.c_r_traj_flag,"%d",send_buffer->c_r_traj_flag); +- sprintf(outbuf.c_direct_flag,"%d",send_buffer->c_direct_flag); +- sprintf(outbuf.c_cpuutilflag,"%d",send_buffer->c_cpuutilflag); +- sprintf(outbuf.c_seq_mix,"%d",send_buffer->c_seq_mix); +- sprintf(outbuf.c_client_number,"%d",send_buffer->c_client_number); +- sprintf(outbuf.c_command,"%d",send_buffer->c_command); +- sprintf(outbuf.c_testnum,"%d",send_buffer->c_testnum); +- sprintf(outbuf.c_no_unlink,"%d",send_buffer->c_no_unlink); +- sprintf(outbuf.c_no_write,"%d",send_buffer->c_no_write); +- sprintf(outbuf.c_file_lock,"%d",send_buffer->c_file_lock); +- sprintf(outbuf.c_rec_lock,"%d",send_buffer->c_rec_lock); +- sprintf(outbuf.c_Kplus_readers,"%d",send_buffer->c_Kplus_readers); +- sprintf(outbuf.c_multiplier,"%d",send_buffer->c_multiplier); +- sprintf(outbuf.c_share_file,"%d",send_buffer->c_share_file); +- sprintf(outbuf.c_pattern,"%d",send_buffer->c_pattern); +- sprintf(outbuf.c_version,"%d",send_buffer->c_version); +- sprintf(outbuf.c_base_time,"%d",send_buffer->c_base_time); +- sprintf(outbuf.c_num_child,"%d",send_buffer->c_num_child); +- sprintf(outbuf.c_pct_read,"%d",send_buffer->c_pct_read); +- sprintf(outbuf.c_advise_op,"%d",send_buffer->c_advise_op); +- sprintf(outbuf.c_advise_flag,"%d",send_buffer->c_advise_flag); +- sprintf(outbuf.c_restf,"%d",send_buffer->c_restf); +- sprintf(outbuf.c_mygen,"%d",send_buffer->c_mygen); +-#ifdef NO_PRINT_LLD +- sprintf(outbuf.c_stride,"%ld",send_buffer->c_stride); +- sprintf(outbuf.c_rest_val,"%ld",send_buffer->c_rest_val); +- sprintf(outbuf.c_delay,"%ld",send_buffer->c_delay); +- sprintf(outbuf.c_purge,"%ld",send_buffer->c_purge); +- sprintf(outbuf.c_fetchon,"%ld",send_buffer->c_fetchon); +- sprintf(outbuf.c_numrecs64,"%ld",send_buffer->c_numrecs64); +- sprintf(outbuf.c_reclen,"%ld",send_buffer->c_reclen); +- sprintf(outbuf.c_child_flag,"%ld",send_buffer->c_child_flag); +- sprintf(outbuf.c_delay_start,"%ld",send_buffer->c_delay_start); +- sprintf(outbuf.c_depth,"%ld",send_buffer->c_depth); +-#else +- sprintf(outbuf.c_delay,"%lld",send_buffer->c_delay); +- sprintf(outbuf.c_stride,"%lld",send_buffer->c_stride); +- sprintf(outbuf.c_rest_val,"%lld",send_buffer->c_rest_val); +- sprintf(outbuf.c_purge,"%lld",send_buffer->c_purge); +- sprintf(outbuf.c_fetchon,"%lld",send_buffer->c_fetchon); +- sprintf(outbuf.c_numrecs64,"%lld",send_buffer->c_numrecs64); +- sprintf(outbuf.c_reclen,"%lld",send_buffer->c_reclen); +- sprintf(outbuf.c_child_flag,"%lld",send_buffer->c_child_flag); +- sprintf(outbuf.c_delay_start,"%lld",send_buffer->c_delay_start); +- sprintf(outbuf.c_depth,"%lld",send_buffer->c_depth); +-#endif +- sprintf(outbuf.c_stop_flag,"%d",send_buffer->c_stop_flag); +- sprintf(outbuf.c_compute_time,"%f",send_buffer->c_compute_time); +- +- if(mdebug >= 1) +- printf("Master sending message to %s \n",host_name); +- /*rc = send(child_socket_val, (char *)&outbuf, sizeof(struct client_neutral_command), 0);*/ +- rc = write(child_socket_val, (char *)&outbuf, sizeof(struct client_neutral_command)); +- if (rc < 0) +- { +- perror("write failed\n"); +- exit(26); +- } +-} +- +-/* +- * Close the childs listening port for messages from the master. +- */ +-#ifdef HAVE_ANSIC_C +-void +-stop_child_listen(int child_socket_val) +-#else +-void +-stop_child_listen(child_socket_val) +-int child_socket_val; +-#endif +-{ +- close(child_socket_val); +-} +- +-/* +- * Close the childs channel for sending messages to the master. +- */ +-#ifdef HAVE_ANSIC_C +-void +-O_stop_child_send(int child_socket_val) +-#else +-void +-O_stop_child_send(child_socket_val) +-int child_socket_val; +-#endif +-{ +- close(child_socket_val); +-} +- +-/* +- * Close the masters listening channel for all clients messages. +- */ +-#ifdef HAVE_ANSIC_C +-void +-stop_master_listen(int master_socket_val) +-#else +-void +-stop_master_listen(master_socket_val) +-int master_socket_val; +-#endif +-{ +- if(mdebug) +- printf("Stop master listen\n"); +-/* +- shutdown(master_socket_val,SHUT_RDWR); +-*/ +- close(master_socket_val); +- master_socket_val = 0; +-} +- +-/* +- * Close the masters send channel a particular child. +- */ +-#ifdef HAVE_ANSIC_C +-void +-stop_master_send(int child_socket_val) +-#else +-void +-stop_master_send(child_socket_val) +-int child_socket_val; +-#endif +-{ +- close(child_socket_val); +-} +- +-/* +- * Start the childs listening service for messages from the master. +- */ +-#ifdef HAVE_ANSIC_C +-int +-start_child_listen(int size_of_message) +-#else +-int +-start_child_listen(size_of_message) +-int size_of_message; +-#endif +-{ +- int tsize; +- int s; +- int rc; +- int xx; +- int tmp_port; +- int sockerr; +- int recv_buf_size=65536; +- int optval=1; +- struct linger dummy={1,0}; +- xx = 0; +- tsize=size_of_message; /* Number of messages to receive */ +- s = socket(AF_INET, SOCK_STREAM, 0); +- if (s < 0) +- { +- perror("socket failed:"); +- exit(19); +- } +- sockerr = setsockopt (s, SOL_SOCKET, SO_RCVBUF, (char *) +- &recv_buf_size, sizeof(int)); +- if ( sockerr == -1 ) { +- perror("Error in setsockopt 3\n"); +- } +- sockerr = setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *) +- &optval, sizeof(int)); +- if ( sockerr == -1 ) { +- perror("Error in setsockopt 4\n"); +- } +- sockerr = setsockopt (s, SOL_SOCKET, SO_LINGER, (char *) +- &dummy, sizeof(struct linger)); +- if ( sockerr == -1 ) { +- perror("Error in setsockopt 4\n"); +- } +- bzero(&child_sync_sock, sizeof(struct sockaddr_in)); +- tmp_port=CHILD_LIST_PORT+chid; +- child_sync_sock.sin_port = htons(tmp_port); +- child_sync_sock.sin_family = AF_INET; +- child_sync_sock.sin_addr.s_addr = INADDR_ANY; +- rc = -1; +- while (rc < 0) +- { +- rc = bind(s, (struct sockaddr *)&child_sync_sock, +- sizeof(struct sockaddr_in)); +- if(rc < 0) +- { +- tmp_port++; +- child_sync_sock.sin_port=htons(tmp_port); +- continue; +- } +- } +- child_port = ntohs(child_sync_sock.sin_port); +- if(cdebug ==1) +- { +- fprintf(newstdout,"Child %d: Listen: Bound at port %d\n",(int)chid, tmp_port); +- fflush(newstdout); +- } +- if(rc < 0) +- { +- fprintf(newstdout,"Child bind failed. Errno %d\n",errno); +- fflush(newstdout); +- exit(20); +- } +- return(s); +-} +-#ifdef HAVE_ANSIC_C +-int +-child_attach(int s, int flag) +-#else +-int +-child_attach(s, flag) +-int s,flag; +-#endif +-{ +- unsigned int me; +- int ns; +- struct sockaddr_in *addr; +- if(flag) +- { +- addr=&child_async_sock; +- if(cdebug) +- { +- fprintf(newstdout,"Child %d attach async\n",(int)chid); +- fflush(newstdout); +- } +- } +- else +- { +- addr=&child_sync_sock; +- if(cdebug) +- { +- fprintf(newstdout,"Child %d attach sync\n",(int)chid); +- fflush(newstdout); +- } +- } +- me=sizeof(struct sockaddr_in); +- if(cdebug) +- { +- printf("Child %d enters listen\n",(int)chid); +- fflush(stdout); +- } +- listen(s,10); +- if(cdebug) +- { +- fprintf(newstdout,"Child %d enters accept\n",(int)chid); +- fflush(newstdout); +- } +- ns=accept(s,(void *)addr,&me); +- if(cdebug) +- { +- fprintf(newstdout,"Child %d attached for receive. Sock %d %d\n", +- (int)chid, ns,errno); +- fflush(newstdout); +- } +- return(ns); +-} +- +- +-/* +- * The clients use this to block waiting for a message from +- * the master. +- */ +-#ifdef HAVE_ANSIC_C +-void +-child_listen(int sock, int size_of_message) +-#else +-void +-child_listen(sock, size_of_message) +-int sock, size_of_message; +-#endif +-{ +- int tsize; +- int rcvd; +- int s; +- int rc; +- char *cnc; +- +- cnc = (char *)&child_rcv_buf[0]; +- bzero(cnc, sizeof(child_rcv_buf)); +- s = sock; +- tsize=size_of_message; /* Number of messages to receive */ +- rcvd = 0; +- while(rcvd < tsize) +- { +- if(cdebug ==1) +- { +- fprintf(newstdout,"Child %d In recieve \n",(int)chid); +- fflush(newstdout); +- } +- rc=read(s,cnc,size_of_message); +- if(rc < 0) +- { +- fprintf(newstdout,"Read failed. Errno %d \n",errno); +- fflush(newstdout); +- exit(21); +- } +- if(cdebug >= 1) +- { +- fprintf(newstdout,"Child %d: Got %d bytes\n",(int)chid, rc); +- fflush(newstdout); +- } +- rcvd+=rc; +- cnc+=rc; +- } +- if(cdebug >= 1) +- { +- fprintf(newstdout,"Child %d: return from listen\n",(int)chid); +- fflush(newstdout); +- } +-} +-/* +- * Start the childs async listening service for messages from the master. +- */ +-#ifdef HAVE_ANSIC_C +-int +-start_child_listen_async(int size_of_message) +-#else +-int +-start_child_listen_async(size_of_message) +-int size_of_message; +-#endif +-{ +- int tsize; +- int s; +- int rc; +- int xx; +- int tmp_port; +- int sockerr; +- int recv_buf_size=65536; +- int optval=1; +- xx = 0; +- tsize=size_of_message; /* Number of messages to receive */ +- s = socket(AF_INET, SOCK_STREAM, 0); +- if (s < 0) +- { +- perror("socket failed:"); +- exit(19); +- } +- sockerr = setsockopt (s, SOL_SOCKET, SO_RCVBUF, (char *) +- &recv_buf_size, sizeof(int)); +- if ( sockerr == -1 ) { +- perror("Error in setsockopt 5\n"); +- } +- sockerr = setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *) +- &optval, sizeof(int)); +- if ( sockerr == -1 ) { +- perror("Error in setsockopt 6\n"); +- } +- bzero(&child_async_sock, sizeof(struct sockaddr_in)); +- tmp_port=CHILD_ALIST_PORT; +- child_async_sock.sin_port = htons(tmp_port); +- child_async_sock.sin_family = AF_INET; +- child_async_sock.sin_addr.s_addr = INADDR_ANY; +- rc = -1; +- while (rc < 0) +- { +- rc = bind(s, (struct sockaddr *)&child_async_sock, +- sizeof(struct sockaddr_in)); +- if(rc < 0) +- { +- tmp_port++; +- child_async_sock.sin_port=htons(tmp_port); +- continue; +- } +- } +- child_async_port = ntohs(child_async_sock.sin_port); +- if(cdebug ==1) +- { +- fprintf(newstdout,"Child %d: Async Listen: Bound at port %d\n", +- (int)chid,tmp_port); +- fflush(newstdout); +- } +- if(rc < 0) +- { +- fprintf(newstdout,"bind failed. Errno %d \n",errno); +- fflush(newstdout); +- exit(20); +- } +- return(s); +-} +-/* +- * The clients use this to block waiting for an async message from +- * the master. +- */ +-#ifdef HAVE_ANSIC_C +-void +-child_listen_async(int sock, int size_of_message) +-#else +-void +-child_listen_async(sock, size_of_message) +-int sock, size_of_message; +-#endif +-{ +- int tsize; +- int rcvd; +- int s; +- int rc; +- char *cnc; +- +- cnc = &child_async_rcv_buf[0]; +- s = sock; +- tsize=size_of_message; /* Number of messages to receive */ +- rcvd = 0; +- while(rcvd < tsize) +- { +- if(cdebug ==1) +- { +- fprintf(newstdout,"Child %d In async recieve \n",(int)chid); +- fflush(newstdout); +- } +- rc=read(s,cnc,size_of_message); +- if(rc < 0) +- { +- fprintf(newstdout,"Read failed. Errno %d \n",errno); +- fflush(newstdout); +- exit(21); +- } +- /* Special case. If master gets final results, it can +- exit, and close the connection to the async child +- too quickly. When this happens the child gets a +- read() that returns 0. It just needs to exit here. +- */ +- if(rc==0) +- exit(0); +- if(cdebug >= 1) +- { +- fprintf(newstdout,"Child %d: Got %d bytes (async) \n",(int)chid,rc); +- fflush(newstdout); +- } +- rcvd+=rc; +- cnc+=rc; +- } +- if(cdebug >= 1) +- { +- fprintf(newstdout,"Child %d: return from async listen\n",(int)chid); +- fflush(newstdout); +- } +-} +- +-/* +- * Start the channel for the master to send a message to +- * a particular child on a particular port that the child +- * has created for the parent to use to communicate. +- */ +-#ifdef HAVE_ANSIC_C +-int +-start_master_send(char *child_host_name, int child_port, struct in_addr *my_s_addr) +-#else +-int +-start_master_send(child_host_name, child_port, my_s_addr) +-char *child_host_name; +-int child_port; +-struct in_addr *my_s_addr; +-#endif +-{ +- int rc,master_socket_val; +- struct sockaddr_in addr,raddr; +- struct hostent *he; +- int port,tmp_port; +- int ecount = 0; +- struct in_addr *ip; +- struct timespec req,rem; +- +- req.tv_sec = 0; +- req.tv_nsec = 10000000; +- rem.tv_sec = 0; +- rem.tv_nsec = 10000000; +- +- he = gethostbyname(child_host_name); +- if (he == NULL) +- { +- printf("Master: Bad hostname >%s<\n",child_host_name); +- fflush(stdout); +- exit(22); +- } +- if(mdebug ==1) +- { +- printf("Master: start master send: %s\n", he->h_name); +- fflush(stdout); +- } +- ip = (struct in_addr *)he->h_addr_list[0]; +-#ifndef UWIN +- if(mdebug ==1) +- { +- printf("Master: child name: %s\n", (char *)inet_ntoa(*ip)); +- printf("Master: child Port: %d\n", child_port); +- fflush(stdout); +- } +-#endif +- +- port=child_port; +- my_s_addr->s_addr = ip->s_addr; +- /*port=CHILD_LIST_PORT;*/ +- +- raddr.sin_family = AF_INET; +- raddr.sin_port = htons(port); +- raddr.sin_addr.s_addr = ip->s_addr; +- master_socket_val = socket(AF_INET, SOCK_STREAM, 0); +- if (master_socket_val < 0) +- { +- perror("Master: socket failed:"); +- exit(23); +- } +- bzero(&addr, sizeof(struct sockaddr_in)); +- tmp_port=HOST_ESEND_PORT; +- addr.sin_port = htons(tmp_port); +- addr.sin_family = AF_INET; +- addr.sin_addr.s_addr = INADDR_ANY; +- rc = -1; +- while (rc < 0) +- { +- rc = bind(master_socket_val, (struct sockaddr *)&addr, +- sizeof(struct sockaddr_in)); +- if(rc < 0) +- { +- tmp_port++; +- addr.sin_port=htons(tmp_port); +- continue; +- } +- } +- if(mdebug ==1) +- { +- printf("Master: Bound port\n"); +- fflush(stdout); +- } +- if (rc < 0) +- { +- perror("Master: bind failed for sync channel to child.\n"); +- exit(24); +- } +- nanosleep(&req,&rem); +-again: +- rc = connect(master_socket_val, (struct sockaddr *)&raddr, +- sizeof(struct sockaddr_in)); +- if (rc < 0) +- { +- if(ecount++ < 300) +- { +- nanosleep(&req,&rem); +- /*sleep(1);*/ +- goto again; +- } +- perror("Master: connect failed\n"); +- printf("Error %d\n",errno); +- exit(25); +- } +- if(mdebug ==1) +- { +- printf("Master Connected\n"); +- fflush(stdout); +- } +- return (master_socket_val); +-} +-/* +- * Start the channel for the master to send a message to +- * a particular child on a particular port that the child +- * has created for the parent to use to communicate. +- */ +-#ifdef HAVE_ANSIC_C +-int +-start_master_send_async(char *child_host_name, int child_port, struct in_addr my_s_addr) +-#else +-int +-start_master_send_async(child_host_name, child_port, my_s_addr) +-char *child_host_name; +-int child_port; +-struct in_addr my_s_addr; +-#endif +-{ +- int rc,master_socket_val; +- struct sockaddr_in addr,raddr; +- int port,tmp_port; +- int ecount = 0; +- struct timespec req,rem; +- +- req.tv_sec = 0; +- req.tv_nsec = 10000000; +- rem.tv_sec = 0; +- rem.tv_nsec = 10000000; +- +- +- port=child_port; +- nanosleep(&req,&rem); +- +-over: +- raddr.sin_family = AF_INET; +- raddr.sin_port = htons(port); +- raddr.sin_addr.s_addr = my_s_addr.s_addr; +- master_socket_val = socket(AF_INET, SOCK_STREAM, 0); +- if (master_socket_val < 0) +- { +- perror("Master: async socket failed:"); +- exit(23); +- } +- bzero(&addr, sizeof(struct sockaddr_in)); +- tmp_port=HOST_ASEND_PORT; +- addr.sin_port = htons(tmp_port); +- addr.sin_family = AF_INET; +- addr.sin_addr.s_addr = INADDR_ANY; +- rc = -1; +- while (rc < 0) +- { +- rc = bind(master_socket_val, (struct sockaddr *)&addr, +- sizeof(struct sockaddr_in)); +- if(rc < 0) +- { +- tmp_port++; +- addr.sin_port=htons(tmp_port); +- continue; +- } +- } +- if(mdebug ==1) +- { +- printf("Master: Bound async port\n"); +- fflush(stdout); +- } +- if (rc < 0) +- { +- perror("Master: bind async failed\n"); +- exit(24); +- } +-again: +- +- rc = connect(master_socket_val, (struct sockaddr *)&raddr, +- sizeof(struct sockaddr_in)); +- if (rc < 0) +- { +- if(ecount++ < 300) +- { +- /* Really need this sleep for Windows */ +-#if defined (Windows) +- sleep(1); +-#else +- nanosleep(&req,&rem); +-#endif +- goto again; +- } +- perror("Master: async connect failed\n"); +- close(master_socket_val); +-#if defined (Windows) +- sleep(1); +-#else +- nanosleep(&req,&rem); +-#endif +- /*sleep(1);*/ +- ecount=0; +- goto over; +- } +- if(mdebug ==1) +- { +- printf("Master async Connected\n"); +- fflush(stdout); +- } +- return (master_socket_val); +-} +- +-/* +- * If not "distributed" then call fork. The "distributed" +- * will start iozone on a remote node. +- */ +-#ifdef HAVE_ANSIC_C +-long long +-start_child_proc(int testnum,long long numrecs64, long long reclen) +-#else +-long long +-start_child_proc(testnum, numrecs64, reclen) +-int testnum; +-long long numrecs64, reclen; +-#endif +-{ +- long long x; +- if(distributed && master_iozone) +- { +- x=(long long)pick_client(testnum,numrecs64, reclen); +- } +- else +- { +- x=(long long)fork(); +- } +- if(mdebug) +- printf("Starting proc %d\n",(int)x); +- return(x); +-} +- +-/* +- * This function picks a client from the list of clients and +- * starts it running on the remote machine. It also waits for +- * the remote process to join and then sends the client +- * the state information it needs to begin to run the +- * test. The client will initialize its state space, +- * begin the test and block as the barrier waiting +- * for the master to say go. +- */ +-#ifdef HAVE_ANSIC_C +-int +-pick_client(int testnum,long long numrecs64, long long reclen) +-#else +-int +-pick_client(testnum, numrecs64, reclen) +-int testnum; +-long long numrecs64, reclen; +-#endif +-{ +- int x; +- int c_command,child_index; +- struct client_command cc; +- struct master_command mc; +- struct master_neutral_command *mnc; +- char command[512]; +- struct in_addr my_s_addr; +- char my_port_num[10]; +- +- +- bzero(&cc,sizeof(struct client_command)); +- for(x=0;x<512;x++) +- command[x]=0; +- +- current_client_number++; /* Need to start with 1 */ +- x=current_client_number; +- +- child_idents[x-1].state = C_STATE_ZERO; +- /* Step 1. Now start client going on remote node. */ +- +- find_remote_shell(remote_shell); +- sprintf(command,"%s ",remote_shell); +- strcat(command,child_idents[x-1].child_name); +- strcat(command," -n '"); +- strcat(command,child_idents[x-1].execute_path); +- strcat(command," -+s -t 1 -r 4 -s 4 -+c "); +- strcat(command,controlling_host_name); +- if (master_listen_port != HOST_LIST_PORT) +- { +- sprintf(my_port_num," -+i %d",master_listen_port); +- strcat(command,my_port_num); +- } +- strcat(command," '"); +- junk=system(command); +-/* +- system("remsh rsnperf '/home/capps/niozone/iozone -+s -t 1 -r 4 -s 8 -+c rsnperf'"); +- +-*/ +- if(mdebug) +- printf("%s",command); +- /* Format example: */ +- /* */ +- /* system("remsh rsnperf '/home/capps/niozone/iozone */ +- /* -+s -t 1 -r 4 -s 8 -+c rsnperf'"); */ +- /* */ +- +- /* Step 2. Wait for join from new client. */ +- +- child_idents[x-1].state = C_STATE_WAIT_WHO; +- +- if(mdebug>=1) +- printf("\nMaster listening for child to send join message.\n"); +- master_listen(master_listen_socket,sizeof(struct master_neutral_command)); +- mnc = (struct master_neutral_command *)&master_rcv_buf[0]; +- +- /* +- * Convert from string format back to internal representation +- */ +- sscanf(mnc->m_child_port,"%d",&mc.m_child_port); +- sscanf(mnc->m_child_async_port,"%d",&mc.m_child_async_port); +- sscanf(mnc->m_command,"%d",&mc.m_command); +- sscanf(mnc->m_version,"%d",&mc.m_version); +- if(mc.m_version != proto_version) +- { +- printf("Client > %s < is not running the same version of Iozone !! C%d M%d\n", child_idents[x-1].child_name, mc.m_version, proto_version); +- } +- +- c_port = mc.m_child_port; +- a_port = mc.m_child_async_port; +- c_command = mc.m_command; +- if(mdebug>=1) +- { +- printf("Master back from listen child Joined.\n"); +- printf("Master: Command %d\n",c_command); +- } +- /* Step 3. Then start_master_send() for this client. */ +- +- if(mdebug>=1) +- printf("Starting master send channel\n"); +- master_send_sockets[x-1]= start_master_send(child_idents[x-1].child_name,c_port, +- &my_s_addr); +- if(mdebug>=1) +- printf("Starting master send async channel\n"); +- master_send_async_sockets[x-1]= start_master_send_async(child_idents[x-1].child_name,a_port, +- my_s_addr); +- +- child_idents[x-1].master_socket_num = master_send_sockets[x-1]; +- child_idents[x-1].master_async_socket_num = master_send_async_sockets[x-1]; +- child_idents[x-1].child_number = x-1; +- child_idents[x-1].child_port = c_port; +- child_idents[x-1].child_async_port = a_port; +- +- /* */ +- /* Step 4. Send message to client telling him his name, number, */ +- /* rsize, fsize, and test to run. */ +- strcpy(cc.c_host_name ,controlling_host_name); +- strcpy(cc.c_pit_hostname ,pit_hostname); +- strcpy(cc.c_pit_service ,pit_service); +- strcpy(cc.c_client_name ,child_idents[x-1].child_name); +- strcpy(cc.c_working_dir ,child_idents[x-1].workdir); +- strcpy(cc.c_file_name ,child_idents[x-1].file_name); +- strcpy(cc.c_write_traj_filename ,write_traj_filename); +- strcpy(cc.c_read_traj_filename ,read_traj_filename); +- cc.c_command = R_JOIN_ACK; +- cc.c_client_number = x-1; +- cc.c_testnum = testnum; +- cc.c_numrecs64 = numrecs64; +- cc.c_reclen = reclen; +- cc.c_oflag = oflag; +- cc.c_mfflag = mfflag; +- cc.c_unbuffered = unbuffered; +- cc.c_noretest = noretest; +- cc.c_notruncate = notruncate; +- cc.c_read_sync = read_sync; +- cc.c_jflag = jflag; +- cc.c_direct_flag = direct_flag; +- cc.c_cpuutilflag = cpuutilflag; +- cc.c_seq_mix = seq_mix; +- cc.c_async_flag = async_flag; +- cc.c_k_flag = k_flag; +- cc.c_h_flag = h_flag; +- cc.c_mflag = mflag; +- cc.c_pflag = pflag; +- cc.c_stride_flag = stride_flag; +- cc.c_fetchon = fetchon; +- cc.c_verify = verify; +- cc.c_sverify = sverify; +- cc.c_odsync = odsync; +- cc.c_diag_v = diag_v; +- cc.c_dedup = dedup; +- cc.c_dedup_interior = dedup_interior; +- cc.c_dedup_compress = dedup_compress; +- cc.c_dedup_mseed = dedup_mseed; +- cc.c_hist_summary = hist_summary; +- cc.c_op_rate = op_rate; +- cc.c_op_rate_flag = op_rate_flag; +- cc.c_file_lock = file_lock; +- cc.c_rec_lock = rlocking; +- cc.c_Kplus_readers = Kplus_readers; +- cc.c_multiplier = multiplier; +- cc.c_share_file = share_file; +- cc.c_pattern = pattern; +- cc.c_version = proto_version; +- cc.c_base_time = base_time; +- cc.c_num_child = (int)num_child; +- cc.c_pct_read = pct_read; +- cc.c_advise_op = advise_op; +- cc.c_advise_flag = advise_flag; +- cc.c_restf = restf; +- cc.c_mygen = mygen; +- cc.c_Q_flag = Q_flag; +- cc.c_L_flag = L_flag; +- cc.c_xflag = xflag; +- cc.c_w_traj_flag = w_traj_flag; +- cc.c_r_traj_flag = r_traj_flag; +- cc.c_include_flush = include_flush; +- cc.c_OPS_flag = OPS_flag; +- cc.c_purge = purge; +- cc.c_mmapflag = mmapflag; +- cc.c_mmapasflag = mmapasflag; +- cc.c_mmapnsflag = mmapnsflag; +- cc.c_mmapssflag = mmapssflag; +- cc.c_no_copy_flag = no_copy_flag; +- cc.c_no_unlink = no_unlink; +- cc.c_no_write = no_write; +- cc.c_include_close = include_close; +- cc.c_disrupt_flag = disrupt_flag; +- cc.c_compute_flag = compute_flag; +- cc.c_delay = delay; +- cc.c_stride = stride; +- cc.c_rest_val = rest_val; +- cc.c_delay_start = delay_start; +- cc.c_compute_time = compute_time; +- cc.c_depth = depth; +- cc.c_MS_flag = MS_flag; +- cc.c_mmap_mix = mmap_mix; +- cc.c_Kplus_flag = Kplus_flag; +- +- +- if(mdebug) +- printf("Master sending client who he is\n"); +- master_send(master_send_sockets[x-1],cc.c_client_name, &cc,sizeof(struct client_command)); +- +- child_idents[x-1].state = C_STATE_WAIT_BARRIER; +- +- /* */ +- /* Step 5. Wait until you receive message that the chile is at */ +- /* the barrier. */ +- if(mdebug>=1) +- printf("Master listening for child to send at barrier message.\n"); +- master_listen(master_listen_socket,sizeof(struct master_neutral_command)); +- mnc = (struct master_neutral_command *)&master_rcv_buf[0]; +- /* +- * Convert from string back to arch specific +- */ +- sscanf(mnc->m_client_number,"%d",&mc.m_client_number); +-#ifdef NO_PRINT_LLD +- sscanf(mnc->m_child_flag,"%ld",&mc.m_child_flag); +-#else +- sscanf(mnc->m_child_flag,"%lld",&mc.m_child_flag); +-#endif +- +- child_index = mc.m_client_number; +- child_stat = (struct child_stats *)&shmaddr[child_index]; +- child_stat->flag = (long long)(mc.m_child_flag); +- if(mdebug>=1) +- printf("Master sees child %d at barrier message.\n",child_index); +- +- return(x); /* Tell code above that it is the parent returning */ +-} +- +-/****************************************************************************************/ +-/* This is the code that the client will use when it */ +-/* gets started via remote shell. It is activated by the -+c controller_name option. */ +-/* */ +-/* The steps to this process are: */ +-/* 1. Start client receive channel */ +-/* 2. Start client send channel */ +-/* 3. Send message to controller saying I'm joining. */ +-/* 4. Go into a loop and get all instructions from */ +-/* 5. Get state information from the master */ +-/* 6. Change to the working directory */ +-/* 7. Run the test */ +-/* 8. Release the listen and send sockets to the master */ +-/* */ +-/****************************************************************************************/ +-#ifdef HAVE_ANSIC_C +-void +-become_client(void) +-#else +-void +-become_client() +-#endif +-{ +- int x,testnum; +- struct master_command mc; +- struct client_command cc; +- struct client_neutral_command *cnc; +- char client_name[100]; +- char *workdir; +- +- bzero(&mc,sizeof(struct master_command)); +- x=fork(); /* Become a daemon so that remote shell will return. */ +- if(x != 0) +- exit(0); +- /* +- * I am the child +- */ +- (void)gethostname(client_name,100); +- +- fflush(stdout); +- fflush(stderr); +- if(cdebug) +- { +- newstdin=freopen("/tmp/don_in","r+",stdin); +- newstdout=freopen("/tmp/don_out","a+",stdout); +- newstderr=freopen("/tmp/don_err","a+",stderr); +- } +- else +- { +- fclose(stdin); +- fclose(stdout); +- fclose(stderr); +- } +- if(cdebug>=1) +- { +- fprintf(newstdout,"My name = %s, Controller's name = %s\n",client_name, controlling_host_name); +- fflush(newstdout); +- } +- +- /* 1. Start client receive channel */ +- +- l_sock = start_child_listen(sizeof(struct client_neutral_command)); +- l_async_sock = start_child_listen_async(sizeof(struct client_neutral_command)); +- +- /* 2. Send message to controller saying I'm joining. */ +- +- strcpy(mc.m_host_name,controlling_host_name); +- strcpy(mc.m_client_name,client_name); +- mc.m_child_port = child_port; +- mc.m_child_async_port = child_async_port; +- mc.m_command = R_CHILD_JOIN; +- mc.m_version = proto_version; +- +- if(cdebug) +- { +- fprintf(newstdout,"Child %s sends JOIN to master %s Host Port %d\n", +- client_name,controlling_host_name,controlling_host_port); +- fflush(newstdout); +- } +- child_send(controlling_host_name,(struct master_command *)&mc, sizeof(struct master_command)); +- +- l_sock=child_attach(l_sock,0); +- l_async_sock=child_attach(l_async_sock,1); +- +- /* 4. Go into a loop and get all instructions from */ +- /* the controlling process. */ +- +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %s waiting for who am I\n",client_name); +- fflush(newstdout); +- } +- child_listen(l_sock,sizeof(struct client_neutral_command)); +- cnc = (struct client_neutral_command *)&child_rcv_buf; +- bzero(&cc, sizeof(struct client_command)); +- +- /* Convert from string format to arch format */ +- sscanf(cnc->c_command,"%d",&cc.c_command); +- sscanf(cnc->c_client_name,"%s",cc.c_client_name); +- sscanf(cnc->c_client_number,"%d",&cc.c_client_number); +- sscanf(cnc->c_host_name,"%s",cc.c_host_name); +- sscanf(cnc->c_pit_hostname,"%s",cc.c_pit_hostname); +- +- if(cc.c_command == R_TERMINATE || cc.c_command==R_DEATH) +- { +- if(cdebug) +- { +- fprintf(newstdout,"Child %d received terminate on sync channel !!\n",(int)chid); +- fflush(newstdout); +- } +- exit(1); +- } +- +- if(cdebug) +- { +- fprintf(newstdout,"Child sees: \n Client name %s \n Client_num # %d \n Host_name %s\n" +- ,cc.c_client_name,cc.c_client_number,cc.c_host_name); +- fflush(newstdout); +- } +- +- /* +- * Now import all of the values of the flags that the child on this +- * machine needs to be able to run the test requested. +- */ +- +- /* 5. Get state information from the master */ +- +-#ifdef NO_PRINT_LLD +- sscanf(cnc->c_numrecs64,"%ld",&cc.c_numrecs64); +- sscanf(cnc->c_reclen,"%ld",&cc.c_reclen); +- sscanf(cnc->c_fetchon,"%ld",&cc.c_fetchon); +- sscanf(cnc->c_purge,"%ld",&cc.c_purge); +- sscanf(cnc->c_delay,"%ld",&cc.c_delay); +- sscanf(cnc->c_stride,"%ld",&cc.c_stride); +- sscanf(cnc->c_rest_val,"%ld",&cc.c_rest_val); +- sscanf(cnc->c_delay_start,"%ld",&cc.c_delay_start); +- sscanf(cnc->c_depth,"%ld",&cc.c_depth); +-#else +- sscanf(cnc->c_numrecs64,"%lld",&cc.c_numrecs64); +- sscanf(cnc->c_reclen,"%lld",&cc.c_reclen); +- sscanf(cnc->c_fetchon,"%lld",&cc.c_fetchon); +- sscanf(cnc->c_purge,"%lld",&cc.c_purge); +- sscanf(cnc->c_delay,"%lld",&cc.c_delay); +- sscanf(cnc->c_stride,"%lld",&cc.c_stride); +- sscanf(cnc->c_rest_val,"%lld",&cc.c_rest_val); +- sscanf(cnc->c_delay_start,"%lld",&cc.c_delay_start); +- sscanf(cnc->c_depth,"%lld",&cc.c_depth); +-#endif +- sscanf(cnc->c_pit_hostname,"%s",cc.c_pit_hostname); +- sscanf(cnc->c_pit_service,"%s",cc.c_pit_service); +- sscanf(cnc->c_testnum,"%d",&cc.c_testnum); +- sscanf(cnc->c_client_number,"%d",&cc.c_client_number); +- sscanf(cnc->c_working_dir,"%s",cc.c_working_dir); +- sscanf(cnc->c_file_name,"%s",cc.c_file_name); +- sscanf(cnc->c_write_traj_filename,"%s",cc.c_write_traj_filename); +- sscanf(cnc->c_read_traj_filename,"%s",cc.c_read_traj_filename); +- sscanf(cnc->c_noretest,"%d",&cc.c_noretest); +- sscanf(cnc->c_notruncate,"%d",&cc.c_notruncate); +- sscanf(cnc->c_read_sync,"%d",&cc.c_read_sync); +- sscanf(cnc->c_jflag,"%d",&cc.c_jflag); +- sscanf(cnc->c_direct_flag,"%d",&cc.c_direct_flag); +- sscanf(cnc->c_cpuutilflag,"%d",&cc.c_cpuutilflag); +- sscanf(cnc->c_seq_mix,"%d",&cc.c_seq_mix); +- sscanf(cnc->c_async_flag,"%d",&cc.c_async_flag); +- sscanf(cnc->c_k_flag,"%d",&cc.c_k_flag); +- sscanf(cnc->c_h_flag,"%d",&cc.c_h_flag); +- sscanf(cnc->c_mflag,"%d",&cc.c_mflag); +- sscanf(cnc->c_pflag,"%d",&cc.c_pflag); +- sscanf(cnc->c_stride_flag,"%d",&cc.c_stride_flag); +- sscanf(cnc->c_verify,"%d",&cc.c_verify); +- sscanf(cnc->c_sverify,"%d",&cc.c_sverify); +- sscanf(cnc->c_odsync,"%d",&cc.c_odsync); +- sscanf(cnc->c_diag_v,"%d",&cc.c_diag_v); +- sscanf(cnc->c_dedup,"%d",&cc.c_dedup); +- sscanf(cnc->c_dedup_interior,"%d",&cc.c_dedup_interior); +- sscanf(cnc->c_dedup_compress,"%d",&cc.c_dedup_compress); +- sscanf(cnc->c_dedup_mseed,"%d",&cc.c_dedup_mseed); +- sscanf(cnc->c_hist_summary,"%d",&cc.c_hist_summary); +- sscanf(cnc->c_op_rate,"%d",&cc.c_op_rate); +- sscanf(cnc->c_op_rate_flag,"%d",&cc.c_op_rate_flag); +- sscanf(cnc->c_file_lock,"%d",&cc.c_file_lock); +- sscanf(cnc->c_rec_lock,"%d",&cc.c_rec_lock); +- sscanf(cnc->c_Kplus_readers,"%d",&cc.c_Kplus_readers); +- sscanf(cnc->c_multiplier,"%d",&cc.c_multiplier); +- sscanf(cnc->c_share_file,"%d",&cc.c_share_file); +- sscanf(cnc->c_pattern,"%d",&cc.c_pattern); +- sscanf(cnc->c_version,"%d",&cc.c_version); +- sscanf(cnc->c_base_time,"%d",&cc.c_base_time); +- sscanf(cnc->c_num_child,"%d",&cc.c_num_child); +- sscanf(cnc->c_pct_read,"%d",&cc.c_pct_read); +- sscanf(cnc->c_advise_op,"%d",&cc.c_advise_op); +- sscanf(cnc->c_advise_flag,"%d",&cc.c_advise_flag); +- sscanf(cnc->c_restf,"%d",&cc.c_restf); +- sscanf(cnc->c_mygen,"%d",&cc.c_mygen); +- sscanf(cnc->c_oflag,"%d",&cc.c_oflag); +- sscanf(cnc->c_mfflag,"%d",&cc.c_mfflag); +- sscanf(cnc->c_unbuffered,"%d",&cc.c_unbuffered); +- sscanf(cnc->c_Q_flag,"%d",&cc.c_Q_flag); +- sscanf(cnc->c_L_flag,"%d",&cc.c_L_flag); +- sscanf(cnc->c_xflag,"%d",&cc.c_xflag); +- sscanf(cnc->c_include_flush,"%d",&cc.c_include_flush); +- sscanf(cnc->c_OPS_flag,"%d",&cc.c_OPS_flag); +- sscanf(cnc->c_mmapflag,"%d",&cc.c_mmapflag); +- sscanf(cnc->c_mmapasflag,"%d",&cc.c_mmapasflag); +- sscanf(cnc->c_mmapnsflag,"%d",&cc.c_mmapnsflag); +- sscanf(cnc->c_mmapssflag,"%d",&cc.c_mmapssflag); +- sscanf(cnc->c_no_copy_flag,"%d",&cc.c_no_copy_flag); +- sscanf(cnc->c_w_traj_flag,"%d",&cc.c_w_traj_flag); +- sscanf(cnc->c_r_traj_flag,"%d",&cc.c_r_traj_flag); +- sscanf(cnc->c_no_unlink,"%d",&cc.c_no_unlink); +- sscanf(cnc->c_no_write,"%d",&cc.c_no_write); +- sscanf(cnc->c_include_close,"%d",&cc.c_include_close); +- sscanf(cnc->c_disrupt_flag,"%d",&cc.c_disrupt_flag); +- sscanf(cnc->c_compute_flag,"%d",&cc.c_compute_flag); +- sscanf(cnc->c_MS_flag,"%d",&cc.c_MS_flag); +- sscanf(cnc->c_mmap_mix,"%d",&cc.c_mmap_mix); +- sscanf(cnc->c_Kplus_flag,"%d",&cc.c_Kplus_flag); +- sscanf(cnc->c_compute_time,"%f",&cc.c_compute_time); +- +- strcpy(write_traj_filename,cc.c_write_traj_filename); +- strcpy(read_traj_filename,cc.c_read_traj_filename); +- numrecs64 = cc.c_numrecs64; +- strcpy(pit_hostname,cc.c_pit_hostname); +- strcpy(pit_service,cc.c_pit_service); +- reclen = cc.c_reclen; +- testnum = cc.c_testnum; +- chid = cc.c_client_number; +- workdir=cc.c_working_dir; +- oflag = cc.c_oflag; +- /* Child's absolute filename to use is provided */ +- mfflag = cc.c_mfflag; +- if(mfflag) +- strcpy(filearray[chid],cc.c_file_name); +- if(cdebug) +- { +- fprintf(newstdout,"File name given %s\n",cc.c_file_name); +- fflush(newstdout); +- } +- unbuffered = cc.c_unbuffered; +- noretest = cc.c_noretest; +- notruncate = cc.c_notruncate; +- read_sync = cc.c_read_sync; +- jflag = cc.c_jflag; +- direct_flag = cc.c_direct_flag; +- cpuutilflag = cc.c_cpuutilflag; +- seq_mix = cc.c_seq_mix; +- async_flag = cc.c_async_flag; +- k_flag = cc.c_k_flag; +- h_flag = cc.c_h_flag; +- mflag = cc.c_mflag; +- pflag = cc.c_pflag; +- stride_flag = cc.c_stride_flag; +- fetchon = cc.c_fetchon; +- verify = cc.c_verify; +- diag_v = cc.c_diag_v; +- dedup = cc.c_dedup; +- dedup_interior = cc.c_dedup_interior; +- dedup_compress = cc.c_dedup_compress; +- dedup_mseed = cc.c_dedup_mseed; +- hist_summary = cc.c_hist_summary; +- op_rate = cc.c_op_rate; +- op_rate_flag = cc.c_op_rate_flag; +- if(diag_v) +- sverify = 0; +- else +- sverify = cc.c_sverify; +- file_lock = cc.c_file_lock; +- rlocking = cc.c_rec_lock; +- Kplus_readers = cc.c_Kplus_readers; +- multiplier = cc.c_multiplier; +- share_file = cc.c_share_file; +- pattern = cc.c_pattern; +- /* proto_version = cc.c_version; Don't copy it back. */ +- base_time=cc.c_base_time; +- num_child=(long long)cc.c_num_child; +- pct_read=cc.c_pct_read; +- advise_op=cc.c_advise_op; +- advise_flag=cc.c_advise_flag; +- restf=cc.c_restf; +- mygen=cc.c_mygen; +- Q_flag = cc.c_Q_flag; +- L_flag = cc.c_L_flag; +- xflag = cc.c_xflag; +- w_traj_flag = cc.c_w_traj_flag; +- r_traj_flag = cc.c_r_traj_flag; +- include_flush = cc.c_include_flush; +- OPS_flag = cc.c_OPS_flag; +- purge = cc.c_purge; +- mmapflag = cc.c_mmapflag; +- mmapasflag = cc.c_mmapasflag; +- mmapnsflag = cc.c_mmapnsflag; +- mmapssflag = cc.c_mmapssflag; +- no_copy_flag = cc.c_no_copy_flag; +- no_unlink = cc.c_no_unlink; +- no_write = cc.c_no_write; +- include_close = cc.c_include_close; +- disrupt_flag = cc.c_disrupt_flag; +- compute_flag = cc.c_compute_flag; +- MS_flag = cc.c_MS_flag; +- mmap_mix = cc.c_mmap_mix; +- Kplus_flag = cc.c_Kplus_flag; +- delay = cc.c_delay; +- stride = cc.c_stride; +- rest_val = cc.c_rest_val; +- depth = cc.c_depth; +- delay_start = cc.c_delay_start; +- compute_time = cc.c_compute_time; +- if(cdebug) +- { +- fprintf(newstdout,"Child %d change directory to %s\n",(int)chid,workdir); +- fflush(newstdout); +- } +- if(purge) +- alloc_pbuf(); +- +- /* 6. Change to the working directory */ +- +- if(chdir(workdir)<0) +- client_error=errno; +- start_child_listen_loop(); /* The async channel listener */ +- +- /* Need to start this after getting into the correct directory */ +- if(w_traj_flag) +- w_traj_size(); +- if(r_traj_flag) +- r_traj_size(); +- +- get_resolution(); /* Get my clock resolution */ +- if(hist_summary) +- { +- printf("Child got HISTORY flag\n"); +- } +- +- /* 7. Run the test */ +- switch(testnum) { +- +- case THREAD_WRITE_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running thread_write_test\n",(int)chid); +- fflush(newstdout); +- } +- thread_write_test((long)0); +- break; +-#ifdef HAVE_PREAD +- case THREAD_PWRITE_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running thread_pwrite_test\n",(int)chid); +- fflush(newstdout); +- } +- thread_pwrite_test((long)0); +- break; +-#endif +- case THREAD_REWRITE_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running thread_rewrite_test\n",(int)chid); +- fflush(newstdout); +- } +- thread_rwrite_test((long)0); +- break; +- case THREAD_READ_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running thread_read_test\n",(int)chid); +- fflush(newstdout); +- } +- thread_read_test((long)0); +- break; +-#ifdef HAVE_PREAD +- case THREAD_PREAD_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running thread_read_test\n",(int)chid); +- fflush(newstdout); +- } +- thread_pread_test((long)0); +- break; +-#endif +- case THREAD_REREAD_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running thread_reread_test\n",(int)chid); +- fflush(newstdout); +- } +- thread_rread_test((long)0); +- break; +- case THREAD_STRIDE_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running thread_stride_read_test\n",(int)chid); +- fflush(newstdout); +- } +- thread_stride_read_test((long)0); +- break; +- case THREAD_RANDOM_READ_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running random read test\n",(int)chid); +- fflush(newstdout); +- } +- thread_ranread_test((long)0); +- break; +- case THREAD_RANDOM_WRITE_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running random write test\n",(int)chid); +- fflush(newstdout); +- } +- thread_ranwrite_test((long)0); +- break; +- case THREAD_REVERSE_READ_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running reverse read test\n",(int)chid); +- fflush(newstdout); +- } +- thread_reverse_read_test((long)0); +- break; +- case THREAD_RANDOM_MIX_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running mixed workload test\n",(int)chid); +- fflush(newstdout); +- } +- thread_mix_test((long)0); +- break; +- case THREAD_FWRITE_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running thread_fwrite_test\n",(int)chid); +- fflush(newstdout); +- } +- thread_fwrite_test((long)0); +- break; +- case THREAD_FREAD_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running thread_fread_test\n",(int)chid); +- fflush(newstdout); +- } +- thread_fread_test((long)0); +- break; +- case THREAD_CLEANUP_TEST : +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d running cleanup\n",(int)chid); +- fflush(newstdout); +- } +- thread_cleanup_test((long)0); +- break; +- }; +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d finished running test.\n",(int)chid); +- fflush(newstdout); +- } +- +- /* 8. Release the listen and send sockets to the master */ +- stop_child_listen(l_sock); +- +- exit(0); +-} +- +-/* +- * Clients tell the master their statistics, set the stopped flag, and set shared memory +- * child_flag to tell the master they are finished. Also each client report all statistics. +- */ +-#ifdef HAVE_ANSIC_C +-void +-tell_master_stats(testnum , chid, throughput, actual, +- cpu_time, wall_time, stop_flag, child_flag) +-int testnum; +-long long chid; +-double throughput, actual, wall_time; +-float cpu_time; +-char stop_flag; +-long long child_flag; +-/* +-void +-tell_master_stats(int testnum , long long chid, double tthroughput, +- double actual, float cpu_time, float wall_time, +- char stop_flag, long long child_flag) +-*/ +-#else +-void +-tell_master_stats(testnum , chid, throughput, actual, cpu_time, +- wall_time, stop_flag, child_flag) +-int testnum; +-long long chid; +-double throughput, actual, wall_time; +-char stop_flag; +-float cpu_time; +-long long child_flag; +-#endif +-{ +- struct master_command mc; +- bzero(&mc,sizeof(struct master_command)); +- mc.m_client_number = (int) chid; +- mc.m_client_error = (int) client_error; +- mc.m_throughput= throughput; +- mc.m_testnum = testnum; +- mc.m_actual = actual; +- mc.m_cputime = cpu_time; +- mc.m_walltime = wall_time; +- mc.m_stop_flag = stop_flag; +- mc.m_child_flag = child_flag; +- mc.m_command = R_STAT_DATA; +- mc.m_mygen = mygen; +- mc.m_version = proto_version; +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d: Tell master stats and terminate\n",(int)chid); +- fflush(newstdout); +- } +- child_send(controlling_host_name,(struct master_command *)&mc, sizeof(struct master_command)); +-} +- +-/* +- * Stop the master listener loop service. +- * Currently this is not used. The master_join_count +- * variable is used to terminate the loop service. +- */ +-#ifdef HAVE_ANSIC_C +-void +-stop_master_listen_loop(void) +-#else +-void +-stop_master_listen_loop() +-#endif +-{ +- if(mdebug>=1) +- printf("Stopping Master listen loop"); +- kill(master_listen_pid,SIGKILL); +-} +- +- +-/* +- * Clients tell the master that I am at the barrier and ready +- * for the message to start work. +- */ +-#ifdef HAVE_ANSIC_C +-void +-tell_master_ready(long long chid) +-#else +-void +-tell_master_ready(chid) +-long long chid; +-#endif +-{ +- struct master_command mc; +- bzero(&mc,sizeof(struct master_command)); +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d: Tell master to go\n",(int)chid); +- fflush(newstdout); +- } +- mc.m_command = R_FLAG_DATA; +- mc.m_mygen = mygen; +- mc.m_version = proto_version; +- mc.m_child_flag = CHILD_STATE_READY; +- mc.m_client_number = (int)chid; +- mc.m_client_error = client_error; +- child_send(controlling_host_name,(struct master_command *)&mc, sizeof(struct master_command)); +-} +- +-/* +- * Clients wait at a barrier for the master to tell them +- * to begin work. This is the function where they wait. +- */ +-#ifdef HAVE_ANSIC_C +-void +-wait_for_master_go(long long chid) +-#else +-void +-wait_for_master_go(chid) +-long long chid; +-#endif +-{ +- struct client_neutral_command *cnc; +- struct client_command cc; +- bzero(&cc,sizeof(struct client_command)); +- child_listen(l_sock,sizeof(struct client_neutral_command)); +- cnc = (struct client_neutral_command *)child_rcv_buf; +- sscanf(cnc->c_command,"%d",&cc.c_command); +- if(cc.c_command == R_TERMINATE || cc.c_command==R_DEATH) +- { +- if(cdebug) +- { +- fprintf(newstdout,"Child %d received terminate on sync channel at barrier !!\n",(int)chid); +- fflush(newstdout); +- } +- exit(1); +- } +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d return from wait_for_master_go\n",(int)chid); +- fflush(newstdout); +- } +-} +- +-/* +- * Create a master listener for receiving data from the +- * many children. As the children finish they will send +- * their statistics and terminate. When the master_join_count +- * goes to zero then it is time to stop this service. +- * When this service exits then the parent will know +- * that all of the children are done. +- */ +-#ifdef HAVE_ANSIC_C +-void +-start_master_listen_loop(int num) +-#else +-void +-start_master_listen_loop(num) +-int num; +-#endif +-{ +- int i; +- struct child_stats *child_stat; +- struct master_neutral_command *mnc; +- struct master_command mc; +- int temp; +- struct timespec req,rem; +- +- req.tv_sec = 0; +- req.tv_nsec = 10000000; +- rem.tv_sec = 0; +- rem.tv_nsec = 10000000; +- +- +- master_join_count=num; +- master_listen_pid=fork(); +- if(master_listen_pid!=0) +- return; +- if(mdebug>=1) +- printf("Starting Master listen loop m %d c %d count %d\n",master_iozone, +- client_iozone,num); +- +- while(master_join_count) +- { +- master_listen(master_listen_socket,sizeof(struct master_neutral_command)); +- mnc=(struct master_neutral_command *)&master_rcv_buf[0]; +- +- /* +- * Convert from string format to arch format +- */ +- sscanf(mnc->m_command,"%d",&mc.m_command); +- sscanf(mnc->m_client_number,"%d",&mc.m_client_number); +- sscanf(mnc->m_client_error,"%d",&mc.m_client_error); +- sscanf(mnc->m_mygen,"%d",&mc.m_mygen); +- sscanf(mnc->m_version,"%d",&mc.m_version); +- if(mc.m_version != proto_version) +- { +- printf("Client # %d is not running the same version of Iozone !\n", +- mc.m_client_number); +- } +- if(mc.m_client_error != 0) +- { +- printf("\nClient # %d reporting an error %s !\n", +- mc.m_client_number,strerror(mc.m_client_error)); +- } +-#ifdef NO_PRINT_LLD +- sscanf(mnc->m_child_flag,"%ld",&mc.m_child_flag); +-#else +- sscanf(mnc->m_child_flag,"%lld",&mc.m_child_flag); +-#endif +- sscanf(mnc->m_actual,"%f",&mc.m_actual); +- sscanf(mnc->m_throughput,"%f",&mc.m_throughput); +- sscanf(mnc->m_cputime,"%f",&mc.m_cputime); +- sscanf(mnc->m_walltime,"%f",&mc.m_walltime); +- sscanf(mnc->m_stop_flag,"%d",&temp); +- mc.m_stop_flag = temp; +- +- switch(mc.m_command) { +- case R_STAT_DATA: +- if(mc.m_mygen != mygen) +- { +- /* +- * >>> You are NOT one of my children !!! <<< +- * Probably children left behind from another run !!! +- * Ignore their messages, and go on without them. +- */ +- printf("*** Unknown Iozone children responding !!! ***\n"); +- continue; +- } +- i = mc.m_client_number; +- if(mdebug) +- printf("loop: R_STAT_DATA for client %d\n",i); +- child_stat = (struct child_stats *)&shmaddr[i]; +- child_stat->flag = mc.m_child_flag; +- child_stat->actual = mc.m_actual; +- child_stat->throughput = mc.m_throughput; +- child_stat->cputime = mc.m_cputime; +- child_stat->walltime = mc.m_walltime; +- *stop_flag = mc.m_stop_flag; +- master_join_count--; +- break; +- case R_FLAG_DATA: +- if(mc.m_mygen != mygen) +- { +- /* You are NOT one of my children !!! */ +- printf("*** Unknown Iozone children responding !!! ***\n"); +- continue; +- } +- if(mdebug) +- printf("loop: R_FLAG_DATA: Client %d flag %d \n", +- (int)mc.m_client_number, +- (int)mc.m_child_flag); +- i = mc.m_client_number; +- child_stat = (struct child_stats *)&shmaddr[i]; +- child_stat->flag = (long long)(mc.m_child_flag); +- break; +- case R_STOP_FLAG: +- if(mc.m_mygen != mygen) +- { +- /* You are NOT one of my children !!! */ +- printf("*** Unknown Iozone children responding !!! ***\n"); +- continue; +- } +- if(mdebug) +- printf("Master loop: R_STOP_FLAG: Client %d STOP_FLAG \n", +- (int)mc.m_client_number); +- *stop_flag=1; +- distribute_stop(); +- break; +- } +- +- } +- /* Let the clients report results before exiting. +- Also, exiting too quickly can close the async +- socket to the child, and cause it to become ill. +- On Solaris, it gets stuck in a 0=read() loop. */ +- +-#if defined(Windows) +- sleep(1); +-#else +- nanosleep(&req,&rem); +-#endif +- +- exit(0); +-} +-/* +- * Create a client listener for receiving async data from the +- * the master. +- */ +-#ifdef HAVE_ANSIC_C +-void +-start_child_listen_loop(void) +-#else +-void +-start_child_listen_loop() +-#endif +-{ +- int i; +- struct child_stats *child_stat; +- struct client_command cc; +- struct client_neutral_command *cnc; +- +- client_listen_pid=fork(); +- if(client_listen_pid!=0) +- return; +- if(cdebug>=1) +- { +- fprintf(newstdout,"Child %d starting client listen loop\n",(int)chid); +- fflush(newstdout); +- } +- while(1) +- { +- bzero(&cc,sizeof(struct client_command)); +- child_listen_async(l_async_sock,sizeof(struct client_neutral_command)); +- cnc=(struct client_neutral_command *)&child_async_rcv_buf; +- /* +- * Convert from string format to arch format +- */ +- sscanf(cnc->c_command,"%d",&cc.c_command); +- sscanf(cnc->c_client_number,"%d",&cc.c_client_number); +- sscanf(cnc->c_stop_flag,"%d",&cc.c_stop_flag); +- +- switch(cc.c_command) { +- case R_STOP_FLAG: +- i = cc.c_client_number; +- if(cdebug) +- { +- fprintf(newstdout,"child loop: R_STOP_FLAG for client %d\n",i); +- fflush(newstdout); +- } +- child_stat = (struct child_stats *)&shmaddr[i]; +- *stop_flag = cc.c_stop_flag; /* In shared memory with other copy */ +- sent_stop=1; +- break; +- case R_TERMINATE: +- if(cdebug) +- { +- fprintf(newstdout,"Child loop: R_TERMINATE: Client %d \n", +- (int)cc.c_client_number); +- fflush(newstdout); +- } +- sleep(2); +- /* Aync listener goes away */ +- stop_child_listen(l_async_sock); +- exit(0); +- case R_DEATH: +- if(cdebug) +- { +- fprintf(newstdout,"Child loop: R_DEATH: Client %d \n", +- (int)cc.c_client_number); +- fflush(newstdout); +- } +- i = cc.c_client_number; +- child_remove_files(i); +- sleep(2); +- /* Aync listener goes away */ +- stop_child_listen(l_async_sock); +- exit(0); +- } +- +- } +-} +- +-/* +- * The controlling process "master" tells the children to begin. +- */ +- +-#ifdef HAVE_ANSIC_C +-void +-tell_children_begin(long long childnum) +-#else +-void +-tell_children_begin(childnum) +-long long childnum; +-#endif +-{ +- struct client_command cc; +- int x; +- bzero(&cc,sizeof(struct client_command)); +- x = (int) childnum; +- if(mdebug>=1) +- printf("Master: Tell child %d to begin\n",x); +- cc.c_command = R_FLAG_DATA; +- cc.c_child_flag = CHILD_STATE_BEGIN; +- cc.c_client_number = (int)childnum; +- master_send(master_send_sockets[x],child_idents[x].child_name, &cc,sizeof(struct client_command)); +-} +- +-/* +- * The master waits here for all of the the children to terminate. +- * When the children are done the the master_join_count will be at zero +- * and the master_listen_loop will exit. This function waits for this to happen. +- */ +-#ifdef HAVE_ANSIC_C +-void +-wait_dist_join(void) +-#else +-void +-wait_dist_join() +-#endif +-{ +- wait(0); +- if(mdebug) +- printf("Master: All children have finished. Sending terminate\n"); +- terminate_child_async(); /* All children are done, so terminate their async channel */ +- current_client_number=0; /* start again */ +-} +- +- +-/* +- * This function reads a file that contains client information. +- * The information is: +- * client name (DNS usable name) +- * client working directory (where to run the test) +- * client directory that contains the Iozone executable. +- * +- * If the first character in a line is a # then it is a comment. +- * The maximum number of clients is MAXSTREAMS. +- */ +-#ifdef HAVE_ANSIC_C +-int +-get_client_info(void) +-#else +-int +-get_client_info() +-#endif +-{ +- FILE *fd; +- char *ret1; +- int count; +- char buffer[200]; +- count=0; +- fd=fopen(client_filename,"r"); +- if(fd == (FILE *)NULL) +- { +- printf("Unable to open client file \"%s\"\n", +- client_filename); +- exit(176); +- } +- while(1) +- { +- if (count > MAXSTREAMS) { +- printf("Too many lines in client file - max of %d supported\n", +- MAXSTREAMS); +- exit(7); +- } +- ret1=fgets(buffer,200,fd); +- if(ret1== (char *)NULL) +- break; +- count+=parse_client_line(buffer,count); +- } +- fclose(fd); +- return(count); +-} +- +- +-/* +- * This function parses a line from the client file. It is +- * looking for: +- * Client name (DNS usable) +- * Client working directory (where to run the test ) +- * Client path to Iozone executable. +- * +- * Lines that start with # are comments. +- */ +- +-#ifdef HAVE_ANSIC_C +-int +-parse_client_line(char *buffer,int line_num) +-#else +-int +-parse_client_line(buffer, line_num) +-char *buffer; +-int line_num; +-#endif +-{ +- int num; +- /* Format is clientname, workdir, execute_path */ +- /* If column #1 contains a # symbol then skip this line */ +- +- if(buffer[0]=='#') +- return(0); +- num=sscanf(buffer,"%s %s %s %s\n", +- child_idents[line_num].child_name, +- child_idents[line_num].workdir, +- child_idents[line_num].execute_path, +- child_idents[line_num].file_name); +- if((num > 0) && (num !=3) && (num !=4)) +- { +- printf("Bad Client Identity at entry %d\n",line_num); +- printf("Client: -> %s Workdir: -> %s Execute_path: -> %s \n", +- child_idents[line_num].child_name, +- child_idents[line_num].workdir, +- child_idents[line_num].execute_path); +- exit(203); +- } +- if(num == 4) +- mfflag++; +- +- return(1); +-} +- +-/* +- * This is a mechanism that the child uses to remove all +- * of its temporary files. Only used at terminate time. +- */ +-#ifdef HAVE_ANSIC_C +-void +-child_remove_files(int i) +-#else +-void +-child_remove_files(i) +-int i; +-#endif +-{ +- +- char *dummyfile[MAXSTREAMS]; /* name of dummy file */ +- dummyfile[i]=(char *)malloc((size_t)MAXNAMESIZE); +- if(mfflag) +- { +- sprintf(dummyfile[i],"%s",filearray[i]); +- } +- else +- { +- sprintf(dummyfile[i],"%s.DUMMY.%d",filearray[i],i); +- } +- if(cdebug) +- { +- fprintf(newstdout,"Child %d remove: %s \n",(int)chid, dummyfile[i]); +- fflush(newstdout); +- } +- if(check_filename(dummyfile[i])) +- unlink(dummyfile[i]); +-} +- +- +-/* +- * The master tells the child async listener that it is time +- * to terminate its services. +- */ +-#ifdef HAVE_ANSIC_C +-void +-terminate_child_async(void) +-#else +-void +-terminate_child_async() +-#endif +-{ +- int i; +- struct client_command cc; +- bzero(&cc,sizeof(struct client_command)); +- cc.c_command = R_TERMINATE; +- for(i=0;i>>>> Client Network Speed check <<<<< *\n"); +- printf("***************************************************\n\n"); +- printf("Master: %s\n",sp_master_host); +- printf("Transfer size %d bytes \n",sp_msize); +- printf("Count %d\n",sp_count); +- printf("Total size %d kbytes \n\n", +- (sp_msize*sp_count)/1024); +- sp_once=1; +- } +- sp_dest=sp_remote_host; +- sleep(1); +- sp_do_master_t(); +- free(sp_buf); +- } +-} +- +-/* +- * Get results back from the client. +- */ +-#ifdef HAVE_ANSIC_C +-void +-sp_get_result(int port,int flag) +-#else +-void +-sp_get_result(port,flag) +-int port,flag; +-#endif +-{ +- int tcfd; +- float throughput; +- int count; +- char mybuf[1024]; +- int sp_offset,xx; +- +- tcfd=sp_start_master_listen(port, 1024); +- sp_offset=0; +- while(sp_offset < 1024) +- { +- xx=read(tcfd,&mybuf[sp_offset],1024); +- sp_offset+=xx; +- } +- sscanf(mybuf,"%d %f",&count,&throughput); +- if(!flag) +- printf("%-20s received %10d Kbytes @ %10.2f Kbytes/sec \n", +- sp_remote_host,count,throughput); +- else +- printf("%-20s sent %10d Kbytes @ %10.2f Kbytes/sec \n", +- sp_remote_host,count,throughput); +- close(tcfd); +-} +- +-/* +- * Send results to the master. +- */ +-#ifdef HAVE_ANSIC_C +-void +-sp_send_result(int port, int count, float throughput) +-#else +-void +-sp_send_result(port, count, throughput) +-int port,count; +-float throughput; +-#endif +-{ +- int msfd; +- char mybuf[1024]; +- sprintf(mybuf,"%d %f",count, throughput); +- msfd=sp_start_child_send(sp_dest, port, &sp_my_cs_addr); +- junk=write(msfd,mybuf,1024); +- if(cdebug) +- { +- fprintf(newstdout,"Sending result\n"); +- fflush(newstdout); +- } +- close(msfd); +-} +- +-/* +- * Start the channel for the master to send a message to +- * a child on a port that the child +- * has created for the parent to use to communicate. +- */ +-#ifdef HAVE_ANSIC_C +-int +-sp_start_master_send(char *sp_child_host_name, int sp_child_listen_port, struct in_addr *sp_my_ms_addr) +-#else +-int +-sp_start_master_send(sp_child_host_name, sp_child_listen_port, sp_my_ms_addr) +-char *sp_child_host_name; +-int sp_child_listen_port; +-struct in_addr *sp_my_ms_addr; +-#endif +-{ +- int rc,master_socket_val; +- struct sockaddr_in addr,raddr; +- struct hostent *he; +- int port,tmp_port; +- int ecount=0; +- struct in_addr *ip; +- struct timespec req,rem; +- +- req.tv_sec = 0; +- req.tv_nsec = 10000000; +- rem.tv_sec = 0; +- rem.tv_nsec = 10000000; +- +- he = gethostbyname(sp_child_host_name); +- if (he == NULL) +- { +- printf("Master: Bad hostname >%s<\n",sp_child_host_name); +- fflush(stdout); +- exit(22); +- } +- if(mdebug ==1) +- { +- printf("Master: start master send: %s\n", he->h_name); +- fflush(stdout); +- } +- ip = (struct in_addr *)he->h_addr_list[0]; +-#ifndef UWIN +- if(mdebug ==1) +- { +- printf("Master: child name: %s\n", (char *)inet_ntoa(*ip)); +- printf("Master: child Port: %d\n", sp_child_listen_port); +- fflush(stdout); +- } +-#endif +- +- port=sp_child_listen_port; +- sp_my_ms_addr->s_addr = ip->s_addr; +- /*port=CHILD_LIST_PORT;*/ +- +- raddr.sin_family = AF_INET; +- raddr.sin_port = htons(port); +- raddr.sin_addr.s_addr = ip->s_addr; +- master_socket_val = socket(AF_INET, SOCK_STREAM, 0); +- if (master_socket_val < 0) +- { +- perror("Master: socket failed:"); +- exit(23); +- } +- bzero(&addr, sizeof(struct sockaddr_in)); +- tmp_port=sp_master_esend_port; +- addr.sin_port = htons(tmp_port); +- addr.sin_family = AF_INET; +- addr.sin_addr.s_addr = INADDR_ANY; +- rc = -1; +- while (rc < 0) +- { +- rc = bind(master_socket_val, (struct sockaddr *)&addr, +- sizeof(struct sockaddr_in)); +- if(rc < 0) +- { +- tmp_port++; +- addr.sin_port=htons(tmp_port); +- continue; +- } +- } +- if(mdebug ==1) +- { +- printf("Master: Bound port\n"); +- fflush(stdout); +- } +- if (rc < 0) +- { +- perror("Master: bind failed for sync channel to child.\n"); +- exit(24); +- } +-#if defined(Windows) +- sleep(1); +-#else +- nanosleep(&req,&rem); +-#endif +- +-again: +- rc = connect(master_socket_val, (struct sockaddr *)&raddr, +- sizeof(struct sockaddr_in)); +- if (rc < 0) +- { +- if(ecount++ < 300) +- { +-#if defined(Windows) +- sleep(1); +-#else +- nanosleep(&req,&rem); +-#endif +- /*sleep(1);*/ +- goto again; +- } +- perror("Master: connect failed\n"); +- printf("Error %d\n",errno); +- exit(25); +- } +- if(mdebug ==1) +- { +- printf("Master Connected\n"); +- fflush(stdout); +- } +- return (master_socket_val); +-} +- +-/* +- * Start the childs listening service for messages from the master. +- */ +-#ifdef HAVE_ANSIC_C +-int +-sp_start_child_listen(int listen_port, int size_of_message) +-#else +-int +-sp_start_child_listen(listen_port, size_of_message) +-int listen_port; +-int size_of_message; +-#endif +-{ +- int tsize; +- int s,ns; +- unsigned int me; +- int rc; +- int xx; +- int tmp_port; +- struct sockaddr_in *addr; +- int sockerr; +- int recv_buf_size=65536; +- int optval=1; +- xx = 0; +- me=sizeof(struct sockaddr_in); +- tsize=size_of_message; /* Number of messages to receive */ +- s = socket(AF_INET, SOCK_STREAM, 0); +- if (s < 0) +- { +- perror("socket failed:"); +- exit(19); +- } +- sockerr = setsockopt (s, SOL_SOCKET, SO_RCVBUF, (char *) +- &recv_buf_size, sizeof(int)); +- if ( sockerr == -1 ) { +- perror("Error in setsockopt 7\n"); +- } +- sockerr = setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *) +- &optval, sizeof(int)); +- if ( sockerr == -1 ) { +- perror("Error in setsockopt 8\n"); +- } +- bzero(&sp_child_sync_sock, sizeof(struct sockaddr_in)); +- tmp_port=sp_child_listen_port; +- sp_child_sync_sock.sin_port = htons(tmp_port); +- sp_child_sync_sock.sin_family = AF_INET; +- sp_child_sync_sock.sin_addr.s_addr = INADDR_ANY; +- rc = -1; +- while (rc < 0) +- { +- rc = bind(s, (struct sockaddr *)&sp_child_sync_sock, +- sizeof(struct sockaddr_in)); +- if(rc < 0) +- { +- tmp_port++; +- sp_child_sync_sock.sin_port=htons(tmp_port); +- continue; +- } +- } +- sp_child_listen_port = ntohs(sp_child_sync_sock.sin_port); +- if(cdebug ==1) +- { +- fprintf(newstdout,"Child: Listen: Bound at port %d\n", tmp_port); +- fflush(newstdout); +- } +- if(rc < 0) +- { +- if(cdebug ==1) +- { +- fprintf(newstdout,"bind failed. Errno %d\n", errno); +- fflush(newstdout); +- } +- exit(20); +- } +- +- addr=&sp_child_async_sock; +- listen(s,10); +- if(cdebug) +- { +- fprintf(newstdout,"Child enters accept\n"); +- fflush(newstdout); +- } +- ns=accept(s,(void *)addr,&me); +- if(cdebug) +- { +- fprintf(newstdout,"Child attached for receive. Sock %d %d\n", ns,errno); +- fflush(newstdout); +- } +- close(s); +- return(ns); +-} +- +- +-/* +- * The client runs this code +- */ +-#ifdef HAVE_ANSIC_C +-void +-sp_do_child_t(void) +-#else +-void +-sp_do_child_t() +-#endif +-{ +- int i,y; +- int offset; +- int sp_tcount=0; +- /* child */ +- /* +- * Child reads from master +- */ +- sp_crfd=sp_start_child_listen(sp_child_listen_port, sp_msize); +- sp_start_time=time_so_far(); +- for(i=0;i%s<\n",sp_master_host_name); +- fflush(stdout); +- exit(22); +- } +- if(cdebug ==1) +- { +- fprintf(newstdout,"Child: start child send: %s\n", he->h_name); +- fprintf(newstdout,"To: %s at port %d\n",sp_master_host_name, +- sp_master_listen_port); +- fflush(newstdout); +- } +- ip = (struct in_addr *)he->h_addr_list[0]; +- +- port=sp_master_listen_port; +- sp_my_cs_addr->s_addr = ip->s_addr; +- +- raddr.sin_family = AF_INET; +- raddr.sin_port = htons(port); +- raddr.sin_addr.s_addr = ip->s_addr; +- sp_child_socket_val = socket(AF_INET, SOCK_STREAM, 0); +- if (sp_child_socket_val < 0) +- { +- perror("child: socket failed:"); +- exit(23); +- } +- bzero(&addr, sizeof(struct sockaddr_in)); +- tmp_port=sp_child_esend_port; +- addr.sin_port = htons(tmp_port); +- addr.sin_family = AF_INET; +- addr.sin_addr.s_addr = INADDR_ANY; +- rc = -1; +- while (rc < 0) +- { +- rc = bind(sp_child_socket_val, (struct sockaddr *)&addr, +- sizeof(struct sockaddr_in)); +- if(rc < 0) +- { +- tmp_port++; +- addr.sin_port=htons(tmp_port); +- continue; +- } +- } +- if(cdebug ==1) +- { +- fprintf(newstdout,"Child: Bound port %d\n",tmp_port); +- fflush(newstdout); +- } +- if (rc < 0) +- { +- perror("Child: bind failed for sync channel to child.\n"); +- exit(24); +- } +-#if defined(Windows) +- sleep(1); +-#else +- nanosleep(&req,&rem); +-#endif +-again: +- rc = connect(sp_child_socket_val, (struct sockaddr *)&raddr, +- sizeof(struct sockaddr_in)); +- if (rc < 0) +- { +- if(ecount++<300) +- { +-#if defined(Windows) +- sleep(1); +-#else +- nanosleep(&req,&rem); +-#endif +- goto again; +- } +- +- fprintf(newstdout,"child: connect failed. Errno %d \n",errno); +- fflush(newstdout); +- exit(25); +- } +- if(cdebug ==1) +- { +- fprintf(newstdout,"child Connected\n"); +- fflush(newstdout); +- } +- return (sp_child_socket_val); +-} +- +-#ifdef HAVE_ANSIC_C +-void +-do_speed_check(int client_flag) +-#else +-void +-do_speed_check(client_flag) +-int client_flag; +-#endif +-{ +- int i; +- if(client_flag) +- { +- speed_main(" "," ",reclen,kilobytes64,client_flag); +- } +- else +- { +- printf("Checking %d clients\n",clients_found); +- for(i=0;i xor ops +- * Seed composed from: blocknumber +- (do not include childnum as you want duplicates) +- * size ... size of buffers. (in bytes) +- * percent. Percent of buffer to modify. +- * percent_interior. Percent of buffer that is dedupable within +- * and across files +- * percent_compress. Percent of buffer that is dedupable within +- * but not across files +- * +- * Returns 0 (zero) for success, and -1 (minus one) for failure. +- */ +-int +-gen_new_buf(char *ibuf, char *obuf, long seed, int size, int percent, +- int percent_interior, int percent_compress, int all) +-{ +- register long *ip, *op; /* Register for speed */ +- register long iseed; /* Register for speed */ +- register long isize; /* Register for speed */ +- register long cseed; /* seed for dedupable for within & ! across */ +- register int x,w; /* Register for speed */ +- register int value; /* Register for speed */ +- register int interior_size; /* size of interior dedup region */ +- register int compress_size; /* size of compression dedup region */ +- if(ibuf == NULL) /* no input buf */ +- return(-1); +- if(obuf == NULL) /* no output buf */ +- return(-1); +- if((percent > 100) || (percent < 0)) /* percent check */ +- return(-1); +- if(size == 0) /* size check */ +- return(-1); +- srand(seed+1+(((int)numrecs64)*dedup_mseed)); /* set random seed */ +- iseed = rand(); /* generate random value */ +- isize = (size * percent)/100; /* percent that is dedupable */ +- interior_size = ((isize * percent_interior)/100);/* /sizeof(long) */ +- compress_size =((interior_size * percent_compress)/100); +- ip = (long *)ibuf; /* pointer to input buf */ +- op = (long *)obuf; /* pointer to output buf */ +- if(all == 0) /* Special case for verify only */ +- isize = sizeof(long); +- /* interior_size = dedup_within + dedup_across */ +- for(w=0;w 0) +- { +- srand(1+seed+((chid+1)*(int)numrecs64)*dedup_mseed); +- value=rand(); +-/* printf("Non-dedup value %x seed %x\n",value,seed);*/ +- for( ; x> 62)) + mti); +-} +- +-/* initialize by an array with array-length */ +-/* init_key is the array for initializing keys */ +-/* key_length is its length */ +-void init_by_array64(unsigned long long init_key[], +- unsigned long long key_length) +-{ +- unsigned long long i, j, k; +- init_genrand64(19650218ULL); +- i=1; j=0; +- k = (NN>key_length ? NN : key_length); +- for (; k; k--) { +- mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * 3935559000370003845ULL)) +- + init_key[j] + j; /* non linear */ +- i++; j++; +- if (i>=NN) { mt[0] = mt[NN-1]; i=1; } +- if (j>=key_length) j=0; +- } +- for (k=NN-1; k; k--) { +- mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * 2862933555777941757ULL)) +- - i; /* non linear */ +- i++; +- if (i>=NN) { mt[0] = mt[NN-1]; i=1; } +- } +- +- mt[0] = 1ULL << 63; /* MSB is 1; assuring non-zero initial array */ +-} +- +-/* generates a random number on [0, 2^64-1]-interval */ +-unsigned long long genrand64_int64(void) +-{ +- int i; +- unsigned long long x; +- static unsigned long long mag01[2]={0ULL, MATRIX_A}; +- +- if (mti >= NN) { /* generate NN words at one time */ +- +- /* if init_genrand64() has not been called, */ +- /* a default initial seed is used */ +- if (mti == NN+1) +- init_genrand64(5489ULL); +- +- for (i=0;i>1) ^ mag01[(int)(x&1ULL)]; +- } +- for (;i>1) ^ mag01[(int)(x&1ULL)]; +- } +- x = (mt[NN-1]&UM)|(mt[0]&LM); +- mt[NN-1] = mt[MM-1] ^ (x>>1) ^ mag01[(int)(x&1ULL)]; +- +- mti = 0; +- } +- +- x = mt[mti++]; +- +- x ^= (x >> 29) & 0x5555555555555555ULL; +- x ^= (x << 17) & 0x71D67FFFEDA60000ULL; +- x ^= (x << 37) & 0xFFF7EEE000000000ULL; +- x ^= (x >> 43); +- +- return x; +-} +- +-/* generates a random number on [0, 2^63-1]-interval */ +-long long genrand64_int63(void) +-{ +- return (long long)(genrand64_int64() >> 1); +-} +- +-/* generates a random number on [0,1]-real-interval */ +-double genrand64_real1(void) +-{ +- return (genrand64_int64() >> 11) * (1.0/9007199254740991.0); +-} +- +-/* generates a random number on [0,1)-real-interval */ +-double genrand64_real2(void) +-{ +- return (genrand64_int64() >> 11) * (1.0/9007199254740992.0); +-} +- +-/* generates a random number on (0,1)-real-interval */ +-double genrand64_real3(void) +-{ +- return ((genrand64_int64() >> 12) + 0.5) * (1.0/4503599627370496.0); +-} +- +-#ifdef MT_TEST +- +-int main(void) +-{ +- int i; +- unsigned long long init[4]={0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL}, length=4; +- init_by_array64(init, length); +- printf("1000 outputs of genrand64_int64()\n"); +- for (i=0; i<1000; i++) { +- printf("%20llu ", genrand64_int64()); +- if (i%5==4) printf("\n"); +- } +- printf("\n1000 outputs of genrand64_real2()\n"); +- for (i=0; i<1000; i++) { +- printf("%10.8f ", genrand64_real2()); +- if (i%5==4) printf("\n"); +- } +- return 0; +-} +-#endif +- +-/*----------------------------------------------------------------------*/ +-/* */ +-/* The PIT Programmable Interdimensional Timer */ +-/* */ +-/* This is used to measure time, when you know something odd is going */ +-/* to be happening with your wrist watch. For example, you have entered */ +-/* a temporal distortion field where time its-self is not moving */ +-/* as it does in your normal universe. ( thing either intense */ +-/* gravitational fields bending space-time, or virtual machines playing */ +-/* with time ) */ +-/* So.. you need to measure time, but with respect to a normal */ +-/* space-time. So.. we deal with this by calling for time from another */ +-/* machine, but do so with a very similar interface to that of */ +-/* gettimeofday(). */ +-/* To activate this, one only needs to set an environmental variable. */ +-/* Example: setenv IOZ_PIT hostname_of_PIT_server */ +-/* The environmental variable tells this client where to go to get */ +-/* correct timeofday time stamps, with the usual gettimeofday() */ +-/* resolution. (microsecond resolution) */ +-/*----------------------------------------------------------------------*/ +- +-/*----------------------------------------------------------------------*/ +-/* The PIT client: Adapted from source found on the web for someone's */ +-/* daytime client code. (Used in many examples for network programming */ +-/* Reads PIT info over a socket from a PIT server. */ +-/* The PIT server sends its raw microsecond version of gettimeofday */ +-/* The PIT client converts this back into timeval structure format. */ +-/* Written by: Don Capps. [ capps@iozone.org ] */ +-/*----------------------------------------------------------------------*/ +- +-/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ +-/* >>>> DON'T forget, you must put a definition for PIT <<<<<<<<<< */ +-/* >>>> in /etc/services <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ +-/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ +-#define DFLT_SERVICE "PIT" /* Default service name. */ +-#define INVALID_DESC -1 /* Invalid file (socket) descriptor. */ +-#define MAXBFRSIZE 256 /* Max bfr sz to read remote TOD. */ +- +-/* +-** Type definitions (for convenience). +-*/ +-#if defined(Windows) +-int false = 0; +-int true = 1; +-#else +-typedef enum { false = 0, true } boolean; +-#endif +-typedef struct sockaddr_in sockaddr_in_t; +-typedef struct sockaddr_in6 sockaddr_in6_t; +- +-/* +- * Routine to mimic gettimeofday() using a remote PIT server +- */ +-#if defined(_SUA_) +-struct timezone { +- int tz_minuteswest; +- int tz_dsttime; +-}; +-#endif +- +-int +-pit_gettimeofday( struct timeval *tp, struct timezone *foo, +- char *pit_hostname, char *pit_service) +-{ +- int sckt; /* socket descriptor */ +- unsigned scopeId = 0; +- +- /* See if the interdimensional rift is active */ +- +- if(pit_hostname[0] == 0) +- { +- return gettimeofday(tp,foo); +- } +- +- if ( ( sckt = openSckt( pit_hostname, +- pit_service, +- scopeId ) ) == INVALID_DESC ) +- { +- fprintf( stderr, +- "Sorry... a connectionless socket could " +- "not be set up.\n"); +- return -1; +- } +- /* +- ** Get the remote PIT. +- */ +- pit( sckt ,tp ); +- close(sckt); +- return 0; +-} +- +-/* +- * Opens a socket for the PIT to use to get the time +- * from a remote time server ( A PIT server ) +- */ +-static int openSckt( const char *host, +- const char *service, +- unsigned int scopeId ) +-{ +- struct addrinfo *ai; +- int aiErr; +- struct addrinfo *aiHead; +- struct addrinfo hints; +- sockaddr_in6_t *pSadrIn6; +- int sckt; +- /* +- * Initialize the 'hints' structure for getaddrinfo(3). +- */ +- memset( &hints, 0, sizeof( hints ) ); +- hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6 records */ +- hints.ai_socktype = SOCK_STREAM; /* Connection oriented communication.*/ +- hints.ai_protocol = IPPROTO_TCP; /* TCP transport layer protocol only. */ +- /* +- ** Look up the host/service information. +- */ +- if ( ( aiErr = getaddrinfo( host, +- service, +- &hints, +- &aiHead ) ) != 0 ) +- { +- fprintf( stderr, "(line %d): ERROR - %s.\n", __LINE__, +- gai_strerror( aiErr ) ); +- return INVALID_DESC; +- } +- /* +- ** Go through the list and try to open a connection. Continue until either +- ** a connection is established or the entire list is exhausted. +- */ +- for ( ai = aiHead, sckt = INVALID_DESC; +- ( ai != NULL ) && ( sckt == INVALID_DESC ); +- ai = ai->ai_next ) +- { +- /* +- ** IPv6 kluge. Make sure the scope ID is set. +- */ +- if ( ai->ai_family == PF_INET6 ) +- { +- pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; +- if ( pSadrIn6->sin6_scope_id == 0 ) +- { +- pSadrIn6->sin6_scope_id = scopeId; +- } /* End IF the scope ID wasn't set. */ +- } /* End IPv6 kluge. */ +- /* +- ** Create a socket. +- */ +- sckt = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol ); +- if(sckt == -1) +- { +- sckt = INVALID_DESC; +- continue; /* Try the next address record in the list. */ +- } +- /* +- ** Set the target destination for the remote host on this socket. That +- ** is, this socket only communicates with the specified host. +- */ +- if (connect( sckt, ai->ai_addr, ai->ai_addrlen ) ) +- { +- (void) close( sckt ); /* Could use system call again here, +- but why? */ +- sckt = INVALID_DESC; +- continue; /* Try the next address record in the list. */ +- } +- } /* End FOR each address record returned by getaddrinfo(3). */ +- /* +- ** Clean up & return. +- */ +- freeaddrinfo( aiHead ); +- return sckt; +-} /* End openSckt() */ +- +-/* +- * Read the PIT, and convert this back into timeval +- * info, and store it in the timeval structure that was +- * passed in. +- */ +-static void pit( int sckt, struct timeval *tp) +-{ +- char bfr[ MAXBFRSIZE+1 ]; +- int inBytes; +- long long value; +- /* +- ** Send a datagram to the server to wake it up. The content isn't +- ** important, but something must be sent to let it know we want the TOD. +- */ +- junk=write( sckt, "Are you there?", 14 ); +- /* +- ** Read the PIT from the remote host. +- */ +- inBytes = read( sckt, bfr, MAXBFRSIZE ); +- bfr[ inBytes ] = '\0'; /* Null-terminate the received string. */ +- /* +- * Convert result to timeval structure format +- */ +- sscanf(bfr,"%llu\n",&value); +- tp->tv_sec = (long)(value / 1000000); +- tp->tv_usec = (long)(value % 1000000); +-} +- +-/* sync does not exist in SUA */ +-#if defined(_SUA_) +-sync() +-{ +-} +-#endif +- +- +-#define BUCKETS 40 +-long long buckets[BUCKETS]; +-long long bucket_val[BUCKETS] = +- { 20,40,60,80,100, +- 200,400,600,800,1000, +- 2000,4000,6000,8000,10000, +- 12000,14000,16000,18000,20000, +- 40000,60000,80000,100000, +- 200000,400000,600000,800000,1000000, +- 2000000,4000000,6000000,8000000,10000000, +- 20000000,30000000,60000000,90000000,120000000,120000001}; +-/* +- * Buckets: (Based on a Netapp internal consensus) +- * 0 1 2 3 4 +- * <=20us <=40us <=60us <=80us <=100us +- * +- * 5 6 7 8 9 +- * <=200us <=400us <=600us <=88us <=1ms +- * +- * 10 11 12 13 14 +- * <=2ms <=4ms <=6ms <=8ms <=10ms +- * +- * 15 16 17 18 19 +- * <=12ms <=14ms <=16ms <=18ms <=20ms +- * +- * 20 21 22 23 24 +- * <=20ms <=40ms <=60ms <=80ms <=100ms +- * +- * 25 26 27 28 29 +- * <=200ms <=400ms <=600ms <=800ms <=1s +- * +- * 30 31 32 33 34 +- * <=2s <=4s <=6s <=8s <=10s +- * +- * 35 36 37 38 39 +- * <=20s <=30s <=60 <=90s >90 +- */ +- +-/* +- fp=fopen("/tmp/iozone_latency_summary.txt","a"); +- dump_hist(fp); +-*/ +- +-void +-hist_insert(double my_value) +-{ +- int k; +- long long value; +- +- /* Convert to micro-seconds */ +- value = (long long)(my_value * 1000000); +- for(k=0;k bucket_val[k]) +- { +- buckets[k]++; +- break; +- } +- } +- } +-} +- +-void +-dump_hist(char *what,int id) +-{ +- FILE *fp; +- +- char name[256]; +- +- sprintf(name,"%s_child_%d.txt","Iozone_histogram",id); +- +- fp = fopen(name,"a"); +- +-#ifndef NO_PRINT_LLD +- fprintf(fp,"Child: %d Op: %s\n",id,what); +- fprintf(fp,"Band 1: "); +- fprintf(fp," 20us:%-7.1lld ",buckets[0]); +- fprintf(fp," 40us:%-7.1lld ",buckets[1]); +- fprintf(fp," 60us:%-7.1lld ",buckets[2]); +- fprintf(fp," 80us:%-7.1lld ",buckets[3]); +- fprintf(fp,"100us:%-7.1lld \n",buckets[4]); +- +- fprintf(fp,"Band 2: "); +- fprintf(fp,"200us:%-7.1lld ",buckets[5]); +- fprintf(fp,"400us:%-7.1lld ",buckets[6]); +- fprintf(fp,"600us:%-7.1lld ",buckets[7]); +- fprintf(fp,"800us:%-7.1lld ",buckets[8]); +- fprintf(fp," 1ms:%-7.1lld \n",buckets[9]); +- +- fprintf(fp,"Band 3: "); +- fprintf(fp," 2ms:%-7.1lld ",buckets[10]); +- fprintf(fp," 4ms:%-7.1lld ",buckets[11]); +- fprintf(fp," 6ms:%-7.1lld ",buckets[12]); +- fprintf(fp," 8ms:%-7.1lld ",buckets[13]); +- fprintf(fp," 10ms:%-7.1lld \n",buckets[14]); +- +- fprintf(fp,"Band 4: "); +- fprintf(fp," 12ms:%-7.1lld ",buckets[15]); +- fprintf(fp," 14ms:%-7.1lld ",buckets[16]); +- fprintf(fp," 16ms:%-7.1lld ",buckets[17]); +- fprintf(fp," 18ms:%-7.1lld ",buckets[18]); +- fprintf(fp," 20ms:%-7.1lld \n",buckets[19]); +- +- fprintf(fp,"Band 5: "); +- fprintf(fp," 40ms:%-7.1lld ",buckets[20]); +- fprintf(fp," 60ms:%-7.1lld ",buckets[21]); +- fprintf(fp," 80ms:%-7.1lld ",buckets[22]); +- fprintf(fp,"100ms:%-7.1lld \n",buckets[23]); +- +- fprintf(fp,"Band 6: "); +- fprintf(fp,"200ms:%-7.1lld ",buckets[24]); +- fprintf(fp,"400ms:%-7.1lld ",buckets[25]); +- fprintf(fp,"600ms:%-7.1lld ",buckets[26]); +- fprintf(fp,"800ms:%-7.1lld ",buckets[27]); +- fprintf(fp," 1s:%-7.1lld \n",buckets[28]); +- +- fprintf(fp,"Band 7: "); +- fprintf(fp," 2s:%-7.1lld ",buckets[29]); +- fprintf(fp," 4s:%-7.1lld ",buckets[30]); +- fprintf(fp," 6s:%-7.1lld ",buckets[31]); +- fprintf(fp," 8s:%-7.1lld ",buckets[32]); +- fprintf(fp," 10s:%-7.1lld \n",buckets[33]); +- +- fprintf(fp,"Band 8: "); +- fprintf(fp," 20s:%-7.1lld ",buckets[34]); +- fprintf(fp," 40s:%-7.1lld ",buckets[35]); +- fprintf(fp," 60s:%-7.1lld ",buckets[36]); +- fprintf(fp," 80s:%-7.1lld ",buckets[37]); +- fprintf(fp," 120s:%-7.1lld \n",buckets[38]); +- +- fprintf(fp,"Band 9: "); +- fprintf(fp,"120+s:%-7.1lld \n\n",buckets[39]); +-#else +- fprintf(fp,"Child: %d Op: %s\n",id,what); +- fprintf(fp,"Band 1: "); +- fprintf(fp," 20us:%-7.1ld ",buckets[0]); +- fprintf(fp," 40us:%-7.1ld ",buckets[1]); +- fprintf(fp," 60us:%-7.1ld ",buckets[2]); +- fprintf(fp," 80us:%-7.1ld ",buckets[3]); +- fprintf(fp,"100us:%-7.1ld \n",buckets[4]); +- +- fprintf(fp,"Band 2: "); +- fprintf(fp,"200us:%-7.1ld ",buckets[5]); +- fprintf(fp,"400us:%-7.1ld ",buckets[6]); +- fprintf(fp,"600us:%-7.1ld ",buckets[7]); +- fprintf(fp,"800us:%-7.1ld ",buckets[8]); +- fprintf(fp," 1ms:%-7.1ld \n",buckets[9]); +- +- fprintf(fp,"Band 3: "); +- fprintf(fp," 2ms:%-7.1ld ",buckets[10]); +- fprintf(fp," 4ms:%-7.1ld ",buckets[11]); +- fprintf(fp," 6ms:%-7.1ld ",buckets[12]); +- fprintf(fp," 8ms:%-7.1ld ",buckets[13]); +- fprintf(fp," 10ms:%-7.1ld \n",buckets[14]); +- +- fprintf(fp,"Band 4: "); +- fprintf(fp," 12ms:%-7.1ld ",buckets[15]); +- fprintf(fp," 14ms:%-7.1ld ",buckets[16]); +- fprintf(fp," 16ms:%-7.1ld ",buckets[17]); +- fprintf(fp," 18ms:%-7.1ld ",buckets[18]); +- fprintf(fp," 20ms:%-7.1ld \n",buckets[19]); +- +- fprintf(fp,"Band 5: "); +- fprintf(fp," 40ms:%-7.1ld ",buckets[20]); +- fprintf(fp," 60ms:%-7.1ld ",buckets[21]); +- fprintf(fp," 80ms:%-7.1ld ",buckets[22]); +- fprintf(fp,"100ms:%-7.1ld \n",buckets[23]); +- +- fprintf(fp,"Band 6: "); +- fprintf(fp,"200ms:%-7.1ld ",buckets[24]); +- fprintf(fp,"400ms:%-7.1ld ",buckets[25]); +- fprintf(fp,"600ms:%-7.1ld ",buckets[26]); +- fprintf(fp,"800ms:%-7.1ld ",buckets[27]); +- fprintf(fp," 1s:%-7.1ld \n",buckets[28]); +- +- fprintf(fp,"Band 7: "); +- fprintf(fp," 2s:%-7.1ld ",buckets[29]); +- fprintf(fp," 4s:%-7.1ld ",buckets[30]); +- fprintf(fp," 6s:%-7.1ld ",buckets[31]); +- fprintf(fp," 8s:%-7.1ld ",buckets[32]); +- fprintf(fp," 10s:%-7.1ld \n",buckets[33]); +- +- fprintf(fp,"Band 8: "); +- fprintf(fp," 20s:%-7.1ld ",buckets[34]); +- fprintf(fp," 40s:%-7.1ld ",buckets[35]); +- fprintf(fp," 60s:%-7.1ld ",buckets[36]); +- fprintf(fp," 80s:%-7.1ld ",buckets[37]); +- fprintf(fp," 120s:%-7.1ld \n",buckets[38]); +- +- fprintf(fp,"Band 9: "); +- fprintf(fp,"120+s:%-7.1ld \n\n",buckets[39]); +-#endif +- fclose(fp); +-} +- +-#ifdef HAVE_ANSIC_C +-void * thread_fwrite_test(void *x) +-#else +-void * thread_fwrite_test( x) +-#endif +-{ +- +- struct child_stats *child_stat; +- double starttime1 = 0; +- double temp_time; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- double walltime, cputime; +- double compute_val = (double)0; +- float delay = (float)0; +- double thread_qtime_stop,thread_qtime_start; +- off64_t traj_offset; +- long long w_traj_bytes_completed; +- long long w_traj_ops_completed; +- FILE *w_traj_fd; +- int fd; +- long long recs_per_buffer; +- long long stopped,i; +- off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; +- long long xx,xx2; +- char *dummyfile [MAXSTREAMS]; /* name of dummy file */ +- char *nbuff; +- char *maddr; +- char *wmaddr,*free_addr; +- char now_string[30]; +- int anwser,bind_cpu,wval; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +- off64_t filebytes64; +- char tmpname[256]; +- FILE *thread_wqfd; +- FILE *thread_Lwqfd; +- char *filename; +- +- char *stdio_buf; +- char *how; +- long long Index = 0; +- FILE *stream = NULL; +- static int First_Run = 1; +- +- if(compute_flag) +- delay=compute_time; +- nbuff=maddr=wmaddr=free_addr=0; +- thread_qtime_stop=thread_qtime_start=0; +- thread_wqfd=w_traj_fd=thread_Lwqfd=(FILE *)0; +- traj_offset=walltime=cputime=0; +- anwser=bind_cpu=0; +- +- if(w_traj_flag) +- { +- filebytes64 = w_traj_fsize; +- numrecs64=w_traj_ops; +- } +- else +- { +- filebytes64 = numrecs64*reclen; +- } +- written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; +- w_traj_bytes_completed=w_traj_ops_completed=0; +- recs_per_buffer = cache_size/reclen ; +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- { +- xx = (long long)((long)x); +- } +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#ifdef _HPUX_SOURCE +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- if(debug1 ) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- filename=dummyfile[xx]; +- +- if(mmapflag || async_flag) +- return(0); +- +- stdio_buf=(char *)malloc((size_t)reclen); +- +- if(Uflag) /* Unmount and re-mount the mountpoint */ +- { +- purge_buffer_cache(); +- } +- +- if(First_Run==1) +- { +- First_Run=0; +- if(check_filename(filename)) +- how="r+"; /* file exists, don't create and zero a new one. */ +- else +- how="w+"; /* file doesn't exist. create it. */ +- } +- else +- how="r+"; /* re-tests should error out if file does not exist. */ +- +-#ifdef IRIX64 +- if((stream=(FILE *)fopen(filename,how)) == 0) +- { +- printf("\nCan not fdopen temp file: %s %lld\n", +- filename,errno); +- perror("fdopen"); +- exit(48); +- } +-#else +- if((stream=(FILE *)I_FOPEN(filename,how)) == 0) +- { +-#ifdef NO_PRINT_LLD +- printf("\nCan not fdopen temp file: %s %d\n", +- filename,errno); +-#else +- printf("\nCan not fdopen temp file: %s %d\n", +- filename,errno); +-#endif +- perror("fdopen"); +- exit(49); +- } +-#endif +- fd=fileno(stream); +- fsync(fd); +- if(direct_flag) +- setvbuf(stream,stdio_buf,_IONBF,reclen); +- else +- setvbuf(stream,stdio_buf,_IOFBF,reclen); +- +- buffer=mainbuffer; +- if(fetchon) +- fetchit(buffer,reclen); +- if(verify || dedup || dedup_interior) +- fill_buffer(buffer,reclen,(long long)pattern,sverify,(long long)0); +- +- compute_val=(double)0; +- +- /*******************************************************************/ +- +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- child_stat->flag=CHILD_STATE_READY; /* Tell parent child is ready to go */ +- +- if(distributed && client_iozone) +- tell_master_ready(chid); +- if(distributed && client_iozone) +- { +- if(cdebug) +- { +- printf("Child %d waiting for go from master\n",(int)xx); +- fflush(stdout); +- } +- wait_for_master_go(chid); +- if(cdebug) +- { +- printf("Child %d received go from master\n",(int)xx); +- fflush(stdout); +- } +- } +- else +- { +- while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ +- Poll((long long)1); +- } +- +- written_so_far=0; +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->actual = 0; +- child_stat->throughput = 0; +- stopped=0; +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_fwol.dat",(int)xx); +- thread_wqfd=fopen(tmpname,"a"); +- if(thread_wqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_wqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","fwrite test start: ",now_string); +- } +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- /*******************************************************************/ +- for(i=0; i (MAXBUFFERSIZE-reclen)) +- Index=0; +- buffer = mbuffer + Index; +- } +- if((verify & diag_v) || dedup || dedup_interior) +- fill_buffer(buffer,reclen,(long long)pattern,sverify,i); +- if(purge) +- purgeit(buffer,reclen); +- if(Q_flag || hist_summary || op_rate_flag) +- { +- thread_qtime_start=time_so_far(); +- } +- if(fwrite(buffer, (size_t) reclen, 1, stream) != 1) +- { +-#ifdef NO_PRINT_LLD +- printf("\nError fwriting block %ld, fd= %d\n", i, +- fd); +-#else +- printf("\nError fwriting block %lld, fd= %d\n", i, +- fd); +-#endif +- perror("fwrite"); +- signal_handler(); +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long)((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_wqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_wqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- w_traj_ops_completed++; +- w_traj_bytes_completed+=reclen; +- written_so_far+=reclen/1024; +- } +- if(include_flush) +- { +- fflush(stream); +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- } +- if(include_close) +- { +- wval=fclose(stream); +- if(wval==-1){ +- perror("fclose"); +- signal_handler(); +- } +- } +- /*******************************************************************/ +- if(!stopped){ +- temp_time = time_so_far(); +- child_stat->throughput = ((temp_time - starttime1)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- } +- if(cdebug) +- { +- printf("Child %d: throughput %f actual %f \n",(int)chid, child_stat->throughput, +- child_stat->actual); +- fflush(stdout); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- tell_master_stats(THREAD_FWRITE_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- +- if (debug1) { +- printf(" child/slot: %lld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n", +- xx, walltime, cputime, +- cpu_util(cputime, walltime)); +- } +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- stopped=0; +- +- /*******************************************************************/ +- /* End fwrite performance test. *************************************/ +- /*******************************************************************/ +- +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- if(Q_flag && (thread_wqfd !=0) ) +- fclose(thread_wqfd); +- free(dummyfile[xx]); +- if(w_traj_flag) +- fclose(w_traj_fd); +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Fwrite test finished: ",now_string); +- fclose(thread_Lwqfd); +- } +- /*******************************************************************/ +- if(!include_close) +- { +- wval=fflush(stream); +- if(wval==-1){ +- perror("fflush"); +- signal_handler(); +- } +- wval=fsync(fd); +- if(wval==-1){ +- perror("fsync"); +- signal_handler(); +- } +- wval=fclose(stream); +- if(wval==-1){ +- perror("fclose"); +- signal_handler(); +- } +- } +- +- if(restf) +- sleep((int)(int)rest_val); +- +- free(stdio_buf); +- if(OPS_flag || MS_flag){ +- filebytes64=filebytes64/reclen; +- } +- /*******************************************************************/ +- if(hist_summary) +- dump_hist("Fwrite",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +- +-return(0); +-} +- +- +-#ifdef HAVE_ANSIC_C +-void * thread_fread_test(void *x) +-#else +-void * thread_fread_test( x) +-#endif +-{ +- struct child_stats *child_stat; +- double starttime1 = 0; +- double temp_time; +- double hist_time; +- double desired_op_rate_time; +- double actual_rate; +- double walltime, cputime; +- double compute_val = (double)0; +- float delay = (float)0; +- double thread_qtime_stop,thread_qtime_start; +- off64_t traj_offset; +- long long w_traj_bytes_completed; +- long long w_traj_ops_completed; +- FILE *w_traj_fd; +- int fd; +- long long recs_per_buffer; +- long long stopped,i; +- off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; +- long long xx,xx2; +- char *dummyfile [MAXSTREAMS]; /* name of dummy file */ +- char *nbuff; +- char *maddr; +- char *wmaddr,*free_addr; +- char now_string[30]; +- int anwser,bind_cpu; +-#if defined(VXFS) || defined(solaris) +- int test_foo = 0; +-#endif +- off64_t filebytes64; +- char tmpname[256]; +- FILE *thread_wqfd; +- FILE *thread_Lwqfd; +- +- if(compute_flag) +- delay=compute_time; +- nbuff=maddr=wmaddr=free_addr=0; +- thread_qtime_stop=thread_qtime_start=0; +- thread_wqfd=w_traj_fd=thread_Lwqfd=(FILE *)0; +- traj_offset=walltime=cputime=0; +- anwser=bind_cpu=0; +- char *stdio_buf; +- long long Index = 0; +- FILE *stream = NULL; +- char *filename; +- +- if(w_traj_flag) +- { +- filebytes64 = w_traj_fsize; +- numrecs64=w_traj_ops; +- } +- else +- { +- filebytes64 = numrecs64*reclen; +- } +- written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; +- w_traj_bytes_completed=w_traj_ops_completed=0; +- recs_per_buffer = cache_size/reclen ; +-#ifdef NO_THREADS +- xx=chid; +-#else +- if(use_thread) +- { +- xx = (long long)((long)x); +- } +- else +- { +- xx=chid; +- } +-#endif +-#ifndef NO_THREADS +-#ifdef _HPUX_SOURCE +- if(ioz_processor_bind) +- { +- bind_cpu=(begin_proc+(int)xx)%num_processors; +- pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, +- (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); +- my_nap(40); /* Switch to new cpu */ +- } +-#endif +-#endif +- if(use_thread) +- nbuff=barray[xx]; +- else +- nbuff=buffer; +- if(debug1 ) +- { +- if(use_thread) +-#ifdef NO_PRINT_LLD +- printf("\nStarting child %ld\n",xx); +-#else +- printf("\nStarting child %lld\n",xx); +-#endif +- else +-#ifdef NO_PRINT_LLD +- printf("\nStarting process %d slot %ld\n",getpid(),xx); +-#else +- printf("\nStarting process %d slot %lld\n",getpid(),xx); +-#endif +- +- } +- dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); +- xx2=xx; +- if(share_file) +- xx2=(long long)0; +- if(mfflag) +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#else +- sprintf(dummyfile[xx],"%s",filearray[xx2]); +-#endif +- } +- else +- { +-#ifdef NO_PRINT_LLD +- sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); +-#else +- sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); +-#endif +- } +- +- filename=dummyfile[xx]; +- +- if(mmapflag || async_flag) +- return(0); +- +- stdio_buf=(char *)malloc((size_t)reclen); +- +- if(Uflag) /* Unmount and re-mount the mountpoint */ +- { +- purge_buffer_cache(); +- } +-#ifdef IRIX64 +- if((stream=(FILE *)fopen(filename,"r")) == 0) +- { +- printf("\nCan not fdopen temp file: %s\n", +- filename); +- perror("fdopen"); +- exit(51); +- } +-#else +- if((stream=(FILE *)I_FOPEN(filename,"r")) == 0) +- { +- printf("\nCan not fdopen temp file: %s\n", +- filename); +- perror("fdopen"); +- exit(52); +- } +-#endif +- fd=I_OPEN(filename,O_RDONLY,0); +- fsync(fd); +- close(fd); +- if(direct_flag) +- setvbuf(stream,stdio_buf,_IONBF,reclen); +- else +- setvbuf(stream,stdio_buf,_IOFBF,reclen); +- +- buffer=mainbuffer; +- if(fetchon) +- fetchit(buffer,reclen); +- compute_val=(double)0; +- +- /*******************************************************************/ +- /*******************************************************************/ +- +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->throughput = 0; +- child_stat->actual = 0; +- child_stat->flag=CHILD_STATE_READY; /* Tell parent child is ready to go */ +- +- if(distributed && client_iozone) +- tell_master_ready(chid); +- if(distributed && client_iozone) +- { +- if(cdebug) +- { +- printf("Child %d waiting for go from master\n",(int)xx); +- fflush(stdout); +- } +- wait_for_master_go(chid); +- if(cdebug) +- { +- printf("Child %d received go from master\n",(int)xx); +- fflush(stdout); +- } +- } +- else +- { +- while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ +- Poll((long long)1); +- } +- +- written_so_far=0; +- child_stat = (struct child_stats *)&shmaddr[xx]; +- child_stat->actual = 0; +- child_stat->throughput = 0; +- stopped=0; +- if(Q_flag) +- { +- sprintf(tmpname,"Child_%d_frol.dat",(int)xx); +- thread_wqfd=fopen(tmpname,"a"); +- if(thread_wqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- fprintf(thread_wqfd,"Offset in Kbytes Latency in microseconds Transfer size in bytes\n"); +- } +- if(L_flag) +- { +- sprintf(tmpname,"Child_%d.log",(int)xx); +- thread_Lwqfd=fopen(tmpname,"a"); +- if(thread_Lwqfd==0) +- { +- client_error=errno; +- if(distributed && client_iozone) +- send_stop(); +- printf("Unable to open %s\n",tmpname); +- exit(40); +- } +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","fread test start: ",now_string); +- } +- starttime1 = time_so_far(); +- if(cpuutilflag) +- { +- walltime = starttime1; +- cputime = cputime_so_far(); +- } +- +- +- +- /*******************************************************************/ +- +- for(i=0; i (MAXBUFFERSIZE-reclen)) +- Index=0; +- buffer = mbuffer + Index; +- } +- if(purge) +- purgeit(buffer,reclen); +- if(Q_flag || hist_summary || op_rate_flag) +- { +- thread_qtime_start=time_so_far(); +- } +- if(fread(buffer, (size_t) reclen,1, stream) != 1) +- { +-#ifdef _64BIT_ARCH_ +-#ifdef NO_PRINT_LLD +- printf("\nError freading block %ld %x\n", i, +- (unsigned long)buffer); +-#else +- printf("\nError freading block %lld %llx\n", i, +- (unsigned long long)buffer); +-#endif +-#else +-#ifdef NO_PRINT_LLD +- printf("\nError freading block %ld %lx\n", i, +- (long)buffer); +-#else +- printf("\nError freading block %lld %lx\n", i, +- (long)buffer); +-#endif +-#endif +- perror("read"); +- exit(54); +- } +- if(verify){ +- if(verify_buffer(buffer,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ +- exit(55); +- } +- } +- if(hist_summary) +- { +- thread_qtime_stop=time_so_far(); +- hist_time =(thread_qtime_stop-thread_qtime_start); +- hist_insert(hist_time); +- } +- if(op_rate_flag) +- { +- thread_qtime_stop=time_so_far(); +- desired_op_rate_time = ((double)1.0/(double)op_rate); +- actual_rate = (double)(thread_qtime_stop-thread_qtime_start); +- if( actual_rate < desired_op_rate_time) +- my_unap((unsigned long long)((desired_op_rate_time-actual_rate)*1000000.0 )); +- } +- if(Q_flag) +- { +- thread_qtime_stop=time_so_far(); +-#ifdef NO_PRINT_LLD +- fprintf(thread_wqfd,"%10.1ld %10.0f %10.1ld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#else +- fprintf(thread_wqfd,"%10.1lld %10.0f %10.1lld\n",(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,reclen); +-#endif +- } +- w_traj_ops_completed++; +- w_traj_bytes_completed+=reclen; +- written_so_far+=reclen/1024; +- +- } +- if(include_flush) +- fflush(stream); +- if(include_close) +- { +- fclose(stream); +- } +- +- /*******************************************************************/ +- +- if(!stopped){ +- temp_time = time_so_far(); +- child_stat->throughput = ((temp_time - starttime1)-time_res) +- -compute_val; +- if(child_stat->throughput < (double).000001) +- { +- child_stat->throughput= time_res; +- if(rec_prob < reclen) +- rec_prob = reclen; +- res_prob=1; +- } +- +- if(OPS_flag){ +- /*written_so_far=(written_so_far*1024)/reclen;*/ +- written_so_far=w_traj_ops_completed; +- } +- child_stat->throughput = +- (double)written_so_far/child_stat->throughput; +- child_stat->actual = (double)written_so_far; +- } +- if(cdebug) +- { +- printf("Child %d: throughput %f actual %f \n",(int)chid, child_stat->throughput, +- child_stat->actual); +- fflush(stdout); +- } +- if(cpuutilflag) +- { +- cputime = cputime_so_far() - cputime; +- if (cputime < cputime_res) +- cputime = 0.0; +- child_stat->cputime = cputime; +- walltime = time_so_far() - walltime; +- child_stat->walltime = walltime; +- } +- if(distributed && client_iozone) +- tell_master_stats(THREAD_FREAD_TEST, chid, child_stat->throughput, +- child_stat->actual, +- child_stat->cputime, child_stat->walltime, +- (char)*stop_flag, +- (long long)CHILD_STATE_HOLD); +- +- if (debug1) { +- printf(" child/slot: %lld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n", +- xx, walltime, cputime, +- cpu_util(cputime, walltime)); +- } +- child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ +- stopped=0; +- +- /*******************************************************************/ +- /* End fead performance test. *************************************/ +- /*******************************************************************/ +- +- if(debug1) +-#ifdef NO_PRINT_LLD +- printf("\nChild finished %ld\n",xx); +-#else +- printf("\nChild finished %lld\n",xx); +-#endif +- if(Q_flag && (thread_wqfd !=0) ) +- fclose(thread_wqfd); +- free(dummyfile[xx]); +- if(w_traj_flag) +- fclose(w_traj_fd); +- +- if(L_flag) +- { +- get_date(now_string); +- fprintf(thread_Lwqfd,"%-25s %s","Fread test finished: ",now_string); +- fclose(thread_Lwqfd); +- } +- +- /*******************************************************************/ +- +- if(!include_close) +- { +- fflush(stream); +- fclose(stream); +- } +- stream = NULL; +- +- if(restf) +- sleep((int)(int)rest_val); +- +- free(stdio_buf); +- if(OPS_flag || MS_flag){ +- filebytes64=filebytes64/reclen; +- } +- +- /*******************************************************************/ +- if(hist_summary) +- dump_hist("Fread",(int)xx); +- if(distributed && client_iozone) +- return(0); +-#ifdef NO_THREADS +- exit(0); +-#else +- if(use_thread) +- thread_exit(); +- else +- exit(0); +-#endif +- +-return(0); +-} +diff --git a/src/components/appio/tests/iozone/iozone_visualizer.pl b/src/components/appio/tests/iozone/iozone_visualizer.pl +deleted file mode 100755 +index a7c6b1360..000000000 +--- a/src/components/appio/tests/iozone/iozone_visualizer.pl ++++ /dev/null +@@ -1,262 +0,0 @@ +-#!/usr/bin/perl +- +-use warnings; +-use strict; +- +-# arguments: one of more report files +-# +-# Christian Mautner , 2005-10-31 +-# Marc Schoechlin , 2007-12-02 +-# +-# This script is just a hack :-) +-# +-# This script is based loosely on the Generate_Graph set +-# of scripts that come with iozone, but is a complete re-write +-# +-# The main reason to write this was the need to compare the behaviour of +-# two or more different setups, for tuning filesystems or +-# comparing different pieces of hardware. +-# +-# This script is in the public domain, too short and too trivial +-# to deserve a copyright. +-# +-# Simply run iozone like, for example, ./iozone -a -g 4G > config1.out (if your machine has 4GB) +-# +-# and then run perl report.pl config1.out +-# or get another report from another box into config2.out and run +-# perl report.pl config1.out config2.out +-# the look in the report_* directory for .png +-# +-# If you don't like png or the graphic size, search for "set terminal" in this file and put whatever gnuplot +-# terminal you want. Note I've also noticed that gnuplot switched the set terminal png syntax +-# a while back, you might need "set terminal png small size 900,700" +-# +-use Getopt::Long; +- +-my $column; +-my %columns; +-my $datafile; +-my @datafiles; +-my $outdir; +-my $report; +-my $nooffset=0; +-my @Reports; +-my @split; +-my $size3d; my $size2d; +- +-# evaluate options +-GetOptions( +- '3d=s' => \$size3d, +- '2d=s' => \$size2d, +- 'nooffset' => \$nooffset +-); +- +-$size3d = "900,700" unless defined $size3d; +-$size2d = "800,500" unless defined $size2d; +- +- +-my $xoffset = "offset -7"; +-my $yoffset = "offset -3"; +- +-if ($nooffset == 1){ +- $xoffset = ""; $yoffset = ""; +-} +- +-print "\niozone_visualizer.pl : this script is distributed as public domain\n"; +-print "Christian Mautner , 2005-10-31\n"; +-print "Marc Schoechlin , 2007-12-02\n"; +- +- +-@Reports=@ARGV; +- +-die "usage: $0 --3d=x,y -2d=x,y [...]\n" if not @Reports or grep (m|^-|, @Reports); +- +-die "report files must be in current directory" if grep (m|/|, @Reports); +- +-print "Configured xtics-offset '$xoffset', configured ytics-offfset '$yoffset' (disable with --nooffset)\n"; +-print "Size 3d graphs : ".$size3d." (modify with '--3d=x,y')\n"; +-print "Size 2d graphs : ".$size2d." (modify with '--2d=x,y')\n"; +- +-#KB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread +-%columns=( +- 'KB' =>1, +- 'reclen' =>2, +- 'write' =>3, +- 'rewrite' =>4, +- 'read' =>5, +- 'reread' =>6, +- 'randread' =>7, +- 'randwrite' =>8, +- 'bkwdread' =>9, +- 'recrewrite'=>10, +- 'strideread'=>11, +- 'fwrite' =>12, +- 'frewrite' =>13, +- 'fread' =>14, +- 'freread' =>15, +- ); +- +-# +-# create output directory. the name is the concatenation +-# of all report file names (minus the file extension, plus +-# prefix report_) +-# +-$outdir="report_".join("_",map{/([^\.]+)(\..*)?/ && $1}(@Reports)); +- +-print STDERR "Output directory: $outdir "; +- +-if ( -d $outdir ) +-{ +- print STDERR "(removing old directory) "; +- system "rm -rf $outdir"; +-} +- +-mkdir $outdir or die "cannot make directory $outdir"; +- +-print STDERR "done.\nPreparing data files..."; +- +-foreach $report (@Reports) +-{ +- open(I, $report) or die "cannot open $report for reading"; +- $report=~/^([^\.]+)/; +- $datafile="$1.dat"; +- push @datafiles, $datafile; +- open(O, ">$outdir/$datafile") or die "cannot open $outdir/$datafile for writing"; +- open(O2, ">$outdir/2d-$datafile") or die "cannot open $outdir/$datafile for writing"; +- +- my @sorted = sort { $columns{$a} <=> $columns{$b} } keys %columns; +- print O "# ".join(" ",@sorted)."\n"; +- print O2 "# ".join(" ",@sorted)."\n"; +- +- while() +- { +- next unless ( /^[\s\d]+$/ ); +- @split = split(); +- next unless ( @split == 15 ); +- print O; +- print O2 if $split[1] == 16384 or $split[0] == $split[1]; +- } +- close(I); +- close(O); +- close(O2); +-} +- +-print STDERR "done.\nGenerating graphs:"; +- +- +-open(HTML, ">$outdir/index.html") or die "cannot open $outdir/index.html for writing"; +- +-print HTML qq{ +- +- +- +-IOZone Statistics +- +- +- +- +-

IOZone Statistics

+- +- +-\n"; +-# Genereate 3d plots +-foreach $column (keys %columns) +-{ +- print STDERR " $column"; +- +- open(G, ">$outdir/$column.do") or die "cannot open $outdir/$column.do for writing"; +- +- +- +- print G qq{ +-set title "Iozone performance: $column" +-set grid lt 2 lw 1 +-set surface +-set parametric +-set xtics $xoffset +-set ytics $yoffset +-set logscale x 2 +-set logscale y 2 +-set autoscale z +-#set xrange [2.**5:2.**24] +-set xlabel "File size in KBytes" -2 +-set ylabel "Record size in Kbytes" 2 +-set zlabel "Kbytes/sec" 4,8 +-set style data lines +-set dgrid3d 80,80,3 +-#set terminal png small picsize 900 700 +-set terminal png small size $size3d nocrop +-set output "$column.png" +-}; +- +- print HTML qq{ +- +- +- +- }; +- +- print G "splot ". join(", ", map{qq{"$_" using 1:2:$columns{$column} title "$_"}}(@datafiles)); +- +- print G "\n"; +- +- close G; +- +- open(G, ">$outdir/2d-$column.do") or die "cannot open $outdir/$column.do for writing"; +- print G qq{ +-set title "Iozone performance: $column" +-#set terminal png small picsize 450 350 +-set terminal png medium size $size2d nocrop +-set logscale x +-set xlabel "File size in KBytes" +-set ylabel "Kbytes/sec" +-set output "2d-$column.png" +-}; +- +- print HTML qq{ +- +- +- +- }; +- +- +- +- print G "plot ". join(", ", map{qq{"2d-$_" using 1:$columns{$column} title "$_" with lines}}(@datafiles)); +- +- print G "\n"; +- +- close G; +- +- if ( system("cd $outdir && gnuplot $column.do && gnuplot 2d-$column.do") ) +- { +- print STDERR "(failed) "; +- } +- else +- { +- print STDERR "(ok) "; +- } +-} +- +-print HTML qq{ +-
+-}; +- +-# Generate Menu +-print HTML "## Overview\n
    \n"; +-foreach $column (keys %columns){ +- print HTML '
  • '.uc($column).' : '. +- '3d\n". +- '2d
  • \n"; +-} +-print HTML "
+-

3d-$column

[top]
+- 3d-$column
+-
+-

2d-$column

[top]
+- 2d-$column
+-
+- +- +-}; +-print STDERR "done.\n"; +diff --git a/src/components/appio/tests/iozone/libasync.c b/src/components/appio/tests/iozone/libasync.c +deleted file mode 100644 +index 4548a2cbe..000000000 +--- a/src/components/appio/tests/iozone/libasync.c ++++ /dev/null +@@ -1,1604 +0,0 @@ +- +- +-/* +- * Library for Posix async read operations with hints. +- * Author: Don Capps +- * Company: Iozone +- * Date: 4/24/1998 +- * +- * Two models are supported. First model is a replacement for read() where the async +- * operations are performed and the requested data is bcopy()-ed back into the users +- * buffer. The second model is a new version of read() where the caller does not +- * supply the address of the buffer but instead is returned an address to the +- * location of the data. The second model eliminates a bcopy from the path. +- * +- * To use model #1: +- * 1. Call async_init(&pointer_on_stack,fd,direct_flag); +- * The fd is the file descriptor for the async operations. +- * The direct_flag sets VX_DIRECT +- * +- * 2. Call async_read(gc, fd, ubuffer, offset, size, stride, max, depth) +- * Where: +- * gc ............ is the pointer on the stack +- * fd ............ is the file descriptor +- * ubuffer ....... is the address of the user buffer. +- * offset ........ is the offset in the file to begin reading +- * size .......... is the size of the transfer. +- * stride ........ is the distance, in size units, to space the async reads. +- * max ........... is the max size of the file to be read. +- * depth ......... is the number of async operations to perform. +- * +- * 3. Call end_async(gc) when finished. +- * Where: +- * gc ............ is the pointer on the stack. +- * +- * To use model #2: +- * 1. Call async_init(&pointer_on_stack,fd,direct_flag); +- * The fd is the file descriptor for the async operations. +- * The direct_flag sets VX_DIRECT +- * 2. Call async_read(gc, fd, &ubuffer, offset, size, stride, max, depth) +- * Where: +- * gc ............ is the pointer on the stack +- * fd ............ is the file descriptor +- * ubuffer ....... is the address of a pointer that will be filled in +- * by the async library. +- * offset ........ is the offset in the file to begin reading +- * size .......... is the size of the transfer. +- * stride ........ is the distance, in size units, to space the async reads. +- * max ........... is the max size of the file to be read. +- * depth ......... is the number of async operations to perform. +- * +- * 3. Call async_release(gc) when finished with the data that was returned. +- * This allows the async library to reuse the memory that was filled in +- * and returned to the user. +- * +- * 4. Call end_async(gc) when finished. +- * Where: +- * gc ............ is the pointer on the stack. +- * +- * To use model #1: (WRITES) +- * 1. Call async_init(&pointer_on_stack,fd,direct_flag); +- * The fd is the file descriptor for the async operations. +- * +- * 2. Call async_write(gc, fd, ubuffer, size, offset, depth) +- * Where: +- * gc ............ is the pointer on the stack +- * fd ............ is the file descriptor +- * ubuffer ....... is the address of the user buffer. +- * size .......... is the size of the transfer. +- * offset ........ is the offset in the file to begin reading +- * depth ......... is the number of async operations to perform. +- * +- * 4. Call end_async(gc) when finished. +- * Where: +- * gc ............ is the pointer on the stack. +- * +- * Notes: +- * The intended use is to replace calls to read() with calls to +- * async_read() and allow the user to make suggestions on +- * what kind of async read-ahead would be nice to have. +- * The first transfer requested is guarenteed to be complete +- * before returning to the caller. The async operations will +- * be started and will also be guarenteed to have completed +- * if the next call specifies its first request to be one +- * that was previously performed with an async operation. +- * +- * The async_read_no_copy() function allows the async operations +- * to return the data to the user and not have to perform +- * a bcopy of the data back into the user specified buffer +- * location. This model is faster but assumes that the user +- * application has been modified to work with this model. +- * +- * The async_write() is intended to enhance the performance of +- * initial writes to a file. This is the slowest case in the write +- * path as it must perform meta-data allocations and wait. +- */ +- +-#include +-#include +-#if defined(solaris) || defined(linux) || defined(SCO_Unixware_gcc) +-#else +-#include +-#endif +-#include +-#include +-#ifndef bsd4_4 +-#include +-#endif +-#ifdef VXFS +-#include +-#endif +- +-#if defined(OSFV5) || defined(linux) +-#include +-#endif +- +-#if defined(linux) +-#include +-#include +-#include +-#endif +- +-#if (defined(solaris) && defined(__LP64__)) || defined(__s390x__) || defined(FreeBSD) +-/* If we are building for 64-bit Solaris, all functions that return pointers +- * must be declared before they are used; otherwise the compiler will assume +- * that they return ints and the top 32 bits of the pointer will be lost, +- * causing segmentation faults. The following includes take care of this. +- * It should be safe to add these for all other OSs too, but we're only +- * doing it for Solaris now in case another OS turns out to be a special case. +- */ +-#include +-#include +-#include /* For the BSD string functions */ +-#endif +- +-void mbcopy(char *source, char *dest, size_t len); +- +- +-#if !defined(solaris) && !defined(off64_t) && !defined(_OFF64_T) && !defined(__off64_t_defined) && !defined(SCO_Unixware_gcc) +-typedef long long off64_t; +-#endif +-#if defined(OSFV5) +-#include +-#endif +- +- +-extern long long page_size; +-extern int one; +-/* +- * Internal cache entrys. Each entry on the global +- * cache, pointed to by async_init(gc) will be of +- * this structure type. +- */ +-char version[] = "Libasync Version $Revision$"; +-struct cache_ent { +- struct aiocb myaiocb; /* For use in small file mode */ +-#ifdef _LARGEFILE64_SOURCE +-#if defined(__CrayX1__) +- aiocb64_t myaiocb64; /* For use in large file mode */ +-#else +- struct aiocb64 myaiocb64; /* For use in large file mode */ +-#endif +-#endif +- long long fd; /* File descriptor */ +- long long size; /* Size of the transfer */ +- struct cache_ent *forward; /* link to next element on cache list */ +- struct cache_ent *back; /* link to previous element on the cache list */ +- long long direct; /* flag to indicate if the buffer should be */ +- /* de-allocated by library */ +- char *real_address; /* Real address to free */ +- +- volatile void *oldbuf; /* Used for firewall to prevent in flight */ +- /* accidents */ +- int oldfd; /* Used for firewall to prevent in flight */ +- /* accidents */ +- size_t oldsize; /* Used for firewall to prevent in flight */ +- /* accidents */ +-}; +- +-/* +- * Head of the cache list +- */ +-struct cache { +- struct cache_ent *head; /* Head of cache list */ +- struct cache_ent *tail; /* tail of cache list */ +- struct cache_ent *inuse_head; /* head of in-use list */ +- long long count; /* How many elements on the cache list */ +- struct cache_ent *w_head; /* Head of cache list */ +- struct cache_ent *w_tail; /* tail of cache list */ +- long long w_count; /* How many elements on the write list */ +- }; +- +-long long max_depth; +-extern int errno; +-struct cache_ent *alloc_cache(); +-struct cache_ent *incache(); +-void async_init(); +-void end_async(); +-int async_suspend(); +-int async_read(); +-void takeoff_cache(); +-void del_cache(); +-void async_release(); +-void putoninuse(); +-void takeoffinuse(); +-struct cache_ent *allocate_write_buffer(); +-size_t async_write(); +-void async_wait_for_write(); +-void async_put_on_write_queue(); +-void async_write_finish(); +- +-/* On Solaris _LP64 will be defined by if we're compiling +- * as a 64-bit binary. Make sure that __LP64__ gets defined in this case, +- * too -- it should be defined on the compiler command line, but let's +- * not rely on this. +- */ +-#if defined(_LP64) +-#if !defined(__LP64__) +-#define __LP64__ +-#endif +-#endif +- +- +-/***********************************************/ +-/* Initialization routine to setup the library */ +-/***********************************************/ +-void +-async_init(gc,fd,flag) +-struct cache **gc; +-int fd; +-int flag; +-{ +-#ifdef VXFS +- if(flag) +- ioctl(fd,VX_SETCACHE,VX_DIRECT); +-#endif +- if(*gc) +- { +- printf("Warning calling async_init two times ?\n"); +- return; +- } +- *gc=(struct cache *)malloc((size_t)sizeof(struct cache)); +- if(*gc == 0) +- { +- printf("Malloc failed\n"); +- exit(174); +- } +- bzero(*gc,sizeof(struct cache)); +-#if defined(__AIX__) || defined(SCO_Unixware_gcc) +- max_depth=500; +-#else +- max_depth=sysconf(_SC_AIO_MAX); +-#endif +-} +- +-/***********************************************/ +-/* Tear down routine to shutdown the library */ +-/***********************************************/ +-void +-end_async(gc) +-struct cache *gc; +-{ +- del_cache(gc); +- async_write_finish(gc); +- free((void *)gc); +-} +- +-/***********************************************/ +-/* Wait for a request to finish */ +-/***********************************************/ +-int +-async_suspend(struct cache_ent *ce) +-{ +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- const struct aiocb * const cblist[1] = {&ce->myaiocb}; +-#else +- const struct aiocb64 * const cblist[1] = {&ce->myaiocb64}; +-#endif +-#else +- const struct aiocb * const cblist[1] = {&ce->myaiocb}; +-#endif +- +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- return aio_suspend(cblist, 1, NULL); +-#else +- return aio_suspend64(cblist, 1, NULL); +-#endif +-#else +- return aio_suspend(cblist, 1, NULL); +-#endif +-} +- +-/************************************************************************* +- * This routine is a generic async reader assist function. It takes +- * the same calling parameters as read() but also extends the +- * interface to include: +- * stride ..... For the async reads, what is the distance, in size units, +- * to space the reads. Note: Stride of 0 indicates that +- * you do not want any read-ahead. +- * max ..... What is the maximum file offset for this operation. +- * depth ..... How much read-ahead do you want. +- * +- * The calls to this will guarentee to complete the read() operation +- * before returning to the caller. The completion may occur in two +- * ways. First the operation may be completed by calling aio_read() +- * and then waiting for it to complete. Second the operation may be +- * completed by copying the data from a cache of previously completed +- * async operations. +- * In the event the read to be satisfied is not in the cache then a +- * series of async operations will be scheduled and then the first +- * async read will be completed. In the event that the read() can be +- * satisfied from the cache then the data is copied back to the +- * user buffer and a series of async reads will be initiated. If a +- * read is issued and the cache contains data and the read can not +- * be satisfied from the cache, then the cache is discarded, and +- * a new cache is constructed. +- * Note: All operations are aio_read(). The series will be issued +- * as asyncs in the order requested. After all are in flight +- * then the code will wait for the manditory first read. +- *************************************************************************/ +- +-int +-async_read(gc, fd, ubuffer, offset, size, stride, max, depth) +-struct cache *gc; +-long long fd; +-char *ubuffer; +-off64_t offset; +-long long size; +-long long stride; +-off64_t max; +-long long depth; +-{ +- off64_t a_offset,r_offset; +- long long a_size; +- struct cache_ent *ce,*first_ce=0; +- long long i; +- ssize_t retval=0; +- ssize_t ret; +- long long start = 0; +- long long del_read=0; +- +- a_offset=offset; +- a_size = size; +- /* +- * Check to see if it can be completed from the cache +- */ +- if((ce=(struct cache_ent *)incache(gc,fd,offset,size))) +- { +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- while((ret=aio_error(&ce->myaiocb))== EINPROGRESS) +- { +- async_suspend(ce); +- } +-#else +- while((ret=aio_error64(&ce->myaiocb64))== EINPROGRESS) +- { +- async_suspend(ce); +- } +-#endif +-#else +- while((ret=aio_error(&ce->myaiocb))== EINPROGRESS) +- { +- async_suspend(ce); +- } +-#endif +- if(ret) +- { +- printf("aio_error 1: ret %d %d\n",ret,errno); +- } +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- retval=aio_return(&ce->myaiocb); +-#else +-#if defined(__CrayX1__) +- retval=aio_return64((aiocb64_t *)&ce->myaiocb64); +-#else +- retval=aio_return64((struct aiocb64 *)&ce->myaiocb64); +-#endif +- +-#endif +-#else +- retval=aio_return(&ce->myaiocb); +-#endif +- if(retval > 0) +- { +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- mbcopy((char *)ce->myaiocb.aio_buf,(char *)ubuffer,(size_t)retval); +-#else +- mbcopy((char *)ce->myaiocb64.aio_buf,(char *)ubuffer,(size_t)retval); +-#endif +-#else +- mbcopy((char *)ce->myaiocb.aio_buf,(char *)ubuffer,(size_t)retval); +-#endif +- } +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- if(retval < ce->myaiocb.aio_nbytes) +-#else +- if(retval < ce->myaiocb64.aio_nbytes) +-#endif +-#else +- if(retval < ce->myaiocb.aio_nbytes) +-#endif +- { +- printf("aio_return error1: ret %d %d\n",retval,errno); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- printf("aio_return error1: fd %d offset %ld buffer %lx size %d Opcode %d\n", +- ce->myaiocb.aio_fildes, +- ce->myaiocb.aio_offset, +- (long)(ce->myaiocb.aio_buf), +- ce->myaiocb.aio_nbytes, +- ce->myaiocb.aio_lio_opcode +-#else +- printf("aio_return error1: fd %d offset %lld buffer %lx size %d Opcode %d\n", +- ce->myaiocb64.aio_fildes, +- ce->myaiocb64.aio_offset, +- (long)(ce->myaiocb64.aio_buf), +- ce->myaiocb64.aio_nbytes, +- ce->myaiocb64.aio_lio_opcode +-#endif +-#else +- printf("aio_return error1: fd %d offset %d buffer %lx size %d Opcode %d\n", +- ce->myaiocb.aio_fildes, +- ce->myaiocb.aio_offset, +- (long)(ce->myaiocb.aio_buf), +- ce->myaiocb.aio_nbytes, +- ce->myaiocb.aio_lio_opcode +-#endif +- ); +- } +- ce->direct=0; +- takeoff_cache(gc,ce); +- }else +- { +- /* +- * Clear the cache and issue the first request async() +- */ +- del_cache(gc); +- del_read++; +- first_ce=alloc_cache(gc,fd,offset,size,(long long)LIO_READ); +-again: +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- ret=aio_read(&first_ce->myaiocb); +-#else +- ret=aio_read64(&first_ce->myaiocb64); +-#endif +-#else +- ret=aio_read(&first_ce->myaiocb); +-#endif +- if(ret!=0) +- { +- if(errno==EAGAIN) +- goto again; +- else +- printf("error returned from aio_read(). Ret %d errno %d\n",ret,errno); +- } +- } +- if(stride==0) /* User does not want read-ahead */ +- goto out; +- if(a_offset<0) /* Before beginning of file */ +- goto out; +- if(a_offset+size>max) /* After end of file */ +- goto out; +- if(depth >=(max_depth-1)) +- depth=max_depth-1; +- if(depth==0) +- goto out; +- if(gc->count > 1) +- start=depth-1; +- for(i=start;i max) +- continue; +- if((ce=incache(gc,fd,r_offset,a_size))) +- continue; +- ce=alloc_cache(gc,fd,r_offset,a_size,(long long)LIO_READ); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- ret=aio_read(&ce->myaiocb); +-#else +- ret=aio_read64(&ce->myaiocb64); +-#endif +-#else +- ret=aio_read(&ce->myaiocb); +-#endif +- if(ret!=0) +- { +- takeoff_cache(gc,ce); +- break; +- } +- } +-out: +- if(del_read) /* Wait for the first read to complete */ +- { +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- while((ret=aio_error(&first_ce->myaiocb))== EINPROGRESS) +- { +- async_suspend(first_ce); +- } +-#else +- while((ret=aio_error64(&first_ce->myaiocb64))== EINPROGRESS) +- { +- async_suspend(first_ce); +- } +-#endif +-#else +- while((ret=aio_error(&first_ce->myaiocb))== EINPROGRESS) +- { +- async_suspend(first_ce); +- } +-#endif +- if(ret) +- printf("aio_error 2: ret %d %d\n",ret,errno); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- retval=aio_return(&first_ce->myaiocb); +-#else +- retval=aio_return64(&first_ce->myaiocb64); +-#endif +-#else +- retval=aio_return(&first_ce->myaiocb); +-#endif +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- if(retval < first_ce->myaiocb.aio_nbytes) +-#else +- if(retval < first_ce->myaiocb64.aio_nbytes) +-#endif +-#else +- if(retval < first_ce->myaiocb.aio_nbytes) +-#endif +- { +- printf("aio_return error2: ret %d %d\n",retval,errno); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- printf("aio_return error2: fd %d offset %lld buffer %lx size %d Opcode %d\n", +- first_ce->myaiocb.aio_fildes, +- first_ce->myaiocb.aio_offset, +- (long)(first_ce->myaiocb.aio_buf), +- first_ce->myaiocb.aio_nbytes, +- first_ce->myaiocb.aio_lio_opcode +-#else +- printf("aio_return error2: fd %d offset %lld buffer %lx size %d Opcode %d\n", +- first_ce->myaiocb64.aio_fildes, +- first_ce->myaiocb64.aio_offset, +- (long)(first_ce->myaiocb64.aio_buf), +- first_ce->myaiocb64.aio_nbytes, +- first_ce->myaiocb64.aio_lio_opcode +-#endif +-#else +- printf("aio_return error2: fd %d offset %d buffer %lx size %d Opcode %d\n", +- first_ce->myaiocb.aio_fildes, +- first_ce->myaiocb.aio_offset, +- (long)(first_ce->myaiocb.aio_buf), +- first_ce->myaiocb.aio_nbytes, +- first_ce->myaiocb.aio_lio_opcode +-#endif +- ); +- } +- if(retval > 0) +- { +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- mbcopy((char *)first_ce->myaiocb.aio_buf,(char *)ubuffer,(size_t)retval); +-#else +- mbcopy((char *)first_ce->myaiocb64.aio_buf,(char *)ubuffer,(size_t)retval); +-#endif +-#else +- mbcopy((char *)first_ce->myaiocb.aio_buf,(char *)ubuffer,(size_t)retval); +-#endif +- } +- first_ce->direct=0; +- takeoff_cache(gc,first_ce); +- } +- return((int)retval); +-} +- +-/************************************************************************ +- * This routine allocates a cache_entry. It contains the +- * aiocb block as well as linkage for use in the cache mechanism. +- * The space allocated here will be released after the cache entry +- * has been consumed. The routine takeoff_cache() will be called +- * after the data has been copied to user buffer or when the +- * cache is purged. The routine takeoff_cache() will also release +- * all memory associated with this cache entry. +- ************************************************************************/ +- +-struct cache_ent * +-alloc_cache(gc,fd,offset,size,op) +-struct cache *gc; +-long long fd,size,op; +-off64_t offset; +-{ +- struct cache_ent *ce; +- long temp; +- ce=(struct cache_ent *)malloc((size_t)sizeof(struct cache_ent)); +- if(ce == (struct cache_ent *)0) +- { +- printf("Malloc failed\n"); +- exit(175); +- } +- bzero(ce,sizeof(struct cache_ent)); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- ce->myaiocb.aio_fildes=(int)fd; +- ce->myaiocb.aio_offset=(off64_t)offset; +- ce->real_address = (char *)malloc((size_t)(size+page_size)); +- temp=(long)ce->real_address; +- temp = (temp+page_size) & ~(page_size-1); +- ce->myaiocb.aio_buf=(volatile void *)temp; +- if(ce->myaiocb.aio_buf == 0) +-#else +- ce->myaiocb64.aio_fildes=(int)fd; +- ce->myaiocb64.aio_offset=(off64_t)offset; +- ce->real_address = (char *)malloc((size_t)(size+page_size)); +- temp=(long)ce->real_address; +- temp = (temp+page_size) & ~(page_size-1); +- ce->myaiocb64.aio_buf=(volatile void *)temp; +- if(ce->myaiocb64.aio_buf == 0) +-#endif +-#else +- ce->myaiocb.aio_fildes=(int)fd; +- ce->myaiocb.aio_offset=(off_t)offset; +- ce->real_address = (char *)malloc((size_t)(size+page_size)); +- temp=(long)ce->real_address; +- temp = (temp+page_size) & ~(page_size-1); +- ce->myaiocb.aio_buf=(volatile void *)temp; +- if(ce->myaiocb.aio_buf == 0) +-#endif +- { +- printf("Malloc failed\n"); +- exit(176); +- } +- /*bzero(ce->myaiocb.aio_buf,(size_t)size);*/ +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- ce->myaiocb.aio_reqprio=0; +- ce->myaiocb.aio_nbytes=(size_t)size; +- ce->myaiocb.aio_sigevent.sigev_notify=SIGEV_NONE; +- ce->myaiocb.aio_lio_opcode=(int)op; +-#else +- ce->myaiocb64.aio_reqprio=0; +- ce->myaiocb64.aio_nbytes=(size_t)size; +- ce->myaiocb64.aio_sigevent.sigev_notify=SIGEV_NONE; +- ce->myaiocb64.aio_lio_opcode=(int)op; +-#endif +-#else +- ce->myaiocb.aio_reqprio=0; +- ce->myaiocb.aio_nbytes=(size_t)size; +- ce->myaiocb.aio_sigevent.sigev_notify=SIGEV_NONE; +- ce->myaiocb.aio_lio_opcode=(int)op; +-#endif +- ce->fd=(int)fd; +- ce->forward=0; +- ce->back=gc->tail; +- if(gc->tail) +- gc->tail->forward = ce; +- gc->tail= ce; +- if(!gc->head) +- gc->head=ce; +- gc->count++; +- return(ce); +-} +- +-/************************************************************************ +- * This routine checks to see if the requested data is in the +- * cache. +-*************************************************************************/ +-struct cache_ent * +-incache(gc,fd,offset,size) +-struct cache *gc; +-long long fd,size; +-off64_t offset; +-{ +- struct cache_ent *move; +- if(gc->head==0) +- { +- return(0); +- } +- move=gc->head; +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- while(move) +- { +- if((move->fd == fd) && (move->myaiocb.aio_offset==(off64_t)offset) && +- ((size_t)size==move->myaiocb.aio_nbytes)) +- { +- return(move); +- } +- move=move->forward; +- } +-#else +- while(move) +- { +- if((move->fd == fd) && (move->myaiocb64.aio_offset==(off64_t)offset) && +- ((size_t)size==move->myaiocb64.aio_nbytes)) +- { +- return(move); +- } +- move=move->forward; +- } +-#endif +-#else +- while(move) +- { +- if((move->fd == fd) && (move->myaiocb.aio_offset==(off_t)offset) && +- ((size_t)size==move->myaiocb.aio_nbytes)) +- { +- return(move); +- } +- move=move->forward; +- } +-#endif +- return(0); +-} +- +-/************************************************************************ +- * This routine removes a specific cache entry from the cache, and +- * releases all memory associated witht the cache entry (if not direct). +-*************************************************************************/ +- +-void +-takeoff_cache(gc,ce) +-struct cache *gc; +-struct cache_ent *ce; +-{ +- struct cache_ent *move; +- long long found; +- move=gc->head; +- if(move==ce) /* Head of list */ +- { +- +- gc->head=ce->forward; +- if(gc->head) +- gc->head->back=0; +- else +- gc->tail = 0; +- if(!ce->direct) +- { +- free((void *)(ce->real_address)); +- free((void *)ce); +- } +- gc->count--; +- return; +- } +- found=0; +- while(move) +- { +- if(move==ce) +- { +- if(move->forward) +- { +- move->forward->back=move->back; +- } +- if(move->back) +- { +- move->back->forward=move->forward; +- } +- found=1; +- break; +- } +- else +- { +- move=move->forward; +- } +- } +- if(gc->head == ce) +- gc->tail = ce; +- if(!found) +- printf("Internal Error in takeoff cache\n"); +- move=gc->head; +- if(!ce->direct) +- { +- free((void *)(ce->real_address)); +- free((void *)ce); +- } +- gc->count--; +-} +- +-/************************************************************************ +- * This routine is used to purge the entire cache. This is called when +- * the cache contains data but the incomming read was not able to +- * be satisfied from the cache. This indicates that the previous +- * async read-ahead was not correct and a new pattern is emerging. +- ************************************************************************/ +-void +-del_cache(gc) +-struct cache *gc; +-{ +- struct cache_ent *ce; +- ssize_t ret; +- ce=gc->head; +- while(1) +- { +- ce=gc->head; +- if(ce==0) +- return; +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- while((ret = aio_cancel(0,&ce->myaiocb))==AIO_NOTCANCELED) +-#else +- while((ret = aio_cancel64(0,&ce->myaiocb64))==AIO_NOTCANCELED) +-#endif +-#else +- while((ret = aio_cancel(0,&ce->myaiocb))==AIO_NOTCANCELED) +-#endif +- ; +- +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- ret = aio_return(&ce->myaiocb); +-#else +- ret = aio_return64(&ce->myaiocb64); +-#endif +-#else +- ret = aio_return(&ce->myaiocb); +-#endif +- ce->direct=0; +- takeoff_cache(gc,ce); /* remove from cache */ +- } +-} +- +-/************************************************************************ +- * Like its sister async_read() this function performs async I/O for +- * all buffers but it differs in that it expects the caller to +- * request a pointer to the data to be returned instead of handing +- * the function a location to put the data. This will allow the +- * async I/O to be performed and does not require any bcopy to be +- * done to put the data back into the location specified by the caller. +- ************************************************************************/ +-int +-async_read_no_copy(gc, fd, ubuffer, offset, size, stride, max, depth) +-struct cache *gc; +-long long fd; +-char **ubuffer; +-off64_t offset; +-long long size; +-long long stride; +-off64_t max; +-long long depth; +-{ +- off64_t a_offset,r_offset; +- long long a_size; +- struct cache_ent *ce,*first_ce=0; +- long long i; +- ssize_t retval=0; +- ssize_t ret; +- long long del_read=0; +- long long start=0; +- +- a_offset=offset; +- a_size = size; +- /* +- * Check to see if it can be completed from the cache +- */ +- if((ce=(struct cache_ent *)incache(gc,fd,offset,size))) +- { +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- while((ret=aio_error(&ce->myaiocb))== EINPROGRESS) +- { +- async_suspend(ce); +- } +-#else +- while((ret=aio_error64(&ce->myaiocb64))== EINPROGRESS) +- { +- async_suspend(ce); +- } +-#endif +-#else +- while((ret=aio_error(&ce->myaiocb))== EINPROGRESS) +- { +- async_suspend(ce); +- } +-#endif +- if(ret) +- printf("aio_error 3: ret %d %d\n",ret,errno); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- if(ce->oldbuf != ce->myaiocb.aio_buf || +- ce->oldfd != ce->myaiocb.aio_fildes || +- ce->oldsize != ce->myaiocb.aio_nbytes) +-#else +- if(ce->oldbuf != ce->myaiocb64.aio_buf || +- ce->oldfd != ce->myaiocb64.aio_fildes || +- ce->oldsize != ce->myaiocb64.aio_nbytes) +-#endif +-#else +- if(ce->oldbuf != ce->myaiocb.aio_buf || +- ce->oldfd != ce->myaiocb.aio_fildes || +- ce->oldsize != ce->myaiocb.aio_nbytes) +-#endif +- printf("It changed in flight\n"); +- +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- retval=aio_return(&ce->myaiocb); +-#else +- retval=aio_return64(&ce->myaiocb64); +-#endif +-#else +- retval=aio_return(&ce->myaiocb); +-#endif +- if(retval > 0) +- { +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- *ubuffer=(char *)ce->myaiocb.aio_buf; +-#else +- *ubuffer=(char *)ce->myaiocb64.aio_buf; +-#endif +-#else +- *ubuffer=(char *)ce->myaiocb.aio_buf; +-#endif +- }else +- *ubuffer=0; +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- if(retval < ce->myaiocb.aio_nbytes) +-#else +- if(retval < ce->myaiocb64.aio_nbytes) +-#endif +-#else +- if(retval < ce->myaiocb.aio_nbytes) +-#endif +- { +- printf("aio_return error4: ret %d %d\n",retval,errno); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- printf("aio_return error4: fd %d offset %lld buffer %lx size %d Opcode %d\n", +- ce->myaiocb.aio_fildes, +- ce->myaiocb.aio_offset, +- (long)(ce->myaiocb.aio_buf), +- ce->myaiocb.aio_nbytes, +- ce->myaiocb.aio_lio_opcode +-#else +- printf("aio_return error4: fd %d offset %lld buffer %lx size %d Opcode %d\n", +- ce->myaiocb64.aio_fildes, +- ce->myaiocb64.aio_offset, +- (long)(ce->myaiocb64.aio_buf), +- ce->myaiocb64.aio_nbytes, +- ce->myaiocb64.aio_lio_opcode +-#endif +-#else +- printf("aio_return error4: fd %d offset %d buffer %lx size %d Opcode %d\n", +- ce->myaiocb.aio_fildes, +- ce->myaiocb.aio_offset, +- (long)(ce->myaiocb.aio_buf), +- ce->myaiocb.aio_nbytes, +- ce->myaiocb.aio_lio_opcode +-#endif +- ); +- } +- ce->direct=1; +- takeoff_cache(gc,ce); /* do not delete buffer*/ +- putoninuse(gc,ce); +- }else +- { +- /* +- * Clear the cache and issue the first request async() +- */ +- del_cache(gc); +- del_read++; +- first_ce=alloc_cache(gc,fd,offset,size,(long long)LIO_READ); /* allocate buffer */ +- /*printf("allocated buffer/read %x offset %d\n",first_ce->myaiocb.aio_buf,offset);*/ +-again: +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- first_ce->oldbuf=first_ce->myaiocb.aio_buf; +- first_ce->oldfd=first_ce->myaiocb.aio_fildes; +- first_ce->oldsize=first_ce->myaiocb.aio_nbytes; +- ret=aio_read(&first_ce->myaiocb); +-#else +- first_ce->oldbuf=first_ce->myaiocb64.aio_buf; +- first_ce->oldfd=first_ce->myaiocb64.aio_fildes; +- first_ce->oldsize=first_ce->myaiocb64.aio_nbytes; +- ret=aio_read64(&first_ce->myaiocb64); +-#endif +-#else +- first_ce->oldbuf=first_ce->myaiocb.aio_buf; +- first_ce->oldfd=first_ce->myaiocb.aio_fildes; +- first_ce->oldsize=first_ce->myaiocb.aio_nbytes; +- ret=aio_read(&first_ce->myaiocb); +-#endif +- if(ret!=0) +- { +- if(errno==EAGAIN) +- goto again; +- else +- printf("error returned from aio_read(). Ret %d errno %d\n",ret,errno); +- } +- } +- if(stride==0) /* User does not want read-ahead */ +- goto out; +- if(a_offset<0) /* Before beginning of file */ +- goto out; +- if(a_offset+size>max) /* After end of file */ +- goto out; +- if(depth >=(max_depth-1)) +- depth=max_depth-1; +- if(depth==0) +- goto out; +- if(gc->count > 1) +- start=depth-1; +- for(i=start;i max) +- continue; +- if((ce=incache(gc,fd,r_offset,a_size))) +- continue; +- ce=alloc_cache(gc,fd,r_offset,a_size,(long long)LIO_READ); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- ce->oldbuf=ce->myaiocb.aio_buf; +- ce->oldfd=ce->myaiocb.aio_fildes; +- ce->oldsize=ce->myaiocb.aio_nbytes; +- ret=aio_read(&ce->myaiocb); +-#else +- ce->oldbuf=ce->myaiocb64.aio_buf; +- ce->oldfd=ce->myaiocb64.aio_fildes; +- ce->oldsize=ce->myaiocb64.aio_nbytes; +- ret=aio_read64(&ce->myaiocb64); +-#endif +-#else +- ce->oldbuf=ce->myaiocb.aio_buf; +- ce->oldfd=ce->myaiocb.aio_fildes; +- ce->oldsize=ce->myaiocb.aio_nbytes; +- ret=aio_read(&ce->myaiocb); +-#endif +- if(ret!=0) +- { +- takeoff_cache(gc,ce); +- break; +- } +- } +-out: +- if(del_read) /* Wait for the first read to complete */ +- { +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- while((ret=aio_error(&first_ce->myaiocb))== EINPROGRESS) +- { +- async_suspend(first_ce); +- } +-#else +- while((ret=aio_error64(&first_ce->myaiocb64))== EINPROGRESS) +- { +- async_suspend(first_ce); +- } +-#endif +-#else +- while((ret=aio_error(&first_ce->myaiocb))== EINPROGRESS) +- { +- async_suspend(first_ce); +- } +-#endif +- if(ret) +- printf("aio_error 4: ret %d %d\n",ret,errno); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- if(first_ce->oldbuf != first_ce->myaiocb.aio_buf || +- first_ce->oldfd != first_ce->myaiocb.aio_fildes || +- first_ce->oldsize != first_ce->myaiocb.aio_nbytes) +- printf("It changed in flight2\n"); +- retval=aio_return(&first_ce->myaiocb); +-#else +- if(first_ce->oldbuf != first_ce->myaiocb64.aio_buf || +- first_ce->oldfd != first_ce->myaiocb64.aio_fildes || +- first_ce->oldsize != first_ce->myaiocb64.aio_nbytes) +- printf("It changed in flight2\n"); +- retval=aio_return64(&first_ce->myaiocb64); +-#endif +-#else +- if(first_ce->oldbuf != first_ce->myaiocb.aio_buf || +- first_ce->oldfd != first_ce->myaiocb.aio_fildes || +- first_ce->oldsize != first_ce->myaiocb.aio_nbytes) +- printf("It changed in flight2\n"); +- retval=aio_return(&first_ce->myaiocb); +-#endif +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- if(retval < first_ce->myaiocb.aio_nbytes) +-#else +- if(retval < first_ce->myaiocb64.aio_nbytes) +-#endif +-#else +- if(retval < first_ce->myaiocb.aio_nbytes) +-#endif +- { +- printf("aio_return error5: ret %d %d\n",retval,errno); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- printf("aio_return error5: fd %d offset %lld buffer %lx size %d Opcode %d\n", +- first_ce->myaiocb.aio_fildes, +- first_ce->myaiocb.aio_offset, +- (long)(first_ce->myaiocb.aio_buf), +- first_ce->myaiocb.aio_nbytes, +- first_ce->myaiocb.aio_lio_opcode +-#else +- printf("aio_return error5: fd %d offset %lld buffer %lx size %d Opcode %d\n", +- first_ce->myaiocb64.aio_fildes, +- first_ce->myaiocb64.aio_offset, +- (long)(first_ce->myaiocb64.aio_buf), +- first_ce->myaiocb64.aio_nbytes, +- first_ce->myaiocb64.aio_lio_opcode +-#endif +-#else +- printf("aio_return error5: fd %d offset %ld buffer %lx size %d Opcode %d\n", +- first_ce->myaiocb.aio_fildes, +- first_ce->myaiocb.aio_offset, +- (long)(first_ce->myaiocb.aio_buf), +- first_ce->myaiocb.aio_nbytes, +- first_ce->myaiocb.aio_lio_opcode +-#endif +- ); +- } +- if(retval > 0) +- { +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- *ubuffer=(char *)first_ce->myaiocb.aio_buf; +-#else +- *ubuffer=(char *)first_ce->myaiocb64.aio_buf; +-#endif +-#else +- *ubuffer=(char *)first_ce->myaiocb.aio_buf; +-#endif +- }else +- *ubuffer=(char *)0; +- first_ce->direct=1; /* do not delete the buffer */ +- takeoff_cache(gc,first_ce); +- putoninuse(gc,first_ce); +- } +- return((int)retval); +-} +- +-/************************************************************************ +- * The caller is now finished with the data that was provided so +- * the library is now free to return the memory to the pool for later +- * reuse. +- ************************************************************************/ +-void +-async_release(gc) +-struct cache *gc; +-{ +- takeoffinuse(gc); +-} +- +- +-/************************************************************************ +- * Put the buffer on the inuse list. When the user is finished with +- * the buffer it will call back into async_release and the items on the +- * inuse list will be deallocated. +- ************************************************************************/ +-void +-putoninuse(gc,entry) +-struct cache *gc; +-struct cache_ent *entry; +-{ +- if(gc->inuse_head) +- entry->forward=gc->inuse_head; +- else +- entry->forward=0; +- gc->inuse_head=entry; +-} +- +-/************************************************************************ +- * This is called when the application is finished with the data that +- * was provided. The memory may now be returned to the pool. +- ************************************************************************/ +-void +-takeoffinuse(gc) +-struct cache *gc; +-{ +- struct cache_ent *ce; +- if(gc->inuse_head==0) +- printf("Takeoffinuse error\n"); +- ce=gc->inuse_head; +- gc->inuse_head=gc->inuse_head->forward; +- +- if(gc->inuse_head !=0) +- printf("Error in take off inuse\n"); +- free((void*)(ce->real_address)); +- free(ce); +-} +- +-/************************************************************************* +- * This routine is a generic async writer assist function. It takes +- * the same calling parameters as write() but also extends the +- * interface to include: +- * +- * offset ..... offset in the file. +- * depth ..... How much read-ahead do you want. +- * +- *************************************************************************/ +-size_t +-async_write(gc,fd,buffer,size,offset,depth) +-struct cache *gc; +-long long fd,size; +-char *buffer; +-off64_t offset; +-long long depth; +-{ +- struct cache_ent *ce; +- size_t ret; +- ce=allocate_write_buffer(gc,fd,offset,size,(long long)LIO_WRITE,depth,0LL,(char *)0,(char *)0); +- ce->direct=0; /* not direct. Lib supplies buffer and must free it */ +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- mbcopy(buffer,(char *)(ce->myaiocb.aio_buf),(size_t)size); +-#else +- mbcopy(buffer,(char *)(ce->myaiocb64.aio_buf),(size_t)size); +-#endif +-#else +- mbcopy(buffer,(char *)(ce->myaiocb.aio_buf),(size_t)size); +-#endif +- async_put_on_write_queue(gc,ce); +- /* +- printf("asw: fd %d offset %lld, size %d\n",ce->myaiocb64.aio_fildes, +- ce->myaiocb64.aio_offset, +- ce->myaiocb64.aio_nbytes); +- */ +- +-again: +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- ret=aio_write(&ce->myaiocb); +-#else +- ret=aio_write64(&ce->myaiocb64); +-#endif +-#else +- ret=aio_write(&ce->myaiocb); +-#endif +- if(ret==-1) +- { +- if(errno==EAGAIN) +- { +- async_wait_for_write(gc); +- goto again; +- } +- if(errno==0) +- { +- /* Compensate for bug in async library */ +- async_wait_for_write(gc); +- goto again; +- } +- else +- { +- printf("Error in aio_write: ret %d errno %d count %lld\n",ret,errno,gc->w_count); +- /* +- printf("aio_write_no_copy: fd %d buffer %x offset %lld size %d\n", +- ce->myaiocb64.aio_fildes, +- ce->myaiocb64.aio_buf, +- ce->myaiocb64.aio_offset, +- ce->myaiocb64.aio_nbytes); +- */ +- exit(177); +- } +- } +- return((ssize_t)size); +-} +- +-/************************************************************************* +- * Allocate a write aiocb and write buffer of the size specified. Also +- * put some extra buffer padding so that VX_DIRECT can do its job when +- * needed. +- *************************************************************************/ +- +-struct cache_ent * +-allocate_write_buffer(gc,fd,offset,size,op,w_depth,direct,buffer,free_addr) +-struct cache *gc; +-long long fd,size,op; +-off64_t offset; +-long long w_depth; +-long long direct; +-char *buffer,*free_addr; +-{ +- struct cache_ent *ce; +- long temp; +- if(fd==0LL) +- { +- printf("Setting up write buffer insane\n"); +- exit(178); +- } +- if(gc->w_count > w_depth) +- async_wait_for_write(gc); +- ce=(struct cache_ent *)malloc((size_t)sizeof(struct cache_ent)); +- if(ce == (struct cache_ent *)0) +- { +- printf("Malloc failed 1\n"); +- exit(179); +- } +- bzero(ce,sizeof(struct cache_ent)); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- ce->myaiocb.aio_fildes=(int)fd; +- ce->myaiocb.aio_offset=(off64_t)offset; +- if(!direct) +- { +- ce->real_address = (char *)malloc((size_t)(size+page_size)); +- temp=(long)ce->real_address; +- temp = (temp+page_size) & ~(page_size-1); +- ce->myaiocb.aio_buf=(volatile void *)temp; +- }else +- { +- ce->myaiocb.aio_buf=(volatile void *)buffer; +- ce->real_address=(char *)free_addr; +- } +- if(ce->myaiocb.aio_buf == 0) +-#else +- ce->myaiocb64.aio_fildes=(int)fd; +- ce->myaiocb64.aio_offset=(off64_t)offset; +- if(!direct) +- { +- ce->real_address = (char *)malloc((size_t)(size+page_size)); +- temp=(long)ce->real_address; +- temp = (temp+page_size) & ~(page_size-1); +- ce->myaiocb64.aio_buf=(volatile void *)temp; +- } +- else +- { +- ce->myaiocb64.aio_buf=(volatile void *)buffer; +- ce->real_address=(char *)free_addr; +- } +- if(ce->myaiocb64.aio_buf == 0) +-#endif +-#else +- ce->myaiocb.aio_fildes=(int)fd; +- ce->myaiocb.aio_offset=(off_t)offset; +- if(!direct) +- { +- ce->real_address = (char *)malloc((size_t)(size+page_size)); +- temp=(long)ce->real_address; +- temp = (temp+page_size) & ~(page_size-1); +- ce->myaiocb.aio_buf=(volatile void *)temp; +- } +- else +- { +- ce->myaiocb.aio_buf=(volatile void *)buffer; +- ce->real_address=(char *)free_addr; +- } +- if(ce->myaiocb.aio_buf == 0) +-#endif +- { +- printf("Malloc failed 2\n"); +- exit(180); +- } +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- ce->myaiocb.aio_reqprio=0; +- ce->myaiocb.aio_nbytes=(size_t)size; +- ce->myaiocb.aio_sigevent.sigev_notify=SIGEV_NONE; +- ce->myaiocb.aio_lio_opcode=(int)op; +-#else +- ce->myaiocb64.aio_reqprio=0; +- ce->myaiocb64.aio_nbytes=(size_t)size; +- ce->myaiocb64.aio_sigevent.sigev_notify=SIGEV_NONE; +- ce->myaiocb64.aio_lio_opcode=(int)op; +-#endif +-#else +- ce->myaiocb.aio_reqprio=0; +- ce->myaiocb.aio_nbytes=(size_t)size; +- ce->myaiocb.aio_sigevent.sigev_notify=SIGEV_NONE; +- ce->myaiocb.aio_lio_opcode=(int)op; +-#endif +- ce->fd=(int)fd; +- return(ce); +-} +- +-/************************************************************************* +- * Put it on the outbound queue. +- *************************************************************************/ +- +-void +-async_put_on_write_queue(gc,ce) +-struct cache *gc; +-struct cache_ent *ce; +-{ +- ce->forward=0; +- ce->back=gc->w_tail; +- if(gc->w_tail) +- gc->w_tail->forward = ce; +- gc->w_tail= ce; +- if(!gc->w_head) +- gc->w_head=ce; +- gc->w_count++; +- return; +-} +- +-/************************************************************************* +- * Cleanup all outstanding writes +- *************************************************************************/ +-void +-async_write_finish(gc) +-struct cache *gc; +-{ +- while(gc->w_head) +- { +- /*printf("async_write_finish: Waiting for buffer %x to finish\n",gc->w_head->myaiocb64.aio_buf);*/ +- async_wait_for_write(gc); +- } +-} +- +-/************************************************************************* +- * Wait for an I/O to finish +- *************************************************************************/ +- +-void +-async_wait_for_write(gc) +-struct cache *gc; +-{ +- struct cache_ent *ce; +- size_t ret,retval; +- if(gc->w_head==0) +- return; +- ce=gc->w_head; +- gc->w_head=ce->forward; +- gc->w_count--; +- ce->forward=0; +- if(ce==gc->w_tail) +- gc->w_tail=0; +- /*printf("Wait for buffer %x offset %lld size %d to finish\n", +- ce->myaiocb64.aio_buf, +- ce->myaiocb64.aio_offset, +- ce->myaiocb64.aio_nbytes); +- printf("write count %lld \n",gc->w_count); +- */ +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- while((ret=aio_error(&ce->myaiocb))== EINPROGRESS) +- { +- async_suspend(ce); +- } +-#else +- while((ret=aio_error64(&ce->myaiocb64))== EINPROGRESS) +- { +- async_suspend(ce); +- } +-#endif +-#else +- while((ret=aio_error(&ce->myaiocb))== EINPROGRESS) +- { +- async_suspend(ce); +- } +-#endif +- if(ret) +- { +- printf("aio_error 5: ret %d %d\n",ret,errno); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- printf("fd %d offset %lld size %d\n", +- ce->myaiocb.aio_fildes, +- ce->myaiocb.aio_offset, +- ce->myaiocb.aio_nbytes); +-#else +- printf("fd %d offset %lld size %d\n", +- ce->myaiocb64.aio_fildes, +- ce->myaiocb64.aio_offset, +- ce->myaiocb64.aio_nbytes); +-#endif +-#else +- printf("fd %d offset %lld size %d\n", +- ce->myaiocb.aio_fildes, +- ce->myaiocb.aio_offset, +- ce->myaiocb.aio_nbytes); +-#endif +- exit(181); +- } +- +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- retval=aio_return(&ce->myaiocb); +-#else +-#if defined(__CrayX1__) +- retval=aio_return64((aiocb64_t *)&ce->myaiocb64); +-#else +- retval=aio_return64((struct aiocb64 *)&ce->myaiocb64); +-#endif +- +-#endif +-#else +- retval=aio_return(&ce->myaiocb); +-#endif +- if((int)retval < 0) +- { +- printf("aio_return error: %d\n",errno); +- } +- +- if(!ce->direct) +- { +- /* printf("Freeing buffer %x\n",ce->real_address);*/ +- free((void *)(ce->real_address)); +- free((void *)ce); +- } +- +-} +- +-/************************************************************************* +- * This routine is a generic async writer assist function. It takes +- * the same calling parameters as write() but also extends the +- * interface to include: +- * +- * offset ..... offset in the file. +- * depth ..... How much read-ahead do you want. +- * free_addr .. address of memory to free after write is completed. +- * +- *************************************************************************/ +-size_t +-async_write_no_copy(gc,fd,buffer,size,offset,depth,free_addr) +-struct cache *gc; +-long long fd,size; +-char *buffer; +-off64_t offset; +-long long depth; +-char *free_addr; +-{ +- struct cache_ent *ce; +- size_t ret; +- long long direct = 1; +- ce=allocate_write_buffer(gc,fd,offset,size,(long long)LIO_WRITE,depth,direct,buffer,free_addr); +- ce->direct=0; /* have library de-allocate the buffer */ +- async_put_on_write_queue(gc,ce); +- /* +- printf("awnc: fd %d offset %lld, size %d\n",ce->myaiocb64.aio_fildes, +- ce->myaiocb64.aio_offset, +- ce->myaiocb64.aio_nbytes); +- */ +- +-again: +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- ret=aio_write(&ce->myaiocb); +-#else +- ret=aio_write64(&ce->myaiocb64); +-#endif +-#else +- ret=aio_write(&ce->myaiocb); +-#endif +- if(ret==-1) +- { +- if(errno==EAGAIN) +- { +- async_wait_for_write(gc); +- goto again; +- } +- if(errno==0) +- { +- /* Compensate for bug in async library */ +- async_wait_for_write(gc); +- goto again; +- } +- else +- { +- printf("Error in aio_write: ret %d errno %d\n",ret,errno); +-#ifdef _LARGEFILE64_SOURCE +-#ifdef __LP64__ +- printf("aio_write_no_copy: fd %d buffer %lx offset %lld size %d\n", +- ce->myaiocb.aio_fildes, +- (long)(ce->myaiocb.aio_buf), +- ce->myaiocb.aio_offset, +- ce->myaiocb.aio_nbytes); +-#else +- printf("aio_write_no_copy: fd %d buffer %lx offset %lld size %d\n", +- ce->myaiocb64.aio_fildes, +- (long)(ce->myaiocb64.aio_buf), +- ce->myaiocb64.aio_offset, +- ce->myaiocb64.aio_nbytes); +-#endif +-#else +- printf("aio_write_no_copy: fd %d buffer %lx offset %ld size %d\n", +- ce->myaiocb.aio_fildes, +- (long)(ce->myaiocb.aio_buf), +- ce->myaiocb.aio_offset, +- ce->myaiocb.aio_nbytes); +-#endif +- exit(182); +- } +- } +- else +- { +- return((ssize_t)size); +- } +-} +- +-void mbcopy(source, dest, len) +-char *source,*dest; +-size_t len; +-{ +- int i; +- for(i=0;i +-#endif +-#include +-#include +-#include +-#if defined(__AIX__) || defined(__FreeBSD__) || defined(__DragonFly__) +-#include +-#else +-#include +-#endif +- +-#if defined(OSV5) || defined(linux) || defined (__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__) || defined(__DragonFly__) +-#include +-#endif +- +-#if defined(linux) || defined(__DragonFly__) || defined(macosx) +-#include +-#include +-#endif +- +-#if (defined(solaris) && defined( __LP64__ )) || defined(__s390x__) || defined(FreeBSD) +-/* If we are building for 64-bit Solaris, all functions that return pointers +- * must be declared before they are used; otherwise the compiler will assume +- * that they return ints and the top 32 bits of the pointer will be lost, +- * causing segmentation faults. The following includes take care of this. +- * It should be safe to add these for all other OSs too, but we're only +- * doing it for Solaris now in case another OS turns out to be a special case. +- */ +-#include +-#include +-#include +-#include +-#include +-#endif +-/* Little Endian */ +-#define ENDIAN_1 1 +-/* Big Endian */ +-#define ENDIAN_2 2 +-/* Middle Endian */ +-#define ENDIAN_3 3 +-/* Middle Endian */ +-#define ENDIAN_4 4 +- +-int junk, *junkp; +- +- +-#ifdef HAVE_ANSIC_C +-/************************************************************************/ +-/* Here is the API... Enjoy */ +-/************************************************************************/ +-/* Create worksheet */ +-int create_xls(char *); +-/* Args: Filename */ +-/* */ +-/* Close worksheet */ +-void close_xls(int); +-/* Args: file descriptor */ +-/* */ +-/* Put a 16 bit integer in worksheet */ +-void do_int(int,int,int,int); +-/* Args: file descriptor, */ +-/* value, */ +-/* row, */ +-/* column */ +- +-/* Put a double in 8 byte float */ +-void do_float(int,double,int,int); +-/* Args: file descriptor, */ +-/* value, */ +-/* row, */ +-/* column */ +-/* Put a string in worksheet */ +-void do_label(int,char *,int,int); +-/* Args: file descriptor, */ +-/* string, */ +-/* row, */ +-/* column */ +-/************************************************************************/ +- +-char libbif_version[] = "Libbif Version $Revision$"; +-void do_eof(int ); /* Used internally */ +-void do_header(int ); /* Used internally */ +-int endian(void); +-#endif +- +-#define BOF 0x9 +-#define INTEGER 0x2 +-#define FLOAT 0x3 +-#define LABEL 0x4 +-#define EXCEL_VERS 0x2 +-#define WORKSHEET 0x10 +- +-struct bof_record{ /* Beginning of file */ +- char hi_opcode; +- char lo_opcode; +- char hi_length; +- char lo_length; +- char hi_version; /* Excel version */ +- char lo_version; +- char hi_filetype; +- char lo_filetype; +- }; +-struct int_record { +- char hi_opcode; /* Type 2 of record */ +- char lo_opcode; +- char hi_length; +- char lo_length; +- char hi_row; +- char lo_row; +- char hi_column; +- char lo_column; +- char rgbhi; +- char rgbmed; +- char rgblo; +- char hi_data; +- char lo_data; +- }; +-struct label_record { +- char hi_opcode; /* Type 4 of record */ +- char lo_opcode; +- char hi_length; +- char lo_length; +- char hi_row; +- char lo_row; +- char hi_column; +- char lo_column; +- char rgbhi; +- char rgbmed; +- char rgblo; +- char string_length; +- char str_array[256]; +- }; +-struct float_record { /* Type 3 record */ +- char hi_opcode; +- char lo_opcode; +- char hi_length; +- char lo_length; +- char hi_row; +- char lo_row; +- char hi_column; +- char lo_column; +- char rgbhi; +- char rgbmed; +- char rgblo; +- double data; +- }; +-/* +- * Write the EOF and close the file +- */ +-#ifdef HAVE_ANSIC_C +-void +-close_xls(int fd) +-{ +-#else +-close_xls(fd) +-int fd; +-{ +-#endif +- do_eof(fd); +- close(fd); +-} +- +-/* +- * Create xls worksheet. Create file and put the BOF record in it. +- */ +-#ifdef HAVE_ANSIC_C +-int +-create_xls(char *name) +-{ +-#else +-create_xls(name) +-char *name; +-{ +-#endif +- int fd; +- unlink(name); +-#ifdef Windows +- fd=open(name,O_BINARY|O_CREAT|O_RDWR,0666); +-#else +- fd=open(name,O_CREAT|O_RDWR,0666); +-#endif +- if(fd<0) +- { +- printf("Error opening file %s\n",name); +- exit(-1); +- } +- do_header(fd); +- return(fd); +-} +- +-#ifdef HAVE_ANSIC_C +-void +-do_header(int fd) /* Stick the BOF at the beginning of the file */ +-{ +-#else +-do_header(fd) +-int fd; +-{ +-#endif +- struct bof_record bof; +- bof.hi_opcode=BOF; +- bof.lo_opcode = 0x0; +- bof.hi_length=0x4; +- bof.lo_length=0x0; +- bof.hi_version=EXCEL_VERS; +- bof.lo_version=0x0; +- bof.hi_filetype=WORKSHEET; +- bof.lo_filetype=0x0; +- junk=write(fd,&bof,sizeof(struct bof_record)); +-} +- +-/* +- * Put an integer (16 bit) in the worksheet +- */ +-#ifdef HAVE_ANSIC_C +-void +-do_int(int fd,int val, int row, int column) +-{ +-#else +-do_int(fd,val,row,column) +-int fd,val,row,column; +-{ +-#endif +- struct int_record intrec; +- short s_row,s_column; +- s_row=(short)row; +- s_column=(short)column; +- intrec.hi_opcode=INTEGER; +- intrec.lo_opcode=0x00; +- intrec.hi_length=0x09; +- intrec.lo_length=0x00; +- intrec.rgbhi=0x0; +- intrec.rgbmed=0x0; +- intrec.rgblo=0x0; +- intrec.hi_row=(char)s_row&0xff; +- intrec.lo_row=(char)(s_row>>8)&0xff; +- intrec.hi_column=(char)(s_column&0xff); +- intrec.lo_column=(char)(s_column>>8)&0xff; +- intrec.hi_data=(val & 0xff); +- intrec.lo_data=(val & 0xff00)>>8; +- junk=write(fd,&intrec,13); +-} +- +-/* Note: This routine converts Big Endian to Little Endian +- * and writes the record out. +- */ +- +-/* +- * Put a double in the worksheet as 8 byte float in IEEE format. +- */ +-#ifdef HAVE_ANSIC_C +-void +-do_float(int fd, double value, int row, int column) +-{ +-#else +-do_float(fd, value, row, column) +-int fd; +-double value; +-int row,column; +-{ +-#endif +- struct float_record floatrec; +- short s_row,s_column; +- unsigned char *sptr,*dptr; +- s_row=(short)row; +- s_column=(short)column; +- floatrec.hi_opcode=FLOAT; +- floatrec.lo_opcode=0x00; +- floatrec.hi_length=0xf; +- floatrec.lo_length=0x00; +- floatrec.rgbhi=0x0; +- floatrec.rgbmed=0x0; +- floatrec.rgblo=0x0; +- floatrec.hi_row=(char)(s_row&0xff); +- floatrec.lo_row=(char)((s_row>>8)&0xff); +- floatrec.hi_column=(char)(s_column&0xff); +- floatrec.lo_column=(char)((s_column>>8)&0xff); +- sptr =(unsigned char *) &value; +- dptr =(unsigned char *) &floatrec.data; +- +- if(endian()==ENDIAN_2) /* Big Endian */ +- { +- dptr[0]=sptr[7]; /* Convert to Little Endian */ +- dptr[1]=sptr[6]; +- dptr[2]=sptr[5]; +- dptr[3]=sptr[4]; +- dptr[4]=sptr[3]; +- dptr[5]=sptr[2]; +- dptr[6]=sptr[1]; +- dptr[7]=sptr[0]; +- } +- if(endian()==ENDIAN_3) /* Middle Endian */ +- { +- dptr[0]=sptr[4]; /* 16 bit swapped ARM */ +- dptr[1]=sptr[5]; +- dptr[2]=sptr[6]; +- dptr[3]=sptr[7]; +- dptr[4]=sptr[0]; +- dptr[5]=sptr[1]; +- dptr[6]=sptr[2]; +- dptr[7]=sptr[3]; +- } +- +- if(endian()==ENDIAN_1) /* Little Endian */ +- { +- dptr[0]=sptr[0]; /* Do not convert to Little Endian */ +- dptr[1]=sptr[1]; +- dptr[2]=sptr[2]; +- dptr[3]=sptr[3]; +- dptr[4]=sptr[4]; +- dptr[5]=sptr[5]; +- dptr[6]=sptr[6]; +- dptr[7]=sptr[7]; +- } +- if(endian()==-1) /* Unsupported architecture */ +- { +- dptr[0]=0; +- dptr[1]=0; +- dptr[2]=0; +- dptr[3]=0; +- dptr[4]=0; +- dptr[5]=0; +- dptr[6]=0; +- dptr[7]=0; +- printf("Excel output not supported on this architecture.\n"); +- } +- junk=write(fd,&floatrec,11); /* Don't write floatrec. Padding problems */ +- junk=write(fd,&floatrec.data,8); /* Write value seperately */ +-} +- +-/* +- * Put a string as a label in the worksheet. +- */ +-#ifdef HAVE_ANSIC_C +-void +-do_label(int fd, char *string, int row, int column) +-{ +-#else +-do_label(fd, string, row, column) +-int fd; +-char *string; +-int row,column; +-{ +-#endif +- struct label_record labelrec; +- short s_row,s_column; +- int i; +- for(i=0;i<255;i++) +- labelrec.str_array[i]=0; +- s_row=(short)row; +- s_column=(short)column; +- i=strlen(string); +- labelrec.hi_opcode=LABEL; +- labelrec.lo_opcode=0x00; +- labelrec.hi_length=0x08; /* 264 total bytes */ +- labelrec.lo_length=0x01; +- labelrec.rgblo=0x0; +- labelrec.rgbmed=0x0; +- labelrec.rgbhi=0x0; +- labelrec.hi_row=(char)(s_row&0xff); +- labelrec.lo_row=(char)((s_row>>8)&0xff); +- labelrec.hi_column=(char)(s_column&0xff); +- labelrec.lo_column=(char)((s_column>>8)&0xff); +- labelrec.string_length=i; +- if(i > 255) /* If too long then terminate it early */ +- string[254]=0; +- i=strlen(string); +- strcpy(labelrec.str_array,string); +- +- junk=write(fd,&labelrec,sizeof(struct label_record)); +- +-} +- +-/* +- * Write the EOF in the file +- */ +-#ifdef HAVE_ANSIC_C +-void +-do_eof(int fd) +-{ +-#else +-do_eof(fd) +-int fd; +-{ +-#endif +- char buf[]={0x0a,0x00,0x00,0x00}; +- junk=write(fd,buf,4); +-} +- +-/* +- * Routine to determine the Endian-ness of the system. This +- * is needed for Iozone to convert doubles (floats) into +- * Little-endian format. This is needed for Excel to be +- * able to interpret the file +- */ +-int +-endian(void) +-{ +- long long foo = 0x0102030405060708LL; +- long foo1 = 0x012345678; +- unsigned char *c,c1,c2,c3,c4,c5,c6,c7,c8; +- c=(unsigned char *)&foo; +- c1=*c++; +- c2=*c++; +- c3=*c++; +- c4=*c++; +- c5=*c++; +- c6=*c++; +- c7=*c++; +- c8=*c; +- +- /*--------------------------------------------------------------*/ +- /* printf("%x %x %x %x %x %x %x %x\n",c1,c2,c3,c4,c5,c6,c7,c8); */ +- /*--------------------------------------------------------------*/ +- +- /* Little Endian format ? ( Intel ) */ +- if( (c1==0x08) && (c2==0x07) && (c3==0x06) && (c4==0x05) && +- (c5==0x04) && (c6==0x03) && (c7==0x02) && (c8==0x01) ) +- return(ENDIAN_1); +- /* Big Endian format ? ( Sparc, Risc... */ +- if( (c1==0x01) && (c2==0x02) && (c3==0x03) && (c4==0x04) && +- (c5==0x05) && (c6==0x06) && (c7==0x07) && (c8==0x08) ) +- return(ENDIAN_2); +- /* Middle Endian format ? ( ARM ... ) */ +- if( (c1==0x04) && (c2==0x03) && (c3==0x02) && (c4==0x01) && +- (c5==0x08) && (c6==0x07) && (c7==0x06) && (c8==0x05) ) +- return(ENDIAN_3); +- c=(unsigned char *)&foo1; +- c1=*c++; +- c2=*c++; +- c3=*c++; +- c4=*c++; +- /* Another middle endian format ? ( PDP-11 ... ) */ +- if( (c1==0x34) && (c2==0x12) && (c3==0x78) && (c4==0x56)) +- return(ENDIAN_4); +- +- return(-1); +-} +diff --git a/src/components/appio/tests/iozone/makefile b/src/components/appio/tests/iozone/makefile +deleted file mode 100644 +index f7db172a6..000000000 +--- a/src/components/appio/tests/iozone/makefile ++++ /dev/null +@@ -1,1461 +0,0 @@ +-# +-# Version $Revision$ +-# +-# The makefile for building all versions of iozone for all supported +-# platforms +-# +-# Supports: hpux, hpux_no_ansi, hpux-10.1, hpux_no_ansi-10.1, +-# sppux, sppux-10.1, ghpux, sppux, +-# convex, FreeBSD, OpenBSD, OSFV3, OSFV4, OSFV5, SCO +-# SCO_Unixware_gcc,NetBSD,TRU64, Mac OS X +- +-CC = cc +-C89 = c89 +-GCC = gcc +-CCS = /usr/ccs/bin/cc +-NACC = /opt/ansic/bin/cc +-CFLAGS = +-S10GCCFLAGS = -m64 +-S10CCFLAGS = -m64 +-FLAG64BIT = -m64 +- +-# If your Linux kernel supports preadv and pwritev system calls +-# and you want iozone to use them, add -DHAVE_PREADV -DHAVE_PWRITEV +-# to CFLAGS +- +-all: +- @echo "" +- @echo "You must specify the target. " +- @echo " -> AIX (32bit) <-" +- @echo " -> AIX-LF (32bit) <-" +- @echo " -> AIX64 (32bit) <-" +- @echo " -> AIX64-LF (32bit) <-" +- @echo " -> bsdi (32bit) <-" +- @echo " -> convex (32bit) <-" +- @echo " -> CrayX1 (32bit) <-" +- @echo " -> dragonfly (32bit) <-" +- @echo " -> freebsd (32bit) <-" +- @echo " -> generic (32bit) <-" +- @echo " -> ghpux (32bit) <-" +- @echo " -> hpuxs-11.0 (simple) (32bit) <-" +- @echo " -> hpux-11.0w (64bit) <-" +- @echo " -> hpuxs-11.0w (64bit) <-" +- @echo " -> hpux-11.0 (32bit) <-" +- @echo " -> hpux-10.1 (32bit) <-" +- @echo " -> hpux-10.20 (32bit) <-" +- @echo " -> hpux (32bit) <-" +- @echo " -> hpux_no_ansi (32bit) <-" +- @echo " -> hpux_no_ansi-10.1 (32bit) <-" +- @echo " -> IRIX (32bit) <-" +- @echo " -> IRIX64 (64bit) <-" +- @echo " -> linux (32bit) <-" +- @echo " -> linux-arm (32bit) <-" +- @echo " -> linux-AMD64 (64bit) <-" +- @echo " -> linux-ia64 (64bit) <-" +- @echo " -> linux-powerpc (32bit) <-" +- @echo " -> linux-powerpc64 (64bit) <-" +- @echo " -> linux-sparc (32bit) <-" +- @echo " -> macosx (32bit) <-" +- @echo " -> netbsd (32bit) <-" +- @echo " -> openbsd (32bit) <-" +- @echo " -> openbsd-threads (32bit) <-" +- @echo " -> OSFV3 (64bit) <-" +- @echo " -> OSFV4 (64bit) <-" +- @echo " -> OSFV5 (64bit) <-" +- @echo " -> linux-S390 (32bit) <-" +- @echo " -> linux-S390X (64bit) <-" +- @echo " -> SCO (32bit) <-" +- @echo " -> SCO_Unixware_gcc (32bit) <-" +- @echo " -> Solaris (32bit) <-" +- @echo " -> Solaris-2.6 (32bit) <-" +- @echo " -> Solaris7gcc (32bit) <-" +- @echo " -> Solaris8-64 (64bit) <-" +- @echo " -> Solaris8-64-VXFS (64bit) <-" +- @echo " -> Solaris10 (32bit) <-" +- @echo " -> Solaris10cc (64bit) <-" +- @echo " -> Solaris10gcc (32bit) <-" +- @echo " -> Solaris10gcc-64 (64bit) <-" +- @echo " -> sppux (32bit) <-" +- @echo " -> sppux-10.1 (32bit) <-" +- @echo " -> sppux_no_ansi-10.1 (32bit) <-" +- @echo " -> SUA (32bit) <-" +- @echo " -> TRU64 (64bit) <-" +- @echo " -> UWIN (32bit) <-" +- @echo " -> Windows (95/98/NT) (32bit) <-" +- @echo "" +- +-clean: +- rm -f *.o iozone fileop pit_server +- +-rpm: +- cp ../../iozone*.tar /usr/src/red*/SO* +- rpmbuild -ba spec.in +- +- +-# +-# Turn on the optimizer, largefiles, Posix async I/O and threads. +-# +-hpux-11.0: iozone_hpux-11.0.o libasync.o libbif.o +- $(CC) +O3 +Oparallel $(LDFLAGS) iozone_hpux-11.0.o libasync.o \ +- libbif.o -lpthread -lrt -o iozone +- +-# +-# Turn on wide-mode, the optimizer, largefiles, Posix async I/O and threads. +-# +-hpux-11.0w: iozone_hpux-11.0w.o libasyncw.o libbif.o +- $(CC) +DD64 +O3 $(LDFLAGS) iozone_hpux-11.0w.o libasyncw.o \ +- libbif.o -lpthread -lrt -o iozone +- +- +-# +-# Simple build with largefiles, Posix threads and Posix async I/O +-# +-hpuxs-11.0: iozone_hpuxs-11.0.o libasync.o libbif.o fileop_hpuxs-11.0.o pit_server.o +- $(CC) -O $(LDFLAGS) iozone_hpuxs-11.0.o \ +- libasync.o libbif.o -lpthread -lrt -o iozone +- $(CC) -O $(LDFLAGS) fileop_hpuxs-11.0.o -o fileop +- $(CC) -O $(LDFLAGS) pit_server.o -o pit_server +- +-# +-# Simple build with wide-mode, largefiles, Posix threads and Posix async I/O +-# +-hpuxs-11.0w: iozone_hpuxs-11.0w.o libasyncw.o libbif.o +- $(CC) -O +DD64 $(LDFLAGS) iozone_hpuxs-11.0w.o \ +- libasyncw.o libbif.o -lpthread -lrt -o iozone +- +-# +-# Simple 10.1 build with no threads, no largefiles, no async I/O +-# +-hpux-10.1: iozone_hpux-10.1.o libbif.o +- $(C89) +e -O $(LDFLAGS) iozone_hpux-10.1.o libbif.o -o iozone +- +-hpux-10.20: iozone_hpux-10.20.o libbif.o +- $(C89) +e -O $(LDFLAGS) iozone_hpux-10.20.o libbif.o -o iozone +- +-# +-# Simple generic HP build with no threads, no largefiles, no async I/O +-# +-hpux: iozone_hpux.o +- $(C89) +e -O $(LDFLAGS) iozone_hpux.o libbif.o -o iozone +- +-# +-# GNU HP build with no threads, no largefiles, no async I/O +-# +-ghpux: iozone_ghpux.o libbif.o +- $(GCC) -O $(LDFLAGS) iozone_ghpux.o libbif.o -static -o iozone +- +-# +-# GNU Generic build with no threads, no largefiles, no async I/O +-# +-generic: iozone_generic.o libbif.o +- $(CC) -O $(LDFLAGS) iozone_generic.o libbif.o -o iozone +- +-# +-# No ansii 'C' compiler HP build with no threads, no largefiles, no async I/O +-# +-hpux_no_ansi-10.1: iozone_hpux_no-10.1.o libbif.o +- $(NACC) -O $(LDFLAGS) iozone_hpux_no-10.1.o libbif.o -o iozone +- +-# +-# No ansii 'C' compiler HP build with no threads, no largefiles, no async I/O +-# +-hpux_no_ansi: iozone_hpux_no.o libbif.o +- $(C89) -O $(LDFLAGS) iozone_hpux_no.o libbif.o -o iozone +- +-# +-# GNU 'C' compiler Linux build with threads, largefiles, async I/O +-# +-linux: iozone_linux.o libasync.o libbif.o fileop_linux.o pit_server.o +- $(CC) -O3 $(LDFLAGS) iozone_linux.o libasync.o libbif.o -lpthread \ +- -lrt -o iozone +- $(CC) -O3 -Dlinux fileop_linux.o -o fileop +- $(CC) -O3 -Dlinux pit_server.o -o pit_server +- +-# +-# GNU 'C' compiler Linux build for powerpc chip with threads, largefiles, async I/O +-# +-linux-powerpc: iozone_linux-powerpc.o libbif.o libasync.o fileop_linux-ppc.o pit_server.o +- $(CC) -O3 $(LDFLAGS) iozone_linux-powerpc.o libasync.o \ +- libbif.o -lpthread -lrt -o iozone +- $(CC) -O3 -Dlinux fileop_linux-ppc.o -o fileop +- $(CC) -O3 -Dlinux pit_server.o -o pit_server +-# +-# GNU 'C' compiler Linux build for sparc chip with threads, largefiles, async I/O +-# +-linux-sparc: iozone_linux-sparc.o libbif.o libasync.o fileop_linux.o pit_server.o +- $(CC) -O3 $(LDFLAGS) iozone_linux-sparc.o libasync.o libbif.o \ +- -lpthread -lrt -o iozone +- $(CC) -O3 -Dlinux fileop_linux.o -o fileop +- $(CC) -O3 -Dlinux pit_server.o -o pit_server +- +-# +-# GNU 'C' compiler Linux build with threads, largefiles, async I/O +-# +-linux-ia64: iozone_linux-ia64.o libbif.o libasync.o fileop_linux-ia64.o pit_server.o +- $(CC) -O3 $(LDFLAGS) iozone_linux-ia64.o libbif.o libasync.o \ +- -lrt -lpthread -o iozone +- $(CC) -O3 -Dlinux fileop_linux-ia64.o -o fileop +- $(CC) -O3 -Dlinux pit_server.o -o pit_server +- +-# +-# GNU 'C' compiler Linux build for powerpc chip with threads, largefiles, async I/O +-# +-linux-powerpc64: iozone_linux-powerpc64.o libbif.o libasync.o fileop_linux-ppc64.o pit_server-linux-powerpc64.o +- $(CC) -O3 -Dunix -DHAVE_ANSIC_C -DSHARED_MEM -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE -Dlinux \ +- iozone_linux-powerpc64.o libasync.o libbif.o -lpthread \ +- -lrt $(FLAG64BIT) -o iozone +- $(CC) -O3 -Dlinux fileop_linux-ppc64.o $(FLAG64BIT) -o fileop +- $(CC) -O3 -Dlinux pit_server-linux-powerpc64.o $(FLAG64BIT) -o pit_server +- +-# +-# GNU 'C' compiler Linux build with threads, largefiles, async I/O +-# +-linux-arm: iozone_linux-arm.o libbif.o libasync.o fileop_linux-arm.o pit_server.o +- $(CC) -O3 $(LDFLAGS) iozone_linux-arm.o libbif.o libasync.o \ +- -lrt -lpthread -o iozone +- $(CC) -O3 -Dlinux fileop_linux-arm.o -o fileop +- $(CC) -O3 -Dlinux pit_server.o -o pit_server +- +-# +-# GNU 'C' compiler Linux build with threads, largefiles, async I/O +-# +-linux-AMD64: iozone_linux-AMD64.o libbif.o libasync.o fileop_linux-AMD64.o pit_server.o +- $(CC) -O3 $(LDFLAGS) iozone_linux-AMD64.o libbif.o libasync.o \ +- -lrt -lpthread -o iozone +- $(CC) -O3 -Dlinux fileop_linux-AMD64.o -o fileop +- $(CC) -O3 -Dlinux pit_server.o -o pit_server +- +-# +-# GNU 'C' compiler Linux build with S/390, threads, largfiles, async I/O +-# +-linux-S390: iozone_linux-s390.o libbif.o libasync.o fileop_linux-s390.o pit_server.o +- $(CC) -O2 $(LDFLAGS) -lpthread -lrt iozone_linux-s390.o \ +- libbif.o libasync.o -o iozone +- $(CC) -O3 -Dlinux fileop_linux-s390.o -o fileop +- $(CC) -O3 -Dlinux pit_server.o -o pit_server +- +-# +-# GNU 'C' compiler Linux build with S/390, threads, largfiles, async I/O +-# +-linux-S390X: iozone_linux-s390x.o libbif.o libasync.o fileop_linux-s390x.o pit_server.o +- $(CC) -O2 $(LDFLAGS) -lpthread -lrt iozone_linux-s390x.o \ +- libbif.o libasync.o -o iozone +- $(CC) -O3 -Dlinux fileop_linux-s390x.o -o fileop +- $(CC) -O3 -Dlinux pit_server.o -o pit_server +- +- +-# +-# AIX +-# I would have built with ASYNC_IO but the AIX machine does not have +-# POSIX 1003.1b compliant async I/O header files. Has threads, no +-# largefile support. +-# +-AIX: iozone_AIX.o libbif.o fileop_AIX.o +- $(CC) -O $(LDFLAGS) iozone_AIX.o libbif.o \ +- -lpthreads -o iozone +- $(CC) -O -Dlinux fileop_AIX.o -o fileop +- +-# +-# AIX-LF +-# I would have built with ASYNC_IO but the AIX machine does not have +-# POSIX 1003.1b compliant async I/O header files. Has threads, and +-# largefile support. +-# +-AIX-LF: iozone_AIX-LF.o libbif.o fileop_AIX-LF.o pit_server.o +- $(CC) -O $(LDFLAGS) iozone_AIX-LF.o libbif.o \ +- -lpthreads -o iozone +- $(CC) -O fileop_AIX-LF.o -o fileop +- $(CC) -O pit_server.o -o pit_server +- +-# AIX64 +-# This version uses the 64 bit interfaces and is compiled as 64 bit code. +-# Has threads, async I/O but no largefile support. +-# +-AIX64: iozone_AIX64.o libbif.o fileop_AIX64.o libasync.o pit_server.o +- $(GCC) -maix64 -O3 $(LDFLAGS) iozone_AIX64.o libasync.o \ +- libbif.o -lpthreads -o iozone +- $(GCC) -maix64 -O3 $(LDFLAGS) -Dlinux fileop_AIX64.o -o fileop +- $(GCC) -maix32 -O3 $(LDFLAGS) pit_server.o -o pit_server +- +-# +-# AIX64-LF +-# This version uses the 64 bit interfaces and is compiled as 64 bit code. +-# Has threads, async I/O and largefile support. +-# +-AIX64-LF: iozone_AIX64-LF.o libbif.o fileop_AIX64-LF.o libasync.o pit_server.o +- $(GCC) -maix64 -O3 $(LDFLAGS) iozone_AIX64-LF.o libasync.o \ +- libbif.o -lpthreads -o iozone +- $(GCC) -maix64 -O3 $(LDFLAGS) -Dlinux fileop_AIX64-LF.o -o fileop +- $(GCC) -maix32 -O3 $(LDFLAGS) pit_server.o -o pit_server +- +-# +-# IRIX 32 bit build with threads, largefiles, async I/O +-# This would like to be in 64 bit mode but it hangs whenever in 64 bit mode. +-# This version uses the 64 bit interfaces but is compiled as 32 bit code +-# +-IRIX64: iozone_IRIX64.o libasyncw.o libbif.o +- $(CC) -32 -O $(LDFLAGS) iozone_IRIX64.o libbif.o \ +- -lpthread libasyncw.o -o iozone +- +-# +-# IRIX 32 bit build with threads, No largefiles, and async I/O +-# This version uses the 32 bit interfaces and is compiled as 32 bit code +-# +-IRIX: iozone_IRIX.o libasync.o libbif.o +- $(CC) -O -32 $(LDFLAGS) iozone_IRIX.o libbif.o -lpthread \ +- libasync.o -o iozone +- +-# +-# CrayX1: 32 bit build with threads, No largefiles, and async I/O +-# This version uses the 32 bit interfaces and is compiled as 32 bit code +-# +-CrayX1: iozone_CrayX1.o libasync.o libbif.o +- $(CC) -O $(LDFLAGS) iozone_CrayX1.o libbif.o \ +- -lpthread libasyncw.o -o iozone +- +-# +-# SPP-UX 32 bit build with threads, No largefiles, and No async I/O, +-# pread extensions +-# For older SPP-UX machines with 9.05 compatibility +-# +-sppux: iozone_sppux.o libbif.o +- $(NACC) -O $(LDFLAGS) iozone_sppux.o libbif.o \ +- -Wl,+parallel -lcnx_syscall -lpthread -lail -o iozone +- +-# +-# SPP-UX 32 bit build with threads, No largefiles, and No async I/O, pread +-# extensions +-# For Newer SPP-UX machines with 10.01 compatibility +-# +-sppux-10.1: iozone_sppux-10.1.o libbif.o +- $(NACC) -O $(LDFLAGS) iozone_sppux-10.1.o libbif.o \ +- -lcnx_syscall -Wl,+parallel -lpthread -lail -o iozone +- +-# +-# SPP-UX 32 bit build with threads, No largefiles, and No async I/O, pread +-# extensions +-# For Newer SPP-UX machines with 10.01 compatibility, and no ansi 'C' compiler. +-# +-sppux_no_ansi-10.1: iozone_sppux_no-10.1.o libbif.o +- $(CCS) -O $(LDFLAGS) iozone_sppux_no-10.1.o libbif.o \ +- -Wl,+parallel -lcnx_syscall \ +- -lpthread -lail -o iozone +- +-# +-# Convex 'C' series 32 bit build with No threads, No largefiles, and No async I/O +-# +-convex: iozone_convex.o libbif.o +- $(CC) -O $(LDFLAGS)iozone_convex.o libbif.o -o iozone +- +-# +-# Solaris 32 bit build with threads, largefiles, and async I/O +-# +-Solaris: iozone_solaris.o libasync.o libbif.o fileop_Solaris.o pit_server.o +- $(CC) -O $(LDFLAGS) iozone_solaris.o libasync.o libbif.o \ +- -lthread -lpthread -lposix4 -lnsl -laio -lsocket \ +- -o iozone +- $(CC) -O fileop_Solaris.o -o fileop +- $(CC) -O pit_server.o -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o pit_server +- +-# +-# Solaris 32 bit build with threads, largefiles, and async I/O +-# +-Solaris7gcc: iozone_solaris7gcc.o libasync7.o libbif7.o +- $(GCC) -O $(LDFLAGS) iozone_solaris7gcc.o libasync7.o libbif7.o \ +- -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o iozone +-# +-# Solaris 32 bit build with threads, largefiles, and async I/O +-# +-Solaris10: iozone_solaris10.o libasync10.o libbif10.o fileop_Solaris10.o pit_server.o +- $(CC) -O $(LDFLAGS) iozone_solaris10.o libasync10.o libbif10.o \ +- -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o iozone +- $(CC) -O fileop_Solaris10.o -o fileop +- $(CC) -O pit_server.o -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o pit_server +- +-# +-# Solaris 32 bit build with threads, largefiles, and async I/O +-# +-Solaris10cc: iozone_solaris10cc.o libasync10cc.o libbif10cc.o fileop_Solaris10cc.o pit_server.o +- $(CC) -O $(LDFLAGS) iozone_solaris10cc.o libasync10cc.o libbif10cc.o \ +- -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o iozone +- $(CC) -O fileop_Solaris10cc.o -o fileop +- $(CC) -O pit_server.o -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o pit_server +- +-# +-# Solaris 32 bit build with threads, largefiles, and async I/O +-# +-Solaris10gcc: iozone_solaris10gcc.o libasync10.o libbif10.o fileop_Solaris10gcc.o pit_server_solaris10gcc.o +- $(GCC) -O $(LDFLAGS) iozone_solaris10gcc.o libasync10.o libbif10.o \ +- -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o iozone +- $(GCC) -O fileop_Solaris10gcc.o -o fileop +- $(GCC) -O pit_server_solaris10gcc.o -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o pit_server +- +-# +-# Solaris 64 bit build with threads, largefiles, and async I/O +-# +-Solaris10gcc-64: iozone_solaris10gcc-64.o libasync10-64.o libbif10-64.o fileop_Solaris10gcc-64.o pit_server_solaris10gcc-64.o +- $(GCC) -O $(LDFLAGS) $(S10GCCFLAGS) iozone_solaris10gcc-64.o libasync10-64.o libbif10-64.o \ +- -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o iozone +- $(GCC) -O $(S10GCCFLAGS) fileop_Solaris10gcc-64.o -o fileop +- $(GCC) -O $(S10GCCFLAGS) pit_server_solaris10gcc-64.o -lthread -lpthread -lposix4 \ +- -lnsl -laio -lsocket -o pit_server +- +- +-# +-# Solaris 64 bit build with threads, largefiles, and async I/O +-# +-Solaris10cc-64: iozone_solaris10cc-64.o libasync10-64.o libbif10-64.o fileop_Solaris10cc-64.o pit_server.o +- $(CC) -O $(LDFLAGS) $(S10CCFLAGS) iozone_solaris10cc-64.o libasync10-64.o libbif10-64.o \ +- -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o iozone +- $(CC) -O $(S10CCFLAGS) fileop_Solaris10cc-64.o -o fileop +- $(CC) -O $(S10CCFLAGS) pit_server.o -lthread -lpthread -lposix4 \ +- -lnsl -laio -lsocket -o pit_server +- +- +- +-# +-# Solaris 2.6 (32 bit) build with no threads, no largefiles, and no async I/O +-# +-Solaris-2.6: iozone_solaris-2.6.o libbif.o +- $(CC) -O $(LDFLAGS) iozone_solaris-2.6.o libbif.o \ +- -lnsl -laio -lsocket -o iozone +- +-# +-# Solaris 64 bit build with threads, largefiles, and async I/O +-# +-Solaris8-64: iozone_solaris8-64.o libasync.o libbif.o +- $(CC) $(LDFLAGS) -fast -xtarget=generic64 -v iozone_solaris8-64.o \ +- libasync.o libbif.o -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o iozone +- +-# +-# Solaris 64 bit build with threads, largefiles, async I/O, and Vxfs +-# +-Solaris8-64-VXFS: iozone_solaris8-64-VXFS.o libasync.o libbif.o +- $(CC) $(LDFLAGS) -fast -xtarget=generic64 -v -I/opt/VRTSvxfs/include/ +- iozone_solaris8-64-VXFS.o libasync.o libbif.o \ +- -lthread -lpthread -lposix4 -lnsl -laio \ +- -lsocket -o iozone +- +-# +-# Windows build requires Cygwin development environment. You +-# can get this from www.cygwin.com +-# No largefiles, No async I/O +-# +-Windows: iozone_windows.o libbif.o fileop_windows.o pit_server_win.o +- $(GCC) -O $(LDFLAGS) iozone_windows.o libbif.o -o iozone +- $(GCC) -O $(LDFLAGS) fileop_windows.o -o fileop +- $(GCC) -O $(LDFLAGS) pit_server_win.o -o pit_server +- +-# +-# Windows build requires SUA development environment. You +-# can get this from Microsoft +-# No largefiles, No async I/O +-# +-SUA: iozone_sua.o libbif.o fileop_sua.o pit_server_sua.o +- $(GCC) -O $(LDFLAGS) iozone_sua.o libbif.o -o iozone +- $(GCC) -O $(LDFLAGS) fileop_sua.o -o fileop +- $(GCC) -O $(LDFLAGS) pit_server_sua.o -o pit_server +- +-# +-# Uwin build requires UWIN development environment. +-# No threads, No largefiles, No async I/O +-# +-UWIN: iozone_uwin.o libbif.o +- $(GCC) -O $(LDFLAGS) iozone_uwin.o libbif.o -o iozone +- +-# +-# GNU C compiler BSD/OS build with threads, largefiles, no async I/O +-# +- +-bsdi: iozone_bsdi.o libbif.o fileop_bsdi.o pit_server.o +- $(CC) -O $(LDFLAGS) iozone_bsdi.o libbif.o -o iozone +- $(CC) -O fileop_bsdi.o -o fileop +- $(CC) -O pit_server.o -o pit_server +- +-# +-# GNU C compiler FreeBSD build with no threads, no largefiles, no async I/O +-# +- +-freebsd: iozone_freebsd.o libbif.o fileop_freebsd.o libasync.o pit_server.o +- $(CC) $(LDFLAGS) iozone_freebsd.o libbif.o -lpthread libasync.o \ +- -o iozone +- $(CC) -O fileop_freebsd.o -o fileop +- $(CC) -O pit_server.o -o pit_server +- +-# +-# GNU C compiler DragonFly build with no threads, no largefiles +-# +-dragonfly: iozone_dragonfly.o libbif.o fileop_dragonfly.o pit_server.o +- $(CC) $(LDFLAGS) iozone_dragonfly.o libbif.o -o iozone +- $(CC) -O fileop_dragonfly.o -o fileop +- $(CC) -O pit_server.o -o pit_server +- +-# +-# GNU C compiler MacosX build with no threads, no largefiles, no async I/O +-# +- +-macosx: iozone_macosx.o fileop_macosx.o pit_server.o +- $(CC) -O $(LDFLAGS) iozone_macosx.o libbif.o -o iozone +- $(CC) -O $(LDFLAGS) fileop_macosx.o -o fileop +- $(CC) -O $(LDFLAGS) pit_server.o -o pit_server +-# +-# +-# GNU C compiler OpenBSD build with no threads, no largefiles, no async I/O +-# +- +-openbsd: iozone_openbsd.o libbif.o fileop_openbsd.o pit_server.o +- $(CC) -O $(LDFLAGS) iozone_openbsd.o libbif.o -o iozone +- $(CC) -O fileop_openbsd.o -o fileop +- $(CC) -O pit_server.o -o pit_server +- +-# +-# GNU C compiler OpenBSD build with threads, no largefiles, no async I/O +-# +- +-openbsd-threads: iozone_openbsd-threads.o libbif.o +- $(CC) -O $(LDFLAGS) -pthread iozone_openbsd-threads.o \ +- libbif.o -o iozone +- +-# +-# GNU C compiler OSFV3 build +-# Has threads and async I/O but no largefiles. +-# +- +-OSFV3: iozone_OSFV3.o libbif.o libasync.o +- $(CC) -O $(LDFLAGS) iozone_OSFV3.o libbif.o \ +- -lpthreads libasync.o -laio -o iozone +- +-# +-# GNU C compiler OSFV4 build +-# Has threads and async I/O but no largefiles. +-# +- +-OSFV4: iozone_OSFV4.o libbif.o libasync.o +- $(CC) -O $(LDFLAGS) iozone_OSFV4.o libbif.o -lpthread \ +- libasync.o -laio -o iozone +- +-# +-# GNU C compiler OSFV5 build +-# Has threads and async I/O but no largefiles. +-# +- +-OSFV5: iozone_OSFV5.o libbif.o libasync.o +- $(CC) -O $(LDFLAGS) iozone_OSFV5.o libbif.o -lpthread \ +- libasync.o -laio -o iozone +- +-# +-# GNU C compiler TRU64 build +-# Has threads and async I/O but no largefiles. +-# +- +-TRU64: iozone_TRU64.o libbif.o libasync.o +- $(CC) -O $(LDFLAGS) iozone_TRU64.o libbif.o -lpthread \ +- libasync.o -laio -o iozone +- +-# +-# GNU Generic build with no threads, no largefiles, no async I/O +-# for SCO +-# Note: Be sure you have the latest patches for SCO's Openserver +-# or you will get warnings about timer problems. +-# +- +-SCO: iozone_SCO.o libbif.o +- $(GCC) -O $(LDFLAGS) iozone_SCO.o -lsocket -s libbif.o -o iozone +- +- +-# +-# GNU build with threads, largefiles, async I/O +-# for SCO Unixware 5 7.1.1 i386 x86at SCO UNIX SVR5 +-# Note: Be sure you have the latest patches for SCO's Openserver +-# or you will get warnings about timer problems. +-# +- +-SCO_Unixware_gcc: iozone_SCO_Unixware_gcc.o libbif.o libasync.o +- $(GCC) -O $(LDFLAGS) iozone_SCO_Unixware_gcc.o libbif.o libasync.o \ +- -lsocket -lthread -o iozone +- +-# +-# GNU C compiler NetBSD build with no threads, no largefiles, no async I/O +-# +- +-netbsd: iozone_netbsd.o libbif.o fileop_netbsd.o pit_server.o +- $(CC) -O $(LDFLAGS) iozone_netbsd.o libbif.o -o iozone +- $(CC) -O fileop_netbsd.o -o fileop +- $(CC) -O pit_server.o -o pit_server +- +-# +-# +-# Now for the machine specific stuff +-# +- +-iozone_hpux.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for HP-UX (9.05)" +- @echo "" +- $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ +- -DNAME='"hpux"' $(CFLAGS) iozone.c -o iozone_hpux.o +- $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_hpux-11.0.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building iozone for HP-UX (11.0)" +- @echo "" +- $(CC) -c +O3 +Oparallel -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ +- -DNAME='"hpux-11.0"' -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) \ +- iozone.c -o iozone_hpux-11.0.o +- $(CC) -c +O3 +Oparallel -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ +- -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libasync.c -o libasync.o +- $(CC) -c +O3 +Oparallel -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ +- -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libbif.c -o libbif.o +- +-iozone_hpux-11.0w.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building iozone for HP-UX (11.0w)" +- @echo "" +- $(CC) -c +DD64 +O3 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ +- -DNAME='"hpux-11.0w"' -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) iozone.c \ +- -o iozone_hpux-11.0w.o +- $(CC) -c +DD64 +O3 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ +- -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libasync.c -o libasyncw.o +- $(CC) -c +DD64 +O3 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ +- -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libbif.c -o libbif.o +- +-iozone_hpuxs-11.0.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building simple iozone for HP-UX (11.0)" +- @echo "" +- $(CC) -c -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE -DHAVE_ANSIC_C \ +- -DNAME='"hpuxs-11.0"' -DASYNC_IO -DVXFS -DHAVE_PREAD $(CFLAGS) iozone.c \ +- -o iozone_hpuxs-11.0.o +- $(CC) -c -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE -DHAVE_ANSIC_C \ +- -DASYNC_IO -DVXFS $(CFLAGS) libasync.c -o libasync.o +- $(CC) -c -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE -DHAVE_ANSIC_C \ +- -DASYNC_IO -DVXFS $(CFLAGS) libbif.c -o libbif.o +- +-fileop_hpuxs-11.0.o: fileop.c +- @echo "" +- @echo "Building simple fileop for HP-UX (11.0)" +- @echo "" +- $(CC) -c $(CFLAGS) fileop.c -o fileop_hpuxs-11.0.o +- +-pit_server_solaris10gcc-64.o: pit_server.c +- @echo "" +- @echo "Building the pit_server" +- @echo "" +- $(CC) -c $(CFLAGS) $(S10GCCFLAGS) pit_server.c -o pit_server_solaris10gcc-64.o +- +-pit_server.o: pit_server.c +- @echo "" +- @echo "Building the pit_server" +- @echo "" +- $(CC) -c $(CFLAGS) pit_server.c -o pit_server.o +- +-pit_server-linux-powerpc64.o: pit_server.c +- @echo "" +- @echo "Building the pit_server" +- @echo "" +- $(CC) -c $(CFLAGS) $(FLAG64BIT) pit_server.c -o pit_server-linux-powerpc64.o +- +-pit_server_solaris10gcc.o: pit_server.c +- @echo "" +- @echo "Building the pit_server" +- @echo "" +- $(GCC) -c $(CFLAGS) pit_server.c -o pit_server_solaris10gcc.o +- +- +-pit_server_win.o: pit_server.c +- @echo "" +- @echo "Building the pit_server for Windows" +- @echo "" +- $(GCC) -c $(CFLAGS) -DWindows pit_server.c -o pit_server_win.o +- +-pit_server_sua.o: pit_server.c +- @echo "" +- @echo "Building the pit_server for Windows SUA" +- @echo "" +- $(GCC) -c $(CFLAGS) -D_SUA_ pit_server.c -o pit_server_sua.o +- +-iozone_hpuxs-11.0w.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building simple iozone for HP-UX (11.0w)" +- @echo "" +- $(CC) -c +DD64 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ +- -DNAME='"hpuxs-11.0w"' -DHAVE_ANSIC_C -DASYNC_IO -DVXFS \ +- -DHAVE_PREAD $(CFLAGS) iozone.c -o iozone_hpuxs-11.0w.o +- $(CC) -c +DD64 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ +- -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libasync.c -o libasyncw.o +- $(CC) -c +DD64 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ +- -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libbif.c -o libbif.o +- +-iozone_hpux-10.1.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for HP-UX (10.1)" +- @echo "" +- $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ +- -DNAME='"hpux-10.1"' $(CFLAGS) iozone.c -o iozone_hpux-10.1.o +- $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_hpux-10.20.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for HP-UX (10.20)" +- @echo "" +- $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ +- -DNAME='"hpux-10.20"' $(CFLAGS) iozone.c -o iozone_hpux-10.20.o +- $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_ghpux.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for GCC HP-UX (9.05) " +- @echo "" +- $(GCC) -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS $(CFLAGS) iozone.c \ +- -DNAME='"h=ghpux"' -o iozone_ghpux.o +- $(GCC) -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_generic.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone Generic " +- @echo "" +- $(CC) -c -O -Dgeneric -Dunix -DHAVE_ANSIC_C -DNO_THREADS \ +- -DNAME='"Generic"' $(CFLAGS) iozone.c -o iozone_generic.o +- $(CC) -c -O -Dgeneric -Dunix -DHAVE_ANSIC_C -DNO_THREADS \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_hpux_no.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for HP-UX (9.05) without ansi compiler" +- @echo "" +- $(NACC) -c -O -Dunix -D_HPUX_SOURCE -DNO_THREADS iozone.c \ +- -DNAME='"hpux_no_ansi"' -o iozone_hpux_no.o +- $(NACC) -c -O -Dunix -D_HPUX_SOURCE -DNO_THREADS \ +- libbif.c -o libbif.o +- +-iozone_hpux_no-10.1.o: iozone.c +- @echo "" +- @echo "Building iozone for HP-UX (10.1) without ansi compiler" +- @echo "" +- $(NACC) -c -O -Dunix -D_HPUX_SOURCE -DNO_THREADS iozone.c \ +- -DNAME='"hpux_no_ansi_10.1"' -o iozone_hpux_no-10.1.o +- $(NACC) -c -O -Dunix -D_HPUX_SOURCE -DNO_THREADS \ +- libbif.c -o libbif.o +- +-iozone_linux-powerpc.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for Linux PowerPC" +- @echo "" +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DDONT_HAVE_O_DIRECT \ +- -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ +- -DNAME='"linux-powerpc"' -o iozone_linux-powerpc.o +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ +- -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o +- $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o +- +-iozone_linux-powerpc64.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for Linux PowerPC64" +- @echo "" +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DNAME='"linux-powerpc64"' \ +- -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ +- $(FLAG64BIT) -o iozone_linux-powerpc64.o +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ +- -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c $(FLAG64BIT) -o libbif.o +- $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c $(FLAG64BIT) -o libasync.o +- +- +-iozone_linux-sparc.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for Linux Sparc" +- @echo "" +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DDONT_HAVE_O_DIRECT \ +- -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ +- -DNAME='"linux-sparc"' -o iozone_linux-sparc.o +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ +- -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o +- $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o +- +-iozone_linux.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for Linux" +- @echo "" +- $(CC) -Wall -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DHAVE_PREAD \ +- -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ +- -DNAME='"linux"' -o iozone_linux.o +- $(CC) -Wall -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ +- -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o +- $(CC) -Wall -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o +- +-fileop_AIX.o: fileop.c +- @echo "" +- @echo "Building fileop for AIX" +- @echo "" +- $(CC) -c -O $(CFLAGS) fileop.c -o fileop_AIX.o +- +-fileop_AIX-LF.o: fileop.c +- @echo "" +- @echo "Building fileop for AIX-LF" +- @echo "" +- $(CC) -c -O $(CFLAGS) fileop.c -o fileop_AIX-LF.o +- +-fileop_AIX64.o: fileop.c +- @echo "" +- @echo "Building fileop for AIX64" +- @echo "" +- $(GCC) -maix64 -c -O3 $(CFLAGS) fileop.c -o fileop_AIX64.o +- +-fileop_AIX64-LF.o: fileop.c +- @echo "" +- @echo "Building fileop for AIX64-LF" +- @echo "" +- $(GCC) -maix64 -c -O3 $(CFLAGS) fileop.c -o fileop_AIX64-LF.o +- +-fileop_bsdi.o: fileop.c +- @echo "" +- @echo "Building fileop for BSDi" +- @echo "" +- $(CC) -c -O $(CFLAGS) fileop.c -o fileop_bsdi.o +- +-fileop_freebsd.o: fileop.c +- @echo "" +- @echo "Building fileop for FreeBSD" +- @echo "" +- $(CC) -c -O $(CFLAGS) fileop.c -o fileop_freebsd.o +- +-fileop_netbsd.o: fileop.c +- @echo "" +- @echo "Building fileop for NetBSD" +- @echo "" +- $(CC) -c -O $(CFLAGS) fileop.c -o fileop_netbsd.o +- +-fileop_Solaris.o: fileop.c +- @echo "" +- @echo "Building fileop for Solaris" +- @echo "" +- $(CC) -c -O $(CFLAGS) fileop.c -o fileop_Solaris.o +- +-fileop_Solaris10.o: fileop.c +- @echo "" +- @echo "Building fileop for Solaris10" +- @echo "" +- $(CC) -c -O $(CFLAGS) fileop.c -o fileop_Solaris10.o +- +-fileop_Solaris10cc.o: fileop.c +- @echo "" +- @echo "Building fileop for Solaris10cc" +- @echo "" +- $(CC) -c -O $(CFLAGS) fileop.c -o fileop_Solaris10cc.o +- +- +-fileop_Solaris10gcc.o: fileop.c +- @echo "" +- @echo "Building fileop for Solaris10gcc" +- @echo "" +- $(GCC) -c -O $(CFLAGS) fileop.c -o fileop_Solaris10gcc.o +- +-fileop_Solaris10gcc-64.o: fileop.c +- @echo "" +- @echo "Building fileop for Solaris10gcc-64" +- @echo "" +- $(GCC) -c -O $(CFLAGS) $(S10GCCFLAGS) fileop.c -o fileop_Solaris10gcc-64.o +- +-fileop_Solaris10cc-64.o: fileop.c +- @echo "" +- @echo "Building fileop for Solaris10cc-64" +- @echo "" +- $(CC) -c -O $(CFLAGS) $(S10CCFLAGS) fileop.c -o fileop_Solaris10cc-64.o +- +- +-fileop_linux.o: fileop.c +- @echo "" +- @echo "Building fileop for Linux" +- @echo "" +- $(CC) -Wall -c -O3 $(CFLAGS) fileop.c -o fileop_linux.o +- +-fileop_openbsd.o: fileop.c +- @echo "" +- @echo "Building fileop for OpenBSD" +- @echo "" +- $(CC) -Wall -c -O $(CFLAGS) fileop.c -o fileop_openbsd.o +- +-fileop_macosx.o: fileop.c +- @echo "" +- @echo "Building fileop for MAC OS X" +- @echo "" +- $(CC) -Wall -c -O -Dmacosx $(CFLAGS) fileop.c -o fileop_macosx.o +- +-fileop_linux-ia64.o: fileop.c +- @echo "" +- @echo "Building fileop for Linux-ia64" +- @echo "" +- $(CC) -Wall -c -O3 $(CFLAGS) fileop.c -o fileop_linux-ia64.o +- +-fileop_linux-ppc.o: fileop.c +- @echo "" +- @echo "Building fileop for Linux-powerpc" +- @echo "" +- $(CC) -Wall -c -O3 $(CFLAGS) fileop.c -o fileop_linux-ppc.o +- +-fileop_linux-ppc64.o: fileop.c +- @echo "" +- @echo "Building fileop for Linux-powerpc64" +- @echo "" +- $(CC) -Wall -c -O3 $(CFLAGS) $(FLAG64BIT) fileop.c -o fileop_linux-ppc64.o +- +-fileop_linux-AMD64.o: fileop.c +- @echo "" +- @echo "Building fileop for Linux-AMD64" +- @echo "" +- $(CC) -Wall -c -O3 $(CFLAGS) fileop.c -o fileop_linux-AMD64.o +- +-fileop_linux-arm.o: fileop.c +- @echo "" +- @echo "Building fileop for Linux-arm" +- @echo "" +- $(GCC) -Wall -c -O3 $(CFLAGS) fileop.c -o fileop_linux-arm.o +- +-fileop_linux-s390.o: fileop.c +- @echo "" +- @echo "Building fileop for Linux-S390" +- @echo "" +- $(GCC) -Wall -c -O3 $(CFLAGS) fileop.c -o fileop_linux-s390.o +- +-fileop_linux-s390x.o: fileop.c +- @echo "" +- @echo "Building fileop for Linux-s390x" +- @echo "" +- $(GCC) -Wall -c -O3 $(CFLAGS) fileop.c -o fileop_linux-s390x.o +- +-fileop_windows.o: fileop.c +- @echo "" +- @echo "Building fileop for Windows" +- @echo "" +- $(GCC) -Wall -c -O3 $(CFLAGS) -DWindows fileop.c -o fileop_windows.o +- +-fileop_sua.o: fileop.c +- @echo "" +- @echo "Building fileop for Windows SUA" +- @echo "" +- $(GCC) -Wall -c -O3 $(CFLAGS) -D_SUA_ fileop.c -o fileop_sua.o +- +-iozone_linux-ia64.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for Linux-ia64" +- @echo "" +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DNAME='"linux-ia64"' \ +- -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ +- -o iozone_linux-ia64.o +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ +- -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o +- $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o +- +-iozone_linux-arm.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for Linux-arm" +- @echo "" +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DHAVE_PREAD \ +- -DNAME='"linux-arm"' -DLINUX_ARM -DSHARED_MEM \ +- -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ +- -o iozone_linux-arm.o +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ +- -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o +- $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o +- +-iozone_linux-AMD64.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for Linux-AMD64" +- @echo "" +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DNAME='"linux-AMD64"' \ +- -D__AMD64__ -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE \ +- -DHAVE_PREAD $(CFLAGS) iozone.c -o iozone_linux-AMD64.o +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ +- -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o +- $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o +- +-iozone_linux-s390.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for Linux-s390" +- @echo "" +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DHAVE_PREAD \ +- -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ +- -DNAME='"linux-s390"' -o iozone_linux-s390.o +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DSHARED_MEM -Dlinux \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libbif.c -o libbif.o +- $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o +- +-iozone_linux-s390x.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for Linux-s390x" +- @echo "" +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DHAVE_PREAD \ +- -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ +- -DNAME='"linux-s390x"' -o iozone_linux-s390x.o +- $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DSHARED_MEM -Dlinux \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libbif.c -o libbif.o +- $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o +- +- +-iozone_AIX.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for AIX" +- @echo "" +- $(CC) -c -O -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ +- -DNAME='"AIX"' -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_AIX.o +- $(CC) -c -O -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ +- -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o +- +-iozone_AIX-LF.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for AIX with Large files" +- @echo "" +- $(CC) -c -O -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ +- -DSHARED_MEM -D_LARGEFILE64_SOURCE -D_LARGE_FILES \ +- -DNAME='"AIX-LF"' $(CFLAGS) iozone.c -o iozone_AIX-LF.o +- $(CC) -c -O -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ +- -DSHARED_MEM -D_LARGEFILE64_SOURCE -D_LARGE_FILES \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_AIX64.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for AIX64" +- @echo "" +- $(GCC) -maix64 -c -O3 -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ +- -DASYNC_IO -DNAME='"AIX64"' -DSHARED_MEM \ +- $(CFLAGS) iozone.c -o iozone_AIX64.o +- $(GCC) -maix64 -c -O3 -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ +- -DASYNC_IO -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o +- $(GCC) -maix64 -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- $(CFLAGS) libasync.c -o libasync.o +- +-iozone_AIX64-LF.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone for AIX64 with Large files" +- @echo "" +- $(GCC) -maix64 -c -O3 -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ +- -DASYNC_IO -DNAME='"AIX64-LF"' -DSHARED_MEM \ +- -D_LARGEFILE64_SOURCE -D_LARGE_FILES \ +- $(CFLAGS) iozone.c -o iozone_AIX64-LF.o +- $(GCC) -maix64 -c -O3 -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ +- -DASYNC_IO -DSHARED_MEM -D_LARGEFILE64_SOURCE -D_LARGE_FILES \ +- $(CFLAGS) libbif.c -o libbif.o +- $(GCC) -maix64 -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE -D_LARGE_FILES \ +- $(CFLAGS) libasync.c -o libasync.o +- +-iozone_solaris.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building iozone for Solaris" +- @echo "" +- $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris"' $(CFLAGS) iozone.c -o iozone_solaris.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- $(CFLAGS) libasync.c -o libasync.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_solaris7gcc.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building iozone for Solaris7gcc" +- @echo "" +- $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris7gcc"' $(CFLAGS) libasync.c -o libasync7.o +- $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- $(CFLAGS) libbif.c -o libbif7.o +- $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris7gcc"' $(CFLAGS) iozone.c -o iozone_solaris7gcc.o +- +-iozone_solaris10.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for Solaris10" +- @echo "" +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- $(CFLAGS) libbif.c -o libbif10.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris10"' $(CFLAGS) libasync.c -o libasync10.o +- $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO -Dstudio11 \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris10"' $(CFLAGS) iozone.c -o iozone_solaris10.o +- +-iozone_solaris10cc.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for Solaris10cc" +- @echo "" +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- $(CFLAGS) libbif.c -o libbif10cc.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris10"' $(CFLAGS) libasync.c -o libasync10cc.o +- $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO -Dstudio11 \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris10"' $(CFLAGS) iozone.c -o iozone_solaris10cc.o +- +-iozone_solaris10gcc.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for Solaris10gcc" +- @echo "" +- $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- $(CFLAGS) libbif.c -o libbif10.o +- $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris10gcc"' $(CFLAGS) libasync.c -o libasync10.o +- $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris10gcc"' $(CFLAGS) iozone.c -o iozone_solaris10gcc.o +- +-iozone_solaris10gcc-64.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for Solaris10gcc-64" +- @echo "" +- $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- $(CFLAGS) $(S10GCCFLAGS) libbif.c -o libbif10-64.o +- $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris10gcc-64"' $(CFLAGS) $(S10GCCFLAGS) libasync.c -o libasync10-64.o +- $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris10gcc-64"' $(CFLAGS) $(S10GCCFLAGS) iozone.c -o iozone_solaris10gcc-64.o +- +-iozone_solaris10cc-64.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for Solaris10cc-64" +- @echo "" +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- $(CFLAGS) $(S10CCFLAGS) libbif.c -o libbif10-64.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris10cc-64"' $(CFLAGS) $(S10CCFLAGS) libasync.c -o libasync10-64.o +- $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO -Dstudio11 \ +- -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ +- -DNAME='"Solaris10cc-64"' $(CFLAGS) $(S10CCFLAGS) iozone.c -o iozone_solaris10cc-64.o +- +- +-# +-# -DSHARED_MEM -Dsolaris libasync.c -o libasync.o +-# -DSHARED_MEM -Dsolaris iozone.c -o iozone_solaris.o +-# +- +-iozone_solaris-2.6.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for Solaris-2.6" +- @echo "" +- $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DNO_THREADS \ +- -DNAME='"Solaris-2.6"' -Dsolaris $(CFLAGS) iozone.c -o iozone_solaris-2.6.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C \ +- -Dsolaris $(CFLAGS) libbif.c -o libbif.o +- +-iozone_solaris8-64.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building iozone for Solaris8-64" +- @echo "" +- $(CC) -fast -xtarget=generic64 -v -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ +- -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ +- -DNAME='"Solaris8-64"' -Dsolaris -DHAVE_PREAD \ +- $(CFLAGS) iozone.c -o iozone_solaris8-64.o +- $(CC) -fast -xtarget=generic64 -v -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ +- -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ +- -Dsolaris -DHAVE_PREAD $(CFLAGS) libasync.c -o libasync.o +- $(CC) -fast -xtarget=generic64 -v -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ +- -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ +- -Dsolaris -DHAVE_PREAD $(CFLAGS) libbif.c -o libbif.o +- +-iozone_solaris8-64-VXFS.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building iozone for Solaris8-64-VXFS" +- @echo "" +- $(CC) -fast -xtarget=generic64 -v -c -I/opt/VRTSvxfs/include/ -Dunix \ +- -DVXFS -DHAVE_ANSIC_C -DASYNC_IO \ +- -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ +- -DNAME='"Solaris8-64"' -Dsolaris -DHAVE_PREAD \ +- $(CFLAGS) iozone.c -o iozone_solaris8-64-VXFS.o +- $(CC) -fast -xtarget=generic64 -v -c -I/opt/VRTSvxfs/include/ -Dunix \ +- -DVXFS -DHAVE_ANSIC_C -DASYNC_IO \ +- -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ +- -Dsolaris -DHAVE_PREAD $(CFLAGS) libasync.c -o libasync.o +- $(CC) -fast -xtarget=generic64 -v -c -I/opt/VRTSvxfs/include/ -Dunix \ +- -DVXFS -DHAVE_ANSIC_C -DASYNC_IO \ +- -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ +- -Dsolaris -DHAVE_PREAD $(CFLAGS) libbif.c -o libbif.o +- +-iozone_windows.o: iozone.c libasync.c libbif.c fileop.c +- @echo "" +- @echo "Building iozone for Windows (No async I/O)" +- @echo "" +- $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -DNO_MADVISE \ +- -DWindows $(CFLAGS) -DDONT_HAVE_O_DIRECT iozone.c \ +- -o iozone_windows.o +- $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -DNO_MADVISE \ +- -DWindows $(CFLAGS) libbif.c -o libbif.o +- +- +-# -D_SUA_ $(CFLAGS) -DDONT_HAVE_O_DIRECT iozone.c \ +- +-iozone_sua.o: iozone.c libasync.c libbif.c fileop.c +- @echo "" +- @echo "Building iozone for Windows SUA (No async I/O)" +- @echo "" +- $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -D_XOPEN_SOURCE -DNO_MADVISE \ +- -D_SUA_ $(CFLAGS) iozone.c \ +- -DNAME='"Windows SUA"' -o iozone_sua.o +- $(GCC) -c -O -Dunix -D_SUA_ -D_XOPEN_SOURCE -DHAVE_ANSIC_C \ +- -DNO_MADVISE $(CFLAGS) libbif.c -o libbif.o +- +-iozone_uwin.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for UWIN (No threads, No async I/O)" +- @echo "" +- $(GCC) -c -O -DUWIN -Dunix -DHAVE_ANSIC_C -DNO_THREADS -DNO_MADVISE \ +- -DNAME='"UWIN"' -DSHARED_MEM -DWindows $(CFLAGS) iozone.c -o iozone_uwin.o +- $(GCC) -c -O -DUWIN -Dunix -DHAVE_ANSIC_C -DNO_THREADS -DNO_MADVISE \ +- -DSHARED_MEM -DWindows $(CFLAGS) libbif.c -o libbif.o +- +-iozone_IRIX64.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building iozone for IRIX64" +- @echo "" +- $(CC) -32 -O -c -Dunix -DHAVE_ANSIC_C -D_LARGEFILE64_SOURCE -DASYNC_IO \ +- -DNAME='"IRIX64"' -DIRIX64 -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_IRIX64.o +- $(CC) -32 -O -c -Dunix -DHAVE_ANSIC_C -D_LARGEFILE64_SOURCE -DASYNC_IO \ +- -DIRIX64 -DSHARED_MEM $(CFLAGS) libasync.c -o libasyncw.o +- $(CC) -32 -O -c -Dunix -DHAVE_ANSIC_C -D_LARGEFILE64_SOURCE -DASYNC_IO \ +- -DIRIX64 -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o +- +-iozone_IRIX.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building iozone for IRIX" +- @echo "" +- $(CC) -O -32 -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ +- -DNAME='"IRIX"' -DIRIX -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_IRIX.o +- $(CC) -O -32 -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ +- -DIRIX -DSHARED_MEM $(CFLAGS) libasync.c -o libasync.o +- $(CC) -O -32 -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ +- -DIRIX -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o +- +-iozone_CrayX1.o: iozone.c libasync.c libbif.c +- @echo "" +- @echo "Building iozone for CrayX1" +- @echo "" +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ +- -DNAME='"CrayX1"' -DIRIX64 -DSHARED_MEM -D__CrayX1__ \ +- $(CFLAGS) iozone.c -o iozone_CrayX1.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ +- -DIRIX64 -DSHARED_MEM -D__CrayX1__ \ +- $(CFLAGS) libasync.c -o libasyncw.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ +- -DIRIX64 -DSHARED_MEM -D__CrayX1__ $(CFLAGS) libbif.c \ +- -o libbif.o +- +-iozone_sppux.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for SPP-UX using Convex compiler" +- @echo "" +- $(NACC) -c -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ +- -DNAME='"sppux"' -Wl,+parallel -DHAVE_ANSIC_C -DHAVE_PREAD \ +- -DHAVE_PREADV $(CFLAGS) iozone.c -o iozone_sppux.o +- $(NACC) -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ +- -Wl,+parallel -DHAVE_ANSIC_C -DHAVE_PREAD -DHAVE_PREADV \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_sppux-10.1.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for SPP-UX using HP ansic compiler" +- @echo "" +- $(NACC) -c -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ +- -DHAVE_ANSIC_C -DHAVE_PREAD -DHAVE_PREADV $(CFLAGS) iozone.c \ +- -DNAME='"sppux-10.1"' -Wl,+parallel -o iozone_sppux-10.1.o +- $(NACC) -c -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ +- -DHAVE_ANSIC_C -DHAVE_PREAD -DHAVE_PREADV \ +- $(CFLAGS) libbif.c -Wl,+parallel -o libbif.o +- +-iozone_sppux_no-10.1.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for SPP-UX no ANSI c compiler" +- @echo "" +- $(CCS) -c -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ +- -DNAME='"sppux_no_ansi_10.1"' -Wl,+parallel -DHAVE_PREAD \ +- -DHAVE_PREADV $(CFLAGS) iozone.c -o iozone_sppux_no-10.1.o +- $(CCS) -c -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ +- -Wl,+parallel -DHAVE_PREAD -DHAVE_PREADV $(CFLAGS) \ +- libbif.c -o libbif.o +- +-iozone_convex.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone for Convex 'C' series" +- @echo "" +- $(CC) -c -O -Dunix -DNO_THREADS -Dbsd4_2 $(CFLAGS) iozone.c \ +- -DNAME='"Convex"' -o iozone_convex.o +- $(CC) -c -O -Dunix -DNO_THREADS -Dbsd4_2 \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_bsdi.o: iozone.c libbif.c +- @echo "" +- @echo "Build iozone for BSD/OS" +- @echo "" +- $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C \ +- -DNAME='"bsdi"' $(CFLAGS) iozone.c -o iozone_bsdi.o +- $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_freebsd.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Build iozone for FreeBSD" +- @echo "" +- $(CC) -c ${CFLAGS} -DFreeBSD -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DASYNC_IO \ +- -DHAVE_PREAD -DNAME='"freebsd"' -DSHARED_MEM \ +- $(CFLAGS) iozone.c -o iozone_freebsd.o +- $(CC) -c ${CFLAGS} -DFreeBSD -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DASYNC_IO \ +- -DSHARED_MEM -DHAVE_PREAD $(CFLAGS) libbif.c \ +- -o libbif.o +- $(CC) -c ${CFLAGS} -DFreeBSD -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DASYNC_IO \ +- -DSHARED_MEM -DHAVE_PREAD $(CFLAGS) libasync.c \ +- -o libasync.o +- +-iozone_dragonfly.o: iozone.c libbif.c +- @echo "" +- @echo "Build iozone for DragonFly" +- @echo "" +- $(CC) -c ${CFLAGS} -D__DragonFly__ -Dunix -DHAVE_ANSIC_C -DNO_THREADS \ +- -DNAME='"dragonfly"' -DSHARED_MEM -DHAVE_PREAD -DHAVE_PREADV \ +- $(CFLAGS) iozone.c -o iozone_dragonfly.o +- $(CC) -c ${CFLAGS} -D__DragonFly__ -Dunix -DHAVE_ANSIC_C -DNO_THREADS \ +- -DSHARED_MEM -DHAVE_PREAD -DHAVE_PREADV $(CFLAGS) libbif.c \ +- -o libbif.o +- +-iozone_macosx.o: iozone.c libbif.c +- @echo "" +- @echo "Build iozone for MacOSX" +- @echo "" +- $(CC) -c -O -Dunix -Dbsd4_2 -Dmacosx -DHAVE_ANSIC_C -DNO_THREADS \ +- -DNAME='"macosx"' -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_macosx.o +- $(CC) -c -O -Dunix -Dbsd4_2 -Dmacosx -DHAVE_ANSIC_C -DNO_THREADS \ +- -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o +- +-iozone_openbsd.o: iozone.c libbif.c +- @echo "" +- @echo "Build iozone for OpenBSD" +- @echo "" +- $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DNO_THREADS \ +- -DNAME='"openbsd"' -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_openbsd.o +- $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DNO_THREADS \ +- -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o +- +-iozone_openbsd-threads.o: iozone.c libbif.c +- @echo "" +- @echo "Build iozone for OpenBSD with threads" +- @echo "" +- $(CC) -c -O -pthread -Dunix -Dbsd4_4 -DHAVE_ANSIC_C \ +- -DNAME='"openbsd-threads"' $(CFLAGS) iozone.c \ +- -o iozone_openbsd-threads.o +- $(CC) -c -O -pthread -Dunix -Dbsd4_4 -DHAVE_ANSIC_C \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_OSFV3.o: iozone.c libbif.c +- @echo "" +- @echo "Build iozone for OSFV3" +- @echo "" +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV3 \ +- -DNAME='"OSFV3"' -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) iozone.c \ +- -o iozone_OSFV3.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV3 \ +- -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libbif.c -o libbif.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV3 \ +- -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libasync.c -o libasync.o +- +-iozone_OSFV4.o: iozone.c libbif.c +- @echo "" +- @echo "Build iozone for OSFV4" +- @echo "" +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV4 \ +- -DNAME='"OSFV4"' -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) iozone.c \ +- -o iozone_OSFV4.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV4 \ +- -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libbif.c -o libbif.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV4 \ +- -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libasync.c -o libasync.o +- +-iozone_OSFV5.o: iozone.c libbif.c +- @echo "" +- @echo "Build iozone for OSFV5" +- @echo "" +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 \ +- -DNAME='"OSFV5"' -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) iozone.c \ +- -o iozone_OSFV5.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 \ +- -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libbif.c -o libbif.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 \ +- -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libasync.c -o libasync.o +- +-iozone_TRU64.o: iozone.c libbif.c +- @echo "" +- @echo "Build iozone for TRU64" +- @echo "" +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 -DTRU64 -DHAVE_PREAD \ +- -DNAME='"TRU64"' -DNO_PRINT_LLD -DOSF_64 -pthread $(CFLAGS) iozone.c \ +- -o iozone_TRU64.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 -DHAVE_PREAD \ +- -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libbif.c -o libbif.o +- $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 -DHAVE_PREAD \ +- -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libasync.c -o libasync.o +- +-iozone_SCO.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone SCO " +- @echo "" +- $(GCC) -c -O -DSCO -Dunix -DHAVE_ANSIC_C -DNO_THREADS -DNO_MADVISE \ +- -DNAME='"SCO"' $(CFLAGS) iozone.c -o iozone_SCO.o +- $(GCC) -c -O -DSCO -Dunix -DHAVE_ANSIC_C -DNO_THREADS -DNO_MADVISE \ +- $(CFLAGS) libbif.c -o libbif.o +- +-iozone_SCO_Unixware_gcc.o: iozone.c libbif.c libasync.c +- @echo "" +- @echo "Building iozone SCO_Unixware_gcc " +- @echo "" +- $(GCC) -c -O -DSCO_Unixware_gcc -Dunix -DHAVE_ANSIC_C \ +- -DASYNC_IO -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ +- -DNAME='"SCO_Unixware_gcc"' -o iozone_SCO_Unixware_gcc.o +- $(GCC) -c -O -DSCO_Unixware_gcc -Dunix -DHAVE_ANSIC_C \ +- -DASYNC_IO -D_LARGEFILE64_SOURCE $(CFLAGS) libbif.c -o libbif.o +- $(GCC) -c -O -DSCO_Unixware_gcc -Dunix -DHAVE_ANSIC_C \ +- -DASYNC_IO -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o +- +-iozone_netbsd.o: iozone.c libbif.c +- @echo "" +- @echo "Building iozone NetBSD " +- @echo "" +- $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DNO_THREADS \ +- -DNAME='"netbsd"' -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_netbsd.o +- $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DNO_THREADS \ +- -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o +diff --git a/src/components/appio/tests/iozone/pit_server.c b/src/components/appio/tests/iozone/pit_server.c +deleted file mode 100644 +index 638e2f0d4..000000000 +--- a/src/components/appio/tests/iozone/pit_server.c ++++ /dev/null +@@ -1,831 +0,0 @@ +-/****************************************************************************** +-* File: pit_server.c +-* +-* Description: Contains source code for an IPv6-capable 'PIT' server. +-* This is a derivative of the tod6 (time-of-day) server that was written +-* by John Wenker. +-* ....... +-* Author of tod6: John Wenker, Sr. Software Engineer, +-* Performance Technologies, San Diego, USA +-* ....... +-* The program tod6 was a time of day server. It has beeen modified +-* to provide a microsecond timestamp on request. Modified and adapted +-* for PIT purposes by Don Capps. [ capps@iozone.org ] +-* +-* This server sends the current value of gettimeofday() in +-* microseconds back to the client, as a numerical string. +-* +-* /etc/services should contain "PIT" with a specified port value. +-* +-******************************************************************************/ +-/* +-** System header files. +-*/ +-#include /* errno declaration & error codes. */ +-#include /* getaddrinfo(3) et al. */ +-#include /* sockaddr_in & sockaddr_in6 definition. */ +-#include /* printf(3) et al. */ +-#include /* exit(2). */ +-#include /* String manipulation & memory functions. */ +-#if defined(_SUA_) +-#include /* poll(2) and related definitions. */ +-#else +-#include /* poll(2) and related definitions. */ +-#endif +-#include /* Socket functions (socket(2), bind(2), etc). */ +-#include /* time(2) & ctime(3). */ +-#include /* gettimeofday */ +-#include /* getopt(3), read(2), etc. */ +-/* Include for Cygnus development environment for Windows */ +-#if defined (Windows) +-#include +-int errno; +-#endif +- +-#if defined(_SUA_) +-extern char *optarg, *opterr; +-#endif +- +-/* +-** Constants. +-** +-** Please remember to add PIT service to the /etc/services file. +-*/ +-#define DFLT_SERVICE "PIT" /* Programmable Interdimensional Timer */ +- +-#define INVALID_DESC -1 /* Invalid file descriptor. */ +-#define MAXCONNQLEN 3 /* Max nbr of connection requests to queue. */ +-#define MAXTCPSCKTS 2 /* One TCP socket for IPv4 & one for IPv6. */ +-#define MAXUDPSCKTS 2 /* One UDP socket for IPv4 & one for IPv6. */ +-#define VALIDOPTS "vh:p:" /* Valid command options. */ +-/* +-** Simple boolean type definition. +-*/ +-int false = 0; +-int true = 1; +-/* +-** Prototypes for internal helper functions. +-*/ +-static int openSckt( const char *service, +- const char *protocol, +- int desc[ ], +- size_t *descSize ); +-static void pit( int tSckt[ ], +- size_t tScktSize, +- int uSckt[ ], +- size_t uScktSize ); +-/* +-** Global data objects. +-*/ +-static char hostBfr[ NI_MAXHOST ]; /* For use w/getnameinfo(3). */ +-static const char *pgmName; /* Program name w/o dir prefix. */ +-static char servBfr[ NI_MAXSERV ]; /* For use w/getnameinfo(3). */ +-static int verbose = 0; /* Verbose mode indication. */ +-struct timeval tm; /* Timeval structure, used with gettimeofday() */ +-char timeStr[40]; /* String for time in microseconds */ +-char service_name[20]; +-int need; +-/* +-** Usage macro for command syntax violations. +-*/ +-#define USAGE \ +- { \ +- fprintf( stderr, \ +- "Usage: %s [-v] -p service \n", \ +- pgmName ); \ +- exit( 127 ); \ +- } /* End USAGE macro. */ +-/* +-** Macro to terminate the program if a system call error occurs. The system +-** call must be one of the usual type that returns -1 on error. +-*/ +-#define CHK(expr) \ +- do \ +- { \ +- if ( (expr) == -1 ) \ +- { \ +- fprintf( stderr, \ +- "%s (line %d): System call ERROR - %s.\n", \ +- pgmName, \ +- __LINE__, \ +- strerror( errno ) ); \ +- exit( 1 ); \ +- } /* End IF system call failed. */ \ +- } while ( false ) +-/****************************************************************************** +-* Function: main +-* +-* Description: +-* Set up a PIT server and handle network requests. This server +-* handles both TCP and UDP requests. +-* +-* Parameters: +-* The usual argc and argv parameters to a main() function. +-* +-* Return Value: +-* This is a daemon program and never returns. However, in the degenerate +-* case where no sockets are created, the function returns zero. +-******************************************************************************/ +-int main( int argc, +- char *argv[ ] ) +-{ +- int opt; +- int tSckt[ MAXTCPSCKTS ]; /* Array of TCP socket descriptors. */ +- size_t tScktSize = MAXTCPSCKTS; /* Size of uSckt (# of elements). */ +- int uSckt[ MAXUDPSCKTS ]; /* Array of UDP socket descriptors. */ +- size_t uScktSize = MAXUDPSCKTS; /* Size of uSckt (# of elements). */ +- +- strcpy(service_name,DFLT_SERVICE); +- /* +- ** Set the program name (w/o directory prefix). +- */ +- pgmName = strrchr( argv[ 0 ], '/' ); +- pgmName = pgmName == NULL ? argv[ 0 ] : pgmName + 1; +- /* +- ** Process command options. +- */ +- opterr = 0; /* Turns off "invalid option" error messages. */ +- while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) >= 0 ) +- { +- switch ( opt ) +- { +- case 'v': /* Verbose mode. */ +- { +- verbose = true; +- break; +- } +- case 'p': /* Get the port number */ +- { +- strcpy(service_name,optarg); +- need++; +- break; +- } +- default: +- { +- USAGE; +- } +- } /* End SWITCH on command option. */ +- } /* End WHILE processing options. */ +- +- if(need < 1) +- { +- USAGE; +- exit; +- } +- /* +- ** Open both a TCP and UDP socket, for both IPv4 & IPv6, on which to receive +- ** service requests. +- */ +- if ( ( openSckt( service_name, "tcp", tSckt, &tScktSize ) < 0 ) || +- ( openSckt( service_name, "udp", uSckt, &uScktSize ) < 0 ) ) +- { +- exit( 1 ); +- } +- /* +- ** Run the Programmable Interdimensional Timer server. +- */ +- if ( ( tScktSize > 0 ) || ( uScktSize > 0 ) ) +- { +- pit( tSckt, /* pit() never returns. */ +- tScktSize, +- uSckt, +- uScktSize ); +- } +- /* +- ** Since pit() never returns, execution only gets here if no sockets were +- ** created. +- */ +- if ( verbose ) +- { +- fprintf( stderr, +- "%s: No sockets opened... terminating.\n", +- pgmName ); +- } +- return 0; +-} /* End main() */ +-/****************************************************************************** +-* Function: openSckt +-* +-* Description: +-* Open passive (server) sockets for the indicated inet service & protocol. +-* Notice in the last sentence that "sockets" is plural. During the interim +-* transition period while everyone is switching over to IPv6, the server +-* application has to open two sockets on which to listen for connections... +-* one for IPv4 traffic and one for IPv6 traffic. +-* +-* Parameters: +-* service - Pointer to a character string representing the well-known port +-* on which to listen (can be a service name or a decimal number). +-* protocol - Pointer to a character string representing the transport layer +-* protocol (only "tcp" or "udp" are valid). +-* desc - Pointer to an array into which the socket descriptors are +-* placed when opened. +-* descSize - This is a value-result parameter. On input, it contains the +-* max number of descriptors that can be put into 'desc' (i.e. the +-* number of elements in the array). Upon return, it will contain +-* the number of descriptors actually opened. Any unused slots in +-* 'desc' are set to INVALID_DESC. +-* +-* Return Value: +-* 0 on success, -1 on error. +-******************************************************************************/ +-static int openSckt( const char *service, +- const char *protocol, +- int desc[ ], +- size_t *descSize ) +-{ +- struct addrinfo *ai; +- int aiErr; +- struct addrinfo *aiHead; +- struct addrinfo hints = { .ai_flags = AI_PASSIVE, /* Server mode. */ +- .ai_family = PF_UNSPEC }; /* IPv4 or IPv6. */ +- size_t maxDescs = *descSize; +- /* +- ** Initialize output parameters. When the loop completes, *descSize is 0. +- */ +- while ( *descSize > 0 ) +- { +- desc[ --( *descSize ) ] = INVALID_DESC; +- } +- /* +- ** Check which protocol is selected (only TCP and UDP are valid). +- */ +- if ( strcmp( protocol, "tcp" ) == 0 ) /* TCP protocol. */ +- { +- hints.ai_socktype = SOCK_STREAM; +- hints.ai_protocol = IPPROTO_TCP; +- } +- else if ( strcmp( protocol, "udp" ) == 0 ) /* UDP protocol. */ +- { +- hints.ai_socktype = SOCK_DGRAM; +- hints.ai_protocol = IPPROTO_UDP; +- } +- else /* Invalid protocol. */ +- { +- fprintf( stderr, +- "%s (line %d): ERROR - Unknown transport " +- "layer protocol \"%s\".\n", +- pgmName, +- __LINE__, +- protocol ); +- return -1; +- } +- /* +- ** Look up the service's "well-known" port number. Notice that NULL is being +- ** passed for the 'node' parameter, and that the AI_PASSIVE flag is set in +- ** 'hints'. Thus, the program is requesting passive address information. +- ** The network address is initialized to :: (all zeros) for IPv6 records, or +- ** 0.0.0.0 for IPv4 records. +- */ +- if ( ( aiErr = getaddrinfo( NULL, +- service, +- &hints, +- &aiHead ) ) != 0 ) +- { +- fprintf( stderr, +- "%s (line %d): ERROR - %s.\n", +- pgmName, +- __LINE__, +- gai_strerror( aiErr ) ); +- return -1; +- } +- /* +- ** For each of the address records returned, attempt to set up a passive +- ** socket. +- */ +- for ( ai = aiHead; +- ( ai != NULL ) && ( *descSize < maxDescs ); +- ai = ai->ai_next ) +- { +- if ( verbose ) +- { +- /* +- ** Display the current address info. Start with the protocol- +- ** independent fields first. +- */ +- fprintf( stderr, +- "Setting up a passive socket based on the " +- "following address info:\n" +- " ai_flags = %#02X\n" +- " ai_family = %d (PF_INET = %d, PF_INET6 = %d)\n" +- " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n" +- " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n" +- " ai_addrlen = %d (sockaddr_in = %lu, " +- "sockaddr_in6 = %lu)\n", +- ai->ai_flags, +- ai->ai_family, +- PF_INET, +- PF_INET6, +- ai->ai_socktype, +- SOCK_STREAM, +- SOCK_DGRAM, +- ai->ai_protocol, +- IPPROTO_TCP, +- IPPROTO_UDP, +- ai->ai_addrlen, +- sizeof( struct sockaddr_in ), +- sizeof( struct sockaddr_in6 ) ); +- /* +- ** Now display the protocol-specific formatted socket address. Note +- ** that the program is requesting that getnameinfo(3) convert the +- ** host & service into numeric strings. +- */ +- getnameinfo( ai->ai_addr, +- ai->ai_addrlen, +- hostBfr, +- sizeof( hostBfr ), +- servBfr, +- sizeof( servBfr ), +- NI_NUMERICHOST | NI_NUMERICSERV ); +- switch ( ai->ai_family ) +- { +- case PF_INET: /* IPv4 address record. */ +- { +- struct sockaddr_in *p = (struct sockaddr_in*) ai->ai_addr; +- fprintf( stderr, +- " ai_addr = sin_family: %d (AF_INET = %d, " +- "AF_INET6 = %d)\n" +- " sin_addr: %s\n" +- " sin_port: %s\n", +- p->sin_family, +- AF_INET, +- AF_INET6, +- hostBfr, +- servBfr ); +- break; +- } /* End CASE of IPv4. */ +- case PF_INET6: /* IPv6 address record. */ +- { +- struct sockaddr_in6 *p = (struct sockaddr_in6*) ai->ai_addr; +- fprintf( stderr, +- " ai_addr = sin6_family: %d (AF_INET = %d, " +- "AF_INET6 = %d)\n" +- " sin6_addr: %s\n" +- " sin6_port: %s\n" +- " sin6_flowinfo: %d\n" +- " sin6_scope_id: %d\n", +- p->sin6_family, +- AF_INET, +- AF_INET6, +- hostBfr, +- servBfr, +- p->sin6_flowinfo, +- p->sin6_scope_id ); +- break; +- } /* End CASE of IPv6. */ +- default: /* Can never get here, but just for completeness. */ +- { +- fprintf( stderr, +- "%s (line %d): ERROR - Unknown protocol family (%d).\n", +- pgmName, +- __LINE__, +- ai->ai_family ); +- freeaddrinfo( aiHead ); +- return -1; +- } /* End DEFAULT case (unknown protocol family). */ +- } /* End SWITCH on protocol family. */ +- } /* End IF verbose mode. */ +- /* +- ** Create a socket using the info in the addrinfo structure. +- */ +- CHK( desc[ *descSize ] = socket( ai->ai_family, +- ai->ai_socktype, +- ai->ai_protocol ) ); +- /* +- ** Here is the code that prevents "IPv4 mapped addresses", as discussed +- ** in Section 22.1.3.1. If an IPv6 socket was just created, then set the +- ** IPV6_V6ONLY socket option. +- */ +- if ( ai->ai_family == PF_INET6 ) +- { +-#if defined( IPV6_V6ONLY ) +- /* +- ** Disable IPv4 mapped addresses. +- */ +- int v6Only = 1; +- CHK( setsockopt( desc[ *descSize ], +- IPPROTO_IPV6, +- IPV6_V6ONLY, +- &v6Only, +- sizeof( v6Only ) ) ); +-#else +- /* +- ** IPV6_V6ONLY is not defined, so the socket option can't be set and +- ** thus IPv4 mapped addresses can't be disabled. Print a warning +- ** message and close the socket. Design note: If the +- ** #if...#else...#endif construct were removed, then this program +- ** would not compile (because IPV6_V6ONLY isn't defined). That's an +- ** acceptable approach; IPv4 mapped addresses are certainly disabled +- ** if the program can't build! However, since this program is also +- ** designed to work for IPv4 sockets as well as IPv6, I decided to +- ** allow the program to compile when IPV6_V6ONLY is not defined, and +- ** turn it into a run-time warning rather than a compile-time error. +- ** IPv4 mapped addresses are still disabled because _all_ IPv6 traffic +- ** is disabled (all IPv6 sockets are closed here), but at least this +- ** way the server can still service IPv4 network traffic. +- */ +- fprintf( stderr, +- "%s (line %d): WARNING - Cannot set IPV6_V6ONLY socket " +- "option. Closing IPv6 %s socket.\n", +- pgmName, +- __LINE__, +- ai->ai_protocol == IPPROTO_TCP ? "TCP" : "UDP" ); +- CHK( close( desc[ *descSize ] ) ); +- continue; /* Go to top of FOR loop w/o updating *descSize! */ +-#endif /* IPV6_V6ONLY */ +- } /* End IF this is an IPv6 socket. */ +- /* +- ** Bind the socket. Again, the info from the addrinfo structure is used. +- */ +- CHK( bind( desc[ *descSize ], +- ai->ai_addr, +- ai->ai_addrlen ) ); +- /* +- ** If this is a TCP socket, put the socket into passive listening mode +- ** (listen is only valid on connection-oriented sockets). +- */ +- if ( ai->ai_socktype == SOCK_STREAM ) +- { +- CHK( listen( desc[ *descSize ], +- MAXCONNQLEN ) ); +- } +- /* +- ** Socket set up okay. Bump index to next descriptor array element. +- */ +- *descSize += 1; +- } /* End FOR each address info structure returned. */ +- /* +- ** Dummy check for unused address records. +- */ +- if ( verbose && ( ai != NULL ) ) +- { +- fprintf( stderr, +- "%s (line %d): WARNING - Some address records were " +- "not processed due to insufficient array space.\n", +- pgmName, +- __LINE__ ); +- } /* End IF verbose and some address records remain unprocessed. */ +- /* +- ** Clean up. +- */ +- freeaddrinfo( aiHead ); +- return 0; +-} /* End openSckt() */ +-/****************************************************************************** +-* Function: pit +-* +-* Description: +-* Listen on a set of sockets and send the current microsecond counter +-* that was produced by gettimeofday(), to any clients. This function +-* never returns. +-* +-* Parameters: +-* tSckt - Array of TCP socket descriptors on which to listen. +-* tScktSize - Size of the tSckt array (nbr of elements). +-* uSckt - Array of UDP socket descriptors on which to listen. +-* uScktSize - Size of the uSckt array (nbr of elements). +-* +-* Return Value: None. +-******************************************************************************/ +-static void pit( int tSckt[ ], +- size_t tScktSize, +- int uSckt[ ], +- size_t uScktSize ) +-{ +- char bfr[ 256 ]; +- ssize_t count; +- struct pollfd *desc; +- size_t descSize = tScktSize + uScktSize; +- int idx; +- int newSckt; +- struct sockaddr *sadr; +- socklen_t sadrLen; +- struct sockaddr_storage sockStor; +- int status; +- size_t timeLen; +- time_t timeVal; +- ssize_t wBytes; +- unsigned long long secs; +- int ret; +- /* +- ** Allocate memory for the poll(2) array. +- */ +- desc = malloc( descSize * sizeof( struct pollfd ) ); +- if ( desc == NULL ) +- { +- fprintf( stderr, +- "%s (line %d): ERROR - %s.\n", +- pgmName, +- __LINE__, +- strerror( ENOMEM ) ); +- exit( 1 ); +- } +- /* +- ** Initialize the poll(2) array. +- */ +- for ( idx = 0; idx < descSize; idx++ ) +- { +- desc[ idx ].fd = idx < tScktSize ? tSckt[ idx ] +- : uSckt[ idx - tScktSize ]; +- desc[ idx ].events = POLLIN; +- desc[ idx ].revents = 0; +- } +- /* +- ** Main PIT server loop. Handles both TCP & UDP requests. This is +- ** an interative server, and all requests are handled directly within the +- ** main loop. +- */ +- while ( true ) /* Do forever. */ +- { +- /* +- ** Wait for activity on one of the sockets. The DO..WHILE construct is +- ** used to restart the system call in the event the process is +- ** interrupted by a signal. +- */ +- do +- { +- status = poll( desc, +- descSize, +- -1 /* Wait indefinitely for input. */ ); +- } while ( ( status < 0 ) && ( errno == EINTR ) ); +- CHK( status ); /* Check for a bona fide system call error. */ +- /* +- ** Get the current time. +- */ +-#if defined(Windows) +- LARGE_INTEGER freq,counter; +- double wintime,bigcounter; +- /* For Windows the time_of_day() is useless. It increments in 55 milli +- * second increments. By using the Win32api one can get access to the +- * high performance measurement interfaces. With this one can get back +- * into the 8 to 9 microsecond resolution. +- */ +- QueryPerformanceFrequency(&freq); +- QueryPerformanceCounter(&counter); +- bigcounter=(double)counter.HighPart *(double)0xffffffff + +- (double)counter.LowPart; +- wintime = (double)(bigcounter/(double)freq.LowPart); +- secs = (long long)(wintime * 1000000); +-#else +- ret = gettimeofday( &tm,0 ); +- secs = ((unsigned long long)tm.tv_sec * 1000000) +- + (unsigned long long)tm.tv_usec; +-#endif +- +- ret = sprintf(timeStr,"%llu",secs); +- timeLen = strlen( timeStr ); +- /* +- ** Process sockets with input available. +- */ +- for ( idx = 0; idx < descSize; idx++ ) +- { +- switch ( desc[ idx ].revents ) +- { +- case 0: /* No activity on this socket; try the next. */ +- continue; +- case POLLIN: /* Network activity. Go process it. */ +- break; +- default: /* Invalid poll events. */ +- { +- fprintf( stderr, +- "%s (line %d): ERROR - Invalid poll event (%#02X).\n", +- pgmName, +- __LINE__, +- desc[ idx ].revents ); +- exit( 1 ); +- } +- } /* End SWITCH on returned poll events. */ +- /* +- ** Determine if this is a TCP request or UDP request. +- */ +- if ( idx < tScktSize ) +- { +- /* +- ** TCP connection requested. Accept it. Notice the use of +- ** the sockaddr_storage data type. +- */ +- sadrLen = sizeof( sockStor ); +- sadr = (struct sockaddr*) &sockStor; +- CHK( newSckt = accept( desc[ idx ].fd, +- sadr, +- &sadrLen ) ); +- CHK( shutdown( newSckt, /* Server never recv's anything. */ +- SHUT_RD ) ); +- if ( verbose ) +- { +- /* +- ** Display the socket address of the remote client. Begin with +- ** the address-independent fields. +- */ +- fprintf( stderr, +- "Sockaddr info for new TCP client:\n" +- " sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n" +- " addr len = %d (sockaddr_in = %lu, " +- "sockaddr_in6 = %lu)\n", +- sadr->sa_family, +- AF_INET, +- AF_INET6, +- sadrLen, +- sizeof( struct sockaddr_in ), +- sizeof( struct sockaddr_in6 ) ); +- /* +- ** Display the address-specific fields. +- */ +- getnameinfo( sadr, +- sadrLen, +- hostBfr, +- sizeof( hostBfr ), +- servBfr, +- sizeof( servBfr ), +- NI_NUMERICHOST | NI_NUMERICSERV ); +- /* +- ** Notice that we're switching on an address family now, not a +- ** protocol family. +- */ +- switch ( sadr->sa_family ) +- { +- case AF_INET: /* IPv4 address. */ +- { +- struct sockaddr_in *p = (struct sockaddr_in*) sadr; +- fprintf( stderr, +- " sin_addr = sin_family: %d\n" +- " sin_addr: %s\n" +- " sin_port: %s\n", +- p->sin_family, +- hostBfr, +- servBfr ); +- break; +- } /* End CASE of IPv4. */ +- case AF_INET6: /* IPv6 address. */ +- { +- struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; +- fprintf( stderr, +- " sin6_addr = sin6_family: %d\n" +- " sin6_addr: %s\n" +- " sin6_port: %s\n" +- " sin6_flowinfo: %d\n" +- " sin6_scope_id: %d\n", +- p->sin6_family, +- hostBfr, +- servBfr, +- p->sin6_flowinfo, +- p->sin6_scope_id ); +- break; +- } /* End CASE of IPv6. */ +- default: /* Can never get here, but for completeness. */ +- { +- fprintf( stderr, +- "%s (line %d): ERROR - Unknown address " +- "family (%d).\n", +- pgmName, +- __LINE__, +- sadr->sa_family ); +- break; +- } /* End DEFAULT case (unknown address family). */ +- } /* End SWITCH on address family. */ +- } /* End IF verbose mode. */ +- /* +- ** Send the PIT to the client. +- */ +- wBytes = timeLen; +- while ( wBytes > 0 ) +- { +- do +- { +- count = write( newSckt, +- timeStr, +- wBytes ); +- } while ( ( count < 0 ) && ( errno == EINTR ) ); +- CHK( count ); /* Check for an error. */ +- wBytes -= count; +- } /* End WHILE there is data to send. */ +- CHK( close( newSckt ) ); +- } /* End IF this was a TCP connection request. */ +- else +- { +- /* +- ** This is a UDP socket, and a datagram is available. The funny +- ** thing about UDP requests is that this server doesn't require any +- ** client input; but it can't send the PIT unless it knows a client +- ** wants the data, and the only way that can occur with UDP is if +- ** the server receives a datagram from the client. Thus, the +- ** server must receive _something_, but the content of the datagram +- ** is irrelevant. Read in the datagram. Again note the use of +- ** sockaddr_storage to receive the address. +- */ +- sadrLen = sizeof( sockStor ); +- sadr = (struct sockaddr*) &sockStor; +- CHK( count = recvfrom( desc[ idx ].fd, +- bfr, +- sizeof( bfr ), +- 0, +- sadr, +- &sadrLen ) ); +- /* +- ** Display whatever was received on stdout. +- */ +- if ( verbose ) +- { +- ssize_t rBytes = count; +- fprintf( stderr, +- "%s: UDP datagram received (%ld bytes).\n", +- pgmName, +- count ); +- while ( count > 0 ) +- { +- fputc( bfr[ rBytes - count-- ], +- stdout ); +- } +- if ( bfr[ rBytes-1 ] != '\n' ) +- fputc( '\n', stdout ); /* Newline also flushes stdout. */ +- /* +- ** Display the socket address of the remote client. Address- +- ** independent fields first. +- */ +- fprintf( stderr, +- "Remote client's sockaddr info:\n" +- " sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n" +- " addr len = %d (sockaddr_in = %lu, " +- "sockaddr_in6 = %lu)\n", +- sadr->sa_family, +- AF_INET, +- AF_INET6, +- sadrLen, +- sizeof( struct sockaddr_in ), +- sizeof( struct sockaddr_in6 ) ); +- /* +- ** Display the address-specific information. +- */ +- getnameinfo( sadr, +- sadrLen, +- hostBfr, +- sizeof( hostBfr ), +- servBfr, +- sizeof( servBfr ), +- NI_NUMERICHOST | NI_NUMERICSERV ); +- switch ( sadr->sa_family ) +- { +- case AF_INET: /* IPv4 address. */ +- { +- struct sockaddr_in *p = (struct sockaddr_in*) sadr; +- fprintf( stderr, +- " sin_addr = sin_family: %d\n" +- " sin_addr: %s\n" +- " sin_port: %s\n", +- p->sin_family, +- hostBfr, +- servBfr ); +- break; +- } /* End CASE of IPv4 address. */ +- case AF_INET6: /* IPv6 address. */ +- { +- struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; +- fprintf( stderr, +- " sin6_addr = sin6_family: %d\n" +- " sin6_addr: %s\n" +- " sin6_port: %s\n" +- " sin6_flowinfo: %d\n" +- " sin6_scope_id: %d\n", +- p->sin6_family, +- hostBfr, +- servBfr, +- p->sin6_flowinfo, +- p->sin6_scope_id ); +- break; +- } /* End CASE of IPv6 address. */ +- default: /* Can never get here, but for completeness. */ +- { +- fprintf( stderr, +- "%s (line %d): ERROR - Unknown address " +- "family (%d).\n", +- pgmName, +- __LINE__, +- sadr->sa_family ); +- break; +- } /* End DEFAULT case (unknown address family). */ +- } /* End SWITCH on address family. */ +- } /* End IF verbose mode. */ +- /* +- ** Send the PIT to the client. +- */ +- wBytes = timeLen; +- while ( wBytes > 0 ) +- { +- do +- { +- count = sendto( desc[ idx ].fd, +- timeStr, +- wBytes, +- 0, +- sadr, /* Address & address length */ +- sadrLen ); /* received in recvfrom(). */ +- } while ( ( count < 0 ) && ( errno == EINTR ) ); +- CHK( count ); /* Check for a bona fide error. */ +- wBytes -= count; +- } /* End WHILE there is data to send. */ +- } /* End ELSE a UDP datagram is available. */ +- desc[ idx ].revents = 0; /* Clear the returned poll events. */ +- } /* End FOR each socket descriptor. */ +- } /* End WHILE forever. */ +-} /* End pit() */ +- +diff --git a/src/components/appio/tests/iozone/read_telemetry b/src/components/appio/tests/iozone/read_telemetry +deleted file mode 100644 +index 1cfd2523c..000000000 +--- a/src/components/appio/tests/iozone/read_telemetry ++++ /dev/null +@@ -1,29 +0,0 @@ +-# +-# +-# The format is: +-# +-# All fields are space delimited. +-# A # symbol in column 1 indicates a comment. +-# First field: Byte offset within the file. +-# Second field: Size in bytes of the I/O operation. +-# Third field: Number of milliseconds to delay before I/O operation. +-# +-# This is an example of sequential 64k reader with 2 milliseconds +-# before each read. +-# +-0 65536 2 +-65536 65536 2 +-131072 65536 2 +-196608 65536 2 +-262144 65536 2 +-327680 65536 2 +-393216 65536 2 +-458752 65536 2 +-524288 65536 2 +-589824 65536 2 +-655360 65536 2 +-720896 65536 2 +-786432 65536 2 +-851968 65536 2 +-917504 65536 2 +-983040 65536 2 +diff --git a/src/components/appio/tests/iozone/report.pl b/src/components/appio/tests/iozone/report.pl +deleted file mode 100755 +index f9b9b30ba..000000000 +--- a/src/components/appio/tests/iozone/report.pl ++++ /dev/null +@@ -1,150 +0,0 @@ +-#!/usr/bin/perl +-# +-# arguments: one of more report files +-# +-# Christian Mautner , 2005-10-31 +-# +-# This script is based loosely on the Generate_Graph set +-# of scripts that come with iozone, but is a complete re-write +-# +-# The main reason to write this was the need to compare the behaviour of +-# two or more different setups, for tuning filesystems or +-# comparing different pieces of hardware. +-# +-# This script is in the public domain, too short and too trivial +-# to deserve a copyright. +-# +-# Simply run iozone like, for example, ./iozone -a -g 4G > config1.out (if your machine has 4GB) +-# and then run perl report.pl config1.out +-# or get another report from another box into config2.out and run +-# perl report.pl config1.out config2.out +-# the look in the report_* directory for .png +-# +-# If you don't like png or the graphic size, search for "set terminal" in this file and put whatever gnuplot +-# terminal you want. Note I've also noticed that gnuplot switched the set terminal png syntax +-# a while back, you might need "set terminal png small size 900,700" +-# +- +- +-@Reports=@ARGV; +- +-die "usage: $0 [...]\n" if not @Reports or grep (m|^-|, @Reports); +- +-die "report files must be in current directory" if grep (m|/|, @Reports); +- +-%columns=( +- 'write' =>3, +- 'read' =>5, +- 'rewrite' =>4, +- 'reread' =>6, +- 'randread' =>7, +- 'randwrite' =>8, +- 'bkwdread' =>9, +- 'recrewrite'=>10, +- 'strideread'=>11, +- 'fwrite' =>12, +- 'frewrite' =>13, +- 'fread' =>14, +- 'freread' =>15, +- ); +- +-# +-# create output directory. the name is the concatenation +-# of all report file names (minus the file extension, plus +-# prefix report_) +-# +-$outdir="report_".join("_",map{/([^\.]+)(\..*)?/ && $1}(@Reports)); +- +-print STDERR "Output directory: $outdir "; +- +-if ( -d $outdir ) +-{ +- print STDERR "(removing old directory) "; +- system "rm -rf $outdir"; +-} +- +-mkdir $outdir or die "cannot make directory $outdir"; +- +-print STDERR "done.\nPreparing data files..."; +- +-foreach $report (@Reports) +-{ +- open(I, $report) or die "cannot open $report for reading"; +- $report=~/^([^\.]+)/; +- $datafile="$1.dat"; +- push @datafiles, $datafile; +- open(O, ">$outdir/$datafile") or die "cannot open $outdir/$datafile for writing"; +- open(O2, ">$outdir/2d-$datafile") or die "cannot open $outdir/$datafile for writing"; +- while() +- { +- next unless ( /^[\s\d]+$/ ); +- @split = split(); +- next unless ( @split >= 8 ); +- print O; +- print O2 if $split[1] == 16384 or $split[0] == $split[1]; +- } +- close I, O, O2; +-} +- +-print STDERR "done.\nGenerating graphs:"; +- +-foreach $column (keys %columns) +-{ +- print STDERR " $column"; +- +- open(G, ">$outdir/$column.do") or die "cannot open $outdir/$column.do for writing"; +- print G qq{ +-set title "Iozone performance: $column" +-set grid lt 2 lw 1 +-set surface +-set parametric +-set xtics +-set ytics +-set logscale x 2 +-set logscale y 2 +-set autoscale z +-#set xrange [2.**5:2.**24] +-set xlabel "File size in KBytes" +-set ylabel "Record size in Kbytes" +-set zlabel "Kbytes/sec" +-set style data lines +-set dgrid3d 80,80,3 +-#set terminal png small picsize 900 700 +-set terminal png small size 900 700 +-set output "$column.png" +-}; +- +- print G "splot ". join(", ", map{qq{"$_" using 1:2:$columns{$column} title "$_"}}(@datafiles)); +- +- print G "\n"; +- +- close G; +- +- open(G, ">$outdir/2d-$column.do") or die "cannot open $outdir/$column.do for writing"; +- print G qq{ +-set title "Iozone performance: $column" +-#set terminal png small picsize 450 350 +-set terminal png small size 450 350 +-set logscale x +-set xlabel "File size in KBytes" +-set ylabel "Kbytes/sec" +-set output "2d-$column.png" +-}; +- +- print G "plot ". join(", ", map{qq{"2d-$_" using 1:$columns{$column} title "$_" with lines}}(@datafiles)); +- +- print G "\n"; +- +- close G; +- +- if ( system("cd $outdir && gnuplot $column.do && gnuplot 2d-$column.do") ) +- { +- print STDERR "(failed) "; +- } +- else +- { +- print STDERR "(ok) "; +- } +-} +- +-print STDERR "done.\n"; +diff --git a/src/components/appio/tests/iozone/spec.in b/src/components/appio/tests/iozone/spec.in +deleted file mode 100644 +index b385b5866..000000000 +--- a/src/components/appio/tests/iozone/spec.in ++++ /dev/null +@@ -1,107 +0,0 @@ +-Summary: Iozone Filesystem Benchmark +-Name: iozone +-Version: 3 +-Release: 398 +-License: Freeware +-Group: Applications/Engineering +-Source: %{name}%{version}_%{release}.tar +-Buildroot: /var/tmp/%{name}-buildroot +- +-%description +-IOzone is a filesystem benchmark tool. The benchmark generates and +-measures a variety of file operations. Iozone has been ported to many machines and runs under many operating systems. +- +-Iozone is useful for performing a broad filesystem analysis of a vendors +-computer platform. The benchmark tests file I/O performance for the following +-operations: Read, write, re-read, re-write, read backwards, read strided, +-fread, fwrite, random read, pread ,mmap, aio_read, aio_write. +- +- +-## +-## PREP +-## +-%prep +- +-## +-## SETUP and PATCH +-## +-%setup -n iozone3_398/src/current +- +- +-## +-## BUILD +-## +-## +-## BUILD +-## +-%build +-%ifarch %{ix86} +- make linux +-%else +- %ifarch x86_64 +- make linux-AMD64 +- %else +- %ifarch ia64 +- make linux-ia64 +- %else +- %ifarch ppc +- make linux-powerpc +- %else +- %ifarch ppc64 +- make linux-powerpc64 +- %else +- %ifarch s390 +- make linux-S390 +- %else +- %ifarch s390x +- make linux-S390X +- %else +- %ifarch %(arm) +- make linux-arm +- %else +- echo "No idea how to build for your arch..." +- exit 1 +- %endif +- %endif +- %endif +- %endif +- %endif +- %endif +- %endif +-%endif +- +-## +-## INSTALL +-## +-%install +-mkdir -p $RPM_BUILD_ROOT/opt/iozone/bin +-cp $RPM_BUILD_DIR/iozone3_398/src/current/iozone $RPM_BUILD_ROOT/opt/iozone/bin/ +-cp $RPM_BUILD_DIR/iozone3_398/src/current/fileop $RPM_BUILD_ROOT/opt/iozone/bin/ +-cp $RPM_BUILD_DIR/iozone3_398/src/current/pit_server $RPM_BUILD_ROOT/opt/iozone/bin/ +-cp $RPM_BUILD_DIR/iozone3_398/src/current/Generate_Graphs $RPM_BUILD_ROOT/opt/iozone/bin/ +-cp $RPM_BUILD_DIR/iozone3_398/src/current/gengnuplot.sh $RPM_BUILD_ROOT/opt/iozone/bin/ +-cp $RPM_BUILD_DIR/iozone3_398/src/current/gnu3d.dem $RPM_BUILD_ROOT/opt/iozone/bin/ +- +-mkdir -p $RPM_BUILD_ROOT/opt/iozone/docs +-cp $RPM_BUILD_DIR/iozone3_398/docs/IOzone_msword_98.pdf $RPM_BUILD_ROOT/opt/iozone/docs/ +-cp $RPM_BUILD_DIR/iozone3_398/docs/Run_rules.doc $RPM_BUILD_ROOT/opt/iozone/docs/ +-cp $RPM_BUILD_DIR/iozone3_398/docs/IOzone_msword_98.doc $RPM_BUILD_ROOT/opt/iozone/docs/ +-cp $RPM_BUILD_DIR/iozone3_398/docs/Iozone_ps.gz $RPM_BUILD_ROOT/opt/iozone/docs/ +-cp $RPM_BUILD_DIR/iozone3_398/src/current/Gnuplot.txt $RPM_BUILD_ROOT/opt/iozone/docs/ +- +-mkdir -p $RPM_BUILD_ROOT/opt/iozone/man/man1 +-cp $RPM_BUILD_DIR/iozone3_398/docs/iozone.1 $RPM_BUILD_ROOT/opt/iozone/man/man1/ +- +- +-## +-## FILES +-## +-%files +-%attr(755,root,root) /opt/ +- +- +-## +-## CLEAN +-## +-%clean +-rm -rf $RPM_BUILD_ROOT +diff --git a/src/components/appio/tests/iozone/write_telemetry b/src/components/appio/tests/iozone/write_telemetry +deleted file mode 100644 +index 8b789d168..000000000 +--- a/src/components/appio/tests/iozone/write_telemetry ++++ /dev/null +@@ -1,29 +0,0 @@ +-# +-# +-# The format is: +-# +-# All fields are space delimited. +-# A # symbol in column 1 indicates a comment. +-# First field: Byte offset within the file. +-# Second field: Size in bytes of the I/O operation. +-# Third field: Number of milliseconds to delay before I/O operation. +-# +-# This is an example of sequential 64k writer with 2 milliseconds +-# before each write. +-# +-0 65536 2 +-65536 65536 2 +-131072 65536 2 +-196608 65536 2 +-262144 65536 2 +-327680 65536 2 +-393216 65536 2 +-458752 65536 2 +-524288 65536 2 +-589824 65536 2 +-655360 65536 2 +-720896 65536 2 +-786432 65536 2 +-851968 65536 2 +-917504 65536 2 +-983040 65536 2 +-- +2.26.2 + diff --git a/papi.spec b/papi.spec index 629bd6a..04adb5f 100644 --- a/papi.spec +++ b/papi.spec @@ -9,13 +9,14 @@ Summary: Performance Application Programming Interface Name: papi Version: 6.0.0 -Release: 4%{?dist} +Release: 5%{?dist} License: BSD Requires: papi-libs = %{version}-%{release} URL: http://icl.cs.utk.edu/papi/ Source0: http://icl.cs.utk.edu/projects/papi/downloads/%{name}-%{version}.tar.gz Patch1: papi-python3.patch Patch2: papi-a64fx.patch +Patch3: papi-no-iozone.patch BuildRequires: autoconf BuildRequires: doxygen BuildRequires: ncurses-devel @@ -80,6 +81,7 @@ the PAPI user-space libraries and interfaces. %setup -q %patch1 -p1 -b .python3 %patch2 -p1 -b .a64fx +%patch3 -p1 %build # This package fails to build with LTO due to undefined symbols. LTO @@ -168,6 +170,9 @@ chrpath --delete $RPM_BUILD_ROOT%{_libdir}/*.so* %{_libdir}/*.a %changelog +* Thu Dec 17 2020 William Cohen - 6.0.0-5 +- Remove iozone source code. (#1901077) + * Mon Nov 09 2020 William Cohen - 6.0.0-4 - Add Fujitsu A64FX presets.