1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * Format of the parsed workload files.
19  * 1) Header
20  * 2) Table of the entries, each entry describes 1 file
21  * 3) Table of IO operations to perform on the files
22  */
23 
24 #pragma pack(push, 1)
25 
26 /*
27  * The parsed workload file starts off with the header, which
28  * contains the count of the total # of files that are operated on.
29  * and the total number of IO operations.
30  */
31 struct ioshark_header {
32 #define IOSHARK_VERSION			2
33 	u_int64_t	version;
34 	u_int64_t	num_files;
35 	u_int64_t	num_io_operations;
36 };
37 
38 /*
39  * After the header, we have a table of #files entries. Each entry
40  * in this table describes 1 file, indexed by fileno and with the
41  * specified size.
42  * Before the tests starts, these files are pre-created.
43  */
44 struct ioshark_file_state {
45 	u_int64_t	fileno;	/* 1..num_files, with files name ioshark.<fileno> */
46 	u_int64_t	size;
47 	u_int64_t	global_filename_ix;
48 };
49 
50 enum file_op {
51 	IOSHARK_LSEEK = 0,
52 	IOSHARK_LLSEEK,
53 	IOSHARK_PREAD64,
54 	IOSHARK_PWRITE64,
55 	IOSHARK_READ,
56 	IOSHARK_WRITE,
57 	IOSHARK_MMAP,
58 	IOSHARK_MMAP2,
59 	IOSHARK_OPEN,
60 	IOSHARK_FSYNC,
61 	IOSHARK_FDATASYNC,
62 	IOSHARK_CLOSE,
63 	IOSHARK_MAPPED_PREAD,
64 	IOSHARK_MAPPED_PWRITE,
65 	IOSHARK_MAX_FILE_OP
66 };
67 
68 /* mmap prot flags */
69 #define IOSHARK_PROT_READ	0x1
70 #define IOSHARK_PROT_WRITE	0x2
71 
72 /*
73  * Next we have the table of IO operations to perform. Each
74  * IO operation is described by this entry.
75  */
76 struct ioshark_file_operation {
77 	/* delta us between previous file op and this */
78 	u_int64_t			delta_us;
79 #define ioshark_io_op			op_union.file_op_u
80 	union {
81 		enum file_op		file_op_u;
82 		u_int32_t		enum_size;
83 	} op_union;
84 	u_int64_t			fileno;
85 	union {
86 		struct lseek_args {
87 #define lseek_offset	u.lseek_a.offset
88 #define lseek_action	u.lseek_a.action
89 			u_int64_t	offset;
90 			u_int32_t	action;
91 		} lseek_a;
92 		struct prw_args {
93 #define prw_offset	u.prw_a.offset
94 #define prw_len		u.prw_a.len
95 			u_int64_t	offset;
96 			u_int64_t	len;
97 		} prw_a;
98 #define rw_len		u.rw_a.len
99 		struct rw_args {
100 			u_int64_t	len;
101 		} rw_a;
102 #define mmap_offset	u.mmap_a.offset
103 #define mmap_len	u.mmap_a.len
104 #define mmap_prot	u.mmap_a.prot
105 		struct mmap_args {
106 			u_int64_t	offset;
107 			u_int64_t	len;
108 			u_int32_t	prot;
109 	} mmap_a;
110 #define open_flags	u.open_a.flags
111 #define open_mode	u.open_a.mode
112 		struct open_args {
113 			u_int32_t	flags;
114 			u_int32_t	mode;
115 		} open_a;
116 	} u;
117 };
118 
119 #define MAX_IOSHARK_PATHLEN	512
120 
121 /*
122  * Global table of all fileames
123  */
124 struct ioshark_filename_struct
125 {
126 	char path[MAX_IOSHARK_PATHLEN];
127 };
128 
129 #pragma pack(pop)
130