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
init_ffsb_thread(ffsb_thread_t * ft,struct ffsb_tg * tg,unsigned bufsize,unsigned tg_num,unsigned thread_num)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
destroy_ffsb_thread(ffsb_thread_t * ft)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
ft_set_statsc(ffsb_thread_t * ft,ffsb_statsc_t * fsc)46 void ft_set_statsc(ffsb_thread_t * ft, ffsb_statsc_t * fsc)
47 {
48 ffsb_statsd_init(&ft->fsd, fsc);
49 }
50
ft_run(void * data)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
ft_alter_bufsize(ffsb_thread_t * ft,unsigned bufsize)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
ft_getbuf(ffsb_thread_t * ft)76 char *ft_getbuf(ffsb_thread_t * ft)
77 {
78 return ft->alignedbuf;
79 }
80
ft_get_read_random(ffsb_thread_t * ft)81 int ft_get_read_random(ffsb_thread_t * ft)
82 {
83 return tg_get_read_random(ft->tg);
84 }
85
ft_get_read_size(ffsb_thread_t * ft)86 uint32_t ft_get_read_size(ffsb_thread_t * ft)
87 {
88 return tg_get_read_size(ft->tg);
89 }
90
ft_get_read_blocksize(ffsb_thread_t * ft)91 uint32_t ft_get_read_blocksize(ffsb_thread_t * ft)
92 {
93 return tg_get_read_blocksize(ft->tg);
94 }
95
ft_get_write_random(ffsb_thread_t * ft)96 int ft_get_write_random(ffsb_thread_t * ft)
97 {
98 return tg_get_write_random(ft->tg);
99 }
100
ft_get_write_size(ffsb_thread_t * ft)101 uint32_t ft_get_write_size(ffsb_thread_t * ft)
102 {
103 return tg_get_write_size(ft->tg);
104 }
105
ft_get_write_blocksize(ffsb_thread_t * ft)106 uint32_t ft_get_write_blocksize(ffsb_thread_t * ft)
107 {
108 return tg_get_write_blocksize(ft->tg);
109 }
110
ft_get_fsync_file(ffsb_thread_t * ft)111 int ft_get_fsync_file(ffsb_thread_t * ft)
112 {
113 return tg_get_fsync_file(ft->tg);
114 }
115
ft_get_randdata(ffsb_thread_t * ft)116 randdata_t *ft_get_randdata(ffsb_thread_t * ft)
117 {
118 return &ft->rd;
119 }
120
ft_incr_op(ffsb_thread_t * ft,unsigned opnum,unsigned increment,uint64_t bytes)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
ft_add_readbytes(ffsb_thread_t * ft,uint32_t bytes)129 void ft_add_readbytes(ffsb_thread_t * ft, uint32_t bytes)
130 {
131 ft->results.read_bytes += bytes;
132 }
133
ft_add_writebytes(ffsb_thread_t * ft,uint32_t bytes)134 void ft_add_writebytes(ffsb_thread_t * ft, uint32_t bytes)
135 {
136 ft->results.write_bytes += bytes;
137 }
138
ft_get_results(ffsb_thread_t * ft)139 ffsb_op_results_t *ft_get_results(ffsb_thread_t * ft)
140 {
141 return &ft->results;
142 }
143
ft_get_read_skip(ffsb_thread_t * ft)144 int ft_get_read_skip(ffsb_thread_t * ft)
145 {
146 return tg_get_read_skip(ft->tg);
147 }
148
ft_get_read_skipsize(ffsb_thread_t * ft)149 uint32_t ft_get_read_skipsize(ffsb_thread_t * ft)
150 {
151 return tg_get_read_skipsize(ft->tg);
152 }
153
ft_needs_stats(ffsb_thread_t * ft,syscall_t sys)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
ft_add_stat(ffsb_thread_t * ft,syscall_t sys,uint32_t val)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
ft_get_stats_data(ffsb_thread_t * ft)168 ffsb_statsd_t *ft_get_stats_data(ffsb_thread_t * ft)
169 {
170 return &ft->fsd;
171 }
172