| /* |
| * Copyright (c) International Business Machines Corp., 2001-2004 |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
| * the GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| #include "ffsb_tg.h" |
| #include "ffsb_thread.h" |
| #include "ffsb_op.h" |
| #include "util.h" |
| |
| void init_ffsb_thread(ffsb_thread_t * ft, struct ffsb_tg *tg, unsigned bufsize, |
| unsigned tg_num, unsigned thread_num) |
| { |
| memset(ft, 0, sizeof(ffsb_thread_t)); |
| |
| ft->tg = tg; |
| ft->tg_num = tg_num; |
| ft->thread_num = thread_num; |
| |
| if (bufsize) |
| ft_alter_bufsize(ft, bufsize); |
| |
| init_random(&ft->rd, MAX_RANDBUF_SIZE); |
| } |
| |
| void destroy_ffsb_thread(ffsb_thread_t * ft) |
| { |
| free(ft->mallocbuf); |
| destroy_random(&ft->rd); |
| if (ft->fsd.config) |
| ffsb_statsd_destroy(&ft->fsd); |
| } |
| |
| void ft_set_statsc(ffsb_thread_t * ft, ffsb_statsc_t * fsc) |
| { |
| ffsb_statsd_init(&ft->fsd, fsc); |
| } |
| |
| void *ft_run(void *data) |
| { |
| ffsb_thread_t *ft = (ffsb_thread_t *) data; |
| tg_op_params_t params; |
| unsigned wait_time = tg_get_waittime(ft->tg); |
| int stopval = tg_get_stopval(ft->tg); |
| |
| ffsb_barrier_wait(tg_get_start_barrier(ft->tg)); |
| |
| while (tg_get_flagval(ft->tg) != stopval) { |
| tg_get_op(ft->tg, &ft->rd, ¶ms); |
| do_op(ft, params.fs, params.opnum); |
| ffsb_milli_sleep(wait_time); |
| } |
| return NULL; |
| } |
| |
| void ft_alter_bufsize(ffsb_thread_t * ft, unsigned bufsize) |
| { |
| if (ft->mallocbuf != NULL) |
| free(ft->mallocbuf); |
| ft->mallocbuf = ffsb_malloc(bufsize + 4096); |
| ft->alignedbuf = ffsb_align_4k(ft->mallocbuf + (4096 - 1)); |
| } |
| |
| char *ft_getbuf(ffsb_thread_t * ft) |
| { |
| return ft->alignedbuf; |
| } |
| |
| int ft_get_read_random(ffsb_thread_t * ft) |
| { |
| return tg_get_read_random(ft->tg); |
| } |
| |
| uint32_t ft_get_read_size(ffsb_thread_t * ft) |
| { |
| return tg_get_read_size(ft->tg); |
| } |
| |
| uint32_t ft_get_read_blocksize(ffsb_thread_t * ft) |
| { |
| return tg_get_read_blocksize(ft->tg); |
| } |
| |
| int ft_get_write_random(ffsb_thread_t * ft) |
| { |
| return tg_get_write_random(ft->tg); |
| } |
| |
| uint32_t ft_get_write_size(ffsb_thread_t * ft) |
| { |
| return tg_get_write_size(ft->tg); |
| } |
| |
| uint32_t ft_get_write_blocksize(ffsb_thread_t * ft) |
| { |
| return tg_get_write_blocksize(ft->tg); |
| } |
| |
| int ft_get_fsync_file(ffsb_thread_t * ft) |
| { |
| return tg_get_fsync_file(ft->tg); |
| } |
| |
| randdata_t *ft_get_randdata(ffsb_thread_t * ft) |
| { |
| return &ft->rd; |
| } |
| |
| void ft_incr_op(ffsb_thread_t * ft, unsigned opnum, unsigned increment, |
| uint64_t bytes) |
| { |
| ft->results.ops[opnum] += increment; |
| ft->results.op_weight[opnum]++; |
| ft->results.bytes[opnum] += bytes; |
| } |
| |
| void ft_add_readbytes(ffsb_thread_t * ft, uint32_t bytes) |
| { |
| ft->results.read_bytes += bytes; |
| } |
| |
| void ft_add_writebytes(ffsb_thread_t * ft, uint32_t bytes) |
| { |
| ft->results.write_bytes += bytes; |
| } |
| |
| ffsb_op_results_t *ft_get_results(ffsb_thread_t * ft) |
| { |
| return &ft->results; |
| } |
| |
| int ft_get_read_skip(ffsb_thread_t * ft) |
| { |
| return tg_get_read_skip(ft->tg); |
| } |
| |
| uint32_t ft_get_read_skipsize(ffsb_thread_t * ft) |
| { |
| return tg_get_read_skipsize(ft->tg); |
| } |
| |
| int ft_needs_stats(ffsb_thread_t * ft, syscall_t sys) |
| { |
| int ret = 0; |
| if (ft && ft->fsd.config && !fsc_ignore_sys(ft->fsd.config, sys)) |
| ret = 1; |
| return ret; |
| } |
| |
| void ft_add_stat(ffsb_thread_t * ft, syscall_t sys, uint32_t val) |
| { |
| if (ft) |
| ffsb_add_data(&ft->fsd, sys, val); |
| } |
| |
| ffsb_statsd_t *ft_get_stats_data(ffsb_thread_t * ft) |
| { |
| return &ft->fsd; |
| } |