IOshark is a repeatable application workload storage benchmark. You
can find more documentation on IOshark at :
https://docs.google.com/a/google.com/document/d/1Bhq7iNPVc_JzwRrkmZqcPjMvWgpHX0r3Ncq-ZsRNOBA/edit?usp=sharing

The short summary of what IOshark is : IOshark has 2 components, one
is a strace+ftrace compiler that takes straces and select ftraces fed
into it and compiles this into bytecodes (stored in *.wl files). The
compiler runs on a Linux host. The second component (which runs on the
device) is the tester that takes as input the bytecode files (*.wl
files) and executes them on the device.

How to Run :
----------
- First collect straces and compile these into bytecodes. The wrapper
script provided (collect-straces.sh) collects straces, ships them to
the host where the script runs, compiles and packages up the bytecode
files into a wl.tar file.
- Ship the wl.tar file and the iostark_bench binaries to the target
device (on /data/local/tmp say). Explode the tarfile.
- Run the tester. "ioshark_bench *.wl" runs the test with default
options. Supported ioshark_bench options :
-b : Explicitly specify a blockdev (to get IO stats from from
/proc/diskstats).
-d : Preserve the delays between successive filesystem syscalls as
seen in the original straces.
-n <N> : Run for N iterations
-t <N> : Limit to N threads. By default (without this option), IOshark
will launch as many threads as there are input files, so 1 thread/file.
-v : verbose. Chatty mode.
-s : One line summary.
-q : Don't create the files in read-only partitions like /system and
/vendor. Instead do reads on those files.

FILE FORMAT :
-----------

Each IOshark workload file is composed of the following

Header
File State : Table of File Entries. Each entry describes a file
File Op : Table of File Operations. One entry describes one operation

Each of the above is described below :

Note : Everything is in Big Endian byte order.

Header {
       /* IOshark version number */
       u_int64_t	ioshark_version;
       /* Total number of files used in this IOshark workload file */
       u_int64_t	num_files;
       /* Total number of IO operations in this IOshark workload file */
       u_int64_t       num_io_operations;
}

File State {
       u_int64_t	fileno;
       u_int64_t	size;
       u_int64_t 	global_filename_ix;
}

File Op {
	/* delta us between previous file op and this */
	u_int64_t		delta_us;
#define file_op			file_op_union.file_op_u
	union {
		enum file_op		file_op_u;
		int32_t			enum_size;
	} file_op_union;
	u_int64_t		fileno;
	union {
		struct lseek_args {
#define lseek_offset	u.lseek_a.offset
#define lseek_action	u.lseek_a.action
			u_int64_t	offset;
			int32_t		action;
		} lseek_a;
		struct prw_args {
#define prw_offset	u.prw_a.offset
#define prw_len		u.prw_a.len
			u_int64_t	offset;
			u_int64_t	len;
		} prw_a;
#define rw_len		u.rw_a.len
		struct rw_args {
			u_int64_t	len;
		} rw_a;
#define mmap_offset	u.mmap_a.offset
#define mmap_len	u.mmap_a.len
#define mmap_prot	u.mmap_a.prot
		struct mmap_args {
			u_int64_t	offset;
			u_int64_t	len;
			int32_t		prot;
	} mmap_a;
#define open_flags	u.open_a.flags
#define open_mode	u.open_a.mode
		struct open_args {
			int32_t		flags;
			int32_t		mode;
		} open_a;
	} u;

}
