libfio.c revision 36d80bc7c7f7fbc2612941b7dd7ceaf645798c7f
12e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe/*
22e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe * fio - the flexible io tester
32e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
42e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe * Copyright (C) 2005 Jens Axboe <axboe@suse.de>
52e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe * Copyright (C) 2006-2012 Jens Axboe <axboe@kernel.dk>
62e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
72e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe * The license below covers all files distributed with fio unless otherwise
82e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe * noted in the file itself.
92e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
102e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  This program is free software; you can redistribute it and/or modify
112e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  it under the terms of the GNU General Public License version 2 as
122e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  published by the Free Software Foundation.
132e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
142e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  This program is distributed in the hope that it will be useful,
152e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  but WITHOUT ANY WARRANTY; without even the implied warranty of
162e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
172e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  GNU General Public License for more details.
182e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
192e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  You should have received a copy of the GNU General Public License
202e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  along with this program; if not, write to the Free Software
212e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
222e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe *
232e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe */
242e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
252e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe#include <string.h>
2659dfce577869f0a6668d682ad06874b3398a4b93Jens Axboe#include <sys/types.h>
2759dfce577869f0a6668d682ad06874b3398a4b93Jens Axboe#include <signal.h>
282e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe#include "fio.h"
292e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
30a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe/*
31a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe * Just expose an empty list, if the OS does not support disk util stats
32a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe */
33a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe#ifndef FIO_HAVE_DISK_UTIL
34a3efc919b0dcc27d65a6e84edca209b91cee173dJens AxboeFLIST_HEAD(disk_list);
35a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe#endif
36a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe
37a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboeunsigned long arch_flags = 0;
38a3efc919b0dcc27d65a6e84edca209b91cee173dJens Axboe
392e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboestatic const char *fio_os_strings[os_nr] = {
402e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"Invalid",
412e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"Linux",
422e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"AIX",
432e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"FreeBSD",
442e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"HP-UX",
452e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"OSX",
462e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"NetBSD",
472e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"Solaris",
482e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"Windows"
492e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe};
502e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
512e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboestatic const char *fio_arch_strings[arch_nr] = {
522e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"Invalid",
532e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"x86-64",
542e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"x86",
552e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"ppc",
562e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"ia64",
572e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"s390",
582e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"alpha",
592e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"sparc",
602e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"sparc64",
612e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"arm",
622e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"sh",
632e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"hppa",
642e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	"generic"
652e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe};
662e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
672e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboestatic void reset_io_counters(struct thread_data *td)
682e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
696eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	int ddir;
706eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) {
716eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->stat_io_bytes[ddir] = 0;
726eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->this_io_bytes[ddir] = 0;
736eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->stat_io_blocks[ddir] = 0;
746eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->this_io_blocks[ddir] = 0;
756eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->rate_bytes[ddir] = 0;
766eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->rate_blocks[ddir] = 0;
776eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	}
782e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	td->zone_bytes = 0;
792e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
802e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	td->last_was_sync = 0;
812e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
822e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	/*
832e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	 * reset file done count if we are to start over
842e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	 */
852e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	if (td->o.time_based || td->o.loops)
862e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		td->nr_done_files = 0;
872e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
882e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
892e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboevoid clear_io_state(struct thread_data *td)
902e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
912e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	struct fio_file *f;
922e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	unsigned int i;
932e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
942e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	reset_io_counters(td);
952e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
962e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	close_files(td);
972e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	for_each_file(td, f, i)
982e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		fio_file_clear_done(f);
992e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1002e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	/*
1012e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	 * Set the same seed to get repeatable runs
1022e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	 */
1032e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	td_fill_rand_seeds(td);
1042e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1052e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1062e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboevoid reset_all_stats(struct thread_data *td)
1072e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1082e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	struct timeval tv;
1092e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	int i;
1102e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1112e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	reset_io_counters(td);
1122e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1136eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
1142e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		td->io_bytes[i] = 0;
1152e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		td->io_blocks[i] = 0;
1162e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		td->io_issues[i] = 0;
1172e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		td->ts.total_io_u[i] = 0;
1186eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li		td->ts.runtime[i] = 0;
1192e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	}
1202e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1212e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	fio_gettime(&tv, NULL);
1222e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	memcpy(&td->epoch, &tv, sizeof(tv));
1232e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	memcpy(&td->start, &tv, sizeof(tv));
1242e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1252e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1262e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboevoid reset_fio_state(void)
1272e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1282e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	groupid = 0;
1292e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	thread_number = 0;
1302caefeecf95c2e01ccffc3e286d17a84b12f4dc1Jens Axboe	stat_number = 0;
1312e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	nr_process = 0;
1322e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	nr_thread = 0;
1332e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	done_secs = 0;
1342e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1352e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1362e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboeconst char *fio_get_os_string(int nr)
1372e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1382e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	if (nr < os_nr)
1392e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		return fio_os_strings[nr];
1402e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1412e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	return NULL;
1422e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1432e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1442e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboeconst char *fio_get_arch_string(int nr)
1452e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1462e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	if (nr < arch_nr)
1472e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		return fio_arch_strings[nr];
1482e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1492e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	return NULL;
1502e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1512e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1522e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboevoid td_set_runstate(struct thread_data *td, int runstate)
1532e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1542e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	if (td->runstate == runstate)
1552e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		return;
1562e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1572e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	dprint(FD_PROCESS, "pid=%d: runstate %d -> %d\n", (int) td->pid,
1582e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe						td->runstate, runstate);
1592e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	td->runstate = runstate;
1602e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1612e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1622e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboevoid fio_terminate_threads(int group_id)
1632e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe{
1642e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	struct thread_data *td;
16541fa20ec4b70d727128b0aa72640e53817d12cdaJens Axboe	pid_t pid = getpid();
1662e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	int i;
1672e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1682e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	dprint(FD_PROCESS, "terminate group_id=%d\n", group_id);
1692e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1702e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	for_each_td(td, i) {
1712e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		if (group_id == TERMINATE_ALL || groupid == td->groupid) {
1722e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			dprint(FD_PROCESS, "setting terminate on %s/%d\n",
1732e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe						td->o.name, (int) td->pid);
1742e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			td->terminate = 1;
1752e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			td->o.start_delay = 0;
1762e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1772e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			/*
1782e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			 * if the thread is running, just let it exit
1792e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			 */
18036d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe			if (!td->pid || pid == td->pid)
1812e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe				continue;
1822e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			else if (td->runstate < TD_RAMP)
1832e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe				kill(td->pid, SIGTERM);
18436d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe			else {
1852e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe				struct ioengine_ops *ops = td->io_ops;
1862e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
18736d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe				if (ops && ops->terminate)
18836d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe					ops->terminate(td);
1892e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe			}
1902e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe		}
1912e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe	}
1922e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe}
1932e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
1942e1df07d1ea30e0304cc65370f3ed161a6f22cd4Jens Axboe
195