155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* 255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * Copyright (c) International Business Machines Corp., 2001-2004 355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * This program is free software; you can redistribute it and/or modify 555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * it under the terms of the GNU General Public License as published by 655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * the Free Software Foundation; either version 2 of the License, or 755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * (at your option) any later version. 855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * This program is distributed in the hope that it will be useful, 1055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * but WITHOUT ANY WARRANTY; without even the implied warranty of 1155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 1255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * the GNU General Public License for more details. 1355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 1455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * You should have received a copy of the GNU General Public License 1555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * along with this program; if not, write to the Free Software 164548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 1755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 1855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#ifndef _FFSB_FS_H_ 1955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define _FFSB_FS_H_ 2055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 2155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "filelist.h" 2255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "ffsb_op.h" 2355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "ffsb_tg.h" 2455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "ffsb_stats.h" 2555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 2655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* These are the base names for the different file types on a 2755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * filesystem. 2855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak*/ 2955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define FILES_BASE "data" 3055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define META_BASE "meta" 3155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define AGE_BASE "fill" 3255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 3355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakstruct ffsb_tg; 3455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 3555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modaktypedef struct size_weight { 3655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint64_t size; 3755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int weight; 3855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak} size_weight_t; 3955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 4055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* A filesystem object 4155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * -- 4255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * represents a filesystem on disk, and maintains access to the different 4355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * directories within it. Currently there are two directories created in 4455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * each filesystem: data and meta 4555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * "data" contains the aging files and the working set files 4655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * "meta" only contains directories for use in the metadata operation 4755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 4855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * Aging 4955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * This object contains methods for aging the filesystem if needed 5055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * a properly set up threadgroup is supplied by the parser which is run 5155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * until the filesystem reaches the desired utilization 5255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 5355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * Operations 5455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * The semantics of a ffsb operation are always such that they occur on 5555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * a filesystem, so the filesystem also hold operation specific data as 5655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * an opaque type 5755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * One example of how this is useful is the aging process, where a different 5855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * set of files is operated upon than in the regular benchmark and the 5955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * op_data is pointing to the "fill" set rather than the "files" set 6055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 6155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 6255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modaktypedef struct ffsb_fs { 6355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak char *basedir; 6455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 6555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak struct benchfiles files; 6655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak struct benchfiles meta; 6755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak struct benchfiles fill; 6855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 6955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int flags; 7055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define FFSB_FS_DIRECTIO (1 << 0) 7155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define FFSB_FS_ALIGNIO4K (1 << 1) 7255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define FFSB_FS_LIBCIO (1 << 2) 7355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define FFSB_FS_REUSE_FS (1 << 3) 7455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 7555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* These pararmeters pertain to files in the files and fill 7655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * dirs. Meta dir only contains directories, starting with 0. 7755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 7855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint32_t num_dirs; 7955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint32_t num_start_files; 8055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint64_t minfilesize, maxfilesize; 8155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak double init_fsutil; 8255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint64_t init_size; 8355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 8455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* These two parameters specify the blocksize to use for 8555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * writes when creating and aging the fs. 8655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 8755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint32_t create_blocksize, age_blocksize; 8855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define FFSB_FS_DEFAULT_CREATE_BLOCKSIZE 4096 8955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define FFSB_FS_DEFAULT_AGE_BLOCKSIZE 4096 9055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 9155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak double start_fsutil; 9255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 9355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* Aging data/parameters */ 9455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak double desired_fsutil; 9555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int age_fs; 9655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint32_t num_age_dirs; 9755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 9855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* Use an ffsb thread group to do the aging work */ 9955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak struct ffsb_tg *aging_tg; 10055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 10155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* If a particular operation wants to maintain fs-specific 10255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * data, it should use this array. Naturally, the ops must 10355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * synchonize access to the data for now, they are all just 10455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * putting pointers to a particular benchfiles struct here, 10555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * which is already sync'ed 10655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 10755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak void *op_data[FFSB_NUMOPS]; 10855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 10955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* per-fs stats */ 11055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak ffsb_statsc_t fsc; 11155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak ffsb_statsd_t fsd; 11255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 11355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak size_weight_t *size_weights; 11455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak unsigned num_weights; 11555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak unsigned sum_weights; 11655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 11755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak} ffsb_fs_t; 11855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 11955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* Set up the structure, zeros everything out and dups the basedir 12055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * string 12155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 12255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid init_ffsb_fs(ffsb_fs_t *fs, char *basedir, uint32_t num_data_dirs, 12355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint32_t num_start_files, unsigned flags); 12455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 12555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* Does not remove files/dirs on disk, only frees up data 12655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * structures 12755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 12855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid destroy_ffsb_fs(ffsb_fs_t *fs); 12955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 13055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* Set up the files and such on the disk including aging if requested. 13155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * Should call back into each op, which initialize its op_data[] 13255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * entry. Aging is done by starting the aging_tg thread group, and 13355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * waiting until the desired utilization is achieved. It can (and is) 13455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * be used with pthread_create(). Parameter should be a ffsb_fs_t * , 13555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * and it will return the same type 13655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 13755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid *construct_ffsb_fs(void *ffsb_fs_ptr); 13855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 13955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* Shallow clone, original should simply be discarded (not destroyed). 14055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * Generally should only be used by parser to write into the config 14155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * object 14255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 14355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid clone_ffsb_fs(ffsb_fs_t *target, ffsb_fs_t *original); 14455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 14555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_print_config(ffsb_fs_t *fs); 14655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 14755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakchar *fs_get_basedir(ffsb_fs_t *fs); 14855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint fs_get_directio(ffsb_fs_t *fs); 14955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_set_directio(ffsb_fs_t *fs, int dio); 15055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint fs_get_alignio(ffsb_fs_t *fs); 15155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_set_alignio(ffsb_fs_t *fs, int aio); 15255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint fs_get_libcio(ffsb_fs_t *fs); 15355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_set_libcio(ffsb_fs_t *fs, int lio); 15455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint fs_get_reuse_fs(ffsb_fs_t *fs); 15555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_set_reuse_fs(ffsb_fs_t *fs, int rfs); 15655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 15755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakstruct benchfiles *fs_get_datafiles(ffsb_fs_t *fs); 15855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakstruct benchfiles *fs_get_metafiles(ffsb_fs_t *fs); 15955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakstruct benchfiles *fs_get_agefiles(ffsb_fs_t *fs); 16055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 16155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_set_aging_tg(ffsb_fs_t *fs, struct ffsb_tg *, double util); 16255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakstruct ffsb_tg *fs_get_aging_tg(ffsb_fs_t *fs); 16355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint fs_get_agefs(ffsb_fs_t *fs); 16455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 16555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_set_opdata(ffsb_fs_t *fs, void *data, unsigned opnum); 16655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid *fs_get_opdata(ffsb_fs_t *fs, unsigned opnum); 16755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_set_min_filesize(ffsb_fs_t *fs, uint64_t size); 16855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_set_max_filesize(ffsb_fs_t *fs, uint64_t size); 16955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_set_create_blocksize(ffsb_fs_t *fs, uint32_t blocksize); 17055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_set_age_blocksize(ffsb_fs_t *fs, uint32_t blocksize); 17155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint32_t fs_get_create_blocksize(ffsb_fs_t *fs); 17255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint32_t fs_get_age_blocksize(ffsb_fs_t *fs); 17355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint64_t fs_get_min_filesize(ffsb_fs_t *fs); 17455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint64_t fs_get_max_filesize(ffsb_fs_t *fs); 17555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint32_t fs_get_numstartfiles(ffsb_fs_t *fs); 17655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint32_t fs_get_numdirs(ffsb_fs_t *fs); 17755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 17855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakdouble fs_get_desired_fsutil(ffsb_fs_t *fs); 17955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 18055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* For these two, fs == NULL is OK */ 18155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint fs_needs_stats(ffsb_fs_t *fs, syscall_t s); 18255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid fs_add_stat(ffsb_fs_t *fs, syscall_t sys, uint32_t val); 18355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 18455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#endif /* _FFSB_FS_H_ */ 185