projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
file: unionize lfsr/randommap
[fio.git]
/
iolog.c
diff --git
a/iolog.c
b/iolog.c
index 3b39f4c6ba6e5f8c919bd7c00d06d3235cb3feb4..99f8bc18d8694cca0c141c51d116aced1b4130f2 100644
(file)
--- a/
iolog.c
+++ b/
iolog.c
@@
-28,19
+28,14
@@
void queue_io_piece(struct thread_data *td, struct io_piece *ipo)
td->total_io_size += ipo->len;
}
td->total_io_size += ipo->len;
}
-void log_io_u(
struct thread_data *td,
struct io_u *io_u)
+void log_io_u(
const struct thread_data *td, const
struct io_u *io_u)
{
{
- const char *act[] = { "read", "write", "sync", "datasync",
- "sync_file_range", "wait", "trim" };
-
- assert(io_u->ddir <= 6);
-
if (!td->o.write_iolog_file)
return;
fprintf(td->iolog_f, "%s %s %llu %lu\n", io_u->file->file_name,
if (!td->o.write_iolog_file)
return;
fprintf(td->iolog_f, "%s %s %llu %lu\n", io_u->file->file_name,
-
act[io_u->ddir], io_u->offset
,
- io_u->buflen);
+
io_ddir_name(io_u->ddir)
,
+ io_u->
offset, io_u->
buflen);
}
void log_file(struct thread_data *td, struct fio_file *f,
}
void log_file(struct thread_data *td, struct fio_file *f,
@@
-65,20
+60,22
@@
void log_file(struct thread_data *td, struct fio_file *f,
static void iolog_delay(struct thread_data *td, unsigned long delay)
{
static void iolog_delay(struct thread_data *td, unsigned long delay)
{
- unsigned long usec = utime_since_now(&td->last_issue);
- unsigned long this_delay;
+ uint64_t usec = utime_since_now(&td->last_issue);
+ uint64_t this_delay;
+ struct timeval tv;
+
+ if (delay < td->time_offset) {
+ td->time_offset = 0;
+ return;
+ }
+ delay -= td->time_offset;
if (delay < usec)
return;
delay -= usec;
if (delay < usec)
return;
delay -= usec;
- /*
- * less than 100 usec delay, just regard it as noise
- */
- if (delay < 100)
- return;
-
+ fio_gettime(&tv, NULL);
while (delay && !td->terminate) {
this_delay = delay;
if (this_delay > 500000)
while (delay && !td->terminate) {
this_delay = delay;
if (this_delay > 500000)
@@
-87,6
+84,12
@@
static void iolog_delay(struct thread_data *td, unsigned long delay)
usec_sleep(td, this_delay);
delay -= this_delay;
}
usec_sleep(td, this_delay);
delay -= this_delay;
}
+
+ usec = utime_since_now(&tv);
+ if (usec > delay)
+ td->time_offset = usec - delay;
+ else
+ td->time_offset = 0;
}
static int ipo_special(struct thread_data *td, struct io_piece *ipo)
}
static int ipo_special(struct thread_data *td, struct io_piece *ipo)
@@
-113,7
+116,7
@@
static int ipo_special(struct thread_data *td, struct io_piece *ipo)
td_io_close_file(td, f);
break;
case FIO_LOG_UNLINK_FILE:
td_io_close_file(td, f);
break;
case FIO_LOG_UNLINK_FILE:
-
unlink(f->file_name
);
+
td_io_unlink_file(td, f
);
break;
default:
log_err("fio: bad file action %d\n", ipo->file_action);
break;
default:
log_err("fio: bad file action %d\n", ipo->file_action);
@@
-184,7
+187,7
@@
void prune_io_piece_log(struct thread_data *td)
}
while (!flist_empty(&td->io_hist_list)) {
}
while (!flist_empty(&td->io_hist_list)) {
- ipo = flist_entry(&td->io_hist_list, struct io_piece, list);
+ ipo = flist_
first_
entry(&td->io_hist_list, struct io_piece, list);
flist_del(&ipo->list);
remove_trim_entry(td, ipo);
td->io_hist_len--;
flist_del(&ipo->list);
remove_trim_entry(td, ipo);
td->io_hist_len--;
@@
-293,7
+296,7
@@
void unlog_io_piece(struct thread_data *td, struct io_u *io_u)
td->io_hist_len--;
}
td->io_hist_len--;
}
-void trim_io_piece(struct thread_data *td, struct io_u *io_u)
+void trim_io_piece(struct thread_data *td,
const
struct io_u *io_u)
{
struct io_piece *ipo = io_u->ipo;
{
struct io_piece *ipo = io_u->ipo;
@@
-550,9
+553,9
@@
int init_iolog(struct thread_data *td)
void setup_log(struct io_log **log, struct log_params *p,
const char *filename)
{
void setup_log(struct io_log **log, struct log_params *p,
const char *filename)
{
- struct io_log *l
= malloc(sizeof(*l))
;
+ struct io_log *l;
-
memset(l, 0
, sizeof(*l));
+
l = calloc(1
, sizeof(*l));
l->nr_samples = 0;
l->max_samples = 1024;
l->log_type = p->log_type;
l->nr_samples = 0;
l->max_samples = 1024;
l->log_type = p->log_type;
@@
-735,6
+738,11
@@
static void finish_chunk(z_stream *stream, FILE *f,
static size_t inflate_chunk(struct iolog_compress *ic, int gz_hdr, FILE *f,
z_stream *stream, struct inflate_chunk_iter *iter)
{
static size_t inflate_chunk(struct iolog_compress *ic, int gz_hdr, FILE *f,
z_stream *stream, struct inflate_chunk_iter *iter)
{
+ size_t ret;
+
+ dprint(FD_COMPRESS, "inflate chunk size=%lu, seq=%u",
+ (unsigned long) ic->len, ic->seq);
+
if (ic->seq != iter->seq) {
if (iter->seq)
finish_chunk(stream, f, iter);
if (ic->seq != iter->seq) {
if (iter->seq)
finish_chunk(stream, f, iter);
@@
-777,7
+785,11
@@
static size_t inflate_chunk(struct iolog_compress *ic, int gz_hdr, FILE *f,
break;
}
break;
}
- return (void *) stream->next_in - ic->buf;
+ ret = (void *) stream->next_in - ic->buf;
+
+ dprint(FD_COMPRESS, "inflated to size=%lu\n", (unsigned long) ret);
+
+ return ret;
}
/*
}
/*
@@
-798,6
+810,9
@@
static int inflate_gz_chunks(struct io_log *log, FILE *f)
if (log->log_gz_store) {
size_t ret;
if (log->log_gz_store) {
size_t ret;
+ dprint(FD_COMPRESS, "log write chunk size=%lu, "
+ "seq=%u\n", (unsigned long) ic->len, ic->seq);
+
ret = fwrite(ic->buf, ic->len, 1, f);
if (ret != 1 || ferror(f)) {
iter.err = errno;
ret = fwrite(ic->buf, ic->len, 1, f);
if (ret != 1 || ferror(f)) {
iter.err = errno;
@@
-870,18
+885,18
@@
int iolog_file_inflate(const char *file)
*/
total = ic.len;
do {
*/
total = ic.len;
do {
- size_t ret;
+ size_t
i
ret;
- ret = inflate_chunk(&ic, 1, stdout, &stream, &iter);
- total -= ret;
+
i
ret = inflate_chunk(&ic, 1, stdout, &stream, &iter);
+ total -=
i
ret;
if (!total)
break;
if (iter.err)
break;
ic.seq++;
if (!total)
break;
if (iter.err)
break;
ic.seq++;
- ic.len -= ret;
- ic.buf += ret;
+ ic.len -=
i
ret;
+ ic.buf +=
i
ret;
} while (1);
if (iter.seq) {
} while (1);
if (iter.seq) {
@@
-986,6
+1001,8
@@
static int gz_work(struct tp_work *work)
stream.next_in = (void *) data->samples;
stream.avail_in = data->nr_samples * log_entry_sz(data->log);
stream.next_in = (void *) data->samples;
stream.avail_in = data->nr_samples * log_entry_sz(data->log);
+ dprint(FD_COMPRESS, "deflate input size=%lu, seq=%u\n",
+ (unsigned long) stream.avail_in, seq);
do {
c = get_new_chunk(seq);
stream.avail_out = GZ_CHUNK;
do {
c = get_new_chunk(seq);
stream.avail_out = GZ_CHUNK;
@@
-1015,10
+1032,13
@@
static int gz_work(struct tp_work *work)
stream.next_out = c->buf;
ret = deflate(&stream, Z_FINISH);
c->len = GZ_CHUNK - stream.avail_out;
stream.next_out = c->buf;
ret = deflate(&stream, Z_FINISH);
c->len = GZ_CHUNK - stream.avail_out;
+ total += c->len;
flist_add_tail(&c->list, &list);
} while (ret != Z_STREAM_END);
}
flist_add_tail(&c->list, &list);
} while (ret != Z_STREAM_END);
}
+ dprint(FD_COMPRESS, "deflated to size=%lu\n", (unsigned long) total);
+
ret = deflateEnd(&stream);
if (ret != Z_OK)
log_err("fio: deflateEnd %d\n", ret);
ret = deflateEnd(&stream);
if (ret != Z_OK)
log_err("fio: deflateEnd %d\n", ret);
@@
-1087,6
+1107,7
@@
int iolog_flush(struct io_log *log, int wait)
} else
data->work.wait = 0;
} else
data->work.wait = 0;
+ data->work.prio = 1;
tp_queue_work(tdat, &data->work);
if (wait) {
tp_queue_work(tdat, &data->work);
if (wait) {