13c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <time.h>
23c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <sys/time.h>
33c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
43c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include "fio.h"
53c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
6263e529f7d90892a610a5b26a519116fe3a675a6Jens Axboestatic struct timeval genesis;
7fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboestatic unsigned long ns_granularity;
8263e529f7d90892a610a5b26a519116fe3a675a6Jens Axboe
93c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe/*
103c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe * busy looping version for the last few usec
113c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe */
126dd6f2cd9fd0a59054c9d003c758d810fd5a8f4aJens Axboevoid usec_spin(unsigned int usec)
133c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{
143c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe	struct timeval start;
153c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
1602bcaa8c31feb93c61b701d143a7eea3efd2124dJens Axboe	fio_gettime(&start, NULL);
173c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe	while (utime_since_now(&start) < usec)
183c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe		nop;
193c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe}
203c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
213c39a379542fd819dbc5cf6daf59380911c39141Jens Axboevoid usec_sleep(struct thread_data *td, unsigned long usec)
223c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{
23fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe	struct timespec req;
24fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe	struct timeval tv;
253c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
263c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe	do {
27fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		unsigned long ts = usec;
28fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe
29fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		if (usec < ns_granularity) {
306dd6f2cd9fd0a59054c9d003c758d810fd5a8f4aJens Axboe			usec_spin(usec);
313c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe			break;
323c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe		}
333c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
34fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		ts = usec - ns_granularity;
353c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
36fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		if (ts >= 1000000) {
37fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe			req.tv_sec = ts / 1000000;
38fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe			ts -= 1000000 * req.tv_sec;
39fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		} else
40fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe			req.tv_sec = 0;
41fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe
42fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		req.tv_nsec = ts * 1000;
43fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		fio_gettime(&tv, NULL);
44fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe
45fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		if (nanosleep(&req, NULL) < 0)
463c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe			break;
473c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
48fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		ts = utime_since_now(&tv);
49fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		if (ts >= usec)
50fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe			break;
513c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
52fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		usec -= ts;
533c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe	} while (!td->terminate);
543c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe}
553c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
56aa60bc582119e8fcd4588dc5820c1cbcab599984Jens Axboeuint64_t mtime_since_genesis(void)
57263e529f7d90892a610a5b26a519116fe3a675a6Jens Axboe{
58263e529f7d90892a610a5b26a519116fe3a675a6Jens Axboe	return mtime_since_now(&genesis);
59263e529f7d90892a610a5b26a519116fe3a675a6Jens Axboe}
60263e529f7d90892a610a5b26a519116fe3a675a6Jens Axboe
610de5b26f6e177aacac0683306c47e0cbaf58b0b6Jens Axboeuint64_t utime_since_genesis(void)
620de5b26f6e177aacac0683306c47e0cbaf58b0b6Jens Axboe{
630de5b26f6e177aacac0683306c47e0cbaf58b0b6Jens Axboe	return utime_since_now(&genesis);
640de5b26f6e177aacac0683306c47e0cbaf58b0b6Jens Axboe}
650de5b26f6e177aacac0683306c47e0cbaf58b0b6Jens Axboe
66b29ee5b3dee417016164198fb240344ef666de2bJens Axboeint in_ramp_time(struct thread_data *td)
67b29ee5b3dee417016164198fb240344ef666de2bJens Axboe{
68b29ee5b3dee417016164198fb240344ef666de2bJens Axboe	return td->o.ramp_time && !td->ramp_time_over;
69b29ee5b3dee417016164198fb240344ef666de2bJens Axboe}
70b29ee5b3dee417016164198fb240344ef666de2bJens Axboe
71721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboeint ramp_time_over(struct thread_data *td)
72721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe{
73721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe	struct timeval tv;
74721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe
75721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe	if (!td->o.ramp_time || td->ramp_time_over)
76721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe		return 1;
77721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe
78721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe	fio_gettime(&tv, NULL);
790de5b26f6e177aacac0683306c47e0cbaf58b0b6Jens Axboe	if (utime_since(&td->epoch, &tv) >= td->o.ramp_time) {
80721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe		td->ramp_time_over = 1;
81b29ee5b3dee417016164198fb240344ef666de2bJens Axboe		reset_all_stats(td);
82b29ee5b3dee417016164198fb240344ef666de2bJens Axboe		td_set_runstate(td, TD_RAMP);
83721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe		return 1;
84721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe	}
85721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe
86721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe	return 0;
87721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe}
88721938ae7fae0f6d470a7e32e177ea5dce480229Jens Axboe
8903e20d687566753b90383571e5e152c5142bdffdBruce Cranvoid fio_time_init(void)
90263e529f7d90892a610a5b26a519116fe3a675a6Jens Axboe{
91fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe	int i;
92fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe
93c223da83e253b0057bb029bf4fbb55a05844215cJens Axboe	fio_clock_init();
94c223da83e253b0057bb029bf4fbb55a05844215cJens Axboe
95fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe	/*
96fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe	 * Check the granularity of the nanosleep function
97fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe	 */
98fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe	for (i = 0; i < 10; i++) {
99fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		struct timeval tv;
100fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		struct timespec ts;
101fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		unsigned long elapsed;
102fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe
103fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		fio_gettime(&tv, NULL);
104fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		ts.tv_sec = 0;
105fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		ts.tv_nsec = 1000;
106fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe
107fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		nanosleep(&ts, NULL);
108fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		elapsed = utime_since_now(&tv);
109fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe
110fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe		if (elapsed > ns_granularity)
111fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe			ns_granularity = elapsed;
112fd841467ce4a5875dba2d21da6851936b46fdb08Jens Axboe	}
113263e529f7d90892a610a5b26a519116fe3a675a6Jens Axboe}
1146043c5790f9978814ec25e3ea8f4d574daf6266eJens Axboe
115a2f77c9f5f01186882762264100b6d30ee77a55dJens Axboevoid set_genesis_time(void)
116a2f77c9f5f01186882762264100b6d30ee77a55dJens Axboe{
117a2f77c9f5f01186882762264100b6d30ee77a55dJens Axboe	fio_gettime(&genesis, NULL);
118a2f77c9f5f01186882762264100b6d30ee77a55dJens Axboe}
119a2f77c9f5f01186882762264100b6d30ee77a55dJens Axboe
1206043c5790f9978814ec25e3ea8f4d574daf6266eJens Axboevoid fill_start_time(struct timeval *t)
1216043c5790f9978814ec25e3ea8f4d574daf6266eJens Axboe{
1226043c5790f9978814ec25e3ea8f4d574daf6266eJens Axboe	memcpy(t, &genesis, sizeof(genesis));
1236043c5790f9978814ec25e3ea8f4d574daf6266eJens Axboe}
124