projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
RDMA I/O engine: Fix compiler warnings
[fio.git]
/
log.c
diff --git
a/log.c
b/log.c
index ba52f0768744df5ea19cec1c2758a399e0cc8db9..f962864d912d9b5cdc3bfbc39286241fdd717665 100644
(file)
--- a/
log.c
+++ b/
log.c
@@
-9,6
+9,7
@@
#include "flist.h"
#include "fio.h"
#include "verify.h"
#include "flist.h"
#include "fio.h"
#include "verify.h"
+#include "trim.h"
static const char iolog_ver2[] = "fio version 2 iolog";
static const char iolog_ver2[] = "fio version 2 iolog";
@@
-20,9
+21,10
@@
void queue_io_piece(struct thread_data *td, struct io_piece *ipo)
void log_io_u(struct thread_data *td, struct io_u *io_u)
{
void log_io_u(struct thread_data *td, struct io_u *io_u)
{
- const char *act[] = { "read", "write", "sync", "datasync" };
+ const char *act[] = { "read", "write", "sync", "datasync",
+ "sync_file_range", "wait", "trim" };
- assert(io_u->ddir <
3
);
+ assert(io_u->ddir <
= 6
);
if (!td->o.write_iolog_file)
return;
if (!td->o.write_iolog_file)
return;
@@
-114,6
+116,7
@@
int read_iolog_get(struct thread_data *td, struct io_u *io_u)
ipo = flist_entry(td->io_log_list.next, struct io_piece, list);
flist_del(&ipo->list);
ipo = flist_entry(td->io_log_list.next, struct io_piece, list);
flist_del(&ipo->list);
+ remove_trim_entry(td, ipo);
ret = ipo_special(td, ipo);
if (ret < 0) {
ret = ipo_special(td, ipo);
if (ret < 0) {
@@
-130,10
+133,10
@@
int read_iolog_get(struct thread_data *td, struct io_u *io_u)
io_u->buflen = ipo->len;
io_u->file = td->files[ipo->fileno];
get_file(io_u->file);
io_u->buflen = ipo->len;
io_u->file = td->files[ipo->fileno];
get_file(io_u->file);
-
dprint(FD_IO, "iolog: get %llu/%lu/%s\n", io_u->offset,
io_u->buflen, io_u->file->file_name);
dprint(FD_IO, "iolog: get %llu/%lu/%s\n", io_u->offset,
io_u->buflen, io_u->file->file_name);
- if (ipo->delay) iolog_delay(td, ipo->delay);
+ if (ipo->delay)
+ iolog_delay(td, ipo->delay);
} else {
elapsed = mtime_since_genesis();
if (ipo->delay > elapsed)
} else {
elapsed = mtime_since_genesis();
if (ipo->delay > elapsed)
@@
-143,7
+146,7
@@
int read_iolog_get(struct thread_data *td, struct io_u *io_u)
free(ipo);
free(ipo);
- if (i
po
->ddir != DDIR_WAIT)
+ if (i
o_u
->ddir != DDIR_WAIT)
return 0;
}
return 0;
}
@@
-159,12
+162,16
@@
void prune_io_piece_log(struct thread_data *td)
while ((n = rb_first(&td->io_hist_tree)) != NULL) {
ipo = rb_entry(n, struct io_piece, rb_node);
rb_erase(n, &td->io_hist_tree);
while ((n = rb_first(&td->io_hist_tree)) != NULL) {
ipo = rb_entry(n, struct io_piece, rb_node);
rb_erase(n, &td->io_hist_tree);
+ remove_trim_entry(td, ipo);
+ td->io_hist_len--;
free(ipo);
}
while (!flist_empty(&td->io_hist_list)) {
ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
flist_del(&ipo->list);
free(ipo);
}
while (!flist_empty(&td->io_hist_list)) {
ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
flist_del(&ipo->list);
+ remove_trim_entry(td, ipo);
+ td->io_hist_len--;
free(ipo);
}
}
free(ipo);
}
}
@@
-178,10
+185,16
@@
void log_io_piece(struct thread_data *td, struct io_u *io_u)
struct io_piece *ipo, *__ipo;
ipo = malloc(sizeof(struct io_piece));
struct io_piece *ipo, *__ipo;
ipo = malloc(sizeof(struct io_piece));
+ init_ipo(ipo);
ipo->file = io_u->file;
ipo->offset = io_u->offset;
ipo->len = io_u->buflen;
ipo->file = io_u->file;
ipo->offset = io_u->offset;
ipo->len = io_u->buflen;
+ if (io_u_should_trim(td, io_u)) {
+ flist_add_tail(&ipo->trim_list, &td->trim_list);
+ td->trim_entries++;
+ }
+
/*
* We don't need to sort the entries, if:
*
/*
* We don't need to sort the entries, if:
*
@@
-200,6
+213,8
@@
void log_io_piece(struct thread_data *td, struct io_u *io_u)
(file_randommap(td, ipo->file) || td->o.verify == VERIFY_NONE)) {
INIT_FLIST_HEAD(&ipo->list);
flist_add_tail(&ipo->list, &td->io_hist_list);
(file_randommap(td, ipo->file) || td->o.verify == VERIFY_NONE)) {
INIT_FLIST_HEAD(&ipo->list);
flist_add_tail(&ipo->list, &td->io_hist_list);
+ ipo->flags |= IP_F_ONLIST;
+ td->io_hist_len++;
return;
}
return;
}
@@
-215,19
+230,28
@@
restart:
parent = *p;
__ipo = rb_entry(parent, struct io_piece, rb_node);
parent = *p;
__ipo = rb_entry(parent, struct io_piece, rb_node);
- if (ipo->offset < __ipo->offset)
+ if (ipo->file < __ipo->file)
+ p = &(*p)->rb_left;
+ else if (ipo->file > __ipo->file)
+ p = &(*p)->rb_right;
+ else if (ipo->offset < __ipo->offset)
p = &(*p)->rb_left;
else if (ipo->offset > __ipo->offset)
p = &(*p)->rb_right;
else {
assert(ipo->len == __ipo->len);
p = &(*p)->rb_left;
else if (ipo->offset > __ipo->offset)
p = &(*p)->rb_right;
else {
assert(ipo->len == __ipo->len);
+ td->io_hist_len--;
rb_erase(parent, &td->io_hist_tree);
rb_erase(parent, &td->io_hist_tree);
+ remove_trim_entry(td, __ipo);
+ free(__ipo);
goto restart;
}
}
rb_link_node(&ipo->rb_node, parent, p);
rb_insert_color(&ipo->rb_node, &td->io_hist_tree);
goto restart;
}
}
rb_link_node(&ipo->rb_node, parent, p);
rb_insert_color(&ipo->rb_node, &td->io_hist_tree);
+ ipo->flags |= IP_F_ONRB;
+ td->io_hist_len++;
}
void write_iolog_close(struct thread_data *td)
}
void write_iolog_close(struct thread_data *td)
@@
-283,6
+307,8
@@
static int read_iolog2(struct thread_data *td, FILE *f)
rw = DDIR_SYNC;
else if (!strcmp(act, "datasync"))
rw = DDIR_DATASYNC;
rw = DDIR_SYNC;
else if (!strcmp(act, "datasync"))
rw = DDIR_DATASYNC;
+ else if (!strcmp(act, "trim"))
+ rw = DDIR_TRIM;
else {
log_err("fio: bad iolog file action: %s\n",
act);
else {
log_err("fio: bad iolog file action: %s\n",
act);
@@
-332,8
+358,7
@@
static int read_iolog2(struct thread_data *td, FILE *f)
* Make note of file
*/
ipo = malloc(sizeof(*ipo));
* Make note of file
*/
ipo = malloc(sizeof(*ipo));
- memset(ipo, 0, sizeof(*ipo));
- INIT_FLIST_HEAD(&ipo->list);
+ init_ipo(ipo);
ipo->ddir = rw;
if (rw == DDIR_WAIT) {
ipo->delay = offset;
ipo->ddir = rw;
if (rw == DDIR_WAIT) {
ipo->delay = offset;
@@
-390,6
+415,7
@@
static int init_iolog_read(struct thread_data *td)
if (!p) {
td_verror(td, errno, "iolog read");
log_err("fio: unable to read iolog\n");
if (!p) {
td_verror(td, errno, "iolog read");
log_err("fio: unable to read iolog\n");
+ fclose(f);
return 1;
}
return 1;
}
@@
-409,7
+435,7
@@
static int init_iolog_read(struct thread_data *td)
}
/*
}
/*
- * Setup a log for storing io patterns.
+ * Set
up a log for storing io patterns.
*/
static int init_iolog_write(struct thread_data *td)
{
*/
static int init_iolog_write(struct thread_data *td)
{