Home | History | Annotate | Download | only in common
      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