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