cpu.c revision 2dc1bbeb58edc85f2829eed6729862c438ea2353
1da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe/*
2da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe * CPU engine
3da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe *
4da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe * Doesn't transfer any data, merely burns CPU cycles according to
5da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe * the settings.
6da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe *
7da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe */
85f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe#include "../fio.h"
95f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe#include "../os.h"
102866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe
11ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboestatic int fio_cpuio_queue(struct thread_data *td, struct io_u fio_unused *io_u)
12ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe{
132dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	__usec_sleep(td->o.cpucycle);
14ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	return FIO_Q_COMPLETED;
15ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe}
16ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe
17ea2877a4ab0fb047a503ba0d7a0fd5393d0fb099Jens Axboestatic int fio_cpuio_setup(struct thread_data fio_unused *td)
18ea2877a4ab0fb047a503ba0d7a0fd5393d0fb099Jens Axboe{
19ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	struct fio_file *f;
20af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe	unsigned int i;
21ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe
222dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->o.size = -1;
232dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	td->io_size = td->o.size;
24ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	td->total_io_size = td->io_size;
25ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe
26ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	for_each_file(td, f, i) {
27ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe		f->real_file_size = -1;
28ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe		f->file_size = -1;
29ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	}
30ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe
31ea2877a4ab0fb047a503ba0d7a0fd5393d0fb099Jens Axboe	return 0;
32ea2877a4ab0fb047a503ba0d7a0fd5393d0fb099Jens Axboe}
33ea2877a4ab0fb047a503ba0d7a0fd5393d0fb099Jens Axboe
342866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboestatic int fio_cpuio_init(struct thread_data *td)
352866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe{
362dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	struct thread_options *o = &td->o;
372dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe
382dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (!o->cpuload) {
39ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe		td_vmsg(td, EINVAL, "cpu thread needs rate (cpuload=)","cpuio");
402866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe		return 1;
41ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	}
42ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe
432dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	if (o->cpuload > 100)
442dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe		o->cpuload = 100;
452866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe
46ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	/*
47ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	 * set thinktime_sleep and thinktime_spin appropriately
48ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	 */
492dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	o->thinktime_blocks = 1;
502dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	o->thinktime_spin = 0;
512dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	o->thinktime = (o->cpucycle * (100 - o->cpuload)) / o->cpuload;
522866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe
532dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	o->nr_files = o->open_files = 1;
54ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	return 0;
55ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe}
56ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe
57ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboestatic int fio_cpuio_open(struct thread_data fio_unused *td, struct fio_file *f)
58ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe{
59ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	f->fd = 0;
602866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	return 0;
612866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe}
622866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe
635f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboestatic struct ioengine_ops ioengine = {
642866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	.name		= "cpuio",
652866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	.version	= FIO_IOOPS_VERSION,
66ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	.queue		= fio_cpuio_queue,
672866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe	.init		= fio_cpuio_init,
68ea2877a4ab0fb047a503ba0d7a0fd5393d0fb099Jens Axboe	.setup		= fio_cpuio_setup,
69ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	.open_file	= fio_cpuio_open,
70ba0fbe1029bae1de08d66a72b6d0b2505c67c438Jens Axboe	.flags		= FIO_SYNCIO | FIO_DISKLESSIO,
712866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe};
725f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe
735f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboestatic void fio_init fio_cpuio_register(void)
745f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe{
755f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe	register_ioengine(&ioengine);
765f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe}
775f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe
785f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboestatic void fio_exit fio_cpuio_unregister(void)
795f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe{
805f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe	unregister_ioengine(&ioengine);
815f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe}
82