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