1 5184 ek110237 /* 2 5184 ek110237 * CDDL HEADER START 3 5184 ek110237 * 4 5184 ek110237 * The contents of this file are subject to the terms of the 5 5184 ek110237 * Common Development and Distribution License (the "License"). 6 5184 ek110237 * You may not use this file except in compliance with the License. 7 5184 ek110237 * 8 5184 ek110237 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 5184 ek110237 * or http://www.opensolaris.org/os/licensing. 10 5184 ek110237 * See the License for the specific language governing permissions 11 5184 ek110237 * and limitations under the License. 12 5184 ek110237 * 13 5184 ek110237 * When distributing Covered Code, include this CDDL HEADER in each 14 5184 ek110237 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 5184 ek110237 * If applicable, add the following below this CDDL HEADER, with the 16 5184 ek110237 * fields enclosed by brackets "[]" replaced with your own identifying 17 5184 ek110237 * information: Portions Copyright [yyyy] [name of copyright owner] 18 5184 ek110237 * 19 5184 ek110237 * CDDL HEADER END 20 5184 ek110237 */ 21 5184 ek110237 /* 22 8615 Andrew * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 5184 ek110237 * Use is subject to license terms. 24 6613 ek110237 * 25 6613 ek110237 * Portions Copyright 2008 Denis Cheng 26 5184 ek110237 */ 27 5184 ek110237 28 5184 ek110237 %{ 29 5184 ek110237 30 5184 ek110237 #include <stdlib.h> 31 5184 ek110237 #include <stdio.h> 32 5184 ek110237 #include <string.h> 33 5184 ek110237 #include <signal.h> 34 5184 ek110237 #include <errno.h> 35 5184 ek110237 #include <sys/types.h> 36 5184 ek110237 #include <locale.h> 37 5184 ek110237 #include <sys/utsname.h> 38 9513 Andrew #include <sys/statvfs.h> 39 5184 ek110237 #ifdef HAVE_STDINT_H 40 5184 ek110237 #include <stdint.h> 41 5184 ek110237 #endif 42 5184 ek110237 #include <fcntl.h> 43 5184 ek110237 #include <sys/mman.h> 44 5184 ek110237 #include <sys/wait.h> 45 5184 ek110237 #ifdef HAVE_LIBTECLA 46 5184 ek110237 #include <libtecla.h> 47 5184 ek110237 #endif 48 5184 ek110237 #include "parsertypes.h" 49 5184 ek110237 #include "filebench.h" 50 5184 ek110237 #include "utils.h" 51 5184 ek110237 #include "stats.h" 52 5184 ek110237 #include "vars.h" 53 5184 ek110237 #include "eventgen.h" 54 5184 ek110237 #ifdef HAVE_LIBTECLA 55 5184 ek110237 #include "auto_comp.h" 56 5184 ek110237 #endif 57 7736 Andrew #include "multi_client_sync.h" 58 5184 ek110237 59 5184 ek110237 int dofile = FS_FALSE; 60 5184 ek110237 static const char cmdname[] = "filebench"; 61 5184 ek110237 static const char cmd_options[] = "pa:f:hi:s:m:"; 62 5184 ek110237 static void usage(int); 63 5184 ek110237 64 5184 ek110237 static cmd_t *cmd = NULL; /* Command being processed */ 65 5184 ek110237 #ifdef HAVE_LIBTECLA 66 5184 ek110237 static GetLine *gl; /* GetLine resource object */ 67 5184 ek110237 #endif 68 5184 ek110237 69 5184 ek110237 char *execname; 70 9513 Andrew char *fbbasepath = FILEBENCHDIR; 71 5184 ek110237 char *fscriptname; 72 5184 ek110237 int noproc = 0; 73 5184 ek110237 var_t *var_list = NULL; 74 5184 ek110237 pidlist_t *pidlist = NULL; 75 5184 ek110237 char *cwd = NULL; 76 5184 ek110237 FILE *parentscript = NULL; 77 5673 aw148015 78 5673 aw148015 static int filecreate_done = 0; 79 5673 aw148015 80 5184 ek110237 /* yacc externals */ 81 5184 ek110237 extern FILE *yyin; 82 5184 ek110237 extern int yydebug; 83 5184 ek110237 extern void yyerror(char *s); 84 5184 ek110237 85 5184 ek110237 /* utilities */ 86 5184 ek110237 static void terminate(void); 87 5184 ek110237 static cmd_t *alloc_cmd(void); 88 5184 ek110237 static attr_t *alloc_attr(void); 89 6550 aw148015 static attr_t *alloc_lvar_attr(var_t *var); 90 5184 ek110237 static attr_t *get_attr(cmd_t *cmd, int64_t name); 91 8404 Andrew static attr_t *get_attr_fileset(cmd_t *cmd, int64_t name); 92 5184 ek110237 static attr_t *get_attr_integer(cmd_t *cmd, int64_t name); 93 5184 ek110237 static attr_t *get_attr_bool(cmd_t *cmd, int64_t name); 94 6550 aw148015 static void get_attr_lvars(cmd_t *cmd, flowop_t *flowop); 95 5184 ek110237 static var_t *alloc_var(void); 96 5184 ek110237 static var_t *get_var(cmd_t *cmd, int64_t name); 97 5184 ek110237 static list_t *alloc_list(); 98 6212 aw148015 static probtabent_t *alloc_probtabent(void); 99 6550 aw148015 static void add_lvar_to_list(var_t *newlvar, var_t **lvar_list); 100 5184 ek110237 101 5184 ek110237 /* Info Commands */ 102 5184 ek110237 static void parser_list(cmd_t *); 103 6212 aw148015 static void parser_flowop_list(cmd_t *); 104 5184 ek110237 105 5184 ek110237 /* Define Commands */ 106 5184 ek110237 static void parser_proc_define(cmd_t *); 107 5184 ek110237 static void parser_thread_define(cmd_t *, procflow_t *, int instances); 108 6212 aw148015 static void parser_flowop_define(cmd_t *, threadflow_t *, flowop_t **, int); 109 5184 ek110237 static void parser_file_define(cmd_t *); 110 5184 ek110237 static void parser_fileset_define(cmd_t *); 111 6212 aw148015 static void parser_randvar_define(cmd_t *); 112 6212 aw148015 static void parser_randvar_set(cmd_t *); 113 6550 aw148015 static void parser_composite_flowop_define(cmd_t *); 114 5184 ek110237 115 5184 ek110237 /* Create Commands */ 116 5184 ek110237 static void parser_proc_create(cmd_t *); 117 5184 ek110237 static void parser_thread_create(cmd_t *); 118 5184 ek110237 static void parser_flowop_create(cmd_t *); 119 5184 ek110237 static void parser_fileset_create(cmd_t *); 120 6212 aw148015 121 6212 aw148015 /* set commands */ 122 9801 Andrew static void parser_set_integer(cmd_t *cmd); 123 9801 Andrew static void parser_set_var(cmd_t *cmd); 124 9801 Andrew static void parser_set_var_op_int(cmd_t *cmd); 125 9801 Andrew static void parser_set_int_op_var(cmd_t *cmd); 126 9801 Andrew static void parser_set_var_op_var(cmd_t *cmd); 127 5184 ek110237 128 5184 ek110237 /* Shutdown Commands */ 129 5184 ek110237 static void parser_proc_shutdown(cmd_t *); 130 5184 ek110237 static void parser_filebench_shutdown(cmd_t *cmd); 131 5184 ek110237 132 5184 ek110237 /* Other Commands */ 133 9513 Andrew static void parser_echo(cmd_t *cmd); 134 5184 ek110237 static void parser_foreach_integer(cmd_t *cmd); 135 5184 ek110237 static void parser_foreach_string(cmd_t *cmd); 136 9513 Andrew static void parser_fscheck(cmd_t *cmd); 137 9513 Andrew static void parser_fsflush(cmd_t *cmd); 138 5184 ek110237 static void parser_log(cmd_t *cmd); 139 5184 ek110237 static void parser_statscmd(cmd_t *cmd); 140 5184 ek110237 static void parser_statsdump(cmd_t *cmd); 141 5184 ek110237 static void parser_statsxmldump(cmd_t *cmd); 142 7736 Andrew static void parser_statsmultidump(cmd_t *cmd); 143 5184 ek110237 static void parser_usage(cmd_t *cmd); 144 5184 ek110237 static void parser_vars(cmd_t *cmd); 145 5184 ek110237 static void parser_printvars(cmd_t *cmd); 146 5184 ek110237 static void parser_system(cmd_t *cmd); 147 5184 ek110237 static void parser_statssnap(cmd_t *cmd); 148 5184 ek110237 static void parser_directory(cmd_t *cmd); 149 5184 ek110237 static void parser_eventgen(cmd_t *cmd); 150 7736 Andrew static void parser_enable_mc(cmd_t *cmd); 151 7736 Andrew static void parser_domultisync(cmd_t *cmd); 152 5184 ek110237 static void parser_run(cmd_t *cmd); 153 5184 ek110237 static void parser_run_variable(cmd_t *cmd); 154 9326 Andrew static void parser_sleep(cmd_t *cmd); 155 9326 Andrew static void parser_sleep_variable(cmd_t *cmd); 156 9326 Andrew static void parser_warmup(cmd_t *cmd); 157 9326 Andrew static void parser_warmup_variable(cmd_t *cmd); 158 5184 ek110237 static void parser_help(cmd_t *cmd); 159 5184 ek110237 static void arg_parse(const char *command); 160 5184 ek110237 static void parser_abort(int arg); 161 6750 ek110237 static void parser_version(cmd_t *cmd); 162 5184 ek110237 163 5184 ek110237 %} 164 5184 ek110237 165 5184 ek110237 %union { 166 6212 aw148015 int64_t ival; 167 6212 aw148015 uchar_t bval; 168 6212 aw148015 char * sval; 169 6212 aw148015 fs_u val; 170 6212 aw148015 avd_t avd; 171 6212 aw148015 cmd_t *cmd; 172 6212 aw148015 attr_t *attr; 173 6212 aw148015 list_t *list; 174 6212 aw148015 probtabent_t *rndtb; 175 5184 ek110237 } 176 5184 ek110237 177 5184 ek110237 %start commands 178 5184 ek110237 179 5184 ek110237 %token FSC_LIST FSC_DEFINE FSC_EXEC FSC_QUIT FSC_DEBUG FSC_CREATE 180 5184 ek110237 %token FSC_SLEEP FSC_STATS FSC_FOREACH FSC_SET FSC_SHUTDOWN FSC_LOG 181 5184 ek110237 %token FSC_SYSTEM FSC_FLOWOP FSC_EVENTGEN FSC_ECHO FSC_LOAD FSC_RUN 182 9513 Andrew %token FSC_WARMUP FSC_NOUSESTATS FSC_FSCHECK FSC_FSFLUSH 183 7736 Andrew %token FSC_USAGE FSC_HELP FSC_VARS FSC_VERSION FSC_ENABLE FSC_DOMULTISYNC 184 5184 ek110237 %token FSV_STRING FSV_VAL_INT FSV_VAL_BOOLEAN FSV_VARIABLE FSV_WHITESTRING 185 6212 aw148015 %token FSV_RANDUNI FSV_RANDTAB FSV_RANDVAR FSV_URAND FSV_RAND48 186 5184 ek110237 %token FST_INT FST_BOOLEAN 187 5184 ek110237 %token FSE_FILE FSE_PROC FSE_THREAD FSE_CLEAR FSE_ALL FSE_SNAP FSE_DUMP 188 6212 aw148015 %token FSE_DIRECTORY FSE_COMMAND FSE_FILESET FSE_XMLDUMP FSE_RAND FSE_MODE 189 7736 Andrew %token FSE_MULTI FSE_MULTIDUMP 190 5184 ek110237 %token FSK_SEPLST FSK_OPENLST FSK_CLOSELST FSK_ASSIGN FSK_IN FSK_QUOTE 191 9801 Andrew %token FSK_DIRSEPLST FSK_PLUS FSK_MINUS FSK_MULTIPLY FSK_DIVIDE 192 5184 ek110237 %token FSA_SIZE FSA_PREALLOC FSA_PARALLOC FSA_PATH FSA_REUSE 193 9326 Andrew %token FSA_PROCESS FSA_MEMSIZE FSA_RATE FSA_CACHED FSA_READONLY FSA_TRUSTTREE 194 5184 ek110237 %token FSA_IOSIZE FSA_FILE FSA_WSS FSA_NAME FSA_RANDOM FSA_INSTANCES 195 5184 ek110237 %token FSA_DSYNC FSA_TARGET FSA_ITERS FSA_NICE FSA_VALUE FSA_BLOCKING 196 5184 ek110237 %token FSA_HIGHWATER FSA_DIRECTIO FSA_DIRWIDTH FSA_FD FSA_SRCFD FSA_ROTATEFD 197 6212 aw148015 %token FSA_NAMELENGTH FSA_FILESIZE FSA_ENTRIES FSA_FILESIZEGAMMA FSA_DIRDEPTHRV 198 6212 aw148015 %token FSA_DIRGAMMA FSA_USEISM FSA_TYPE FSA_RANDTABLE FSA_RANDSRC FSA_RANDROUND 199 9513 Andrew %token FSA_LEAFDIRS FSA_INDEXED FSA_FSTYPE 200 7736 Andrew %token FSA_RANDSEED FSA_RANDGAMMA FSA_RANDMEAN FSA_RANDMIN FSA_MASTER 201 7736 Andrew %token FSA_CLIENT 202 6212 aw148015 %token FSS_TYPE FSS_SEED FSS_GAMMA FSS_MEAN FSS_MIN FSS_SRC FSS_ROUND 203 6550 aw148015 %token FSV_SET_LOCAL_VAR FSA_LVAR_ASSIGN 204 6212 aw148015 %token FSA_ALLDONE FSA_FIRSTDONE FSA_TIMEOUT 205 5184 ek110237 206 5184 ek110237 %type <ival> FSV_VAL_INT 207 5184 ek110237 %type <bval> FSV_VAL_BOOLEAN 208 5184 ek110237 %type <sval> FSV_STRING 209 5184 ek110237 %type <sval> FSV_WHITESTRING 210 5184 ek110237 %type <sval> FSV_VARIABLE 211 6212 aw148015 %type <sval> FSV_RANDVAR 212 5184 ek110237 %type <sval> FSK_ASSIGN 213 6550 aw148015 %type <sval> FSV_SET_LOCAL_VAR 214 5184 ek110237 215 7736 Andrew %type <ival> FSC_LIST FSC_DEFINE FSC_SET FSC_LOAD FSC_RUN FSC_ENABLE 216 7736 Andrew %type <ival> FSC_DOMULTISYNC 217 6750 ek110237 %type <ival> FSE_FILE FSE_PROC FSE_THREAD FSE_CLEAR FSC_HELP FSC_VERSION 218 5184 ek110237 219 5184 ek110237 %type <sval> name 220 5184 ek110237 %type <ival> entity 221 5184 ek110237 %type <val> value 222 5184 ek110237 223 6212 aw148015 %type <cmd> command inner_commands load_command run_command list_command 224 6212 aw148015 %type <cmd> proc_define_command files_define_command randvar_define_command 225 6550 aw148015 %type <cmd> fo_define_command debug_command create_command 226 5184 ek110237 %type <cmd> sleep_command stats_command set_command shutdown_command 227 5184 ek110237 %type <cmd> foreach_command log_command system_command flowop_command 228 5184 ek110237 %type <cmd> eventgen_command quit_command flowop_list thread_list 229 5184 ek110237 %type <cmd> thread echo_command usage_command help_command vars_command 230 9513 Andrew %type <cmd> version_command enable_command multisync_command 231 9513 Andrew %type <cmd> warmup_command fscheck_command fsflush_command 232 9801 Andrew %type <cmd> set_integer_command set_other_command 233 5184 ek110237 234 6212 aw148015 %type <attr> files_attr_op files_attr_ops pt_attr_op pt_attr_ops 235 6212 aw148015 %type <attr> fo_attr_op fo_attr_ops ev_attr_op ev_attr_ops 236 6212 aw148015 %type <attr> randvar_attr_op randvar_attr_ops randvar_attr_typop 237 6212 aw148015 %type <attr> randvar_attr_srcop attr_value attr_list_value 238 6550 aw148015 %type <attr> comp_lvar_def comp_attr_op comp_attr_ops 239 7736 Andrew %type <attr> enable_multi_ops enable_multi_op multisync_op 240 9513 Andrew %type <attr> fscheck_attr_op 241 6212 aw148015 %type <list> integer_seplist string_seplist string_list var_string_list 242 6212 aw148015 %type <list> var_string whitevar_string whitevar_string_list 243 6212 aw148015 %type <ival> attrs_define_file attrs_define_thread attrs_flowop 244 6550 aw148015 %type <ival> attrs_define_fileset attrs_define_proc attrs_eventgen attrs_define_comp 245 6212 aw148015 %type <ival> files_attr_name pt_attr_name fo_attr_name ev_attr_name 246 6212 aw148015 %type <ival> randvar_attr_name FSA_TYPE randtype_name randvar_attr_param 247 7736 Andrew %type <ival> randsrc_name FSA_RANDSRC randvar_attr_tsp em_attr_name 248 6212 aw148015 %type <ival> FSS_TYPE FSS_SEED FSS_GAMMA FSS_MEAN FSS_MIN FSS_SRC 249 9801 Andrew %type <ival> fscheck_attr_name FSA_FSTYPE binary_op 250 5184 ek110237 251 6212 aw148015 %type <rndtb> probtabentry_list probtabentry 252 6212 aw148015 %type <avd> var_int_val 253 5184 ek110237 %% 254 5184 ek110237 255 5184 ek110237 commands: commands command 256 5184 ek110237 { 257 5184 ek110237 list_t *list = NULL; 258 5184 ek110237 list_t *list_end = NULL; 259 5184 ek110237 260 5184 ek110237 if ($2->cmd != NULL) 261 5184 ek110237 $2->cmd($2); 262 5184 ek110237 263 5184 ek110237 free($2); 264 5184 ek110237 } 265 5184 ek110237 | commands error 266 5184 ek110237 { 267 5184 ek110237 if (dofile) 268 5184 ek110237 YYABORT; 269 5184 ek110237 } 270 5184 ek110237 |; 271 5184 ek110237 272 5184 ek110237 inner_commands: command 273 5184 ek110237 { 274 5184 ek110237 filebench_log(LOG_DEBUG_IMPL, "inner_command %zx", $1); 275 5184 ek110237 $$ = $1; 276 5184 ek110237 } 277 5184 ek110237 | inner_commands command 278 5184 ek110237 { 279 5184 ek110237 cmd_t *list = NULL; 280 5184 ek110237 cmd_t *list_end = NULL; 281 5184 ek110237 282 5184 ek110237 /* Find end of list */ 283 5184 ek110237 for (list = $1; list != NULL; 284 5184 ek110237 list = list->cmd_next) 285 5184 ek110237 list_end = list; 286 5184 ek110237 287 5184 ek110237 list_end->cmd_next = $2; 288 5184 ek110237 289 5184 ek110237 filebench_log(LOG_DEBUG_IMPL, 290 5184 ek110237 "inner_commands adding cmd %zx to list %zx", $2, $1); 291 5184 ek110237 292 5184 ek110237 $$ = $1; 293 5184 ek110237 }; 294 5184 ek110237 295 5184 ek110237 command: 296 6212 aw148015 proc_define_command 297 6212 aw148015 | files_define_command 298 6212 aw148015 | randvar_define_command 299 6550 aw148015 | fo_define_command 300 5184 ek110237 | debug_command 301 5184 ek110237 | eventgen_command 302 5184 ek110237 | create_command 303 5184 ek110237 | echo_command 304 5184 ek110237 | usage_command 305 5184 ek110237 | vars_command 306 5184 ek110237 | foreach_command 307 9513 Andrew | fscheck_command 308 9513 Andrew | fsflush_command 309 5184 ek110237 | help_command 310 5184 ek110237 | list_command 311 5184 ek110237 | load_command 312 5184 ek110237 | log_command 313 5184 ek110237 | run_command 314 5184 ek110237 | set_command 315 5184 ek110237 | shutdown_command 316 5184 ek110237 | sleep_command 317 9326 Andrew | warmup_command 318 5184 ek110237 | stats_command 319 5184 ek110237 | system_command 320 6750 ek110237 | version_command 321 7736 Andrew | enable_command 322 7736 Andrew | multisync_command 323 5184 ek110237 | quit_command; 324 5184 ek110237 325 5184 ek110237 foreach_command: FSC_FOREACH 326 5184 ek110237 { 327 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 328 5184 ek110237 YYERROR; 329 5184 ek110237 filebench_log(LOG_DEBUG_IMPL, "foreach_command %zx", $$); 330 5184 ek110237 } 331 5184 ek110237 | foreach_command FSV_VARIABLE FSK_IN integer_seplist FSK_OPENLST inner_commands FSK_CLOSELST 332 5184 ek110237 { 333 5184 ek110237 cmd_t *cmd, *inner_cmd; 334 5184 ek110237 list_t *list; 335 5184 ek110237 336 5184 ek110237 $$ = $1; 337 5184 ek110237 $$->cmd_list = $6; 338 5184 ek110237 $$->cmd_tgt1 = $2; 339 5184 ek110237 $$->cmd_param_list = $4; 340 5184 ek110237 $$->cmd = parser_foreach_integer; 341 5184 ek110237 342 5184 ek110237 for (list = $$->cmd_param_list; list != NULL; 343 5184 ek110237 list = list->list_next) { 344 5184 ek110237 for (inner_cmd = $$->cmd_list; 345 5184 ek110237 inner_cmd != NULL; 346 5184 ek110237 inner_cmd = inner_cmd->cmd_next) { 347 5184 ek110237 filebench_log(LOG_DEBUG_IMPL, 348 6286 aw148015 "packing foreach: %zx %s=%llu, cmd %zx", 349 6212 aw148015 $$, $$->cmd_tgt1, 350 6286 aw148015 (u_longlong_t)avd_get_int(list->list_integer), 351 6286 aw148015 inner_cmd); 352 5184 ek110237 } 353 5184 ek110237 } 354 5184 ek110237 }| foreach_command FSV_VARIABLE FSK_IN string_seplist FSK_OPENLST inner_commands FSK_CLOSELST 355 5184 ek110237 { 356 5184 ek110237 cmd_t *cmd, *inner_cmd; 357 5184 ek110237 list_t *list; 358 5184 ek110237 359 5184 ek110237 $$ = $1; 360 5184 ek110237 $$->cmd_list = $6; 361 5184 ek110237 $$->cmd_tgt1 = $2; 362 5184 ek110237 $$->cmd_param_list = $4; 363 5184 ek110237 $$->cmd = parser_foreach_string; 364 5184 ek110237 365 5184 ek110237 for (list = $$->cmd_param_list; list != NULL; 366 5184 ek110237 list = list->list_next) { 367 5184 ek110237 for (inner_cmd = $$->cmd_list; 368 5184 ek110237 inner_cmd != NULL; 369 5184 ek110237 inner_cmd = inner_cmd->cmd_next) { 370 5184 ek110237 filebench_log(LOG_DEBUG_IMPL, 371 5184 ek110237 "packing foreach: %zx %s=%s, cmd %zx", 372 5184 ek110237 $$, 373 5184 ek110237 $$->cmd_tgt1, 374 5184 ek110237 *list->list_string, inner_cmd); 375 5184 ek110237 } 376 5184 ek110237 } 377 5184 ek110237 }; 378 5184 ek110237 379 5184 ek110237 integer_seplist: FSV_VAL_INT 380 5184 ek110237 { 381 5184 ek110237 if (($$ = alloc_list()) == NULL) 382 5184 ek110237 YYERROR; 383 5184 ek110237 384 6212 aw148015 $$->list_integer = avd_int_alloc($1); 385 5184 ek110237 } 386 5184 ek110237 | integer_seplist FSK_SEPLST FSV_VAL_INT 387 5184 ek110237 { 388 5184 ek110237 list_t *list = NULL; 389 5184 ek110237 list_t *list_end = NULL; 390 5184 ek110237 391 5184 ek110237 if (($$ = alloc_list()) == NULL) 392 5184 ek110237 YYERROR; 393 5184 ek110237 394 6212 aw148015 $$->list_integer = avd_int_alloc($3); 395 5184 ek110237 396 5184 ek110237 /* Find end of list */ 397 5184 ek110237 for (list = $1; list != NULL; 398 5184 ek110237 list = list->list_next) 399 5184 ek110237 list_end = list; 400 5184 ek110237 list_end->list_next = $$; 401 5184 ek110237 $$ = $1; 402 5184 ek110237 }; 403 5184 ek110237 404 5184 ek110237 string_seplist: FSK_QUOTE FSV_WHITESTRING FSK_QUOTE 405 5184 ek110237 { 406 5184 ek110237 if (($$ = alloc_list()) == NULL) 407 5184 ek110237 YYERROR; 408 5184 ek110237 409 6212 aw148015 $$->list_string = avd_str_alloc($2); 410 5184 ek110237 } 411 5184 ek110237 | string_seplist FSK_SEPLST FSK_QUOTE FSV_WHITESTRING FSK_QUOTE 412 5184 ek110237 { 413 5184 ek110237 list_t *list = NULL; 414 5184 ek110237 list_t *list_end = NULL; 415 5184 ek110237 416 5184 ek110237 if (($$ = alloc_list()) == NULL) 417 5184 ek110237 YYERROR; 418 5184 ek110237 419 6212 aw148015 $$->list_string = avd_str_alloc($4); 420 5184 ek110237 421 5184 ek110237 /* Find end of list */ 422 5184 ek110237 for (list = $1; list != NULL; 423 5184 ek110237 list = list->list_next) 424 5184 ek110237 list_end = list; 425 5184 ek110237 list_end->list_next = $$; 426 5184 ek110237 $$ = $1; 427 5184 ek110237 }; 428 5184 ek110237 429 5184 ek110237 eventgen_command: FSC_EVENTGEN 430 5184 ek110237 { 431 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 432 5184 ek110237 YYERROR; 433 5184 ek110237 $$->cmd = &parser_eventgen; 434 5184 ek110237 } 435 6212 aw148015 | eventgen_command ev_attr_ops 436 5184 ek110237 { 437 5184 ek110237 $1->cmd_attr_list = $2; 438 5184 ek110237 }; 439 5184 ek110237 440 5184 ek110237 system_command: FSC_SYSTEM whitevar_string_list 441 5184 ek110237 { 442 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 443 5184 ek110237 YYERROR; 444 5184 ek110237 445 5184 ek110237 $$->cmd_param_list = $2; 446 5184 ek110237 $$->cmd = parser_system; 447 5184 ek110237 }; 448 5184 ek110237 449 5184 ek110237 echo_command: FSC_ECHO whitevar_string_list 450 5184 ek110237 { 451 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 452 5184 ek110237 YYERROR; 453 5184 ek110237 454 5184 ek110237 $$->cmd_param_list = $2; 455 5184 ek110237 $$->cmd = parser_echo; 456 6750 ek110237 }; 457 6750 ek110237 458 6750 ek110237 version_command: FSC_VERSION 459 6750 ek110237 { 460 6750 ek110237 if (($$ = alloc_cmd()) == NULL) 461 6750 ek110237 YYERROR; 462 6750 ek110237 $$->cmd = parser_version; 463 5184 ek110237 }; 464 5184 ek110237 465 5184 ek110237 usage_command: FSC_USAGE whitevar_string_list 466 5184 ek110237 { 467 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 468 5184 ek110237 YYERROR; 469 5184 ek110237 470 5184 ek110237 $$->cmd_param_list = $2; 471 5184 ek110237 $$->cmd = parser_usage; 472 5184 ek110237 }; 473 5184 ek110237 474 5184 ek110237 vars_command: FSC_VARS 475 5184 ek110237 { 476 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 477 5184 ek110237 YYERROR; 478 5184 ek110237 479 5184 ek110237 $$->cmd = parser_printvars; 480 5184 ek110237 }; 481 5184 ek110237 482 7736 Andrew enable_command: FSC_ENABLE FSE_MULTI 483 7736 Andrew { 484 7736 Andrew if (($$ = alloc_cmd()) == NULL) 485 7736 Andrew YYERROR; 486 7736 Andrew 487 7736 Andrew $$->cmd = parser_enable_mc; 488 7736 Andrew } 489 7736 Andrew | enable_command enable_multi_ops 490 7736 Andrew { 491 7736 Andrew $1->cmd_attr_list = $2; 492 7736 Andrew }; 493 7736 Andrew 494 7736 Andrew multisync_command: FSC_DOMULTISYNC multisync_op 495 7736 Andrew { 496 7736 Andrew if (($$ = alloc_cmd()) == NULL) 497 7736 Andrew YYERROR; 498 7736 Andrew 499 7736 Andrew $$->cmd = parser_domultisync; 500 7736 Andrew $$->cmd_attr_list = $2; 501 7736 Andrew } 502 7736 Andrew 503 5184 ek110237 string_list: FSV_VARIABLE 504 5184 ek110237 { 505 5184 ek110237 if (($$ = alloc_list()) == NULL) 506 5184 ek110237 YYERROR; 507 6212 aw148015 $$->list_string = avd_str_alloc($1); 508 5184 ek110237 } 509 5184 ek110237 | string_list FSK_SEPLST FSV_VARIABLE 510 5184 ek110237 { 511 5184 ek110237 list_t *list = NULL; 512 5184 ek110237 list_t *list_end = NULL; 513 5184 ek110237 514 5184 ek110237 if (($$ = alloc_list()) == NULL) 515 5184 ek110237 YYERROR; 516 5184 ek110237 517 6212 aw148015 $$->list_string = avd_str_alloc($3); 518 5184 ek110237 519 5184 ek110237 /* Find end of list */ 520 5184 ek110237 for (list = $1; list != NULL; 521 5184 ek110237 list = list->list_next) 522 5184 ek110237 list_end = list; 523 5184 ek110237 list_end->list_next = $$; 524 5184 ek110237 $$ = $1; 525 5184 ek110237 }; 526 5184 ek110237 527 5184 ek110237 var_string: FSV_VARIABLE 528 5184 ek110237 { 529 5184 ek110237 if (($$ = alloc_list()) == NULL) 530 5184 ek110237 YYERROR; 531 5184 ek110237 532 6212 aw148015 $$->list_string = avd_str_alloc($1); 533 5184 ek110237 } 534 5184 ek110237 | FSV_STRING 535 5184 ek110237 { 536 5184 ek110237 if (($$ = alloc_list()) == NULL) 537 5184 ek110237 YYERROR; 538 5184 ek110237 539 6212 aw148015 $$->list_string = avd_str_alloc($1); 540 5184 ek110237 }; 541 5184 ek110237 542 5184 ek110237 var_string_list: var_string 543 5184 ek110237 { 544 5184 ek110237 $$ = $1; 545 5184 ek110237 }| var_string FSV_STRING 546 5184 ek110237 { 547 5184 ek110237 list_t *list = NULL; 548 5184 ek110237 list_t *list_end = NULL; 549 5184 ek110237 550 5184 ek110237 /* Add string */ 551 5184 ek110237 if (($$ = alloc_list()) == NULL) 552 5184 ek110237 YYERROR; 553 5184 ek110237 554 6212 aw148015 $$->list_string = avd_str_alloc($2); 555 5184 ek110237 556 5184 ek110237 /* Find end of list */ 557 5184 ek110237 for (list = $1; list != NULL; 558 5184 ek110237 list = list->list_next) 559 5184 ek110237 list_end = list; 560 5184 ek110237 list_end->list_next = $$; 561 5184 ek110237 $$ = $1; 562 5184 ek110237 563 5184 ek110237 }| var_string FSV_VARIABLE 564 5184 ek110237 { 565 5184 ek110237 list_t *list = NULL; 566 5184 ek110237 list_t *list_end = NULL; 567 5184 ek110237 568 5184 ek110237 /* Add variable */ 569 5184 ek110237 if (($$ = alloc_list()) == NULL) 570 5184 ek110237 YYERROR; 571 5184 ek110237 572 6212 aw148015 $$->list_string = avd_str_alloc($2); 573 5184 ek110237 574 5184 ek110237 /* Find end of list */ 575 5184 ek110237 for (list = $1; list != NULL; 576 5184 ek110237 list = list->list_next) 577 5184 ek110237 list_end = list; 578 5184 ek110237 list_end->list_next = $$; 579 5184 ek110237 $$ = $1; 580 5184 ek110237 } |var_string_list FSV_STRING 581 5184 ek110237 { 582 5184 ek110237 list_t *list = NULL; 583 5184 ek110237 list_t *list_end = NULL; 584 5184 ek110237 585 5184 ek110237 /* Add string */ 586 5184 ek110237 if (($$ = alloc_list()) == NULL) 587 5184 ek110237 YYERROR; 588 5184 ek110237 589 6212 aw148015 $$->list_string = avd_str_alloc($2); 590 5184 ek110237 591 5184 ek110237 /* Find end of list */ 592 5184 ek110237 for (list = $1; list != NULL; 593 5184 ek110237 list = list->list_next) 594 5184 ek110237 list_end = list; 595 5184 ek110237 list_end->list_next = $$; 596 5184 ek110237 $$ = $1; 597 5184 ek110237 598 5184 ek110237 }| var_string_list FSV_VARIABLE 599 5184 ek110237 { 600 5184 ek110237 list_t *list = NULL; 601 5184 ek110237 list_t *list_end = NULL; 602 5184 ek110237 603 5184 ek110237 /* Add variable */ 604 5184 ek110237 if (($$ = alloc_list()) == NULL) 605 5184 ek110237 YYERROR; 606 5184 ek110237 607 6212 aw148015 $$->list_string = avd_str_alloc($2); 608 5184 ek110237 609 5184 ek110237 /* Find end of list */ 610 5184 ek110237 for (list = $1; list != NULL; 611 5184 ek110237 list = list->list_next) 612 5184 ek110237 list_end = list; 613 5184 ek110237 list_end->list_next = $$; 614 5184 ek110237 $$ = $1; 615 5184 ek110237 }; 616 5184 ek110237 617 5184 ek110237 whitevar_string: FSK_QUOTE FSV_VARIABLE 618 5184 ek110237 { 619 5184 ek110237 if (($$ = alloc_list()) == NULL) 620 5184 ek110237 YYERROR; 621 5184 ek110237 622 6212 aw148015 $$->list_string = avd_str_alloc($2); 623 5184 ek110237 } 624 5184 ek110237 | FSK_QUOTE FSV_WHITESTRING 625 5184 ek110237 { 626 5184 ek110237 if (($$ = alloc_list()) == NULL) 627 5184 ek110237 YYERROR; 628 5184 ek110237 629 6212 aw148015 $$->list_string = avd_str_alloc($2); 630 5184 ek110237 }; 631 5184 ek110237 632 5184 ek110237 whitevar_string_list: whitevar_string FSV_WHITESTRING 633 5184 ek110237 { 634 5184 ek110237 list_t *list = NULL; 635 5184 ek110237 list_t *list_end = NULL; 636 5184 ek110237 637 5184 ek110237 /* Add string */ 638 5184 ek110237 if (($$ = alloc_list()) == NULL) 639 5184 ek110237 YYERROR; 640 5184 ek110237 641 6212 aw148015 $$->list_string = avd_str_alloc($2); 642 5184 ek110237 643 5184 ek110237 /* Find end of list */ 644 5184 ek110237 for (list = $1; list != NULL; 645 5184 ek110237 list = list->list_next) 646 5184 ek110237 list_end = list; 647 5184 ek110237 list_end->list_next = $$; 648 5184 ek110237 $$ = $1; 649 5184 ek110237 650 5184 ek110237 }| whitevar_string FSV_VARIABLE 651 5184 ek110237 { 652 5184 ek110237 list_t *list = NULL; 653 5184 ek110237 list_t *list_end = NULL; 654 5184 ek110237 655 5184 ek110237 /* Add variable */ 656 5184 ek110237 if (($$ = alloc_list()) == NULL) 657 5184 ek110237 YYERROR; 658 5184 ek110237 659 6212 aw148015 $$->list_string = avd_str_alloc($2); 660 5184 ek110237 661 5184 ek110237 /* Find end of list */ 662 5184 ek110237 for (list = $1; list != NULL; 663 5184 ek110237 list = list->list_next) 664 5184 ek110237 list_end = list; 665 5184 ek110237 list_end->list_next = $$; 666 5184 ek110237 $$ = $1; 667 6212 aw148015 }| whitevar_string FSV_RANDVAR randvar_attr_tsp 668 6212 aw148015 { 669 6212 aw148015 list_t *list = NULL; 670 6212 aw148015 list_t *list_end = NULL; 671 6212 aw148015 672 6212 aw148015 /* Add variable */ 673 6212 aw148015 if (($$ = alloc_list()) == NULL) 674 6212 aw148015 YYERROR; 675 6212 aw148015 676 6212 aw148015 $$->list_string = avd_str_alloc($2); 677 6212 aw148015 $$->list_integer = avd_int_alloc($3); 678 6212 aw148015 679 6212 aw148015 /* Find end of list */ 680 6212 aw148015 for (list = $1; list != NULL; 681 6212 aw148015 list = list->list_next) 682 6212 aw148015 list_end = list; 683 6212 aw148015 list_end->list_next = $$; 684 6212 aw148015 $$ = $1; 685 6212 aw148015 }| whitevar_string_list FSV_WHITESTRING 686 5184 ek110237 { 687 5184 ek110237 list_t *list = NULL; 688 5184 ek110237 list_t *list_end = NULL; 689 5184 ek110237 690 5184 ek110237 /* Add string */ 691 5184 ek110237 if (($$ = alloc_list()) == NULL) 692 5184 ek110237 YYERROR; 693 5184 ek110237 694 6212 aw148015 $$->list_string = avd_str_alloc($2); 695 5184 ek110237 696 5184 ek110237 /* Find end of list */ 697 5184 ek110237 for (list = $1; list != NULL; 698 5184 ek110237 list = list->list_next) 699 5184 ek110237 list_end = list; 700 5184 ek110237 list_end->list_next = $$; 701 5184 ek110237 $$ = $1; 702 5184 ek110237 703 5184 ek110237 }| whitevar_string_list FSV_VARIABLE 704 5184 ek110237 { 705 5184 ek110237 list_t *list = NULL; 706 5184 ek110237 list_t *list_end = NULL; 707 5184 ek110237 708 5184 ek110237 /* Add variable */ 709 5184 ek110237 if (($$ = alloc_list()) == NULL) 710 5184 ek110237 YYERROR; 711 5184 ek110237 712 6212 aw148015 $$->list_string = avd_str_alloc($2); 713 6212 aw148015 714 6212 aw148015 /* Find end of list */ 715 6212 aw148015 for (list = $1; list != NULL; 716 6212 aw148015 list = list->list_next) 717 6212 aw148015 list_end = list; 718 6212 aw148015 list_end->list_next = $$; 719 6212 aw148015 $$ = $1; 720 6212 aw148015 }| whitevar_string_list FSV_RANDVAR randvar_attr_tsp 721 6212 aw148015 { 722 6212 aw148015 list_t *list = NULL; 723 6212 aw148015 list_t *list_end = NULL; 724 6212 aw148015 725 6212 aw148015 /* Add variable */ 726 6212 aw148015 if (($$ = alloc_list()) == NULL) 727 6212 aw148015 YYERROR; 728 6212 aw148015 729 6212 aw148015 $$->list_string = avd_str_alloc($2); 730 6212 aw148015 $$->list_integer = avd_int_alloc($3); 731 5184 ek110237 732 5184 ek110237 /* Find end of list */ 733 5184 ek110237 for (list = $1; list != NULL; 734 5184 ek110237 list = list->list_next) 735 5184 ek110237 list_end = list; 736 5184 ek110237 list_end->list_next = $$; 737 5184 ek110237 $$ = $1; 738 5184 ek110237 }| whitevar_string_list FSK_QUOTE 739 5184 ek110237 { 740 5184 ek110237 $$ = $1; 741 5184 ek110237 }| whitevar_string FSK_QUOTE 742 5184 ek110237 { 743 5184 ek110237 $$ = $1; 744 5184 ek110237 }; 745 5184 ek110237 746 5184 ek110237 list_command: FSC_LIST 747 5184 ek110237 { 748 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 749 5184 ek110237 YYERROR; 750 5184 ek110237 $$->cmd = &parser_list; 751 6212 aw148015 } 752 6212 aw148015 | list_command FSC_FLOWOP 753 6212 aw148015 { 754 6212 aw148015 $1->cmd = &parser_flowop_list; 755 5184 ek110237 }; 756 5184 ek110237 757 9513 Andrew fscheck_command: FSC_FSCHECK fscheck_attr_op 758 9513 Andrew { 759 9513 Andrew if (($$ = alloc_cmd()) == NULL) 760 9513 Andrew YYERROR; 761 9513 Andrew $$->cmd = &parser_fscheck; 762 9513 Andrew 763 9513 Andrew $$->cmd_attr_list = $2; 764 9513 Andrew } 765 9513 Andrew | fscheck_command fscheck_attr_op 766 9513 Andrew { 767 9513 Andrew $1->cmd_attr_list->attr_next = $2; 768 9513 Andrew }; 769 9513 Andrew 770 9513 Andrew fsflush_command: FSC_FSFLUSH fscheck_attr_op 771 9513 Andrew { 772 9513 Andrew if (($$ = alloc_cmd()) == NULL) 773 9513 Andrew YYERROR; 774 9513 Andrew $$->cmd = &parser_fsflush; 775 9513 Andrew 776 9513 Andrew $$->cmd_attr_list = $2; 777 9513 Andrew }; 778 9513 Andrew 779 5184 ek110237 log_command: FSC_LOG whitevar_string_list 780 5184 ek110237 { 781 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 782 5184 ek110237 YYERROR; 783 5184 ek110237 $$->cmd = &parser_log; 784 5184 ek110237 $$->cmd_param_list = $2; 785 5184 ek110237 }; 786 5184 ek110237 787 5184 ek110237 debug_command: FSC_DEBUG FSV_VAL_INT 788 5184 ek110237 { 789 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 790 5184 ek110237 YYERROR; 791 5184 ek110237 $$->cmd = NULL; 792 6391 aw148015 filebench_shm->shm_debug_level = $2; 793 6391 aw148015 if (filebench_shm->shm_debug_level > 9) 794 5184 ek110237 yydebug = 1; 795 5184 ek110237 }; 796 5184 ek110237 797 9801 Andrew set_command: 798 9801 Andrew set_integer_command 799 9801 Andrew | set_other_command; 800 9801 Andrew 801 9801 Andrew set_integer_command: FSC_SET FSV_VARIABLE FSK_ASSIGN FSV_VAL_INT 802 9801 Andrew { 803 9801 Andrew if (($$ = alloc_cmd()) == NULL) 804 9801 Andrew YYERROR; 805 9801 Andrew $$->cmd_tgt1 = $2; 806 9801 Andrew $$->cmd_qty = $4; 807 9801 Andrew if (parentscript) { 808 9801 Andrew parser_vars($$); 809 9801 Andrew } 810 9801 Andrew $$->cmd = parser_set_integer; 811 9801 Andrew }| FSC_SET FSV_VARIABLE FSK_ASSIGN FSV_VARIABLE 812 9801 Andrew { 813 9801 Andrew if (($$ = alloc_cmd()) == NULL) 814 9801 Andrew YYERROR; 815 9801 Andrew var_assign_var($2, $4); 816 9801 Andrew $$->cmd_tgt1 = $2; 817 9801 Andrew $$->cmd_tgt2 = $4; 818 9801 Andrew if (parentscript) { 819 9801 Andrew parser_vars($$); 820 9801 Andrew } 821 9801 Andrew $$->cmd = parser_set_var; 822 9801 Andrew } 823 9801 Andrew | set_integer_command binary_op FSV_VAL_INT 824 9801 Andrew { 825 9801 Andrew if ($1->cmd == parser_set_integer) { 826 9801 Andrew switch ($2) { 827 9801 Andrew case FSK_PLUS: 828 9801 Andrew var_assign_integer($1->cmd_tgt1, $1->cmd_qty + $3); 829 9801 Andrew break; 830 9801 Andrew case FSK_MINUS: 831 9801 Andrew var_assign_integer($1->cmd_tgt1, $1->cmd_qty - $3); 832 9801 Andrew break; 833 9801 Andrew case FSK_MULTIPLY: 834 9801 Andrew var_assign_integer($1->cmd_tgt1, $1->cmd_qty * $3); 835 9801 Andrew break; 836 9801 Andrew case FSK_DIVIDE: 837 9801 Andrew var_assign_integer($1->cmd_tgt1, $1->cmd_qty / $3); 838 9801 Andrew break; 839 9801 Andrew } 840 9801 Andrew $$->cmd = NULL; 841 9801 Andrew } else { 842 9801 Andrew $1->cmd_qty = $3; 843 9801 Andrew $1->cmd_subtype = $2; 844 9801 Andrew $1->cmd = parser_set_var_op_int; 845 9801 Andrew } 846 9801 Andrew } 847 9801 Andrew | set_integer_command binary_op FSV_VARIABLE 848 9801 Andrew { 849 9801 Andrew $1->cmd_tgt3 = $3; 850 9801 Andrew $1->cmd_subtype = $2; 851 9801 Andrew if ($1->cmd == parser_set_integer) { 852 9801 Andrew $$->cmd = parser_set_int_op_var; 853 9801 Andrew } else { 854 9801 Andrew $1->cmd = parser_set_var_op_var; 855 9801 Andrew } 856 9801 Andrew }; 857 9801 Andrew 858 9801 Andrew set_other_command: FSC_SET FSV_VARIABLE FSK_ASSIGN FSV_VAL_BOOLEAN 859 9801 Andrew { 860 9801 Andrew if (($$ = alloc_cmd()) == NULL) 861 9801 Andrew YYERROR; 862 9801 Andrew var_assign_boolean($2, $4); 863 6212 aw148015 if (parentscript) { 864 6212 aw148015 $$->cmd_tgt1 = $2; 865 6212 aw148015 parser_vars($$); 866 6212 aw148015 } 867 6212 aw148015 $$->cmd = NULL; 868 6212 aw148015 } 869 9801 Andrew | FSC_SET FSV_VARIABLE FSK_ASSIGN FSK_QUOTE FSV_WHITESTRING FSK_QUOTE 870 9801 Andrew { 871 9801 Andrew if (($$ = alloc_cmd()) == NULL) 872 9801 Andrew YYERROR; 873 9801 Andrew var_assign_string($2, $5); 874 5184 ek110237 if (parentscript) { 875 5184 ek110237 $$->cmd_tgt1 = $2; 876 5184 ek110237 parser_vars($$); 877 5184 ek110237 } 878 5184 ek110237 $$->cmd = NULL; 879 5184 ek110237 }| FSC_SET FSV_VARIABLE FSK_ASSIGN FSV_STRING 880 5184 ek110237 { 881 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 882 5184 ek110237 YYERROR; 883 5184 ek110237 var_assign_string($2, $4); 884 5184 ek110237 if (parentscript) { 885 5184 ek110237 $$->cmd_tgt1 = $2; 886 5184 ek110237 parser_vars($$); 887 5184 ek110237 } 888 5184 ek110237 $$->cmd = NULL; 889 6084 aw148015 } | FSC_SET FSE_MODE FSC_QUIT FSA_TIMEOUT 890 6084 aw148015 { 891 6084 aw148015 filebench_shm->shm_rmode = FILEBENCH_MODE_TIMEOUT; 892 6084 aw148015 if (($$ = alloc_cmd()) == NULL) 893 6084 aw148015 YYERROR; 894 6084 aw148015 $$->cmd = NULL; 895 6084 aw148015 } | FSC_SET FSE_MODE FSC_QUIT FSA_ALLDONE 896 6084 aw148015 { 897 6084 aw148015 filebench_shm->shm_rmode = FILEBENCH_MODE_QALLDONE; 898 6084 aw148015 if (($$ = alloc_cmd()) == NULL) 899 6084 aw148015 YYERROR; 900 6084 aw148015 $$->cmd = NULL; 901 6084 aw148015 } | FSC_SET FSE_MODE FSC_QUIT FSA_FIRSTDONE 902 6084 aw148015 { 903 6084 aw148015 filebench_shm->shm_rmode = FILEBENCH_MODE_Q1STDONE; 904 6084 aw148015 if (($$ = alloc_cmd()) == NULL) 905 6084 aw148015 YYERROR; 906 6084 aw148015 $$->cmd = NULL; 907 9356 Andrew } | FSC_SET FSE_MODE FSC_NOUSESTATS 908 9356 Andrew { 909 9356 Andrew filebench_shm->shm_mmode |= FILEBENCH_MODE_NOUSAGE; 910 9356 Andrew filebench_log(LOG_INFO, "disabling CPU usage statistics"); 911 9356 Andrew if (($$ = alloc_cmd()) == NULL) 912 9356 Andrew YYERROR; 913 9356 Andrew $$->cmd = NULL; 914 9513 Andrew } | FSC_SET FSV_RANDVAR FSS_TYPE FSK_ASSIGN randvar_attr_typop 915 6212 aw148015 { 916 6212 aw148015 if (($$ = alloc_cmd()) == NULL) 917 6212 aw148015 YYERROR; 918 6212 aw148015 $$->cmd = &parser_randvar_set; 919 6212 aw148015 $$->cmd_tgt1 = $2; 920 6212 aw148015 $$->cmd_qty = FSS_TYPE; 921 6212 aw148015 $$->cmd_attr_list = $5; 922 6212 aw148015 923 9513 Andrew } | FSC_SET FSV_RANDVAR FSS_SRC FSK_ASSIGN randvar_attr_srcop 924 6212 aw148015 { 925 6212 aw148015 if (($$ = alloc_cmd()) == NULL) 926 6212 aw148015 YYERROR; 927 6212 aw148015 $$->cmd = &parser_randvar_set; 928 6212 aw148015 $$->cmd_tgt1 = $2; 929 6212 aw148015 $$->cmd_qty = FSS_SRC; 930 6212 aw148015 $$->cmd_attr_list = $5; 931 6212 aw148015 932 9513 Andrew } | FSC_SET FSV_RANDVAR randvar_attr_param FSK_ASSIGN attr_value 933 6212 aw148015 { 934 6212 aw148015 if (($$ = alloc_cmd()) == NULL) 935 6212 aw148015 YYERROR; 936 6212 aw148015 $$->cmd = &parser_randvar_set; 937 6212 aw148015 $$->cmd_tgt1 = $2; 938 6212 aw148015 $$->cmd_qty = $3; 939 6212 aw148015 $$->cmd_attr_list = $5; 940 6212 aw148015 941 5184 ek110237 }; 942 5184 ek110237 943 5184 ek110237 stats_command: FSC_STATS FSE_SNAP 944 5184 ek110237 { 945 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 946 5184 ek110237 YYERROR; 947 5184 ek110237 $$->cmd = (void (*)(struct cmd *))&parser_statssnap; 948 5184 ek110237 break; 949 5184 ek110237 950 5184 ek110237 } 951 5184 ek110237 | FSC_STATS FSE_CLEAR 952 5184 ek110237 { 953 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 954 5184 ek110237 YYERROR; 955 5184 ek110237 $$->cmd = (void (*)(struct cmd *))&stats_clear; 956 5184 ek110237 957 5184 ek110237 } 958 5184 ek110237 | FSC_STATS FSE_DIRECTORY var_string_list 959 5184 ek110237 { 960 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 961 5184 ek110237 YYERROR; 962 5184 ek110237 $$->cmd_param_list = $3; 963 5184 ek110237 $$->cmd = (void (*)(struct cmd *))&parser_directory; 964 5184 ek110237 965 5184 ek110237 } 966 5184 ek110237 | FSC_STATS FSE_COMMAND whitevar_string_list 967 5184 ek110237 { 968 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 969 5184 ek110237 YYERROR; 970 5184 ek110237 971 5184 ek110237 $$->cmd_param_list = $3; 972 5184 ek110237 $$->cmd = parser_statscmd; 973 5184 ek110237 974 5184 ek110237 }| FSC_STATS FSE_DUMP whitevar_string_list 975 5184 ek110237 { 976 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 977 5184 ek110237 YYERROR; 978 5184 ek110237 979 5184 ek110237 $$->cmd_param_list = $3; 980 5184 ek110237 $$->cmd = parser_statsdump; 981 5184 ek110237 }| FSC_STATS FSE_XMLDUMP whitevar_string_list 982 5184 ek110237 { 983 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 984 5184 ek110237 YYERROR; 985 5184 ek110237 986 5184 ek110237 $$->cmd_param_list = $3; 987 5184 ek110237 $$->cmd = parser_statsxmldump; 988 7736 Andrew }| FSC_STATS FSE_MULTIDUMP whitevar_string_list 989 7736 Andrew { 990 7736 Andrew if (($$ = alloc_cmd()) == NULL) 991 7736 Andrew YYERROR; 992 7736 Andrew 993 7736 Andrew $$->cmd_param_list = $3; 994 7736 Andrew $$->cmd = parser_statsmultidump; 995 5184 ek110237 }; 996 5184 ek110237 997 5184 ek110237 quit_command: FSC_QUIT 998 5184 ek110237 { 999 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1000 5184 ek110237 YYERROR; 1001 5184 ek110237 $$->cmd = parser_filebench_shutdown; 1002 5184 ek110237 }; 1003 5184 ek110237 1004 5184 ek110237 flowop_list: flowop_command 1005 5184 ek110237 { 1006 5184 ek110237 $$ = $1; 1007 5184 ek110237 }| flowop_list flowop_command 1008 5184 ek110237 { 1009 5184 ek110237 cmd_t *list = NULL; 1010 5184 ek110237 cmd_t *list_end = NULL; 1011 5184 ek110237 1012 5184 ek110237 /* Find end of list */ 1013 5184 ek110237 for (list = $1; list != NULL; 1014 5184 ek110237 list = list->cmd_next) 1015 5184 ek110237 list_end = list; 1016 5184 ek110237 1017 5184 ek110237 list_end->cmd_next = $2; 1018 5184 ek110237 1019 5184 ek110237 filebench_log(LOG_DEBUG_IMPL, 1020 5184 ek110237 "flowop_list adding cmd %zx to list %zx", $2, $1); 1021 5184 ek110237 1022 5184 ek110237 $$ = $1; 1023 5184 ek110237 }; 1024 5184 ek110237 1025 6212 aw148015 thread: FSE_THREAD pt_attr_ops FSK_OPENLST flowop_list FSK_CLOSELST 1026 5184 ek110237 { 1027 5184 ek110237 /* 1028 5184 ek110237 * Allocate a cmd node per thread, with a 1029 5184 ek110237 * list of flowops attached to the cmd_list 1030 5184 ek110237 */ 1031 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1032 5184 ek110237 YYERROR; 1033 5184 ek110237 $$->cmd_list = $4; 1034 5184 ek110237 $$->cmd_attr_list = $2; 1035 5184 ek110237 }; 1036 5184 ek110237 1037 5184 ek110237 thread_list: thread 1038 5184 ek110237 { 1039 5184 ek110237 $$ = $1; 1040 5184 ek110237 }| thread_list thread 1041 5184 ek110237 { 1042 5184 ek110237 cmd_t *list = NULL; 1043 5184 ek110237 cmd_t *list_end = NULL; 1044 5184 ek110237 1045 5184 ek110237 /* Find end of list */ 1046 5184 ek110237 for (list = $1; list != NULL; 1047 5184 ek110237 list = list->cmd_next) 1048 5184 ek110237 list_end = list; 1049 5184 ek110237 1050 5184 ek110237 list_end->cmd_next = $2; 1051 5184 ek110237 1052 5184 ek110237 filebench_log(LOG_DEBUG_IMPL, 1053 5184 ek110237 "thread_list adding cmd %zx to list %zx", $2, $1); 1054 5184 ek110237 1055 5184 ek110237 $$ = $1; 1056 5184 ek110237 }; 1057 5184 ek110237 1058 6212 aw148015 proc_define_command: FSC_DEFINE FSE_PROC pt_attr_ops FSK_OPENLST thread_list FSK_CLOSELST 1059 5184 ek110237 { 1060 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1061 5184 ek110237 YYERROR; 1062 5184 ek110237 $$->cmd = &parser_proc_define; 1063 5184 ek110237 $$->cmd_list = $5; 1064 5184 ek110237 $$->cmd_attr_list = $3; 1065 5184 ek110237 1066 6212 aw148015 } 1067 6212 aw148015 | proc_define_command pt_attr_ops 1068 6212 aw148015 { 1069 6212 aw148015 $1->cmd_attr_list = $2; 1070 6212 aw148015 }; 1071 6212 aw148015 1072 6212 aw148015 files_define_command: FSC_DEFINE FSE_FILE 1073 5184 ek110237 { 1074 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1075 5184 ek110237 YYERROR; 1076 5184 ek110237 $$->cmd = &parser_file_define; 1077 5184 ek110237 }| FSC_DEFINE FSE_FILESET 1078 5184 ek110237 { 1079 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1080 5184 ek110237 YYERROR; 1081 5184 ek110237 $$->cmd = &parser_fileset_define; 1082 5184 ek110237 } 1083 6212 aw148015 | files_define_command files_attr_ops 1084 5184 ek110237 { 1085 5184 ek110237 $1->cmd_attr_list = $2; 1086 6212 aw148015 }; 1087 6212 aw148015 1088 6212 aw148015 randvar_define_command: FSC_DEFINE FSE_RAND randvar_attr_ops 1089 6212 aw148015 { 1090 6212 aw148015 if (($$ = alloc_cmd()) == NULL) 1091 6212 aw148015 YYERROR; 1092 6212 aw148015 $$->cmd = &parser_randvar_define; 1093 6212 aw148015 $$->cmd_attr_list = $3; 1094 5184 ek110237 }; 1095 5184 ek110237 1096 6550 aw148015 fo_define_command: FSC_DEFINE FSC_FLOWOP comp_attr_ops FSK_OPENLST flowop_list FSK_CLOSELST 1097 6550 aw148015 { 1098 6550 aw148015 if (($$ = alloc_cmd()) == NULL) 1099 6550 aw148015 YYERROR; 1100 6550 aw148015 $$->cmd = &parser_composite_flowop_define; 1101 6550 aw148015 $$->cmd_list = $5; 1102 6550 aw148015 $$->cmd_attr_list = $3; 1103 6550 aw148015 } 1104 6550 aw148015 | fo_define_command comp_attr_ops 1105 6550 aw148015 { 1106 6550 aw148015 $1->cmd_attr_list = $2; 1107 6550 aw148015 }; 1108 6550 aw148015 1109 5184 ek110237 create_command: FSC_CREATE entity 1110 5184 ek110237 { 1111 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1112 5184 ek110237 YYERROR; 1113 5184 ek110237 switch ($2) { 1114 5184 ek110237 case FSE_PROC: 1115 5184 ek110237 $$->cmd = &parser_proc_create; 1116 5184 ek110237 break; 1117 5673 aw148015 case FSE_FILESET: 1118 5184 ek110237 case FSE_FILE: 1119 5184 ek110237 $$->cmd = &parser_fileset_create; 1120 5184 ek110237 break; 1121 5184 ek110237 default: 1122 5184 ek110237 filebench_log(LOG_ERROR, "unknown entity", $2); 1123 5184 ek110237 YYERROR; 1124 5184 ek110237 } 1125 5184 ek110237 1126 5184 ek110237 }; 1127 5184 ek110237 1128 5184 ek110237 shutdown_command: FSC_SHUTDOWN entity 1129 5184 ek110237 { 1130 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1131 5184 ek110237 YYERROR; 1132 5184 ek110237 switch ($2) { 1133 5184 ek110237 case FSE_PROC: 1134 5184 ek110237 $$->cmd = &parser_proc_shutdown; 1135 9356 Andrew break; 1136 9356 Andrew case FSE_FILE: 1137 9356 Andrew case FSE_FILESET: 1138 9356 Andrew $$->cmd = &parser_fileset_shutdown; 1139 5184 ek110237 break; 1140 5184 ek110237 default: 1141 5184 ek110237 filebench_log(LOG_ERROR, "unknown entity", $2); 1142 5184 ek110237 YYERROR; 1143 5184 ek110237 } 1144 5184 ek110237 1145 5184 ek110237 }; 1146 5184 ek110237 1147 9326 Andrew warmup_command: FSC_WARMUP FSV_VAL_INT 1148 9326 Andrew { 1149 9326 Andrew if (($$ = alloc_cmd()) == NULL) 1150 9326 Andrew YYERROR; 1151 9326 Andrew $$->cmd = parser_warmup; 1152 9326 Andrew $$->cmd_qty = $2; 1153 9326 Andrew } 1154 9326 Andrew | FSC_WARMUP FSV_VARIABLE 1155 9326 Andrew { 1156 9326 Andrew fbint_t *integer; 1157 9326 Andrew 1158 9326 Andrew if (($$ = alloc_cmd()) == NULL) 1159 9326 Andrew YYERROR; 1160 9326 Andrew $$->cmd = parser_warmup_variable; 1161 9326 Andrew $$->cmd_tgt1 = fb_stralloc($2); 1162 9326 Andrew }; 1163 9326 Andrew 1164 5184 ek110237 sleep_command: FSC_SLEEP FSV_VAL_INT 1165 5184 ek110237 { 1166 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1167 5184 ek110237 YYERROR; 1168 5184 ek110237 $$->cmd = parser_sleep; 1169 5184 ek110237 $$->cmd_qty = $2; 1170 5184 ek110237 } 1171 5184 ek110237 | FSC_SLEEP FSV_VARIABLE 1172 5184 ek110237 { 1173 6212 aw148015 fbint_t *integer; 1174 5184 ek110237 1175 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1176 5184 ek110237 YYERROR; 1177 5184 ek110237 $$->cmd = parser_sleep_variable; 1178 5184 ek110237 $$->cmd_tgt1 = fb_stralloc($2); 1179 5184 ek110237 }; 1180 5184 ek110237 1181 5184 ek110237 run_command: FSC_RUN FSV_VAL_INT 1182 5184 ek110237 { 1183 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1184 5184 ek110237 YYERROR; 1185 5184 ek110237 $$->cmd = parser_run; 1186 5184 ek110237 $$->cmd_qty = $2; 1187 5184 ek110237 } 1188 5184 ek110237 | FSC_RUN FSV_VARIABLE 1189 5184 ek110237 { 1190 6212 aw148015 fbint_t *integer; 1191 5184 ek110237 1192 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1193 5184 ek110237 YYERROR; 1194 5184 ek110237 $$->cmd = parser_run_variable; 1195 5184 ek110237 $$->cmd_tgt1 = fb_stralloc($2); 1196 5184 ek110237 } 1197 5184 ek110237 | FSC_RUN 1198 5184 ek110237 { 1199 6212 aw148015 fbint_t *integer; 1200 5184 ek110237 1201 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1202 5184 ek110237 YYERROR; 1203 5184 ek110237 $$->cmd = parser_run; 1204 5184 ek110237 $$->cmd_qty = 60UL; 1205 5184 ek110237 }; 1206 5184 ek110237 1207 5184 ek110237 help_command: FSC_HELP 1208 5184 ek110237 { 1209 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1210 5184 ek110237 YYERROR; 1211 5184 ek110237 $$->cmd = parser_help; 1212 5184 ek110237 }; 1213 5184 ek110237 1214 5184 ek110237 flowop_command: FSC_FLOWOP name 1215 5184 ek110237 { 1216 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1217 5184 ek110237 YYERROR; 1218 5184 ek110237 $$->cmd_name = fb_stralloc($2); 1219 5184 ek110237 } 1220 6212 aw148015 | flowop_command fo_attr_ops 1221 5184 ek110237 { 1222 5184 ek110237 $1->cmd_attr_list = $2; 1223 5184 ek110237 }; 1224 5184 ek110237 1225 5184 ek110237 load_command: FSC_LOAD FSV_STRING 1226 5184 ek110237 { 1227 5184 ek110237 FILE *newfile; 1228 5184 ek110237 char loadfile[128]; 1229 5184 ek110237 1230 5184 ek110237 if (($$ = alloc_cmd()) == NULL) 1231 5184 ek110237 YYERROR; 1232 5184 ek110237 1233 5184 ek110237 (void) strcpy(loadfile, $2); 1234 5184 ek110237 (void) strcat(loadfile, ".f"); 1235 5184 ek110237 1236 5184 ek110237 if ((newfile = fopen(loadfile, "r")) == NULL) { 1237 9513 Andrew (void) strcpy(loadfile, fbbasepath); 1238 5184 ek110237 (void) strcat(loadfile, "/workloads/"); 1239 5184 ek110237 (void) strcat(loadfile, $2); 1240 5184 ek110237 (void) strcat(loadfile, ".f"); 1241 5184 ek110237 if ((newfile = fopen(loadfile, "r")) == NULL) { 1242 5184 ek110237 filebench_log(LOG_ERROR, "Cannot open %s", loadfile); 1243 5184 ek110237 YYERROR; 1244 5184 ek110237 } 1245 5184 ek110237 } 1246 5184 ek110237 1247 5184 ek110237 parentscript = yyin; 1248 5184 ek110237 yyin = newfile; 1249 5184 ek110237 yy_switchfileparent(yyin); 1250 5184 ek110237 }; 1251 5184 ek110237 1252 6212 aw148015 1253 5184 ek110237 entity: FSE_PROC {$$ = FSE_PROC;} 1254 5184 ek110237 | FSE_THREAD {$$ = FSE_THREAD;} 1255 5184 ek110237 | FSE_FILESET {$$ = FSE_FILESET;} 1256 5184 ek110237 | FSE_FILE {$$ = FSE_FILE;}; 1257 5184 ek110237 1258 5184 ek110237 value: FSV_VAL_INT { $$.i = $1;} 1259 5184 ek110237 | FSV_STRING { $$.s = $1;} 1260 5184 ek110237 | FSV_VAL_BOOLEAN { $$.b = $1;}; 1261 5184 ek110237 1262 5184 ek110237 name: FSV_STRING; 1263 5184 ek110237 1264 6212 aw148015 /* attribute parsing for define file and define fileset */ 1265 6212 aw148015 files_attr_ops: files_attr_op 1266 5184 ek110237 { 1267 5184 ek110237 $$ = $1; 1268 5184 ek110237 } 1269 6212 aw148015 | files_attr_ops FSK_SEPLST files_attr_op 1270 5184 ek110237 { 1271 5184 ek110237 attr_t *attr = NULL; 1272 5184 ek110237 attr_t *list_end = NULL; 1273 5184 ek110237 1274 5184 ek110237 for (attr = $1; attr != NULL; 1275 5184 ek110237 attr = attr->attr_next) 1276 5184 ek110237 list_end = attr; /* Find end of list */ 1277 5184 ek110237 1278 5184 ek110237 list_end->attr_next = $3; 1279 5184 ek110237 1280 5184 ek110237 $$ = $1; 1281 5184 ek110237 }; 1282 5184 ek110237 1283 6212 aw148015 files_attr_op: files_attr_name FSK_ASSIGN attr_list_value 1284 5184 ek110237 { 1285 5184 ek110237 $$ = $3; 1286 5184 ek110237 $$->attr_name = $1; 1287 5184 ek110237 } 1288 6212 aw148015 | files_attr_name 1289 6212 aw148015 { 1290 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1291 6212 aw148015 YYERROR; 1292 6212 aw148015 $$->attr_name = $1; 1293 6212 aw148015 }; 1294 6212 aw148015 1295 6212 aw148015 /* attribute parsing for random variables */ 1296 6212 aw148015 randvar_attr_ops: randvar_attr_op 1297 6212 aw148015 { 1298 6212 aw148015 $$ = $1; 1299 6212 aw148015 } 1300 6212 aw148015 | randvar_attr_ops FSK_SEPLST randvar_attr_op 1301 6212 aw148015 { 1302 6212 aw148015 attr_t *attr = NULL; 1303 6212 aw148015 attr_t *list_end = NULL; 1304 6212 aw148015 1305 6212 aw148015 for (attr = $1; attr != NULL; 1306 6212 aw148015 attr = attr->attr_next) 1307 6212 aw148015 list_end = attr; /* Find end of list */ 1308 6212 aw148015 1309 6212 aw148015 list_end->attr_next = $3; 1310 6212 aw148015 1311 6212 aw148015 $$ = $1; 1312 6212 aw148015 } 1313 6212 aw148015 | randvar_attr_ops FSK_SEPLST FSA_RANDTABLE FSK_ASSIGN FSK_OPENLST probtabentry_list FSK_CLOSELST 1314 6212 aw148015 { 1315 6212 aw148015 attr_t *attr = NULL; 1316 6212 aw148015 attr_t *list_end = NULL; 1317 6212 aw148015 1318 6212 aw148015 for (attr = $1; attr != NULL; 1319 6212 aw148015 attr = attr->attr_next) 1320 6212 aw148015 list_end = attr; /* Find end of list */ 1321 6212 aw148015 1322 6212 aw148015 1323 6212 aw148015 if ((attr = alloc_attr()) == NULL) 1324 6212 aw148015 YYERROR; 1325 6212 aw148015 1326 6212 aw148015 attr->attr_name = FSA_RANDTABLE; 1327 6212 aw148015 attr->attr_obj = (void *)$6; 1328 6212 aw148015 list_end->attr_next = attr; 1329 6212 aw148015 $$ = $1; 1330 6212 aw148015 }; 1331 6212 aw148015 1332 6212 aw148015 randvar_attr_op: randvar_attr_name FSK_ASSIGN attr_list_value 1333 6212 aw148015 { 1334 6212 aw148015 $$ = $3; 1335 6212 aw148015 $$->attr_name = $1; 1336 6212 aw148015 } 1337 6212 aw148015 | randvar_attr_name 1338 5184 ek110237 { 1339 5184 ek110237 if (($$ = alloc_attr()) == NULL) 1340 5184 ek110237 YYERROR; 1341 5184 ek110237 $$->attr_name = $1; 1342 5184 ek110237 } 1343 6212 aw148015 | FSA_TYPE FSK_ASSIGN randvar_attr_typop 1344 6212 aw148015 { 1345 6212 aw148015 $$ = $3; 1346 6212 aw148015 $$->attr_name = FSA_TYPE; 1347 6212 aw148015 } 1348 6212 aw148015 | FSA_RANDSRC FSK_ASSIGN randvar_attr_srcop 1349 6212 aw148015 { 1350 6212 aw148015 $$ = $3; 1351 6212 aw148015 $$->attr_name = FSA_RANDSRC; 1352 6212 aw148015 }; 1353 5184 ek110237 1354 6212 aw148015 probtabentry: FSK_OPENLST var_int_val FSK_SEPLST var_int_val FSK_SEPLST var_int_val FSK_CLOSELST 1355 6212 aw148015 { 1356 6212 aw148015 if (($$ = alloc_probtabent()) == NULL) 1357 6212 aw148015 YYERROR; 1358 6212 aw148015 $$->pte_percent = $2; 1359 6212 aw148015 $$->pte_segmin = $4; 1360 6212 aw148015 $$->pte_segmax = $6; 1361 6212 aw148015 }; 1362 6212 aw148015 1363 6212 aw148015 /* attribute parsing for prob density function table */ 1364 6212 aw148015 probtabentry_list: probtabentry 1365 6212 aw148015 { 1366 6212 aw148015 $$ = $1; 1367 6212 aw148015 } 1368 6212 aw148015 | probtabentry_list FSK_SEPLST probtabentry 1369 6212 aw148015 { 1370 6212 aw148015 probtabent_t *pte = NULL; 1371 6212 aw148015 probtabent_t *ptelist_end = NULL; 1372 6212 aw148015 1373 6212 aw148015 for (pte = $1; pte != NULL; 1374 6212 aw148015 pte = pte->pte_next) 1375 6212 aw148015 ptelist_end = pte; /* Find end of prob table entry list */ 1376 6212 aw148015 1377 6212 aw148015 ptelist_end->pte_next = $3; 1378 6212 aw148015 1379 6212 aw148015 $$ = $1; 1380 6212 aw148015 }; 1381 6212 aw148015 1382 6212 aw148015 /* attribute parsing for define thread and process */ 1383 6212 aw148015 pt_attr_ops: pt_attr_op 1384 6212 aw148015 { 1385 6212 aw148015 $$ = $1; 1386 6212 aw148015 } 1387 6212 aw148015 | pt_attr_ops FSK_SEPLST pt_attr_op 1388 6212 aw148015 { 1389 6212 aw148015 attr_t *attr = NULL; 1390 6212 aw148015 attr_t *list_end = NULL; 1391 6212 aw148015 1392 6212 aw148015 for (attr = $1; attr != NULL; 1393 6212 aw148015 attr = attr->attr_next) 1394 6212 aw148015 list_end = attr; /* Find end of list */ 1395 6212 aw148015 1396 6212 aw148015 list_end->attr_next = $3; 1397 6212 aw148015 1398 6212 aw148015 $$ = $1; 1399 6212 aw148015 }; 1400 6212 aw148015 1401 6212 aw148015 pt_attr_op: pt_attr_name FSK_ASSIGN attr_value 1402 6212 aw148015 { 1403 6212 aw148015 $$ = $3; 1404 6212 aw148015 $$->attr_name = $1; 1405 6212 aw148015 } 1406 6212 aw148015 | pt_attr_name 1407 6212 aw148015 { 1408 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1409 6212 aw148015 YYERROR; 1410 6212 aw148015 $$->attr_name = $1; 1411 6212 aw148015 }; 1412 6212 aw148015 1413 6212 aw148015 /* attribute parsing for flowops */ 1414 6212 aw148015 fo_attr_ops: fo_attr_op 1415 6212 aw148015 { 1416 6212 aw148015 $$ = $1; 1417 6212 aw148015 } 1418 6212 aw148015 | fo_attr_ops FSK_SEPLST fo_attr_op 1419 6212 aw148015 { 1420 6212 aw148015 attr_t *attr = NULL; 1421 6212 aw148015 attr_t *list_end = NULL; 1422 6212 aw148015 1423 6212 aw148015 for (attr = $1; attr != NULL; 1424 6212 aw148015 attr = attr->attr_next) 1425 6212 aw148015 list_end = attr; /* Find end of list */ 1426 6212 aw148015 1427 6212 aw148015 list_end->attr_next = $3; 1428 6212 aw148015 1429 6212 aw148015 $$ = $1; 1430 6550 aw148015 } 1431 6550 aw148015 | fo_attr_ops FSK_SEPLST comp_lvar_def 1432 6550 aw148015 { 1433 6550 aw148015 attr_t *attr = NULL; 1434 6550 aw148015 attr_t *list_end = NULL; 1435 6550 aw148015 1436 6550 aw148015 for (attr = $1; attr != NULL; 1437 6550 aw148015 attr = attr->attr_next) 1438 6550 aw148015 list_end = attr; /* Find end of list */ 1439 6550 aw148015 1440 6550 aw148015 list_end->attr_next = $3; 1441 6550 aw148015 1442 6550 aw148015 $$ = $1; 1443 6212 aw148015 }; 1444 6212 aw148015 1445 6212 aw148015 fo_attr_op: fo_attr_name FSK_ASSIGN attr_value 1446 6212 aw148015 { 1447 6212 aw148015 $$ = $3; 1448 6212 aw148015 $$->attr_name = $1; 1449 6212 aw148015 } 1450 6212 aw148015 | fo_attr_name 1451 6212 aw148015 { 1452 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1453 6212 aw148015 YYERROR; 1454 6212 aw148015 $$->attr_name = $1; 1455 6212 aw148015 }; 1456 6212 aw148015 1457 6212 aw148015 /* attribute parsing for Event Generator */ 1458 6212 aw148015 ev_attr_ops: ev_attr_op 1459 6212 aw148015 { 1460 6212 aw148015 $$ = $1; 1461 6212 aw148015 } 1462 6212 aw148015 | ev_attr_ops FSK_SEPLST ev_attr_op 1463 6212 aw148015 { 1464 6212 aw148015 attr_t *attr = NULL; 1465 6212 aw148015 attr_t *list_end = NULL; 1466 6212 aw148015 1467 6212 aw148015 for (attr = $1; attr != NULL; 1468 6212 aw148015 attr = attr->attr_next) 1469 6212 aw148015 list_end = attr; /* Find end of list */ 1470 6212 aw148015 1471 6212 aw148015 list_end->attr_next = $3; 1472 6212 aw148015 1473 6212 aw148015 $$ = $1; 1474 6212 aw148015 }; 1475 6212 aw148015 1476 6212 aw148015 ev_attr_op: ev_attr_name FSK_ASSIGN attr_value 1477 6212 aw148015 { 1478 6212 aw148015 $$ = $3; 1479 6212 aw148015 $$->attr_name = $1; 1480 6212 aw148015 } 1481 6212 aw148015 | ev_attr_name 1482 6212 aw148015 { 1483 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1484 6212 aw148015 YYERROR; 1485 6212 aw148015 $$->attr_name = $1; 1486 6212 aw148015 }; 1487 7736 Andrew 1488 7736 Andrew /* attribute parsing for enable multiple client command */ 1489 7736 Andrew enable_multi_ops: enable_multi_op 1490 7736 Andrew { 1491 7736 Andrew $$ = $1; 1492 7736 Andrew } 1493 7736 Andrew | enable_multi_ops FSK_SEPLST enable_multi_op 1494 7736 Andrew { 1495 7736 Andrew attr_t *attr = NULL; 1496 7736 Andrew attr_t *list_end = NULL; 1497 7736 Andrew 1498 7736 Andrew for (attr = $1; attr != NULL; 1499 7736 Andrew attr = attr->attr_next) 1500 7736 Andrew list_end = attr; /* Find end of list */ 1501 7736 Andrew 1502 7736 Andrew list_end->attr_next = $3; 1503 7736 Andrew 1504 7736 Andrew $$ = $1; 1505 7736 Andrew }; 1506 7736 Andrew 1507 7736 Andrew enable_multi_op: em_attr_name FSK_ASSIGN attr_value 1508 7736 Andrew { 1509 7736 Andrew $$ = $3; 1510 7736 Andrew $$->attr_name = $1; 1511 9326 Andrew }; 1512 7736 Andrew 1513 7736 Andrew multisync_op: FSA_VALUE FSK_ASSIGN attr_value 1514 7736 Andrew { 1515 7736 Andrew $$ = $3; 1516 7736 Andrew $$->attr_name = FSA_VALUE; 1517 9513 Andrew }; 1518 9513 Andrew 1519 9513 Andrew fscheck_attr_op: fscheck_attr_name FSK_ASSIGN FSV_STRING 1520 9513 Andrew { 1521 9513 Andrew if (($$ = alloc_attr()) == NULL) 1522 9513 Andrew YYERROR; 1523 9513 Andrew $$->attr_avd = avd_str_alloc($3); 1524 9513 Andrew $$->attr_name = $1; 1525 9326 Andrew }; 1526 9801 Andrew 1527 9801 Andrew binary_op: 1528 9801 Andrew FSK_PLUS {$$ = FSK_PLUS;} 1529 9801 Andrew | FSK_MINUS {$$ = FSK_MINUS;} 1530 9801 Andrew | FSK_MULTIPLY {$$ = FSK_MULTIPLY;} 1531 9801 Andrew | FSK_DIVIDE {$$ = FSK_DIVIDE;}; 1532 6212 aw148015 1533 6212 aw148015 files_attr_name: attrs_define_file 1534 6212 aw148015 |attrs_define_fileset; 1535 6212 aw148015 1536 6212 aw148015 pt_attr_name: attrs_define_thread 1537 6212 aw148015 |attrs_define_proc; 1538 6212 aw148015 1539 6212 aw148015 fo_attr_name: attrs_flowop; 1540 6212 aw148015 1541 6212 aw148015 ev_attr_name: attrs_eventgen; 1542 5184 ek110237 1543 5184 ek110237 attrs_define_proc: 1544 6212 aw148015 FSA_NICE { $$ = FSA_NICE;} 1545 6212 aw148015 | FSA_NAME { $$ = FSA_NAME;} 1546 6212 aw148015 | FSA_INSTANCES { $$ = FSA_INSTANCES;}; 1547 5184 ek110237 1548 5184 ek110237 attrs_define_file: 1549 6212 aw148015 FSA_SIZE { $$ = FSA_SIZE;} 1550 6212 aw148015 | FSA_NAME { $$ = FSA_NAME;} 1551 5184 ek110237 | FSA_PATH { $$ = FSA_PATH;} 1552 9326 Andrew | FSA_READONLY { $$ = FSA_READONLY;} 1553 9326 Andrew | FSA_TRUSTTREE { $$ = FSA_TRUSTTREE;} 1554 5184 ek110237 | FSA_REUSE { $$ = FSA_REUSE;} 1555 5184 ek110237 | FSA_PREALLOC { $$ = FSA_PREALLOC;} 1556 5184 ek110237 | FSA_PARALLOC { $$ = FSA_PARALLOC;}; 1557 5184 ek110237 1558 5184 ek110237 attrs_define_fileset: 1559 6212 aw148015 FSA_SIZE { $$ = FSA_SIZE;} 1560 6212 aw148015 | FSA_NAME { $$ = FSA_NAME;} 1561 5184 ek110237 | FSA_PATH { $$ = FSA_PATH;} 1562 5184 ek110237 | FSA_DIRWIDTH { $$ = FSA_DIRWIDTH;} 1563 6212 aw148015 | FSA_DIRDEPTHRV { $$ = FSA_DIRDEPTHRV;} 1564 5184 ek110237 | FSA_PREALLOC { $$ = FSA_PREALLOC;} 1565 8404 Andrew | FSA_PARALLOC { $$ = FSA_PARALLOC;} 1566 8404 Andrew | FSA_REUSE { $$ = FSA_REUSE;} 1567 9326 Andrew | FSA_READONLY { $$ = FSA_READONLY;} 1568 9326 Andrew | FSA_TRUSTTREE { $$ = FSA_TRUSTTREE;} 1569 5184 ek110237 | FSA_FILESIZEGAMMA { $$ = FSA_FILESIZEGAMMA;} 1570 5184 ek110237 | FSA_DIRGAMMA { $$ = FSA_DIRGAMMA;} 1571 5184 ek110237 | FSA_CACHED { $$ = FSA_CACHED;} 1572 9326 Andrew | FSA_ENTRIES { $$ = FSA_ENTRIES;} 1573 7946 Andrew | FSA_LEAFDIRS { $$ = FSA_LEAFDIRS;}; 1574 5184 ek110237 1575 6212 aw148015 randvar_attr_name: 1576 6212 aw148015 FSA_NAME { $$ = FSA_NAME;} 1577 6212 aw148015 | FSA_RANDSEED { $$ = FSA_RANDSEED;} 1578 6212 aw148015 | FSA_RANDGAMMA { $$ = FSA_RANDGAMMA;} 1579 6212 aw148015 | FSA_RANDMEAN { $$ = FSA_RANDMEAN;} 1580 6212 aw148015 | FSA_RANDMIN { $$ = FSA_RANDMIN;} 1581 6212 aw148015 | FSA_RANDROUND { $$ = FSA_RANDROUND;}; 1582 6212 aw148015 1583 6212 aw148015 randvar_attr_tsp: 1584 6212 aw148015 FSS_TYPE { $$ = FSS_TYPE;} 1585 6212 aw148015 | FSS_SRC { $$ = FSS_SRC;} 1586 6212 aw148015 | FSS_SEED { $$ = FSS_SEED;} 1587 6212 aw148015 | FSS_GAMMA { $$ = FSS_GAMMA;} 1588 6212 aw148015 | FSS_MEAN { $$ = FSS_MEAN;} 1589 6212 aw148015 | FSS_MIN { $$ = FSS_MIN;} 1590 6212 aw148015 | FSS_ROUND { $$ = FSS_ROUND;}; 1591 6212 aw148015 1592 6212 aw148015 1593 6212 aw148015 randvar_attr_param: 1594 6212 aw148015 FSS_SEED { $$ = FSS_SEED;} 1595 6212 aw148015 | FSS_GAMMA { $$ = FSS_GAMMA;} 1596 6212 aw148015 | FSS_MEAN { $$ = FSS_MEAN;} 1597 6212 aw148015 | FSS_MIN { $$ = FSS_MIN;} 1598 6212 aw148015 | FSS_ROUND { $$ = FSS_ROUND;}; 1599 6212 aw148015 1600 6212 aw148015 randvar_attr_typop: randtype_name 1601 6212 aw148015 { 1602 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1603 6212 aw148015 YYERROR; 1604 6212 aw148015 $$->attr_avd = avd_int_alloc($1); 1605 6212 aw148015 }; 1606 6212 aw148015 1607 6212 aw148015 randtype_name: 1608 6212 aw148015 FSV_RANDUNI { $$ = FSV_RANDUNI;} 1609 6212 aw148015 | FSV_RANDTAB { $$ = FSV_RANDTAB;} 1610 6212 aw148015 | FSA_RANDGAMMA { $$ = FSA_RANDGAMMA;}; 1611 6212 aw148015 1612 6212 aw148015 randvar_attr_srcop: randsrc_name 1613 6212 aw148015 { 1614 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1615 6212 aw148015 YYERROR; 1616 6212 aw148015 $$->attr_avd = avd_int_alloc($1); 1617 6212 aw148015 }; 1618 6212 aw148015 1619 6212 aw148015 randsrc_name: 1620 6212 aw148015 FSV_URAND { $$ = FSV_URAND;} 1621 6212 aw148015 | FSV_RAND48 { $$ = FSV_RAND48;}; 1622 6212 aw148015 1623 5184 ek110237 attrs_define_thread: 1624 6212 aw148015 FSA_PROCESS { $$ = FSA_PROCESS;} 1625 6212 aw148015 | FSA_NAME { $$ = FSA_NAME;} 1626 6212 aw148015 | FSA_MEMSIZE { $$ = FSA_MEMSIZE;} 1627 6212 aw148015 | FSA_USEISM { $$ = FSA_USEISM;} 1628 6212 aw148015 | FSA_INSTANCES { $$ = FSA_INSTANCES;}; 1629 5184 ek110237 1630 5184 ek110237 attrs_flowop: 1631 6212 aw148015 FSA_WSS { $$ = FSA_WSS;} 1632 6212 aw148015 | FSA_FILE { $$ = FSA_FILE;} 1633 6212 aw148015 | FSA_NAME { $$ = FSA_NAME;} 1634 6212 aw148015 | FSA_RANDOM { $$ = FSA_RANDOM;} 1635 6212 aw148015 | FSA_FD { $$ = FSA_FD;} 1636 6212 aw148015 | FSA_SRCFD { $$ = FSA_SRCFD;} 1637 6212 aw148015 | FSA_ROTATEFD { $$ = FSA_ROTATEFD;} 1638 6212 aw148015 | FSA_DSYNC { $$ = FSA_DSYNC;} 1639 6212 aw148015 | FSA_DIRECTIO { $$ = FSA_DIRECTIO;} 1640 8404 Andrew | FSA_INDEXED { $$ = FSA_INDEXED;} 1641 6212 aw148015 | FSA_TARGET { $$ = FSA_TARGET;} 1642 6212 aw148015 | FSA_ITERS { $$ = FSA_ITERS;} 1643 6212 aw148015 | FSA_VALUE { $$ = FSA_VALUE;} 1644 6212 aw148015 | FSA_BLOCKING { $$ = FSA_BLOCKING;} 1645 6212 aw148015 | FSA_HIGHWATER { $$ = FSA_HIGHWATER;} 1646 6212 aw148015 | FSA_IOSIZE { $$ = FSA_IOSIZE;}; 1647 5184 ek110237 1648 5184 ek110237 attrs_eventgen: 1649 6212 aw148015 FSA_RATE { $$ = FSA_RATE;}; 1650 7736 Andrew 1651 7736 Andrew em_attr_name: 1652 9326 Andrew FSA_MASTER { $$ = FSA_MASTER;} 1653 7736 Andrew | FSA_CLIENT { $$ = FSA_CLIENT;}; 1654 9513 Andrew 1655 9513 Andrew fscheck_attr_name: 1656 9513 Andrew FSA_PATH { $$ = FSA_PATH;} 1657 9513 Andrew | FSA_FSTYPE { $$ = FSA_FSTYPE;}; 1658 6550 aw148015 1659 6550 aw148015 comp_attr_ops: comp_attr_op 1660 6550 aw148015 { 1661 6550 aw148015 $$ = $1; 1662 6550 aw148015 } 1663 6550 aw148015 | comp_attr_ops FSK_SEPLST comp_attr_op 1664 6550 aw148015 { 1665 6550 aw148015 attr_t *attr = NULL; 1666 6550 aw148015 attr_t *list_end = NULL; 1667 6550 aw148015 1668 6550 aw148015 for (attr = $1; attr != NULL; 1669 6550 aw148015 attr = attr->attr_next) 1670 6550 aw148015 list_end = attr; /* Find end of list */ 1671 6550 aw148015 1672 6550 aw148015 list_end->attr_next = $3; 1673 6550 aw148015 1674 6550 aw148015 $$ = $1; 1675 6550 aw148015 } 1676 6550 aw148015 | comp_attr_ops FSK_SEPLST comp_lvar_def 1677 6550 aw148015 { 1678 6550 aw148015 attr_t *attr = NULL; 1679 6550 aw148015 attr_t *list_end = NULL; 1680 6550 aw148015 1681 6550 aw148015 for (attr = $1; attr != NULL; 1682 6550 aw148015 attr = attr->attr_next) 1683 6550 aw148015 list_end = attr; /* Find end of list */ 1684 6550 aw148015 1685 6550 aw148015 list_end->attr_next = $3; 1686 6550 aw148015 1687 6550 aw148015 $$ = $1; 1688 6550 aw148015 }; 1689 6550 aw148015 1690 6550 aw148015 comp_attr_op: attrs_define_comp FSK_ASSIGN attr_value 1691 6550 aw148015 { 1692 6550 aw148015 $$ = $3; 1693 6550 aw148015 $$->attr_name = $1; 1694 6550 aw148015 }; 1695 6550 aw148015 1696 6550 aw148015 comp_lvar_def: FSV_VARIABLE FSK_ASSIGN FSV_VAL_BOOLEAN 1697 6550 aw148015 { 1698 6550 aw148015 if (($$ = alloc_lvar_attr(var_lvar_assign_boolean($1, $3))) == NULL) 1699 6550 aw148015 YYERROR; 1700 6550 aw148015 } 1701 6550 aw148015 | FSV_VARIABLE FSK_ASSIGN FSV_VAL_INT 1702 6550 aw148015 { 1703 6550 aw148015 if (($$ = alloc_lvar_attr(var_lvar_assign_integer($1, $3))) == NULL) 1704 6550 aw148015 YYERROR; 1705 6550 aw148015 } 1706 6550 aw148015 | FSV_VARIABLE FSK_ASSIGN FSK_QUOTE FSV_WHITESTRING FSK_QUOTE 1707 6550 aw148015 { 1708 6550 aw148015 if (($$ = alloc_lvar_attr(var_lvar_assign_string($1, $4))) == NULL) 1709 6550 aw148015 YYERROR; 1710 6550 aw148015 } 1711 6550 aw148015 | FSV_VARIABLE FSK_ASSIGN FSV_STRING 1712 6550 aw148015 { 1713 6550 aw148015 if (($$ = alloc_lvar_attr(var_lvar_assign_string($1, $3))) == NULL) 1714 6550 aw148015 YYERROR; 1715 6550 aw148015 } 1716 6550 aw148015 | FSV_VARIABLE FSK_ASSIGN FSV_VARIABLE 1717 6550 aw148015 { 1718 6550 aw148015 if (($$ = alloc_lvar_attr(var_lvar_assign_var($1, $3))) == NULL) 1719 6550 aw148015 YYERROR; 1720 6550 aw148015 } 1721 6550 aw148015 | FSV_VARIABLE 1722 6550 aw148015 { 1723 6550 aw148015 if (($$ = alloc_lvar_attr(var_lvar_alloc_local($1))) == NULL) 1724 6550 aw148015 YYERROR; 1725 6550 aw148015 }; 1726 6550 aw148015 1727 6550 aw148015 1728 6550 aw148015 attrs_define_comp: 1729 6550 aw148015 FSA_NAME { $$ = FSA_NAME;} 1730 6550 aw148015 | FSA_ITERS { $$ = FSA_ITERS;}; 1731 5184 ek110237 1732 6212 aw148015 attr_value: FSV_STRING 1733 6212 aw148015 { 1734 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1735 6212 aw148015 YYERROR; 1736 6212 aw148015 $$->attr_avd = avd_str_alloc($1); 1737 6212 aw148015 } | FSV_VAL_INT { 1738 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1739 6212 aw148015 YYERROR; 1740 6212 aw148015 $$->attr_avd = avd_int_alloc($1); 1741 6212 aw148015 } | FSV_VAL_BOOLEAN { 1742 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1743 6212 aw148015 YYERROR; 1744 6212 aw148015 $$->attr_avd = avd_bool_alloc($1); 1745 6212 aw148015 } | FSV_VARIABLE { 1746 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1747 6212 aw148015 YYERROR; 1748 6212 aw148015 $$->attr_avd = var_ref_attr($1); 1749 6212 aw148015 }; 1750 6212 aw148015 1751 6212 aw148015 attr_list_value: var_string_list { 1752 5184 ek110237 if (($$ = alloc_attr()) == NULL) 1753 5184 ek110237 YYERROR; 1754 5184 ek110237 $$->attr_param_list = $1; 1755 8404 Andrew } | FSV_STRING { 1756 5184 ek110237 if (($$ = alloc_attr()) == NULL) 1757 5184 ek110237 YYERROR; 1758 6212 aw148015 $$->attr_avd = avd_str_alloc($1); 1759 5184 ek110237 } | FSV_VAL_INT { 1760 5184 ek110237 if (($$ = alloc_attr()) == NULL) 1761 5184 ek110237 YYERROR; 1762 6212 aw148015 $$->attr_avd = avd_int_alloc($1); 1763 6212 aw148015 } | FSV_VAL_BOOLEAN { 1764 6212 aw148015 if (($$ = alloc_attr()) == NULL) 1765 6212 aw148015 YYERROR; 1766 6212 aw148015 $$->attr_avd = avd_bool_alloc($1); 1767 5184 ek110237 } | FSV_VARIABLE { 1768 5184 ek110237 if (($$ = alloc_attr()) == NULL) 1769 5184 ek110237 YYERROR; 1770 6212 aw148015 $$->attr_avd = var_ref_attr($1); 1771 6212 aw148015 }; 1772 6212 aw148015 1773 6212 aw148015 var_int_val: FSV_VAL_INT 1774 6212 aw148015 { 1775 6212 aw148015 $$ = avd_int_alloc($1); 1776 6212 aw148015 } | FSV_VARIABLE 1777 6212 aw148015 { 1778 6212 aw148015 $$ = var_ref_attr($1); 1779 5184 ek110237 }; 1780 5184 ek110237 1781 5184 ek110237 %% 1782 5184 ek110237 1783 5184 ek110237 /* 1784 5184 ek110237 * The following 'c' routines implement the various commands defined in the 1785 5184 ek110237 * above yacc parser code. The yacc portion checks the syntax of the commands 1786 5184 ek110237 * found in a workload file, or typed on interactive command lines, parsing 1787 5184 ek110237 * the commands' parameters into lists. The lists are then passed in a cmd_t 1788 5184 ek110237 * struct for each command to its related routine in the following section 1789 5184 ek110237 * for actual execution. This section also includes a few utility routines 1790 5184 ek110237 * and the main entry point for the program. 1791 5184 ek110237 */ 1792 5184 ek110237 1793 5184 ek110237 /* 1794 5184 ek110237 * Entry point for filebench. Processes command line arguements. The -f 1795 5184 ek110237 * option will read in a workload file (the full name and extension must 1796 5184 ek110237 * must be given). The -a, -s, -m and -i options are used by worker process 1797 5184 ek110237 * to receive their name, the base address of shared memory, its path, and 1798 5184 ek110237 * the process' instance number, respectively. This information is supplied 1799 5184 ek110237 * by the master process when it execs worker processes under the process 1800 5184 ek110237 * model of execution. If the worker process arguments are passed then main 1801 5184 ek110237 * will call the procflow_exec routine which creates worker threadflows and 1802 5184 ek110237 * flowops and executes the procflow's portion of the workload model until 1803 5184 ek110237 * completion. If worker process arguments are not passed to the process, 1804 5184 ek110237 * then it becomes the master process for a filebench run. It initializes 1805 5184 ek110237 * the various filebench components and either executes the supplied workload 1806 5184 ek110237 * file, or enters interactive mode. 1807 5184 ek110237 */ 1808 5184 ek110237 1809 5184 ek110237 int 1810 5184 ek110237 main(int argc, char *argv[]) 1811 5184 ek110237 { 1812 5184 ek110237 int opt; 1813 5184 ek110237 int docmd = FS_FALSE; 1814 5184 ek110237 int instance; 1815 5184 ek110237 char procname[128]; 1816 5184 ek110237 caddr_t shmaddr; 1817 5184 ek110237 char dir[MAXPATHLEN]; 1818 5184 ek110237 #ifdef HAVE_SETRLIMIT 1819 5184 ek110237 struct rlimit rlp; 1820 5184 ek110237 #endif 1821 5184 ek110237 #ifdef HAVE_LIBTECLA 1822 5184 ek110237 char *line; 1823 5184 ek110237 #else 1824 5184 ek110237 char line[1024]; 1825 5184 ek110237 #endif 1826 5184 ek110237 char shmpathtmp[1024]; 1827 5184 ek110237 1828 5184 ek110237 #ifdef HAVE_SETRLIMIT 1829 5184 ek110237 /* Set resource limits */ 1830 5184 ek110237 (void) getrlimit(RLIMIT_NOFILE, &rlp); 1831 5184 ek110237 rlp.rlim_cur = rlp.rlim_max; 1832 5184 ek110237 setrlimit(RLIMIT_NOFILE, &rlp); 1833 5184 ek110237 #endif 1834 5184 ek110237 1835 5184 ek110237 yydebug = 0; 1836 5184 ek110237 execname = argv[0]; 1837 5184 ek110237 *procname = 0; 1838 5184 ek110237 cwd = getcwd(dir, MAXPATHLEN); 1839 5184 ek110237 1840 5184 ek110237 while ((opt = getopt(argc, argv, cmd_options)) != (int)EOF) { 1841 5184 ek110237 1842 5184 ek110237 switch (opt) { 1843 5184 ek110237 case 'h': 1844 5184 ek110237 usage(2); 1845 5184 ek110237 break; 1846 5184 ek110237 1847 5184 ek110237 case 'p': 1848 5184 ek110237 noproc = 1; 1849 5184 ek110237 break; 1850 5184 ek110237 1851 5184 ek110237 case 'f': 1852 5184 ek110237 if (optarg == NULL) 1853 5184 ek110237 usage(1); 1854 5184 ek110237 if ((yyin = fopen(optarg, "r")) == NULL) { 1855 5184 ek110237 (void) fprintf(stderr, 1856 5184 ek110237 "Cannot open file %s", optarg); 1857 5184 ek110237 exit(1); 1858 5184 ek110237 } 1859 5184 ek110237 dofile = FS_TRUE; 1860 5184 ek110237 fscriptname = optarg; 1861 5184 ek110237 1862 5184 ek110237 break; 1863 5184 ek110237 1864 5184 ek110237 case 'a': 1865 5184 ek110237 if (optarg == NULL) 1866 5184 ek110237 usage(1); 1867 5184 ek110237 sscanf(optarg, "%s", &procname[0]); 1868 5184 ek110237 break; 1869 5184 ek110237 1870 5184 ek110237 case 's': 1871 5184 ek110237 if (optarg == NULL) 1872 5184 ek110237 usage(1); 1873 5184 ek110237 #if defined(_LP64) || (__WORDSIZE == 64) 1874 5184 ek110237 sscanf(optarg, "%llx", &shmaddr); 1875 5184 ek110237 #else 1876 5184 ek110237 sscanf(optarg, "%x", &shmaddr); 1877 5184 ek110237 #endif 1878 5184 ek110237 break; 1879 5184 ek110237 1880 5184 ek110237 case 'm': 1881 5184 ek110237 if (optarg == NULL) 1882 5184 ek110237 usage(1); 1883 5184 ek110237 sscanf(optarg, "%s", shmpathtmp); 1884 5184 ek110237 shmpath = shmpathtmp; 1885 5184 ek110237 break; 1886 5184 ek110237 1887 5184 ek110237 case 'i': 1888 5184 ek110237 if (optarg == NULL) 1889 5184 ek110237 usage(1); 1890 5184 ek110237 sscanf(optarg, "%d", &instance); 1891 5184 ek110237 break; 1892 5184 ek110237 1893 5184 ek110237 case '?': 1894 5184 ek110237 default: 1895 5184 ek110237 usage(1); 1896 5184 ek110237 break; 1897 5184 ek110237 } 1898 5184 ek110237 } 1899 5184 ek110237 1900 5184 ek110237 #ifdef USE_PROCESS_MODEL 1901 5184 ek110237 if (!(*procname)) 1902 5184 ek110237 #endif 1903 5184 ek110237 printf("FileBench Version %s\n", FILEBENCH_VERSION); 1904 5184 ek110237 filebench_init(); 1905 5184 ek110237 1906 6084 aw148015 /* get process pid for use with message logging */ 1907 6084 aw148015 my_pid = getpid(); 1908 6084 aw148015 1909 5184 ek110237 #ifdef USE_PROCESS_MODEL 1910 5184 ek110237 if (*procname) { 1911 6084 aw148015 /* A child FileBench instance */ 1912 5184 ek110237 if (ipc_attach(shmaddr) < 0) { 1913 5184 ek110237 filebench_log(LOG_ERROR, "Cannot attach shm for %s", 1914 5184 ek110237 procname); 1915 5184 ek110237 exit(1); 1916 5184 ek110237 } 1917 5184 ek110237 1918 8615 Andrew /* get correct function pointer for each child process */ 1919 8615 Andrew filebench_plugin_funcvecinit(); 1920 8615 Andrew 1921 6212 aw148015 if (procflow_exec(procname, instance) < 0) { 1922 6212 aw148015 filebench_log(LOG_ERROR, "Cannot startup process %s", 1923 6212 aw148015 procname); 1924 5184 ek110237 exit(1); 1925 6212 aw148015 } 1926 6084 aw148015 1927 6084 aw148015 exit(0); 1928 5184 ek110237 } 1929 5184 ek110237 #endif 1930 5184 ek110237 1931 6084 aw148015 /* master (or only) process */ 1932 5184 ek110237 ipc_init(); 1933 5184 ek110237 1934 5184 ek110237 if (fscriptname) 1935 6391 aw148015 (void) strcpy(filebench_shm->shm_fscriptname, fscriptname); 1936 5184 ek110237 1937 8615 Andrew filebench_plugin_funcvecinit(); 1938 5184 ek110237 flowop_init(); 1939 5184 ek110237 stats_init(); 1940 5184 ek110237 eventgen_init(); 1941 5184 ek110237 1942 5184 ek110237 signal(SIGINT, parser_abort); 1943 5184 ek110237 1944 5184 ek110237 if (dofile) 1945 5184 ek110237 yyparse(); 1946 5184 ek110237 else { 1947 5184 ek110237 #ifdef HAVE_LIBTECLA 1948 5184 ek110237 if ((gl = new_GetLine(MAX_LINE_LEN, MAX_CMD_HIST)) == NULL) { 1949 5184 ek110237 filebench_log(LOG_ERROR, 1950 5184 ek110237 "Failed to create GetLine object"); 1951 5184 ek110237 filebench_shutdown(1); 1952 5184 ek110237 } 1953 5184 ek110237 1954 5184 ek110237 if (gl_customize_completion(gl, NULL, command_complete)) { 1955 5184 ek110237 filebench_log(LOG_ERROR, 1956 5184 ek110237 "Failed to register auto-completion function"); 1957 5184 ek110237 filebench_shutdown(1); 1958 5184 ek110237 } 1959 5184 ek110237 1960 5184 ek110237 while (line = gl_get_line(gl, FILEBENCH_PROMPT, NULL, -1)) { 1961 5184 ek110237 arg_parse(line); 1962 5184 ek110237 yyparse(); 1963 5184 ek110237 } 1964 5184 ek110237 1965 5184 ek110237 del_GetLine(gl); 1966 5184 ek110237 #else 1967 5184 ek110237 while (!feof(stdin)) { 1968 5184 ek110237 printf(FILEBENCH_PROMPT); 1969 5184 ek110237 fflush(stdout); 1970 5184 ek110237 if (fgets(line, sizeof (line), stdin) == NULL) { 1971 5184 ek110237 if (errno == EINTR) 1972 5184 ek110237 continue; 1973 5184 ek110237 else 1974 5184 ek110237 break; 1975 5184 ek110237 } 1976 5184 ek110237 arg_parse(line); 1977 5184 ek110237 yyparse(); 1978 5184 ek110237 } 1979 5184 ek110237 printf("\n"); 1980 5184 ek110237 #endif /* HAVE_LIBTECLA */ 1981 5184 ek110237 } 1982 5184 ek110237 1983 5184 ek110237 parser_filebench_shutdown((cmd_t *)0); 1984 5184 ek110237 1985 5184 ek110237 return (0); 1986 5184 ek110237 } 1987 5184 ek110237 1988 5184 ek110237 /* 1989 5184 ek110237 * arg_parse() puts the parser into command parsing mode. Create a tmpfile 1990 5184 ek110237 * and instruct the parser to read instructions from this location by setting 1991 5184 ek110237 * yyin to the value returned by tmpfile. Write the command into the file. 1992 5184 ek110237 * Then seek back to to the start of the file so that the parser can read 1993 5184 ek110237 * the instructions. 1994 5184 ek110237 */ 1995 5184 ek110237 static void 1996 5184 ek110237 arg_parse(const char *command) 1997 5184 ek110237 { 1998 6750 ek110237 if ((yyin = tmpfile()) == NULL) { 1999 5184 ek110237 filebench_log(LOG_FATAL, 2000 6750 ek110237 "Exiting: Cannot create tmpfile: %s", strerror(errno)); 2001 6750 ek110237 exit(1); 2002 6750 ek110237 } 2003 5184 ek110237 2004 5184 ek110237 if (fwrite(command, strlen(command), 1, yyin) != 1) 2005 5184 ek110237 filebench_log(LOG_FATAL, 2006 5184 ek110237 "Cannot write tmpfile: %s", strerror(errno)); 2007 5184 ek110237 2008 5184 ek110237 if (fseek(yyin, 0, SEEK_SET) != 0) 2009 5184 ek110237 filebench_log(LOG_FATAL, 2010 5184 ek110237 "Cannot seek tmpfile: %s", strerror(errno)); 2011 5184 ek110237 } 2012 5184 ek110237 2013 5184 ek110237 /* 2014 5184 ek110237 * Converts a list of var_strings or ordinary strings to a single ordinary 2015 5184 ek110237 * string. It returns a pointer to the string (in malloc'd memory) if found, 2016 5184 ek110237 * or NULL otherwise. 2017 5184 ek110237 */ 2018 5184 ek110237 char * 2019 5184 ek110237 parser_list2string(list_t *list) 2020 5184 ek110237 { 2021 5184 ek110237 list_t *l; 2022 5184 ek110237 char *string; 2023 5184 ek110237 char *tmp; 2024 6212 aw148015 fbint_t *integer; 2025 5184 ek110237 if ((string = malloc(MAXPATHLEN)) == NULL) { 2026 5184 ek110237 filebench_log(LOG_ERROR, "Failed to allocate memory"); 2027 5184 ek110237 return (NULL); 2028 5184 ek110237 } 2029 5184 ek110237 2030 5184 ek110237 *string = 0; 2031 5184 ek110237 2032 8404 Andrew /* printf("parser_list2string: called\n"); */ 2033 5184 ek110237 /* Format args */ 2034 6212 aw148015 for (l = list; l != NULL; l = l->list_next) { 2035 6212 aw148015 char *lstr = avd_get_str(l->list_string); 2036 6212 aw148015 2037 5184 ek110237 filebench_log(LOG_DEBUG_SCRIPT, 2038 6212 aw148015 "converting string '%s'", lstr); 2039 5184 ek110237 2040 6212 aw148015 /* see if it is a random variable */ 2041 6212 aw148015 if (l->list_integer) { 2042 6212 aw148015 fbint_t param_name; 2043 6212 aw148015 2044 6212 aw148015 tmp = NULL; 2045 6212 aw148015 param_name = avd_get_int(l->list_integer); 2046 6212 aw148015 switch (param_name) { 2047 6212 aw148015 case FSS_TYPE: 2048 6212 aw148015 tmp = var_randvar_to_string(lstr, 2049 6212 aw148015 RAND_PARAM_TYPE); 2050 6212 aw148015 break; 2051 6212 aw148015 2052 6212 aw148015 case FSS_SRC: 2053 6212 aw148015 tmp = var_randvar_to_string(lstr, 2054 6212 aw148015 RAND_PARAM_SRC); 2055 6212 aw148015 break; 2056 6212 aw148015 2057 6212 aw148015 case FSS_SEED: 2058 6212 aw148015 tmp = var_randvar_to_string(lstr, 2059 6212 aw148015 RAND_PARAM_SEED); 2060 6212 aw148015 break; 2061 6212 aw148015 2062 6212 aw148015 case FSS_MIN: 2063 6212 aw148015 tmp = var_randvar_to_string(lstr, 2064 6212 aw148015 RAND_PARAM_MIN); 2065 6212 aw148015 break; 2066 6212 aw148015 2067 6212 aw148015 case FSS_MEAN: 2068 6212 aw148015 tmp = var_randvar_to_string(lstr, 2069 6212 aw148015 RAND_PARAM_MEAN); 2070 6212 aw148015 break; 2071 6212 aw148015 2072 6212 aw148015 case FSS_GAMMA: 2073 6212 aw148015 tmp = var_randvar_to_string(lstr, 2074 6212 aw148015 RAND_PARAM_GAMMA); 2075 6212 aw148015 break; 2076 6212 aw148015 2077 6212 aw148015 case FSS_ROUND: 2078 6212 aw148015 tmp = var_randvar_to_string(lstr, 2079 6212 aw148015 RAND_PARAM_ROUND); 2080 6212 aw148015 break; 2081 6212 aw148015 } 2082 6212 aw148015 2083 6212 aw148015 if (tmp) { 2084 6212 aw148015 (void) strcat(string, tmp); 2085 6212 aw148015 free(tmp); 2086 6212 aw148015 } else { 2087 6212 aw148015 (void) strcat(string, lstr); 2088 6212 aw148015 } 2089 5184 ek110237 } else { 2090 6212 aw148015 /* perhaps a normal variable? */ 2091 6212 aw148015 if ((tmp = var_to_string(lstr)) != NULL) { 2092 6212 aw148015 (void) strcat(string, tmp); 2093 6212 aw148015 free(tmp); 2094 6212 aw148015 } else { 2095 6212 aw148015 (void) strcat(string, lstr); 2096 6212 aw148015 } 2097 5184 ek110237 } 2098 5184 ek110237 } 2099 5184 ek110237 return (string); 2100 5184 ek110237 } 2101 5184 ek110237 2102 5184 ek110237 /* 2103 5184 ek110237 * If the list just contains a single string starting with '$', then find 2104 5184 ek110237 * or create the named var and return the var's var_string component. 2105 5184 ek110237 * Otherwise, convert the list to a string, and allocate a var_string 2106 5184 ek110237 * containing a copy of that string. On failure either returns NULL 2107 5184 ek110237 * or shuts down the run. 2108 5184 ek110237 */ 2109 6212 aw148015 avd_t 2110 5184 ek110237 parser_list2varstring(list_t *list) 2111 5184 ek110237 { 2112 6212 aw148015 char *lstr = avd_get_str(list->list_string); 2113 6212 aw148015 2114 8404 Andrew /* printf("parser_list2varstring: Called\n"); */ 2115 5184 ek110237 /* Special case - variable name */ 2116 6212 aw148015 if ((list->list_next == NULL) && (*lstr == '$')) 2117 6212 aw148015 return (var_ref_attr(lstr)); 2118 5184 ek110237 2119 6212 aw148015 return (avd_str_alloc(parser_list2string(list))); 2120 5184 ek110237 } 2121 5184 ek110237 2122 5184 ek110237 /* 2123 5184 ek110237 * Looks for the var named in list_string of the first element of the 2124 6212 aw148015 * supplied list. If found, returns the var_val portion of the var in 2125 6212 aw148015 * an attribute value descriptor. If the var is not found, cannot be 2126 6212 aw148015 * allocated, the supplied list is NULL, or the list_string filed is 2127 6212 aw148015 * empty, returns NULL. 2128 5184 ek110237 */ 2129 6212 aw148015 avd_t 2130 6212 aw148015 parser_list2avd(list_t *list) 2131 5184 ek110237 { 2132 6212 aw148015 avd_t avd; 2133 6212 aw148015 char *lstr; 2134 5184 ek110237 2135 6212 aw148015 if (list && ((lstr = avd_get_str(list->list_string)) != NULL)) { 2136 6212 aw148015 avd = var_ref_attr(lstr); 2137 6212 aw148015 return (avd); 2138 5184 ek110237 } 2139 5184 ek110237 2140 5184 ek110237 return (NULL); 2141 5184 ek110237 } 2142 5184 ek110237 2143 5184 ek110237 /* 2144 5184 ek110237 * Sets the event generator rate from the attribute supplied with the 2145 5184 ek110237 * command. If the attribute doesn't exist the routine does nothing. 2146 5184 ek110237 */ 2147 5184 ek110237 static void 2148 5184 ek110237 parser_eventgen(cmd_t *cmd) 2149 5184 ek110237 { 2150 5184 ek110237 attr_t *attr; 2151 5184 ek110237 2152 5184 ek110237 /* Get the rate from attribute */ 2153 5184 ek110237 if (attr = get_attr_integer(cmd, FSA_RATE)) { 2154 6212 aw148015 if (attr->attr_avd) { 2155 7946 Andrew eventgen_setrate(attr->attr_avd); 2156 5184 ek110237 } 2157 5184 ek110237 } 2158 5184 ek110237 } 2159 5184 ek110237 2160 5184 ek110237 /* 2161 5184 ek110237 * Assigns the designated integer variable successive values from the 2162 5184 ek110237 * supplied comma seperated integer list. After each successive integer 2163 5184 ek110237 * assignment, it executes the bracket enclosed list of commands. For 2164 5184 ek110237 * example, repeated runs of a workload with increasing io sizes can 2165 5184 ek110237 * be done using the following command line: 2166 5184 ek110237 * foreach $iosize in 2k, 4k, 8k {run 60} 2167 5184 ek110237 */ 2168 5184 ek110237 static void 2169 5184 ek110237 parser_foreach_integer(cmd_t *cmd) 2170 5184 ek110237 { 2171 5184 ek110237 list_t *list = cmd->cmd_param_list; 2172 5184 ek110237 cmd_t *inner_cmd; 2173 5184 ek110237 2174 5184 ek110237 for (; list != NULL; list = list->list_next) { 2175 6212 aw148015 fbint_t list_int = avd_get_int(list->list_integer); 2176 6212 aw148015 2177 6212 aw148015 var_assign_integer(cmd->cmd_tgt1, list_int); 2178 6286 aw148015 filebench_log(LOG_VERBOSE, "Iterating %s=%llu", 2179 6286 aw148015 cmd->cmd_tgt1, (u_longlong_t)list_int); 2180 5184 ek110237 for (inner_cmd = cmd->cmd_list; inner_cmd != NULL; 2181 5184 ek110237 inner_cmd = inner_cmd->cmd_next) { 2182 5184 ek110237 inner_cmd->cmd(inner_cmd); 2183 5184 ek110237 } 2184 5184 ek110237 } 2185 5184 ek110237 } 2186 5184 ek110237 2187 5184 ek110237 /* 2188 5184 ek110237 * Similar to parser_foreach_integer(), except takes a list of strings after 2189 5184 ek110237 * the "in" token. For example, to run twice using a different directory, 2190 5184 ek110237 * perhaps using a different filesystem, the following command line 2191 5184 ek110237 * could be used: 2192 5184 ek110237 * foreach $dir in "/ufs_top/fbt", "/zfs_top/fbt" {run 60) 2193 5184 ek110237 */ 2194 5184 ek110237 static void 2195 5184 ek110237 parser_foreach_string(cmd_t *cmd) 2196 5184 ek110237 { 2197 5184 ek110237 list_t *list = cmd->cmd_param_list; 2198 5184 ek110237 2199 5184 ek110237 for (; list != NULL; list = list->list_next) { 2200 6212 aw148015 cmd_t *inner_cmd; 2201 6212 aw148015 char *lstr = avd_get_str(list->list_string); 2202 6212 aw148015 var_assign_string(cmd->cmd_tgt1, lstr); 2203 5184 ek110237 filebench_log(LOG_VERBOSE, "Iterating %s=%s", 2204 6212 aw148015 cmd->cmd_tgt1, lstr); 2205 5184 ek110237 for (inner_cmd = cmd->cmd_list; inner_cmd != NULL; 2206 5184 ek110237 inner_cmd = inner_cmd->cmd_next) { 2207 5184 ek110237 inner_cmd->cmd(inner_cmd); 2208 5184 ek110237 } 2209 5184 ek110237 } 2210 5184 ek110237 } 2211 5184 ek110237 2212 5184 ek110237 /* 2213 5673 aw148015 * Lists the fileset name, path name and average size for all defined 2214 5673 aw148015 * filesets. 2215 5184 ek110237 */ 2216 5184 ek110237 static void 2217 5184 ek110237 parser_list(cmd_t *cmd) 2218 5184 ek110237 { 2219 5673 aw148015 (void) fileset_iter(fileset_print); 2220 5184 ek110237 } 2221 5184 ek110237 2222 5184 ek110237 /* 2223 6212 aw148015 * Lists the flowop name and instance number for all flowops. 2224 6212 aw148015 */ 2225 6212 aw148015 static void 2226 6212 aw148015 parser_flowop_list(cmd_t *cmd) 2227 6212 aw148015 { 2228 6212 aw148015 flowop_printall(); 2229 6212 aw148015 } 2230 6212 aw148015 2231 6212 aw148015 /* 2232 5184 ek110237 * Calls procflow_define() to allocate "instances" number of procflow(s) 2233 5184 ek110237 * (processes) with the supplied name. The default number of instances is 2234 5184 ek110237 * one. An optional priority level attribute can be supplied and is stored in 2235 5184 ek110237 * pf_nice. Finally the routine loops through the list of inner commands, if 2236 5184 ek110237 * any, which are defines for threadflows, and passes them one at a time to 2237 5184 ek110237 * parser_thread_define() to allocate threadflow entities for the process(es). 2238 5184 ek110237 */ 2239 5184 ek110237 static void 2240 5184 ek110237 parser_proc_define(cmd_t *cmd) 2241 5184 ek110237 { 2242 5184 ek110237 procflow_t *procflow, template; 2243 5184 ek110237 char *name; 2244 5184 ek110237 attr_t *attr; 2245 6212 aw148015 avd_t var_instances; 2246 6212 aw148015 fbint_t instances; 2247 5184 ek110237 cmd_t *inner_cmd; 2248 5184 ek110237 2249 5184 ek110237 /* Get the name of the process */ 2250 5184 ek110237 if (attr = get_attr(cmd, FSA_NAME)) { 2251 6212 aw148015 name = avd_get_str(attr->attr_avd); 2252 5184 ek110237 } else { 2253 5184 ek110237 filebench_log(LOG_ERROR, 2254 5184 ek110237 "define proc: proc specifies no name"); 2255 5184 ek110237 filebench_shutdown(1); 2256 5184 ek110237 } 2257 5184 ek110237 2258 5184 ek110237 /* Get the memory size from attribute */ 2259 5184 ek110237 if (attr = get_attr_integer(cmd, FSA_INSTANCES)) { 2260 6212 aw148015 if (AVD_IS_RANDOM(attr->attr_avd)) { 2261 6212 aw148015 filebench_log(LOG_ERROR, 2262 6212 aw148015 "proc_define: Instances attr cannot be random"); 2263 6212 aw148015 filebench_shutdown(1); 2264 6212 aw148015 } 2265 6212 aw148015 var_instances = attr->attr_avd; 2266 6212 aw148015 instances = avd_get_int(var_instances); 2267 5184 ek110237 filebench_log(LOG_DEBUG_IMPL, 2268 6286 aw148015 "Setting instances = %llu", (u_longlong_t)instances); 2269 6212 aw148015 } else { 2270 6212 aw148015 filebench_log(LOG_DEBUG_IMPL, 2271 6212 aw148015 "Defaulting to instances = 1"); 2272 6212 aw148015 var_instances = avd_int_alloc(1); 2273 6212 aw148015 instances = 1; 2274 5184 ek110237 } 2275 5184 ek110237 2276 6212 aw148015 if ((procflow = procflow_define(name, NULL, var_instances)) == NULL) { 2277 5184 ek110237 filebench_log(LOG_ERROR, 2278 5184 ek110237 "Failed to instantiate %d %s process(es)\n", 2279 5184 ek110237 instances, name); 2280 5184 ek110237 filebench_shutdown(1); 2281 5184 ek110237 } 2282 5184 ek110237 2283 5184 ek110237 /* Get the pri from attribute */ 2284 5184 ek110237 if (attr = get_attr_integer(cmd, FSA_NICE)) { 2285 6212 aw148015 if (AVD_IS_RANDOM(attr->attr_avd)) { 2286 6212 aw148015 filebench_log(LOG_ERROR, 2287 6212 aw148015 "proc_define: priority cannot be random"); 2288 6212 aw148015 filebench_shutdown(1); 2289 6212 aw148015 } 2290 6286 aw148015 filebench_log(LOG_DEBUG_IMPL, "Setting pri = %llu", 2291 6286 aw148015 (u_longlong_t)avd_get_int(attr->attr_avd)); 2292 6212 aw148015 procflow->pf_nice = attr->attr_avd; 2293 5184 ek110237 } else 2294 6212 aw148015 procflow->pf_nice = avd_int_alloc(0); 2295 5184 ek110237 2296 5184 ek110237 2297 5184 ek110237 /* Create the list of threads for this process */ 2298 5184 ek110237 for (inner_cmd = cmd->cmd_list; inner_cmd != NULL; 2299 5184 ek110237 inner_cmd = inner_cmd->cmd_next) { 2300 6212 aw148015 parser_thread_define(inner_cmd, procflow, instances); 2301 5184 ek110237 } 2302 5184 ek110237 } 2303 5184 ek110237 2304 5184 ek110237 /* 2305 5184 ek110237 * Calls threadflow_define() to allocate "instances" number of threadflow(s) 2306 5184 ek110237 * (threads) with the supplied name. The default number of instances is 2307 5184 ek110237 * one. Two other optional attributes may be supplied, one to set the memory 2308 5184 ek110237 * size, stored in tf_memsize, and to select the use of Interprocess Shared 2309 5184 ek110237 * Memory, which sets the THREADFLOW_USEISM flag in tf_attrs. Finally 2310 5184 ek110237 * the routine loops through the list of inner commands, if any, which are 2311 5184 ek110237 * defines for flowops, and passes them one at a time to 2312 5184 ek110237 * parser_flowop_define() to allocate flowop entities for the threadflows. 2313 5184 ek110237 */ 2314 5184 ek110237 static void 2315 5184 ek110237 parser_thread_define(cmd_t *cmd, procflow_t *procflow, int procinstances) 2316 5184 ek110237 { 2317 5184 ek110237 threadflow_t *threadflow, template; 2318 5184 ek110237 attr_t *attr; 2319 6212 aw148015 avd_t instances; 2320 5184 ek110237 cmd_t *inner_cmd; 2321 5184 ek110237 char *name; 2322 5184 ek110237 2323 5184 ek110237 memset(&template, 0, sizeof (threadflow_t)); 2324 5184 ek110237 2325 5184 ek110237 /* Get the name of the thread */ 2326 5184 ek110237 if (attr = get_attr(cmd, FSA_NAME)) { 2327 6212 aw148015 name = avd_get_str(attr->attr_avd); 2328 5184 ek110237 } else { 2329 5184 ek110237 filebench_log(LOG_ERROR, 2330 5184 ek110237 "define thread: thread in process %s specifies no name", 2331 5184 ek110237 procflow->pf_name); 2332 5184 ek110237 filebench_shutdown(1); 2333 5184 ek110237 } 2334 5184 ek110237 2335 5184 ek110237 /* Get the number of instances from attribute */ 2336 5184 ek110237 if (attr = get_attr_integer(cmd, FSA_INSTANCES)) { 2337 6212 aw148015 if (AVD_IS_RANDOM(attr->attr_avd)) { 2338 6212 aw148015 filebench_log(LOG_ERROR, 2339 6212 aw148015 "define thread: Instances attr cannot be random"); 2340 6212 aw148015 filebench_shutdown(1); 2341 6212 aw148015 } 2342 5184 ek110237 filebench_log(LOG_DEBUG_IMPL, 2343 6286 aw148015 "define thread: Setting instances = %llu", 2344 6286 aw148015 (u_longlong_t)avd_get_int(attr->attr_avd)); 2345 6212 aw148015 instances = attr->attr_avd; 2346 6212 aw148015 } else 2347 6212 aw148015 instances = avd_int_alloc(1); 2348 5184 ek110237 2349 5184 ek110237 /* Get the memory size from attribute */ 2350 5184 ek110237 if (attr = get_attr_integer(cmd, FSA_MEMSIZE)) { 2351 6212 aw148015 if (AVD_IS_RANDOM(attr->attr_avd)) { 2352 6212 aw148015 filebench_log(LOG_ERROR, 2353 6212 aw148015 "define thread: Memory size cannot be random"); 2354 6212 aw148015 filebench_shutdown(1); 2355 6212 aw148015 } 2356 5184 ek110237 filebench_log(LOG_DEBUG_IMPL, 2357 6286 aw148015 "define thread: Setting memsize = %llu", 2358 6286 aw148015 (u_longlong_t)avd_get_int(attr->attr_avd)); 2359 6212 aw148015 template.tf_memsize = attr->attr_avd; 2360 5184 ek110237 } else 2361 6212 aw148015 template.tf_memsize = avd_int_alloc(0); 2362 5184 ek110237 2363 5184 ek110237 if ((threadflow = threadflow_define(procflow, name, 2364 5184 ek110237 &template, instances)) == NULL) { 2365 5184 ek110237 filebench_log(LOG_ERROR, 2366 5184 ek110237 "define thread: Failed to instantiate thread\n"); 2367 5184 ek110237 filebench_shutdown(1); 2368 5184 ek110237 } 2369 5184 ek110237 2370 5184 ek110237 /* Use ISM Memory? */ 2371 5184 ek110237 if (attr = get_attr(cmd, FSA_USEISM)) { 2372 5184 ek110237 threadflow->tf_attrs |= THREADFLOW_USEISM; 2373 5184 ek110237 } 2374 5184 ek110237 2375 5184 ek110237 /* Create the list of flowops */ 2376 5184 ek110237 for (inner_cmd = cmd->cmd_list; inner_cmd != NULL; 2377 5184 ek110237 inner_cmd = inner_cmd->cmd_next) { 2378 6212 aw148015 parser_flowop_define(inner_cmd, threadflow, 2379 6550 aw148015 &threadflow->tf_thrd_fops, FLOW_MASTER); 2380 5184 ek110237 } 2381 5184 ek110237 } 2382 6212 aw148015 2383 6212 aw148015 /* 2384 8404 Andrew * Fills in the attributes for a newly allocated flowop 2385 6212 aw148015 */ 2386 6212 aw148015 static void 2387 6212 aw148015 parser_flowop_get_attrs(cmd_t *cmd, flowop_t *flowop) 2388 6212 aw148015 { 2389 6212 aw148015 attr_t *attr; 2390 6212 aw148015 2391 6212 aw148015 /* Get the filename from attribute */ 2392 6212 aw148015 if (attr = get_attr(cmd, FSA_FILE)) { 2393 6212 aw148015 flowop->fo_filename = attr->attr_avd; 2394 6212 aw148015 if (flowop->fo_filename == NULL) { 2395 6212 aw148015 filebench_log(LOG_ERROR, 2396 6212 aw148015 "define flowop: no filename specfied"); 2397 6212 aw148015 filebench_shutdown(1); 2398 6212 aw148015 } 2399 9326 Andrew } else { 2400 9326 Andrew /* no filename attribute specified */ 2401 9326 Andrew flowop->fo_filename = NULL; 2402 6212 aw148015 } 2403 6212 aw148015 2404 6212 aw148015 /* Get the iosize of the op */ 2405 6212 aw148015 if (attr = get_attr_integer(cmd, FSA_IOSIZE)) 2406 6212 aw148015 flowop->fo_iosize = attr->attr_avd; 2407 6212 aw148015 else 2408 6212 aw148015 flowop->fo_iosize = avd_int_alloc(0); 2409 6212 aw148015 2410 6212 aw148015 /* Get the working set size of the op */ 2411 6212 aw148015 if (attr = get_attr_integer(cmd, FSA_WSS)) 2412 6212 aw148015 flowop->fo_wss = attr->attr_avd; 2413 6212 aw148015 else 2414 6212 aw148015 flowop->fo_wss = avd_int_alloc(0); 2415 6212 aw148015 2416 6212 aw148015 /* Random I/O? */ 2417 6212 aw148015 if (attr = get_attr_bool(cmd, FSA_RANDOM)) 2418 6212 aw148015 flowop->fo_random = attr->attr_avd; 2419 6212 aw148015 else 2420 6212 aw148015 flowop->fo_random = avd_bool_alloc(FALSE); 2421 6212 aw148015 2422 6212 aw148015 /* Sync I/O? */ 2423 6212 aw148015 if (attr = get_attr_bool(cmd, FSA_DSYNC)) 2424 6212 aw148015 flowop->fo_dsync = attr->attr_avd; 2425 6212 aw148015 else 2426 6212 aw148015 flowop->fo_dsync = avd_bool_alloc(FALSE); 2427 6212 aw148015 2428 6212 aw148015 /* Target, for wakeup etc */ 2429 6212 aw148015 if (attr = get_attr(cmd, FSA_TARGET)) 2430 6212 aw148015 (void) strcpy(flowop->fo_targetname, 2431 6212 aw148015 avd_get_str(attr->attr_avd)); 2432 6212 aw148015 2433 6212 aw148015 /* Value */ 2434 6212 aw148015 if (attr = get_attr_integer(cmd, FSA_VALUE)) 2435 6212 aw148015 flowop->fo_value = attr->attr_avd; 2436 6212 aw148015 else 2437 6212 aw148015 flowop->fo_value = avd_int_alloc(0); 2438 6212 aw148015 2439 6212 aw148015 /* FD */ 2440 9326 Andrew if (attr = get_attr_integer(cmd, FSA_FD)) { 2441 6212 aw148015 flowop->fo_fdnumber = avd_get_int(attr->attr_avd); 2442 9326 Andrew if (flowop->fo_filename != NULL) 2443 9326 Andrew filebench_log(LOG_DEBUG_SCRIPT, "It is not " 2444 9326 Andrew "advisable to supply both an fd number " 2445 9326 Andrew "and a fileset name in most cases"); 2446 9326 Andrew } 2447 6212 aw148015 2448 6212 aw148015 /* Rotatefd? */ 2449 6212 aw148015 if (attr = get_attr_bool(cmd, FSA_ROTATEFD)) 2450 6212 aw148015 flowop->fo_rotatefd = attr->attr_avd; 2451 6212 aw148015 else 2452 6212 aw148015 flowop->fo_rotatefd = avd_bool_alloc(FALSE); 2453 6212 aw148015 2454 6212 aw148015 /* SRC FD, for copies etc... */ 2455 6212 aw148015 if (attr = get_attr_integer(cmd, FSA_SRCFD)) 2456 6212 aw148015 flowop->fo_srcfdnumber = avd_get_int(attr->attr_avd); 2457 6212 aw148015 2458 6212 aw148015 /* Blocking operation? */ 2459 6212 aw148015 if (attr = get_attr_bool(cmd, FSA_BLOCKING)) 2460 6212 aw148015 flowop->fo_blocking = attr->attr_avd; 2461 6212 aw148015 else 2462 6212 aw148015 flowop->fo_blocking = avd_bool_alloc(FALSE); 2463 6212 aw148015 2464 6212 aw148015 /* Direct I/O Operation */ 2465 6212 aw148015 if (attr = get_attr_bool(cmd, FSA_DIRECTIO)) 2466 6212 aw148015 flowop->fo_directio = attr->attr_avd; 2467 6212 aw148015 else 2468 6212 aw148015 flowop->fo_directio = avd_bool_alloc(FALSE); 2469 6212 aw148015 2470 6212 aw148015 /* Highwater mark */ 2471 6212 aw148015 if (attr = get_attr_integer(cmd, FSA_HIGHWATER)) { 2472 6212 aw148015 flowop->fo_highwater = attr->attr_avd; 2473 6212 aw148015 if (AVD_IS_RANDOM(attr->attr_avd)) { 2474 6212 aw148015 filebench_log(LOG_ERROR, 2475 6212 aw148015 "define flowop: Highwater attr cannot be random"); 2476 6212 aw148015 filebench_shutdown(1); 2477 6212 aw148015 } 2478 6212 aw148015 } else { 2479 6212 aw148015 flowop->fo_highwater = avd_int_alloc(1); 2480 6212 aw148015 } 2481 8404 Andrew 2482 8404 Andrew /* find file or leaf directory by index number */ 2483 8404 Andrew if (attr = get_attr_integer(cmd, FSA_INDEXED)) 2484 8404 Andrew flowop->fo_fileindex = attr->attr_avd; 2485 8404 Andrew else 2486 8404 Andrew flowop->fo_fileindex = NULL; 2487 6212 aw148015 } 2488 6212 aw148015 2489 6550 aw148015 /* 2490 6550 aw148015 * defines the FLOW_MASTER flowops within a FLOW_MASTER instance of 2491 6550 aw148015 * a composit flowop. Default attributes from the FLOW_INNER_DEF instances 2492 6550 aw148015 * of the composit flowop's inner flowops are used if set. Otherwise 2493 6550 aw148015 * default attributes from the FLOW_MASTER instance of the composit flowop 2494 6550 aw148015 * are used, which may include defaults from the original FLOW_DEFINITION 2495 6550 aw148015 * of the composit flowop. 2496 6550 aw148015 */ 2497 6550 aw148015 static void 2498 6550 aw148015 parser_inner_flowop_define(threadflow_t *thread, flowop_t *comp0_flow, 2499 6550 aw148015 flowop_t *comp_mstr_flow) 2500 6550 aw148015 { 2501 6550 aw148015 flowop_t *inner_flowtype, *inner_flowop; 2502 6550 aw148015 2503 6550 aw148015 /* follow flowop list, creating composit names */ 2504 6550 aw148015 inner_flowtype = comp0_flow->fo_comp_fops; 2505 6550 aw148015 comp_mstr_flow->fo_comp_fops = NULL; 2506 6550 aw148015 2507 6550 aw148015 while (inner_flowtype) { 2508 6550 aw148015 char fullname[MAXPATHLEN]; 2509 6550 aw148015 2510 6550 aw148015 /* create composite_name.name for new flowop */ 2511 6613 ek110237 snprintf(fullname, MAXPATHLEN, "%s.%s", 2512 6613 ek110237 comp_mstr_flow->fo_name, inner_flowtype->fo_name); 2513 6550 aw148015 2514 6550 aw148015 if ((inner_flowop = flowop_define(thread, fullname, 2515 6550 aw148015 inner_flowtype, &comp_mstr_flow->fo_comp_fops, 2516 6550 aw148015 FLOW_MASTER, 0)) == NULL) { 2517 6550 aw148015 filebench_log(LOG_ERROR, 2518 6550 aw148015 "define flowop: Failed to instantiate flowop %s\n", 2519 6550 aw148015 fullname); 2520 6550 aw148015 filebench_shutdown(1); 2521 6550 aw148015 } 2522 6550 aw148015 2523 6550 aw148015 /* if applicable, update filename attribute */ 2524 6550 aw148015 if (inner_flowop->fo_filename) { 2525 6550 aw148015 char *name; 2526 6550 aw148015 2527 6550 aw148015 /* fix up avd_t */ 2528 6550 aw148015 avd_update(&inner_flowop->fo_filename, 2529 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2530 6550 aw148015 2531 6550 aw148015 /* see if ready to get the file or fileset */ 2532 6550 aw148015 name = avd_get_str(inner_flowop->fo_filename); 2533 6550 aw148015 if (name) { 2534 6550 aw148015 2535 6550 aw148015 inner_flowop->fo_fileset = fileset_find(name); 2536 6550 aw148015 2537 6550 aw148015 if (inner_flowop->fo_fileset == NULL) { 2538 6550 aw148015 filebench_log(LOG_ERROR, 2539 6550 aw148015 "inr flowop %s: file %s not found", 2540 6550 aw148015 inner_flowop->fo_name, name); 2541 6550 aw148015 filebench_shutdown(1); 2542 6550 aw148015 } 2543 6550 aw148015 } 2544 6550 aw148015 } 2545 6550 aw148015 2546 6550 aw148015 /* update attributes from local variables */ 2547 6550 aw148015 avd_update(&inner_flowop->fo_iters, 2548 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2549 6550 aw148015 2550 6550 aw148015 /* if the inner flowop is a composit flowop, recurse */ 2551 6550 aw148015 if (inner_flowtype->fo_type == FLOW_TYPE_COMPOSITE) { 2552 6550 aw148015 var_t *newlvar, *proto_lvars, *lvar_ptr; 2553 6550 aw148015 2554 6550 aw148015 proto_lvars = inner_flowop->fo_lvar_list; 2555 6550 aw148015 inner_flowop->fo_lvar_list = 0; 2556 6550 aw148015 2557 6550 aw148015 for (lvar_ptr = inner_flowtype->fo_lvar_list; lvar_ptr; 2558 6550 aw148015 lvar_ptr = lvar_ptr->var_next) { 2559 6550 aw148015 2560 6550 aw148015 if ((newlvar = var_lvar_alloc_local( 2561 6550 aw148015 lvar_ptr->var_name)) != NULL) { 2562 6550 aw148015 2563 6550 aw148015 add_lvar_to_list(newlvar, 2564 6550 aw148015 &inner_flowop->fo_lvar_list); 2565 6550 aw148015 2566 6550 aw148015 var_update_comp_lvars(newlvar, 2567 6550 aw148015 proto_lvars, 2568 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2569 6550 aw148015 } 2570 6550 aw148015 } 2571 6550 aw148015 2572 6550 aw148015 parser_inner_flowop_define(thread, 2573 6550 aw148015 inner_flowtype, 2574 6550 aw148015 inner_flowop); 2575 6550 aw148015 2576 6550 aw148015 inner_flowtype = inner_flowtype->fo_exec_next; 2577 6550 aw148015 continue; 2578 6550 aw148015 } 2579 6550 aw148015 2580 6550 aw148015 avd_update(&inner_flowop->fo_iosize, 2581 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2582 6550 aw148015 avd_update(&inner_flowop->fo_wss, 2583 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2584 6550 aw148015 avd_update(&inner_flowop->fo_iters, 2585 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2586 6550 aw148015 avd_update(&inner_flowop->fo_value, 2587 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2588 6550 aw148015 avd_update(&inner_flowop->fo_random, 2589 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2590 6550 aw148015 avd_update(&inner_flowop->fo_dsync, 2591 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2592 6550 aw148015 avd_update(&inner_flowop->fo_rotatefd, 2593 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2594 6550 aw148015 avd_update(&inner_flowop->fo_blocking, 2595 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2596 6550 aw148015 avd_update(&inner_flowop->fo_directio, 2597 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2598 6550 aw148015 avd_update(&inner_flowop->fo_highwater, 2599 6550 aw148015 comp_mstr_flow->fo_lvar_list); 2600 6550 aw148015 2601 6550 aw148015 inner_flowtype = inner_flowtype->fo_exec_next; 2602 6550 aw148015 } 2603 6550 aw148015 } 2604 5184 ek110237 2605 5184 ek110237 /* 2606 5184 ek110237 * Calls flowop_define() to allocate a flowop with the supplied name. 2607 5184 ek110237 * The allocated flowop inherits attributes from a base flowop of the 2608 5184 ek110237 * same type. If the new flowop has a file or fileset attribute specified, 2609 5184 ek110237 * it must specify a defined fileobj or fileset or an error will be logged. 2610 5184 ek110237 * The new flowop may also have the following attributes set by 2611 5184 ek110237 * the program: 2612 5184 ek110237 * - file size (fo_iosize) 2613 5184 ek110237 * - working set size (fo_wss) 2614 5184 ek110237 * - do random io (fo_random) 2615 5184 ek110237 * - do synchronous io (fo_dsync) 2616 5184 ek110237 * - perform each operation multiple times before advancing (fo_iter) 2617 5184 ek110237 * - target name (fo_targetname) 2618 5184 ek110237 * - An integer value (fo_value) 2619 5184 ek110237 * - a file descriptor (fo_fd) 2620 5184 ek110237 * - specify to rotate file descriptors (fo_rotatefd) 2621 5184 ek110237 * - a source fd (fo_srcfdnumber) 2622 5184 ek110237 * - specify a blocking operation (fo_blocking) 2623 5184 ek110237 * - specify a highwater mark (fo_highwater) 2624 5184 ek110237 * 2625 5184 ek110237 * After all the supplied attributes are stored in their respective locations 2626 5184 ek110237 * in the flowop object, the flowop's init function is called. No errors are 2627 5184 ek110237 * returned, but the filebench run will be terminated if the flowtype is not 2628 5184 ek110237 * specified, a name for the new flowop is not supplied, the flowop_define 2629 5184 ek110237 * call fails, or a file or fileset name is supplied but the corresponding 2630 5184 ek110237 * fileobj or fileset cannot be located. 2631 5184 ek110237 */ 2632 5184 ek110237 static void 2633 6212 aw148015 parser_flowop_define(cmd_t *cmd, threadflow_t *thread, 2634 6212 aw148015 flowop_t **flowoplist_hdp, int category) 2635 5184 ek110237 { 2636 5184 ek110237 flowop_t *flowop, *flowop_type; 2637 5184 ek110237 char *type = (char *)cmd->cmd_name; 2638 5184 ek110237 char *name; 2639 5184 ek110237 attr_t *attr; 2640 5184 ek110237 2641 5184 ek110237 /* Get the inherited flowop */ 2642 5184 ek110237 flowop_type = flowop_find(type); 2643 5184 ek110237 if (flowop_type == NULL) { 2644 5184 ek110237 filebench_log(LOG_ERROR, 2645 5184 ek110237 "define flowop: flowop type %s not found", 2646 5184 ek110237 type); 2647 5184 ek110237 filebench_shutdown(1); 2648 5184 ek110237 } 2649 5184 ek110237 2650 5184 ek110237 /* Get the name of the flowop */ 2651 5184 ek110237 if (attr = get_attr(cmd, FSA_NAME)) { 2652 6212 aw148015 name = avd_get_str(attr->attr_avd); 2653 5184 ek110237 } else { 2654 5184 ek110237 filebench_log(LOG_ERROR, 2655 5184 ek110237 "define flowop: flowop %s specifies no name", 2656 5184 ek110237 flowop_type->fo_name); 2657 5184 ek110237 filebench_shutdown(1); 2658 5184 ek110237 } 2659 5184 ek110237 2660 5184 ek110237 if ((flowop = flowop_define(thread, name, 2661 6550 aw148015 flowop_type, flowoplist_hdp, category, 0)) == NULL) { 2662 5184 ek110237 filebench_log(LOG_ERROR, 2663 5184 ek110237 "define flowop: Failed to instantiate flowop %s\n", 2664 5184 ek110237 cmd->cmd_name); 2665 5184 ek110237 filebench_shutdown(1); 2666 5184 ek110237 } 2667 5184 ek110237 2668 5184 ek110237 /* Iterations */ 2669 5184 ek110237 if (attr = get_attr_integer(cmd, FSA_ITERS)) 2670 6212 aw148015 flowop->fo_iters = attr->attr_avd; 2671 5184 ek110237 else 2672 6212 aw148015 flowop->fo_iters = avd_int_alloc(1); 2673 5184 ek110237 2674 6550 aw148015 2675 6550 aw148015 /* if this is a use of a composit flowop, create inner FLOW MASTERS */ 2676 6550 aw148015 if (flowop_type->fo_type == FLOW_TYPE_COMPOSITE) { 2677 6550 aw148015 get_attr_lvars(cmd, flowop); 2678 6550 aw148015 if (category == FLOW_MASTER) 2679 6550 aw148015 parser_inner_flowop_define(thread, 2680 6550 aw148015 flowop_type, flowop); 2681 6550 aw148015 } 2682 6550 aw148015 else { 2683 6550 aw148015 parser_flowop_get_attrs(cmd, flowop); 2684 6550 aw148015 } 2685 5184 ek110237 } 2686 6550 aw148015 2687 6550 aw148015 static void 2688 6550 aw148015 parser_composite_flowop_define(cmd_t *cmd) 2689 6550 aw148015 { 2690 6550 aw148015 flowop_t *flowop; 2691 6550 aw148015 cmd_t *inner_cmd; 2692 6550 aw148015 char *name; 2693 6550 aw148015 attr_t *attr; 2694 6550 aw148015 2695 6550 aw148015 /* Get the name of the flowop */ 2696 6550 aw148015 if (attr = get_attr(cmd, FSA_NAME)) { 2697 6550 aw148015 name = avd_get_str(attr->attr_avd); 2698 6550 aw148015 } else { 2699 6550 aw148015 filebench_log(LOG_ERROR, 2700 6550 aw148015 "define flowop: Composit flowop specifies no name"); 2701 6550 aw148015 2702 6550 aw148015 filebench_shutdown(1); 2703 6550 aw148015 } 2704 6550 aw148015 2705 6550 aw148015 if ((flowop = flowop_new_composite_define(name)) == NULL) { 2706 6550 aw148015 filebench_log(LOG_ERROR, 2707 6550 aw148015 "define flowop: Failed to instantiate flowop %s\n", 2708 6550 aw148015 cmd->cmd_name); 2709 6550 aw148015 filebench_shutdown(1); 2710 6550 aw148015 } 2711 6550 aw148015 2712 6550 aw148015 /* place any local var_t variables on the flowop's local list */ 2713 6550 aw148015 get_attr_lvars(cmd, flowop); 2714 6550 aw148015 2715 6550 aw148015 /* Iterations */ 2716 6550 aw148015 if (attr = get_attr_integer(cmd, FSA_ITERS)) 2717 6550 aw148015 flowop->fo_iters = attr->attr_avd; 2718 6550 aw148015 else 2719 6550 aw148015 flowop->fo_iters = avd_int_alloc(1); 2720 6550 aw148015 2721 6550 aw148015 /* define inner flowops */ 2722 6550 aw148015 for (inner_cmd = cmd->cmd_list; inner_cmd != NULL; 2723 6550 aw148015 inner_cmd = inner_cmd->cmd_next) { 2724 6550 aw148015 parser_flowop_define(inner_cmd, NULL, 2725 6550 aw148015 &flowop->fo_comp_fops, FLOW_INNER_DEF); 2726 6550 aw148015 } 2727 6550 aw148015 } 2728 6550 aw148015 2729 5184 ek110237 2730 5184 ek110237 /* 2731 5184 ek110237 * Calls fileset_define() to allocate a fileset with the supplied name and 2732 6212 aw148015 * initializes the fileset's pathname attribute, and optionally the 2733 6212 aw148015 * fileset_cached, fileset_reuse, fileset_prealloc and fileset_size attributes. 2734 5673 aw148015 * 2735 5184 ek110237 */ 2736 5673 aw148015 static fileset_t * 2737 5673 aw148015 parser_fileset_define_common(cmd_t *cmd) 2738 5184 ek110237 { 2739 5184 ek110237 fileset_t *fileset; 2740 6212 aw148015 avd_t name; 2741 5184 ek110237 attr_t *attr; 2742 6212 aw148015 avd_t pathname; 2743 5184 ek110237 2744 8615 Andrew /* 2745 8615 Andrew * Make sure all plugin flowops are initialized. 2746 8615 Andrew * Defaults to local fs for now 2747 8615 Andrew */ 2748 8615 Andrew flowop_plugin_flowinit(); 2749 8615 Andrew 2750 5184 ek110237 /* Get the name of the file */ 2751 8404 Andrew if (attr = get_attr_fileset(cmd, FSA_NAME)) { 2752 6212 aw148015 name = attr->attr_avd; 2753 5184 ek110237 } else { 2754 5184 ek110237 filebench_log(LOG_ERROR, 2755 5673 aw148015 "define fileset: file or fileset specifies no name"); 2756 5673 aw148015 return (NULL); 2757 5184 ek110237 } 2758 5184 ek110237 2759 5184 ek110237 if ((fileset = fileset_define(name)) == NULL) { 2760 5184 ek110237 filebench_log(LOG_ERROR, 2761 5184 ek110237 "define file: failed to instantiate file %s\n", 2762 6212 aw148015 avd_get_str(name)); 2763 5673 aw148015 return (NULL); 2764 5184 ek110237 } 2765 5184 ek110237 2766 5184 ek110237 /* Get the pathname from attribute */ 2767 5184 ek110237 if ((attr = get_attr(cmd, FSA_PATH)) == NULL) { 2768 5184 ek110237 filebench_log(LOG_ERROR, "define file: no pathname specified"); 2769 5673 aw148015 return (NULL); 2770 5184 ek110237 } 2771 5184 ek110237 2772 5184 ek110237 /* Expand variables in pathname */ 2773 5673 aw148015 if ((pathname = parser_list2varstring(attr->attr_param_list)) 2774 5673 aw148015 == NULL) { 2775 5184 ek110237 filebench_log(LOG_ERROR, "Cannot interpret path"); 2776 5673 aw148015 return (NULL); 2777 5184 ek110237 } 2778 5184 ek110237 2779 5184 ek110237 fileset->fs_path = pathname; 2780 5673 aw148015 2781 7736 Andrew /* How much should we preallocate? */ 2782 7736 Andrew if ((attr = get_attr_integer(cmd, FSA_PREALLOC)) && 2783 7736 Andrew attr->attr_avd) { 2784 7736 Andrew if (AVD_IS_RANDOM(attr->attr_avd)) { 2785 7736 Andrew filebench_log(LOG_ERROR, 2786 7736 Andrew "define fileset: Prealloc attr cannot be random"); 2787 7736 Andrew filebench_shutdown(1); 2788 7736 Andrew } 2789 7736 Andrew fileset->fs_preallocpercent = attr->attr_avd; 2790 7736 Andrew } else if (attr && !attr->attr_avd) { 2791 7736 Andrew fileset->fs_preallocpercent = avd_int_alloc(100); 2792 7736 Andrew } else { 2793 7736 Andrew fileset->fs_preallocpercent = avd_int_alloc(0); 2794 7736 Andrew } 2795 7736 Andrew 2796 7736 Andrew /* Should we preallocate? */ 2797 7736 Andrew if (attr = get_attr_bool(cmd, FSA_PREALLOC)) 2798 7736 Andrew fileset->fs_prealloc = attr->attr_avd; 2799 7736 Andrew else 2800 7736 Andrew fileset->fs_prealloc = avd_bool_alloc(FALSE); 2801 7736 Andrew 2802 5673 aw148015 /* Should we prealloc in parallel? */ 2803 6212 aw148015 if (attr = get_attr_bool(cmd, FSA_PARALLOC)) 2804 6212 aw148015 fileset->fs_paralloc = attr->attr_avd; 2805 6212 aw148015 else 2806 6212 aw148015 fileset->fs_paralloc = avd_bool_alloc(FALSE); 2807 5673 aw148015 2808 9326 Andrew /* Should we allow writes to the file? */ 2809 9326 Andrew if (attr = get_attr_bool(cmd, FSA_READONLY)) 2810 9326 Andrew fileset->fs_readonly = attr->attr_avd; 2811 9326 Andrew else 2812 9326 Andrew fileset->fs_readonly = avd_bool_alloc(FALSE); 2813 9326 Andrew 2814 5673 aw148015 /* Should we reuse the existing file? */ 2815 7736 Andrew if (attr = get_attr_bool(cmd, FSA_REUSE)) 2816 6212 aw148015 fileset->fs_reuse = attr->attr_avd; 2817 7736 Andrew else 2818 6212 aw148015 fileset->fs_reuse = avd_bool_alloc(FALSE); 2819 9326 Andrew 2820 9326 Andrew /* Should we check for files actual existance? */ 2821 9326 Andrew if (attr = get_attr_bool(cmd, FSA_TRUSTTREE)) 2822 9326 Andrew fileset->fs_trust_tree = attr->attr_avd; 2823 9326 Andrew else 2824 9326 Andrew fileset->fs_trust_tree = avd_bool_alloc(FALSE); 2825 5184 ek110237 2826 5184 ek110237 /* Should we leave in cache? */ 2827 7736 Andrew if (attr = get_attr_bool(cmd, FSA_CACHED)) 2828 6212 aw148015 fileset->fs_cached = attr->attr_avd; 2829 7736 Andrew else 2830 6212 aw148015 fileset->fs_cached = avd_bool_alloc(FALSE); 2831 5184 ek110237 2832 5673 aw148015 /* Get the mean or absolute size of the file */ 2833 7736 Andrew if (attr = get_attr_integer(cmd, FSA_SIZE)) 2834 6212 aw148015 fileset->fs_size = attr->attr_avd; 2835 7736 Andrew else 2836 6212 aw148015 fileset->fs_size = avd_int_alloc(0); 2837 5184 ek110237 2838 5673 aw148015 return (fileset); 2839 5673 aw148015 } 2840 5673 aw148015 2841 5673 aw148015 /* 2842 5673 aw148015 * Calls parser_fileset_define_common() to allocate a fileset with 2843 7736 Andrew * one entry and optionally the fileset_prealloc. sets the fileset_entries, 2844 7736 Andrew * fileset_dirwidth, fileset_dirgamma, and fileset_sizegamma attributes 2845 5673 aw148015 * to appropriate values for emulating the old "fileobj" entity 2846 5673 aw148015 */ 2847 5673 aw148015 static void 2848 5673 aw148015 parser_file_define(cmd_t *cmd) 2849 5673 aw148015 { 2850 5673 aw148015 fileset_t *fileset; 2851 5673 aw148015 attr_t *attr; 2852 5673 aw148015 2853 5673 aw148015 if ((fileset = parser_fileset_define_common(cmd)) == NULL) { 2854 5673 aw148015 filebench_log(LOG_ERROR, 2855 5673 aw148015 "define file: failed to instantiate file"); 2856 5673 aw148015 filebench_shutdown(1); 2857 5673 aw148015 return; 2858 5673 aw148015 } 2859 5673 aw148015 2860 5673 aw148015 /* fileset is emulating a single file */ 2861 5673 aw148015 fileset->fs_attrs = FILESET_IS_FILE; 2862 5673 aw148015 2863 5673 aw148015 /* Set the size of the fileset to 1 */ 2864 6212 aw148015 fileset->fs_entries = avd_int_alloc(1); 2865 5673 aw148015 2866 5673 aw148015 /* Set the mean dir width to more than 1 */ 2867 6212 aw148015 fileset->fs_dirwidth = avd_int_alloc(10); 2868 5673 aw148015 2869 5673 aw148015 /* Set the dir and size gammas to 0 */ 2870 6212 aw148015 fileset->fs_dirgamma = avd_int_alloc(0); 2871 6212 aw148015 fileset->fs_sizegamma = avd_int_alloc(0); 2872 5673 aw148015 } 2873 5673 aw148015 2874 5673 aw148015 /* 2875 5673 aw148015 * Calls parser_fileset_define_common() to allocate a fileset with the 2876 6212 aw148015 * supplied name and initializes the fileset's fileset_preallocpercent, 2877 6212 aw148015 * fileset_prealloc, fileset_entries, fileset_dirwidth, fileset_dirgamma, 2878 6212 aw148015 * and fileset_sizegamma attributes. 2879 5673 aw148015 */ 2880 5673 aw148015 static void 2881 5673 aw148015 parser_fileset_define(cmd_t *cmd) 2882 5673 aw148015 { 2883 5673 aw148015 fileset_t *fileset; 2884 5673 aw148015 attr_t *attr; 2885 5673 aw148015 2886 5673 aw148015 if ((fileset = parser_fileset_define_common(cmd)) == NULL) { 2887 5673 aw148015 filebench_log(LOG_ERROR, 2888 5673 aw148015 "define fileset: failed to instantiate fileset"); 2889 5673 aw148015 filebench_shutdown(1); 2890 5673 aw148015 return; 2891 5673 aw148015 } 2892 5673 aw148015 /* Get the number of files in the fileset */ 2893 5184 ek110237 if (attr = get_attr_integer(cmd, FSA_ENTRIES)) { 2894 6212 aw148015 fileset->fs_entries = attr->attr_avd; 2895 5184 ek110237 } else { 2896 6212 aw148015 fileset->fs_entries = avd_int_alloc(0); 2897 7946 Andrew } 2898 7946 Andrew 2899 7946 Andrew /* Get the number of leafdirs in the fileset */ 2900 7946 Andrew if (attr = get_attr_integer(cmd, FSA_LEAFDIRS)) { 2901 7946 Andrew fileset->fs_leafdirs = attr->attr_avd; 2902 7946 Andrew } else { 2903 7946 Andrew fileset->fs_leafdirs = avd_int_alloc(0); 2904 7946 Andrew } 2905 7946 Andrew 2906 7946 Andrew if ((avd_get_int(fileset->fs_entries) == 0) && 2907 7946 Andrew (avd_get_int(fileset->fs_leafdirs) == 0)) { 2908 7946 Andrew filebench_log(LOG_ERROR, "Fileset has no files or leafdirs"); 2909 5184 ek110237 } 2910 5184 ek110237 2911 5184 ek110237 /* Get the mean dir width of the fileset */ 2912 5184 ek110237 if (attr = get_attr_integer(cmd, FSA_DIRWIDTH)) { 2913 6212 aw148015 fileset->fs_dirwidth = attr->attr_avd; 2914 5184 ek110237 } else { 2915 5184 ek110237 filebench_log(LOG_ERROR, "Fileset has zero directory width"); 2916 6212 aw148015 fileset->fs_dirwidth = avd_int_alloc(0); 2917 5184 ek110237 } 2918 5184 ek110237 2919 6212 aw148015 /* Get the random variable for dir depth, if supplied */ 2920 6212 aw148015 if (attr = get_attr_integer(cmd, FSA_DIRDEPTHRV)) { 2921 6212 aw148015 if (!AVD_IS_RANDOM(attr->attr_avd)) { 2922 6212 aw148015 filebench_log(LOG_ERROR, 2923 6212 aw148015 "Define fileset: dirdepthrv must be random var"); 2924 6212 aw148015 filebench_shutdown(1); 2925 6212 aw148015 } 2926 6212 aw148015 fileset->fs_dirdepthrv = attr->attr_avd; 2927 6212 aw148015 } else { 2928 6212 aw148015 fileset->fs_dirdepthrv = NULL; 2929 6212 aw148015 } 2930 6212 aw148015 2931 6212 aw148015 /* Get the gamma value for dir depth distributions */ 2932 5184 ek110237 if (attr = get_attr_integer(cmd, FSA_DIRGAMMA)) { 2933 6212 aw148015 if (AVD_IS_RANDOM(attr->attr_avd)) { 2934 6212 aw148015 filebench_log(LOG_ERROR, 2935 6212 aw148015 "Define fileset: dirgamma attr cannot be random"); 2936 6212 aw148015 filebench_shutdown(1); 2937 6212 aw148015 } 2938 6212 aw148015 fileset->fs_dirgamma = attr->attr_avd; 2939 5184 ek110237 } else 2940 6212 aw148015 fileset->fs_dirgamma = avd_int_alloc(1500); 2941 5184 ek110237 2942 5184 ek110237 /* Get the gamma value for dir width distributions */ 2943 5184 ek110237 if (attr = get_attr_integer(cmd, FSA_FILESIZEGAMMA)) { 2944 6212 aw148015 if (AVD_IS_RANDOM(attr->attr_avd)) { 2945 6212 aw148015 filebench_log(LOG_ERROR, 2946 6212 aw148015 "Define fileset: filesizegamma cannot be random"); 2947 6212 aw148015 filebench_shutdown(1); 2948 6212 aw148015 } 2949 6212 aw148015 fileset->fs_sizegamma = attr->attr_avd; 2950 5184 ek110237 } else 2951 6212 aw148015 fileset->fs_sizegamma = avd_int_alloc(1500); 2952 5184 ek110237 } 2953 5184 ek110237 2954 5184 ek110237 /* 2955 5184 ek110237 * Creates and starts all defined procflow processes. The call to 2956 5184 ek110237 * procflow_init() results in creation of the requested number of 2957 5184 ek110237 * process instances for each previously defined procflow. The 2958 5184 ek110237 * child processes exec() a new instance of filebench, passing it 2959 5184 ek110237 * the instance number and address of the shared memory region. 2960 5184 ek110237 * The child processes will then create their threads and flowops. 2961 5184 ek110237 * The routine then unlocks the run_lock to allow all the processes' 2962 5184 ek110237 * threads to start and waits for all of them to begin execution. 2963 5184 ek110237 * Finally, it records the start time and resets the event generation 2964 5184 ek110237 * system. 2965 5184 ek110237 */ 2966 5184 ek110237 static void 2967 5184 ek110237 parser_proc_create(cmd_t *cmd) 2968 5184 ek110237 { 2969 6084 aw148015 filebench_shm->shm_1st_err = 0; 2970 9326 Andrew filebench_shm->shm_f_abort = FILEBENCH_OK; 2971 9326 Andrew 2972 5184 ek110237 if (procflow_init() != 0) { 2973 5184 ek110237 filebench_log(LOG_ERROR, "Failed to create processes\n"); 2974 5184 ek110237 filebench_shutdown(1); 2975 5184 ek110237 } 2976 5184 ek110237 2977 5184 ek110237 /* Release the read lock, allowing threads to start */ 2978 6391 aw148015 (void) pthread_rwlock_unlock(&filebench_shm->shm_run_lock); 2979 5184 ek110237 2980 5184 ek110237 /* Wait for all threads to start */ 2981 5184 ek110237 if (procflow_allstarted() != 0) { 2982 5184 ek110237 filebench_log(LOG_ERROR, "Could not start run"); 2983 5184 ek110237 return; 2984 5184 ek110237 } 2985 5184 ek110237 2986 5184 ek110237 2987 5184 ek110237 if (filebench_shm->shm_required && 2988 5184 ek110237 (ipc_ismcreate(filebench_shm->shm_required) < 0)) { 2989 5184 ek110237 filebench_log(LOG_ERROR, "Could not allocate shared memory"); 2990 5184 ek110237 return; 2991 5184 ek110237 } 2992 5184 ek110237 2993 6305 aw148015 filebench_shm->shm_starttime = gethrtime(); 2994 5184 ek110237 eventgen_reset(); 2995 5184 ek110237 } 2996 5184 ek110237 2997 5184 ek110237 /* 2998 5673 aw148015 * Calls fileset_createset() to populate all files and filesets and 2999 5673 aw148015 * create all associated, initially existant, files and subdirectories. 3000 5184 ek110237 * If errors are encountered, calls filebench_shutdown() 3001 5184 ek110237 * to exit filebench. 3002 5184 ek110237 */ 3003 5184 ek110237 static void 3004 5184 ek110237 parser_fileset_create(cmd_t *cmd) 3005 5184 ek110237 { 3006 5673 aw148015 if (!filecreate_done) { 3007 5673 aw148015 filecreate_done = 1; 3008 6212 aw148015 3009 6212 aw148015 /* initialize the random number system first */ 3010 6212 aw148015 randdist_init(); 3011 6212 aw148015 3012 6212 aw148015 /* create all the filesets */ 3013 5673 aw148015 if (fileset_createset(NULL) != 0) { 3014 5673 aw148015 filebench_log(LOG_ERROR, "Failed to create filesets"); 3015 5673 aw148015 filebench_shutdown(1); 3016 5673 aw148015 } 3017 5673 aw148015 } else { 3018 5673 aw148015 filebench_log(LOG_INFO, 3019 5673 aw148015 "Attempting to create fileset more than once, ignoring"); 3020 5673 aw148015 } 3021 5184 ek110237 3022 5184 ek110237 } 3023 5184 ek110237 3024 5184 ek110237 /* 3025 9356 Andrew * Deletes the files and directories that represent files and filesets on the 3026 9356 Andrew * storage medium. 3027 9356 Andrew */ 3028 9356 Andrew static void 3029 9356 Andrew parser_fileset_shutdown(cmd_t *cmd) 3030 9356 Andrew { 3031 9356 Andrew filebench_log(LOG_INFO, "Shutting down filesets"); 3032 9356 Andrew fileset_delete_all_filesets(); 3033 9356 Andrew } 3034 9356 Andrew 3035 9356 Andrew /* 3036 5184 ek110237 * Shuts down all processes and their associated threads. When finished 3037 5184 ek110237 * it deletes interprocess shared memory and resets the event generator. 3038 5184 ek110237 * It does not exit the filebench program though. 3039 5184 ek110237 */ 3040 5184 ek110237 static void 3041 5184 ek110237 parser_proc_shutdown(cmd_t *cmd) 3042 5184 ek110237 { 3043 5184 ek110237 filebench_log(LOG_INFO, "Shutting down processes"); 3044 5673 aw148015 filecreate_done = 0; 3045 5184 ek110237 procflow_shutdown(); 3046 5184