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_FLOWOP_H
  27 #define _FB_FLOWOP_H
  28 
  29 #include "config.h"
  30 
  31 #include <stdio.h>
  32 #include <stdlib.h>
  33 #include <unistd.h>
  34 #include <sys/stat.h>
  35 #include <sys/types.h>
  36 #include <sys/param.h>
  37 #include <sys/resource.h>
  38 #include <pthread.h>
  39 #ifndef HAVE_SYSV_SEM
  40 #include <semaphore.h>
  41 #endif
  42 #include "stats.h"
  43 #include "threadflow.h"
  44 #include "vars.h"
  45 #include "fileset.h"
  46 #include "filebench.h"
  47 #include "fsplug.h"
  48 
  49 #ifdef  __cplusplus
  50 extern "C" {
  51 #endif
  52 
  53 typedef struct flowop {
  54         char            fo_name[128];   /* Name */
  55         int             fo_instance;    /* Instance number */
  56         struct flowop   *fo_next;       /* Next in global list */
  57         struct flowop   *fo_exec_next;  /* Next in thread's or compfo's list */
  58         struct flowop   *fo_resultnext; /* List of flowops in result */
  59         struct flowop   *fo_comp_fops;  /* List of flowops in composite fo */
  60         var_t           *fo_lvar_list;  /* List of composite local vars */
  61         struct threadflow *fo_thread;   /* Backpointer to thread */
  62         int             (*fo_func)();   /* Method */
  63         int             (*fo_init)();   /* Init Method */
  64         void            (*fo_destruct)(); /* Destructor Method */
  65         int             fo_type;        /* Type */
  66         int             fo_attrs;       /* Flow op attribute */
  67         avd_t           fo_filename;    /* file/fileset name */
  68         fileset_t       *fo_fileset;    /* Fileset for op */
  69         int             fo_fd;          /* File descriptor */
  70         int             fo_fdnumber;    /* User specified file descriptor */
  71         int             fo_srcfdnumber; /* User specified src file descriptor */
  72         fbint_t         fo_constvalue;  /* constant version of fo_value */
  73         fbint_t         fo_constwss;    /* constant version of fo_wss */
  74         avd_t           fo_iosize;      /* Size of operation */
  75         avd_t           fo_wss;         /* Flow op working set size */
  76         char            fo_targetname[128]; /* Target, for wakeup etc... */
  77         struct flowop   *fo_targets;    /* List of targets matching name */
  78         struct flowop   *fo_targetnext; /* List of targets matching name */
  79         avd_t           fo_iters;       /* Number of iterations of op */
  80         avd_t           fo_value;       /* Attr */
  81         avd_t           fo_sequential;  /* Attr */
  82         avd_t           fo_random;      /* Attr */
  83         avd_t           fo_stride;      /* Attr */
  84         avd_t           fo_backwards;   /* Attr */
  85         avd_t           fo_dsync;       /* Attr */
  86         avd_t           fo_blocking;    /* Attr */
  87         avd_t           fo_directio;    /* Attr */
  88         avd_t           fo_rotatefd;    /* Attr */
  89         avd_t           fo_fileindex;   /* Attr */
  90         flowstat_t      fo_stats;       /* Flow statistics */
  91         pthread_cond_t  fo_cv;          /* Block/wakeup cv */
  92         pthread_mutex_t fo_lock;        /* Mutex around flowop */
  93         void            *fo_private;    /* Flowop private scratch pad area */
  94         char            *fo_buf;        /* Per-flowop buffer */
  95         uint64_t        fo_buf_size;    /* current size of buffer */
  96 #ifdef HAVE_SYSV_SEM
  97         int             fo_semid_lw;    /* sem id */
  98         int             fo_semid_hw;    /* sem id for highwater block */
  99 #else
 100         sem_t           fo_sem;         /* sem_t for posix semaphores */
 101 #endif /* HAVE_SYSV_SEM */
 102         avd_t           fo_highwater;   /* value of highwater paramter */
 103         void            *fo_idp;        /* id, for sems etc */
 104         hrtime_t        fo_timestamp;   /* for ratecontrol, etc... */
 105         int             fo_initted;     /* Set to one if initialized */
 106         int64_t         fo_tputbucket;  /* Throughput bucket, for limiter */
 107         uint64_t        fo_tputlast;    /* Throughput count, for delta's */
 108 
 109 } flowop_t;
 110 
 111 /* Flow Op Attrs */
 112 #define FLOW_ATTR_SEQUENTIAL    0x1
 113 #define FLOW_ATTR_RANDOM        0x2
 114 #define FLOW_ATTR_STRIDE        0x4
 115 #define FLOW_ATTR_BACKWARDS     0x8
 116 #define FLOW_ATTR_DSYNC         0x10
 117 #define FLOW_ATTR_BLOCKING      0x20
 118 #define FLOW_ATTR_DIRECTIO      0x40
 119 #define FLOW_ATTR_READ          0x80
 120 #define FLOW_ATTR_WRITE         0x100
 121 
 122 /* Flowop Instance Numbers */
 123                             /* Worker flowops have instance numbers > 0 */
 124 #define FLOW_DEFINITION 0   /* Prototype definition of flowop from library */
 125 #define FLOW_INNER_DEF -1   /* Constructed proto flowops within composite */
 126 #define FLOW_MASTER -2      /* Master flowop based on flowop declaration */
 127                             /* supplied within a thread definition */
 128 
 129 /* Flowop type definitions */
 130 
 131 #define FLOW_TYPES      6
 132 #define FLOW_TYPE_GLOBAL        0  /* Rolled up statistics */
 133 #define FLOW_TYPE_IO            1  /* Op is an I/O, reflected in iops and lat */
 134 #define FLOW_TYPE_AIO           2  /* Op is an async I/O, reflected in iops */
 135 #define FLOW_TYPE_SYNC          3  /* Op is a sync event */
 136 #define FLOW_TYPE_COMPOSITE     4  /* Op is a composite flowop */
 137 #define FLOW_TYPE_OTHER         5  /* Op is a something else */
 138 
 139 typedef struct flowop_proto {
 140         int     fl_type;
 141         int     fl_attrs;
 142         char    *fl_name;
 143         int     (*fl_init)();
 144         int     (*fl_func)();
 145         void    (*fl_destruct)();
 146 } flowop_proto_t;
 147 
 148 extern flowstat_t controlstats;
 149 extern pthread_mutex_t controlstats_lock;
 150 
 151 void flowop_init(void);
 152 void flowop_plugin_flowinit(void);
 153 flowop_t *flowop_define(threadflow_t *, char *name, flowop_t *inherit,
 154     flowop_t **flowoplist_hdp, int instance, int type);
 155 flowop_t *flowop_find(char *name);
 156 flowop_t *flowop_find_one(char *name, int instance);
 157 flowop_t *flowop_find_from_list(char *name, flowop_t *list);
 158 int flowop_init_generic(flowop_t *flowop);
 159 void flowop_destruct_generic(flowop_t *flowop);
 160 void flowop_flow_init(flowop_proto_t *list, int nops);
 161 void flowoplib_usage(void);
 162 int flowoplib_iosetup(threadflow_t *threadflow, flowop_t *flowop,
 163     fbint_t *wssp, caddr_t *iobufp, fb_fdesc_t **filedescp, fbint_t iosize);
 164 void flowop_delete_all(flowop_t **threadlist);
 165 void flowop_endop(threadflow_t *threadflow, flowop_t *flowop, int64_t bytes);
 166 void flowop_beginop(threadflow_t *threadflow, flowop_t *flowop);
 167 void flowop_destruct_all_flows(threadflow_t *threadflow);
 168 flowop_t *flowop_new_composite_define(char *name);
 169 void flowop_printall(void);
 170 
 171 #ifdef  __cplusplus
 172 }
 173 #endif
 174 
 175 #endif  /* _FB_FLOWOP_H */