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 5184 ek110237 */ 25 5184 ek110237 26 5184 ek110237 #ifndef _FB_IPC_H 27 5184 ek110237 #define _FB_IPC_H 28 5184 ek110237 29 5184 ek110237 #include "config.h" 30 5184 ek110237 #include <pthread.h> 31 5184 ek110237 32 5184 ek110237 #include "procflow.h" 33 5184 ek110237 #include "threadflow.h" 34 5184 ek110237 #include "fileset.h" 35 5184 ek110237 #include "flowop.h" 36 6212 aw148015 #include "fb_random.h" 37 8615 Andrew #include "fsplug.h" 38 5184 ek110237 #include "filebench.h" 39 5184 ek110237 40 5184 ek110237 #ifdef __cplusplus 41 5184 ek110237 extern "C" { 42 5184 ek110237 #endif 43 5184 ek110237 44 5184 ek110237 #ifdef USE_PROCESS_MODEL 45 5184 ek110237 #define FILEBENCH_MEMSIZE 4096 46 5184 ek110237 #else 47 5184 ek110237 #define FILEBENCH_MEMSIZE 2048 48 5184 ek110237 #endif /* USE_PROCESS_MODEL */ 49 7556 Andrew 50 7556 Andrew /* Mutex Priority Inheritance and Robustness flags */ 51 7556 Andrew #define IPC_MUTEX_NORMAL 0x0 52 7556 Andrew #define IPC_MUTEX_PRIORITY 0x1 53 7556 Andrew #define IPC_MUTEX_ROBUST 0x2 54 7556 Andrew #define IPC_MUTEX_PRI_ROB 0x3 55 7556 Andrew #define IPC_NUM_MUTEX_ATTRS 4 56 5184 ek110237 57 5184 ek110237 #define FILEBENCH_NFILESETS FILEBENCH_MEMSIZE 58 5184 ek110237 #define FILEBENCH_NFILESETENTRIES (1024 * 1024) 59 5184 ek110237 #define FILEBENCH_NPROCFLOWS FILEBENCH_MEMSIZE 60 6212 aw148015 #define FILEBENCH_NTHREADFLOWS (64 * FILEBENCH_MEMSIZE) 61 6212 aw148015 #define FILEBENCH_NFLOWOPS (64 * FILEBENCH_MEMSIZE) 62 5184 ek110237 #define FILEBENCH_NVARS FILEBENCH_MEMSIZE 63 6212 aw148015 #define FILEBENCH_NRANDDISTS (FILEBENCH_MEMSIZE/4) 64 6212 aw148015 #define FILEBENCH_FILESETPATHMEMORY (FILEBENCH_NFILESETENTRIES*FSE_MAXPATHLEN) 65 6212 aw148015 #define FILEBENCH_STRINGMEMORY (FILEBENCH_NVARS * 128) 66 5184 ek110237 #define FILEBENCH_MAXBITMAP FILEBENCH_NFILESETENTRIES 67 5184 ek110237 68 5673 aw148015 #define FILEBENCH_PROCFLOW 0 69 5673 aw148015 #define FILEBENCH_THREADFLOW 1 70 5673 aw148015 #define FILEBENCH_FLOWOP 2 71 6212 aw148015 #define FILEBENCH_AVD 3 72 6212 aw148015 #define FILEBENCH_VARIABLE 4 73 6212 aw148015 #define FILEBENCH_FILESET 5 74 6212 aw148015 #define FILEBENCH_FILESETENTRY 6 75 6212 aw148015 #define FILEBENCH_RANDDIST 7 76 5673 aw148015 #define FILEBENCH_TYPES 8 77 5184 ek110237 78 5184 ek110237 #define FILEBENCH_NSEMS 128 79 5184 ek110237 80 6084 aw148015 #define FILEBENCH_ABORT_ERROR 1 81 6084 aw148015 #define FILEBENCH_ABORT_DONE 2 82 6084 aw148015 #define FILEBENCH_ABORT_RSRC 3 83 9326 Andrew #define FILEBENCH_ABORT_FINI 4 84 6084 aw148015 85 9356 Andrew /* run modes */ 86 6084 aw148015 #define FILEBENCH_MODE_TIMEOUT 0x0 87 6084 aw148015 #define FILEBENCH_MODE_Q1STDONE 0x1 88 6084 aw148015 #define FILEBENCH_MODE_QALLDONE 0x2 89 9356 Andrew 90 9356 Andrew /* misc. modes */ 91 9356 Andrew #define FILEBENCH_MODE_NOUSAGE 0x01 92 6084 aw148015 93 5184 ek110237 typedef struct filebench_shm { 94 7556 Andrew /* 95 7556 Andrew * All state down to shm_marker are set to zero during filebench 96 7556 Andrew * initialization 97 7556 Andrew */ 98 7556 Andrew 99 7556 Andrew /* 100 7556 Andrew * list of defined filesets and related locks. 101 7556 Andrew */ 102 7556 Andrew fileset_t *shm_filesetlist; /* list of defined filesets */ 103 7556 Andrew pthread_mutex_t shm_fileset_lock; /* protects access to list */ 104 7556 Andrew 105 7556 Andrew /* 106 7556 Andrew * parallel file allocation control. Restricts number of spawned 107 7556 Andrew * allocation threads and allows waiting for allocation to finish. 108 7556 Andrew */ 109 7556 Andrew pthread_cond_t shm_fsparalloc_cv; /* cv to wait for alloc threads */ 110 7556 Andrew int shm_fsparalloc_count; /* active alloc thread count */ 111 7556 Andrew pthread_mutex_t shm_fsparalloc_lock; /* lock to protect count */ 112 7556 Andrew 113 7556 Andrew /* 114 7556 Andrew * Procflow and process state 115 7556 Andrew */ 116 7556 Andrew procflow_t *shm_proclist; /* list of defined procflows */ 117 7556 Andrew pthread_mutex_t shm_procflow_lock; /* protects shm_proclist */ 118 7556 Andrew int shm_procs_running; /* count of running processes */ 119 7556 Andrew pthread_mutex_t shm_procs_running_lock; /* protects shm_procs_running */ 120 7556 Andrew int shm_f_abort; /* stop the run NOW! */ 121 7556 Andrew pthread_rwlock_t shm_run_lock; /* used as barrier to sync run */ 122 7556 Andrew #ifdef USE_PROCESS_MODEL 123 7556 Andrew pthread_cond_t shm_procflow_procs_cv; /* pauses procflow_init till */ 124 7556 Andrew #endif /* all procflows are created */ 125 7556 Andrew 126 7556 Andrew /* 127 7556 Andrew * flowop state 128 7556 Andrew */ 129 7556 Andrew flowop_t *shm_flowoplist; /* list of defined flowops */ 130 7556 Andrew pthread_mutex_t shm_flowop_lock; /* protects flowoplist */ 131 7556 Andrew pthread_rwlock_t shm_flowop_find_lock; /* prevents flowop_find() */ 132 7556 Andrew /* during initial flowop creation */ 133 7556 Andrew 134 7556 Andrew /* 135 7556 Andrew * lists related to variables 136 7556 Andrew */ 137 7556 Andrew 138 7556 Andrew var_t *shm_var_list; /* normal variables */ 139 7556 Andrew var_t *shm_var_dyn_list; /* special system variables */ 140 7556 Andrew var_t *shm_var_loc_list; /* variables local to comp flowops */ 141 7556 Andrew randdist_t *shm_rand_list; /* random variables */ 142 7556 Andrew 143 7556 Andrew /* 144 7556 Andrew * log and statistics dumping controls and state 145 7556 Andrew */ 146 7556 Andrew int shm_debug_level; 147 7556 Andrew int shm_bequiet; /* pause run while collecting stats */ 148 7556 Andrew int shm_log_fd; /* log file descriptor */ 149 7556 Andrew int shm_dump_fd; /* dump file descriptor */ 150 7556 Andrew char shm_dump_filename[MAXPATHLEN]; 151 7556 Andrew 152 7556 Andrew /* 153 7556 Andrew * Event generator state 154 7556 Andrew */ 155 9801 Andrew int shm_eventgen_enabled; /* event gen in operation */ 156 7946 Andrew avd_t shm_eventgen_hz; /* number of events per sec. */ 157 7556 Andrew uint64_t shm_eventgen_q; /* count of unclaimed events */ 158 7556 Andrew pthread_mutex_t shm_eventgen_lock; /* lock protecting count */ 159 7556 Andrew pthread_cond_t shm_eventgen_cv; /* cv to wait on for more events */ 160 7556 Andrew 161 7556 Andrew /* 162 7556 Andrew * System 5 semaphore state 163 7556 Andrew */ 164 7556 Andrew key_t shm_semkey; 165 7556 Andrew int shm_sys_semid; 166 7556 Andrew char shm_semids[FILEBENCH_NSEMS]; 167 7556 Andrew 168 7556 Andrew /* 169 7556 Andrew * Misc. pointers and state 170 7556 Andrew */ 171 7556 Andrew char shm_fscriptname[1024]; 172 7556 Andrew int shm_id; 173 9356 Andrew int shm_rmode; /* run mode settings */ 174 9356 Andrew int shm_mmode; /* misc. mode settings */ 175 7556 Andrew int shm_1st_err; 176 6391 aw148015 pthread_mutex_t shm_threadflow_lock; 177 6391 aw148015 pthread_mutex_t shm_msg_lock; 178 7556 Andrew pthread_mutexattr_t shm_mutexattr[IPC_NUM_MUTEX_ATTRS]; 179 7556 Andrew char *shm_string_ptr; 180 7556 Andrew char *shm_path_ptr; 181 7556 Andrew hrtime_t shm_epoch; 182 7556 Andrew hrtime_t shm_starttime; 183 7556 Andrew int shm_utid; 184 7556 Andrew 185 7556 Andrew /* 186 7556 Andrew * Shared memory allocation control 187 7556 Andrew */ 188 6305 aw148015 pthread_mutex_t shm_malloc_lock; 189 6305 aw148015 pthread_mutex_t shm_ism_lock; 190 7556 Andrew int shm_bitmap[FILEBENCH_TYPES][FILEBENCH_MAXBITMAP]; 191 7556 Andrew int shm_lastbitmapindex[FILEBENCH_TYPES]; 192 5184 ek110237 size_t shm_required; 193 5184 ek110237 size_t shm_allocated; 194 5184 ek110237 caddr_t shm_addr; 195 5184 ek110237 char *shm_ptr; 196 5184 ek110237 197 8615 Andrew /* 198 8615 Andrew * Type of plug-in file system client to use. Defaults to 199 8615 Andrew * local file system, which is type "0". 200 8615 Andrew */ 201 8615 Andrew fb_plugin_type_t shm_filesys_type; 202 8615 Andrew 203 8615 Andrew /* 204 8615 Andrew * end of pre-zeroed data 205 8615 Andrew */ 206 8615 Andrew int shm_marker; 207 5184 ek110237 208 7556 Andrew /* 209 7556 Andrew * actual storage for shared entities. 210 7556 Andrew * These are not zeroed during initialization 211 7556 Andrew */ 212 6305 aw148015 fileset_t shm_fileset[FILEBENCH_NFILESETS]; 213 6305 aw148015 filesetentry_t shm_filesetentry[FILEBENCH_NFILESETENTRIES]; 214 6305 aw148015 char shm_filesetpaths[FILEBENCH_FILESETPATHMEMORY]; 215 6305 aw148015 procflow_t shm_procflow[FILEBENCH_NPROCFLOWS]; 216 6305 aw148015 threadflow_t shm_threadflow[FILEBENCH_NTHREADFLOWS]; 217 6305 aw148015 flowop_t shm_flowop[FILEBENCH_NFLOWOPS]; 218 6305 aw148015 var_t shm_var[FILEBENCH_NVARS]; 219 6212 aw148015 randdist_t shm_randdist[FILEBENCH_NRANDDISTS]; 220 6212 aw148015 struct avd shm_avd_ptrs[FILEBENCH_NVARS * 2]; 221 6305 aw148015 char shm_strings[FILEBENCH_STRINGMEMORY]; 222 5184 ek110237 } filebench_shm_t; 223 5184 ek110237 224 5184 ek110237 extern char *shmpath; 225 5184 ek110237 226 5184 ek110237 void ipc_init(void); 227 5184 ek110237 void *ipc_malloc(int type); 228 5184 ek110237 void ipc_free(int type, char *addr); 229 5184 ek110237 int ipc_attach(caddr_t shmaddr); 230 7556 Andrew pthread_mutexattr_t *ipc_mutexattr(int); 231 5184 ek110237 pthread_condattr_t *ipc_condattr(void); 232 5184 ek110237 int ipc_semidalloc(void); 233 5184 ek110237 void ipc_semidfree(int semid); 234 5184 ek110237 char *ipc_stralloc(char *string); 235 5184 ek110237 char *ipc_pathalloc(char *string); 236 5184 ek110237 int ipc_mutex_lock(pthread_mutex_t *mutex); 237 5184 ek110237 int ipc_mutex_unlock(pthread_mutex_t *mutex); 238 5184 ek110237 void ipc_seminit(void); 239 5184 ek110237 char *ipc_ismmalloc(size_t size); 240 5184 ek110237 int ipc_ismcreate(size_t size); 241 5184 ek110237 void ipc_ismdelete(void); 242 6750 ek110237 void ipc_fini(void); 243 5184 ek110237 244 5184 ek110237 extern filebench_shm_t *filebench_shm; 245 5184 ek110237 246 5184 ek110237 #ifdef __cplusplus 247 5184 ek110237 } 248 5184 ek110237 #endif 249 5184 ek110237 250 5184 ek110237 #endif /* _FB_IPC_H */ 251