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