projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
examples: Small updates to nbd.fio
[fio.git]
/
time.c
diff --git
a/time.c
b/time.c
index 279ee48492302ebd5a1080e5422cc48ecd6b7a59..5c4d6de0399c5cc681e9ca362c019870baf9db98 100644
(file)
--- a/
time.c
+++ b/
time.c
@@
-3,23
+3,23
@@
#include "fio.h"
#include "fio.h"
-static struct time
val
genesis;
+static struct time
spec
genesis;
static unsigned long ns_granularity;
static unsigned long ns_granularity;
-void time
val_add_msec(struct timeval *tv
, unsigned int msec)
+void time
spec_add_msec(struct timespec *ts
, unsigned int msec)
{
{
- u
nsigned long adj_usec = 1000
* msec;
+ u
int64_t adj_nsec = 1000000ULL
* msec;
- t
v->tv_usec += adj_u
sec;
- if (adj_
usec >= 1
000000) {
- u
nsigned long adj_sec = adj_usec / 1
000000;
+ t
s->tv_nsec += adj_n
sec;
+ if (adj_
nsec >= 1000
000000) {
+ u
int64_t adj_sec = adj_nsec / 1000
000000;
- t
v->tv_usec -= adj_sec * 1
000000;
- t
v
->tv_sec += adj_sec;
+ t
s->tv_nsec -= adj_sec * 1000
000000;
+ t
s
->tv_sec += adj_sec;
}
}
- if (t
v->tv_usec >= 1
000000){
- t
v->tv_usec -= 1
000000;
- t
v
->tv_sec++;
+ if (t
s->tv_nsec >= 1000
000000){
+ t
s->tv_nsec -= 1000
000000;
+ t
s
->tv_sec++;
}
}
}
}
@@
-28,7
+28,7
@@
void timeval_add_msec(struct timeval *tv, unsigned int msec)
*/
uint64_t usec_spin(unsigned int usec)
{
*/
uint64_t usec_spin(unsigned int usec)
{
- struct time
val
start;
+ struct time
spec
start;
uint64_t t;
fio_gettime(&start, NULL);
uint64_t t;
fio_gettime(&start, NULL);
@@
-41,7
+41,7
@@
uint64_t usec_spin(unsigned int usec)
uint64_t usec_sleep(struct thread_data *td, unsigned long usec)
{
struct timespec req;
uint64_t usec_sleep(struct thread_data *td, unsigned long usec)
{
struct timespec req;
- struct time
val
tv;
+ struct time
spec
tv;
uint64_t t = 0;
do {
uint64_t t = 0;
do {
@@
-57,6
+57,13
@@
uint64_t usec_sleep(struct thread_data *td, unsigned long usec)
if (ts >= 1000000) {
req.tv_sec = ts / 1000000;
ts -= 1000000 * req.tv_sec;
if (ts >= 1000000) {
req.tv_sec = ts / 1000000;
ts -= 1000000 * req.tv_sec;
+ /*
+ * Limit sleep to ~1 second at most, otherwise we
+ * don't notice then someone signaled the job to
+ * exit manually.
+ */
+ if (req.tv_sec > 1)
+ req.tv_sec = 1;
} else
req.tv_sec = 0;
} else
req.tv_sec = 0;
@@
-97,31
+104,38
@@
bool in_ramp_time(struct thread_data *td)
return td->o.ramp_time && !td->ramp_time_over;
}
return td->o.ramp_time && !td->ramp_time_over;
}
-static
void
parent_update_ramp(struct thread_data *td)
+static
bool
parent_update_ramp(struct thread_data *td)
{
struct thread_data *parent = td->parent;
if (!parent || parent->ramp_time_over)
{
struct thread_data *parent = td->parent;
if (!parent || parent->ramp_time_over)
- return;
+ return
false
;
reset_all_stats(parent);
reset_all_stats(parent);
- parent->ramp_time_over =
1
;
+ parent->ramp_time_over =
true
;
td_set_runstate(parent, TD_RAMP);
td_set_runstate(parent, TD_RAMP);
+ return true;
}
bool ramp_time_over(struct thread_data *td)
{
}
bool ramp_time_over(struct thread_data *td)
{
- struct timeval tv;
-
if (!td->o.ramp_time || td->ramp_time_over)
return true;
if (!td->o.ramp_time || td->ramp_time_over)
return true;
- fio_gettime(&tv, NULL);
- if (utime_since(&td->epoch, &tv) >= td->o.ramp_time) {
- td->ramp_time_over = 1;
+ if (utime_since_now(&td->epoch) >= td->o.ramp_time) {
+ td->ramp_time_over = true;
reset_all_stats(td);
reset_all_stats(td);
+ reset_io_stats(td);
td_set_runstate(td, TD_RAMP);
td_set_runstate(td, TD_RAMP);
- parent_update_ramp(td);
+
+ /*
+ * If we have a parent, the parent isn't doing IO. Hence
+ * the parent never enters do_io(), which will switch us
+ * from RAMP -> RUNNING. Do this manually here.
+ */
+ if (parent_update_ramp(td))
+ td_set_runstate(td, TD_RUNNING);
+
return true;
}
return true;
}
@@
-138,8
+152,7
@@
void fio_time_init(void)
* Check the granularity of the nanosleep function
*/
for (i = 0; i < 10; i++) {
* Check the granularity of the nanosleep function
*/
for (i = 0; i < 10; i++) {
- struct timeval tv;
- struct timespec ts;
+ struct timespec tv, ts;
unsigned long elapsed;
fio_gettime(&tv, NULL);
unsigned long elapsed;
fio_gettime(&tv, NULL);
@@
-159,18
+172,18
@@
void set_genesis_time(void)
fio_gettime(&genesis, NULL);
}
fio_gettime(&genesis, NULL);
}
-void set_epoch_time(struct thread_data *td, int log_
unix_epoch
)
+void set_epoch_time(struct thread_data *td, int log_
alternate_epoch, clockid_t clock_id
)
{
fio_gettime(&td->epoch, NULL);
{
fio_gettime(&td->epoch, NULL);
- if (log_
unix
_epoch) {
- struct time
val tv
;
-
gettimeofday(&tv, NULL
);
- td->
unix_epoch = (unsigned long long)(tv
.tv_sec) * 1000 +
- (unsigned long long)(t
v.tv_usec) / 1
000;
+ if (log_
alternate
_epoch) {
+ struct time
spec ts
;
+
clock_gettime(clock_id, &ts
);
+ td->
alternate_epoch = (unsigned long long)(ts
.tv_sec) * 1000 +
+ (unsigned long long)(t
s.tv_nsec) / 1000
000;
}
}
}
}
-void fill_start_time(struct time
val
*t)
+void fill_start_time(struct time
spec
*t)
{
memcpy(t, &genesis, sizeof(genesis));
}
{
memcpy(t, &genesis, sizeof(genesis));
}