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 #ifndef _FFSB_OP_H_
19 #define _FFSB_OP_H_
20 
21 #include <stdlib.h>
22 #include <sys/types.h>
23 #include <inttypes.h>
24 
25 struct ffsb_op_results;
26 struct ffsb_thread;
27 struct ffsb_fs;
28 
29 #define NA 0x00
30 #define READ 0x01
31 #define WRITE 0x02
32 
33 /* This file handles all of the operations FFSB supports.  It has
34  * tight interactions with the filesystem objects, but is otherwise
35  * pretty abstract.
36  */
37 
38 /* The op callback */
39 typedef void (*ffsb_op_fn)(struct ffsb_thread *, struct ffsb_fs *,
40 			     unsigned op_num);
41 
42 /* Operation results printing function */
43 typedef void (*ffsb_op_print_fn)(struct ffsb_op_results *, double secs,
44 				  unsigned int op_num);
45 
46 /* Operation specific initialization for a filesystem */
47 typedef void (*ffsb_op_fs_fn)(struct ffsb_fs *, unsigned opnum);
48 
49 typedef struct ffsb_op {
50 	unsigned int op_id;
51 	char *op_name;
52 	ffsb_op_fn op_fn;
53 
54 	unsigned int throughput;
55 	/* The point of these two fields is to determine which set of
56 	 * files are being worked on.  Currently either data, meta, or
57 	 * aging.  Data and meta are mutually exclusive, so we only
58 	 * need two funcs.
59 	 */
60 	ffsb_op_fs_fn op_bench;
61 	ffsb_op_fs_fn op_age;
62 } ffsb_op_t;
63 
64 /* List of all operations, located in ffsb_op.c */
65 extern ffsb_op_t ffsb_op_list[];
66 
67 /* This *must* be updated when a new operation is added or one is
68  * removed several other structures use it for statically sized arrays
69  */
70 #define FFSB_NUMOPS (15)
71 
72 /* Returns index of an op.
73  * Returns -1 if opname isn't found, and its case sensitive :)
74  */
75 int ops_find_op(char *opname);
76 
77 typedef struct ffsb_op_results {
78 	/* Count of how many times each op was run */
79 	unsigned int ops[FFSB_NUMOPS];
80 	unsigned int op_weight[FFSB_NUMOPS];
81 	uint64_t bytes[FFSB_NUMOPS];
82 
83 	uint64_t read_bytes;
84 	uint64_t write_bytes;
85 } ffsb_op_results_t;
86 
87 void init_ffsb_op_results(struct ffsb_op_results *);
88 void print_results(struct ffsb_op_results *results, double runtime);
89 char *op_get_name(int opnum);
90 
91 /* Setup the ops for the benchmark */
92 void ops_setup_bench(struct ffsb_fs *fs);
93 
94 /* setup the ops for aging the filesystem */
95 void ops_setup_age(struct ffsb_fs *fs);
96 
97 void add_results(struct ffsb_op_results *target, struct ffsb_op_results *src);
98 
99 /* Run this op, using this thread state, on this filesystem */
100 void do_op(struct ffsb_thread *ft, struct ffsb_fs *fs, unsigned op_num);
101 
102 #endif /* _FFSB_OP_H_ */
103