1 /* 2 * Copyright (c) International Business Machines Corp., 2001-2004 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 12 * the GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 #include "ffsb_tg.h" 19 #include "ffsb_thread.h" 20 #include "ffsb_op.h" 21 #include "util.h" 22 23 void init_ffsb_thread(ffsb_thread_t * ft, struct ffsb_tg *tg, unsigned bufsize, 24 unsigned tg_num, unsigned thread_num) 25 { 26 memset(ft, 0, sizeof(ffsb_thread_t)); 27 28 ft->tg = tg; 29 ft->tg_num = tg_num; 30 ft->thread_num = thread_num; 31 32 if (bufsize) 33 ft_alter_bufsize(ft, bufsize); 34 35 init_random(&ft->rd, MAX_RANDBUF_SIZE); 36 } 37 38 void destroy_ffsb_thread(ffsb_thread_t * ft) 39 { 40 free(ft->mallocbuf); 41 destroy_random(&ft->rd); 42 if (ft->fsd.config) 43 ffsb_statsd_destroy(&ft->fsd); 44 } 45 46 void ft_set_statsc(ffsb_thread_t * ft, ffsb_statsc_t * fsc) 47 { 48 ffsb_statsd_init(&ft->fsd, fsc); 49 } 50 51 void *ft_run(void *data) 52 { 53 ffsb_thread_t *ft = (ffsb_thread_t *) data; 54 tg_op_params_t params; 55 unsigned wait_time = tg_get_waittime(ft->tg); 56 int stopval = tg_get_stopval(ft->tg); 57 58 ffsb_barrier_wait(tg_get_start_barrier(ft->tg)); 59 60 while (tg_get_flagval(ft->tg) != stopval) { 61 tg_get_op(ft->tg, &ft->rd, ¶ms); 62 do_op(ft, params.fs, params.opnum); 63 ffsb_milli_sleep(wait_time); 64 } 65 return NULL; 66 } 67 68 void ft_alter_bufsize(ffsb_thread_t * ft, unsigned bufsize) 69 { 70 if (ft->mallocbuf != NULL) 71 free(ft->mallocbuf); 72 ft->mallocbuf = ffsb_malloc(bufsize + 4096); 73 ft->alignedbuf = ffsb_align_4k(ft->mallocbuf + (4096 - 1)); 74 } 75 76 char *ft_getbuf(ffsb_thread_t * ft) 77 { 78 return ft->alignedbuf; 79 } 80 81 int ft_get_read_random(ffsb_thread_t * ft) 82 { 83 return tg_get_read_random(ft->tg); 84 } 85 86 uint32_t ft_get_read_size(ffsb_thread_t * ft) 87 { 88 return tg_get_read_size(ft->tg); 89 } 90 91 uint32_t ft_get_read_blocksize(ffsb_thread_t * ft) 92 { 93 return tg_get_read_blocksize(ft->tg); 94 } 95 96 int ft_get_write_random(ffsb_thread_t * ft) 97 { 98 return tg_get_write_random(ft->tg); 99 } 100 101 uint32_t ft_get_write_size(ffsb_thread_t * ft) 102 { 103 return tg_get_write_size(ft->tg); 104 } 105 106 uint32_t ft_get_write_blocksize(ffsb_thread_t * ft) 107 { 108 return tg_get_write_blocksize(ft->tg); 109 } 110 111 int ft_get_fsync_file(ffsb_thread_t * ft) 112 { 113 return tg_get_fsync_file(ft->tg); 114 } 115 116 randdata_t *ft_get_randdata(ffsb_thread_t * ft) 117 { 118 return &ft->rd; 119 } 120 121 void ft_incr_op(ffsb_thread_t * ft, unsigned opnum, unsigned increment, 122 uint64_t bytes) 123 { 124 ft->results.ops[opnum] += increment; 125 ft->results.op_weight[opnum]++; 126 ft->results.bytes[opnum] += bytes; 127 } 128 129 void ft_add_readbytes(ffsb_thread_t * ft, uint32_t bytes) 130 { 131 ft->results.read_bytes += bytes; 132 } 133 134 void ft_add_writebytes(ffsb_thread_t * ft, uint32_t bytes) 135 { 136 ft->results.write_bytes += bytes; 137 } 138 139 ffsb_op_results_t *ft_get_results(ffsb_thread_t * ft) 140 { 141 return &ft->results; 142 } 143 144 int ft_get_read_skip(ffsb_thread_t * ft) 145 { 146 return tg_get_read_skip(ft->tg); 147 } 148 149 uint32_t ft_get_read_skipsize(ffsb_thread_t * ft) 150 { 151 return tg_get_read_skipsize(ft->tg); 152 } 153 154 int ft_needs_stats(ffsb_thread_t * ft, syscall_t sys) 155 { 156 int ret = 0; 157 if (ft && ft->fsd.config && !fsc_ignore_sys(ft->fsd.config, sys)) 158 ret = 1; 159 return ret; 160 } 161 162 void ft_add_stat(ffsb_thread_t * ft, syscall_t sys, uint32_t val) 163 { 164 if (ft) 165 ffsb_add_data(&ft->fsd, sys, val); 166 } 167 168 ffsb_statsd_t *ft_get_stats_data(ffsb_thread_t * ft) 169 { 170 return &ft->fsd; 171 } 172