gettime-thread.c helpers.c json.c idletime.c td_error.c \
profiles/tiobench.c profiles/act.c io_u_queue.c filelock.c \
workqueue.c rate-submit.c optgroup.c helper_thread.c \
- steadystate.c zone-dist.c zbd.c dedupe.c fdp.c
+ steadystate.c zone-dist.c zbd.c dedupe.c dataplacement.c
ifdef CONFIG_LIBHDFS
HDFSFLAGS= -I $(JAVA_HOME)/include -I $(JAVA_HOME)/include/linux -I $(FIO_LIBHDFS_INCLUDE)
--- /dev/null
+/*
+ * Note: This is similar to a very basic setup
+ * of ZBD devices
+ *
+ * Specify fdp=1 (With char devices /dev/ng0n1)
+ */
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "fio.h"
+#include "file.h"
+
+#include "pshared.h"
+#include "dataplacement.h"
+
+static int fdp_ruh_info(struct thread_data *td, struct fio_file *f,
+ struct fio_ruhs_info *ruhs)
+{
+ int ret = -EINVAL;
+
+ if (!td->io_ops) {
+ log_err("fio: no ops set in fdp init?!\n");
+ return ret;
+ }
+
+ if (td->io_ops->fdp_fetch_ruhs) {
+ ret = td->io_ops->fdp_fetch_ruhs(td, f, ruhs);
+ if (ret < 0) {
+ td_verror(td, errno, "fdp fetch ruhs failed");
+ log_err("%s: fdp fetch ruhs failed (%d)\n",
+ f->file_name, errno);
+ }
+ } else {
+ log_err("%s: engine (%s) lacks fetch ruhs\n",
+ f->file_name, td->io_ops->name);
+ }
+
+ return ret;
+}
+
+static int init_ruh_info(struct thread_data *td, struct fio_file *f)
+{
+ struct fio_ruhs_info *ruhs, *tmp;
+ int i, ret;
+
+ ruhs = scalloc(1, sizeof(*ruhs) + FDP_MAX_RUHS * sizeof(*ruhs->plis));
+ if (!ruhs)
+ return -ENOMEM;
+
+ ret = fdp_ruh_info(td, f, ruhs);
+ if (ret) {
+ log_info("fio: ruh info failed for %s (%d)\n",
+ f->file_name, -ret);
+ goto out;
+ }
+
+ if (ruhs->nr_ruhs > FDP_MAX_RUHS)
+ ruhs->nr_ruhs = FDP_MAX_RUHS;
+
+ if (td->o.fdp_nrpli == 0) {
+ f->ruhs_info = ruhs;
+ return 0;
+ }
+
+ for (i = 0; i < td->o.fdp_nrpli; i++) {
+ if (td->o.fdp_plis[i] >= ruhs->nr_ruhs) {
+ ret = -EINVAL;
+ goto out;
+ }
+ }
+
+ tmp = scalloc(1, sizeof(*tmp) + ruhs->nr_ruhs * sizeof(*tmp->plis));
+ if (!tmp) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ tmp->nr_ruhs = td->o.fdp_nrpli;
+ for (i = 0; i < td->o.fdp_nrpli; i++)
+ tmp->plis[i] = ruhs->plis[td->o.fdp_plis[i]];
+ f->ruhs_info = tmp;
+out:
+ sfree(ruhs);
+ return ret;
+}
+
+int dp_init(struct thread_data *td)
+{
+ struct fio_file *f;
+ int i, ret = 0;
+
+ for_each_file(td, f, i) {
+ ret = init_ruh_info(td, f);
+ if (ret)
+ break;
+ }
+ return ret;
+}
+
+void fdp_free_ruhs_info(struct fio_file *f)
+{
+ if (!f->ruhs_info)
+ return;
+ sfree(f->ruhs_info);
+ f->ruhs_info = NULL;
+}
+
+void dp_fill_dspec_data(struct thread_data *td, struct io_u *io_u)
+{
+ struct fio_file *f = io_u->file;
+ struct fio_ruhs_info *ruhs = f->ruhs_info;
+ int dspec;
+
+ if (!ruhs || io_u->ddir != DDIR_WRITE) {
+ io_u->dtype = 0;
+ io_u->dspec = 0;
+ return;
+ }
+
+ if (td->o.fdp_pli_select == FIO_FDP_RR) {
+ if (ruhs->pli_loc >= ruhs->nr_ruhs)
+ ruhs->pli_loc = 0;
+
+ dspec = ruhs->plis[ruhs->pli_loc++];
+ } else {
+ ruhs->pli_loc = rand_between(&td->fdp_state, 0, ruhs->nr_ruhs - 1);
+ dspec = ruhs->plis[ruhs->pli_loc];
+ }
+
+ io_u->dtype = FDP_DIR_DTYPE;
+ io_u->dspec = dspec;
+}
--- /dev/null
+#ifndef FIO_DATAPLACEMENT_H
+#define FIO_DATAPLACEMENT_H
+
+#include "io_u.h"
+
+#define FDP_DIR_DTYPE 2
+#define FDP_MAX_RUHS 128
+
+/*
+ * How fio chooses what placement identifier to use next. Choice of
+ * uniformly random, or roundrobin.
+ */
+
+enum {
+ FIO_FDP_RANDOM = 0x1,
+ FIO_FDP_RR = 0x2,
+};
+
+struct fio_ruhs_info {
+ uint32_t nr_ruhs;
+ uint32_t pli_loc;
+ uint16_t plis[];
+};
+
+int dp_init(struct thread_data *td);
+void fdp_free_ruhs_info(struct fio_file *f);
+void dp_fill_dspec_data(struct thread_data *td, struct io_u *io_u);
+
+#endif /* FIO_DATAPLACEMENT_H */
#include "fio.h"
#include "verify.h"
#include "zbd_types.h"
-#include "fdp.h"
+#include "dataplacement.h"
#include "optgroup.h"
static pthread_mutex_t g_serialize = PTHREAD_MUTEX_INITIALIZER;
+++ /dev/null
-/*
- * Note: This is similar to a very basic setup
- * of ZBD devices
- *
- * Specify fdp=1 (With char devices /dev/ng0n1)
- */
-
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "fio.h"
-#include "file.h"
-
-#include "pshared.h"
-#include "fdp.h"
-
-static int fdp_ruh_info(struct thread_data *td, struct fio_file *f,
- struct fio_ruhs_info *ruhs)
-{
- int ret = -EINVAL;
-
- if (!td->io_ops) {
- log_err("fio: no ops set in fdp init?!\n");
- return ret;
- }
-
- if (td->io_ops->fdp_fetch_ruhs) {
- ret = td->io_ops->fdp_fetch_ruhs(td, f, ruhs);
- if (ret < 0) {
- td_verror(td, errno, "fdp fetch ruhs failed");
- log_err("%s: fdp fetch ruhs failed (%d)\n",
- f->file_name, errno);
- }
- } else {
- log_err("%s: engine (%s) lacks fetch ruhs\n",
- f->file_name, td->io_ops->name);
- }
-
- return ret;
-}
-
-static int init_ruh_info(struct thread_data *td, struct fio_file *f)
-{
- struct fio_ruhs_info *ruhs, *tmp;
- int i, ret;
-
- ruhs = scalloc(1, sizeof(*ruhs) + FDP_MAX_RUHS * sizeof(*ruhs->plis));
- if (!ruhs)
- return -ENOMEM;
-
- ret = fdp_ruh_info(td, f, ruhs);
- if (ret) {
- log_info("fio: ruh info failed for %s (%d)\n",
- f->file_name, -ret);
- goto out;
- }
-
- if (ruhs->nr_ruhs > FDP_MAX_RUHS)
- ruhs->nr_ruhs = FDP_MAX_RUHS;
-
- if (td->o.fdp_nrpli == 0) {
- f->ruhs_info = ruhs;
- return 0;
- }
-
- for (i = 0; i < td->o.fdp_nrpli; i++) {
- if (td->o.fdp_plis[i] >= ruhs->nr_ruhs) {
- ret = -EINVAL;
- goto out;
- }
- }
-
- tmp = scalloc(1, sizeof(*tmp) + ruhs->nr_ruhs * sizeof(*tmp->plis));
- if (!tmp) {
- ret = -ENOMEM;
- goto out;
- }
-
- tmp->nr_ruhs = td->o.fdp_nrpli;
- for (i = 0; i < td->o.fdp_nrpli; i++)
- tmp->plis[i] = ruhs->plis[td->o.fdp_plis[i]];
- f->ruhs_info = tmp;
-out:
- sfree(ruhs);
- return ret;
-}
-
-int fdp_init(struct thread_data *td)
-{
- struct fio_file *f;
- int i, ret = 0;
-
- for_each_file(td, f, i) {
- ret = init_ruh_info(td, f);
- if (ret)
- break;
- }
- return ret;
-}
-
-void fdp_free_ruhs_info(struct fio_file *f)
-{
- if (!f->ruhs_info)
- return;
- sfree(f->ruhs_info);
- f->ruhs_info = NULL;
-}
-
-void fdp_fill_dspec_data(struct thread_data *td, struct io_u *io_u)
-{
- struct fio_file *f = io_u->file;
- struct fio_ruhs_info *ruhs = f->ruhs_info;
- int dspec;
-
- if (!ruhs || io_u->ddir != DDIR_WRITE) {
- io_u->dtype = 0;
- io_u->dspec = 0;
- return;
- }
-
- if (td->o.fdp_pli_select == FIO_FDP_RR) {
- if (ruhs->pli_loc >= ruhs->nr_ruhs)
- ruhs->pli_loc = 0;
-
- dspec = ruhs->plis[ruhs->pli_loc++];
- } else {
- ruhs->pli_loc = rand_between(&td->fdp_state, 0, ruhs->nr_ruhs - 1);
- dspec = ruhs->plis[ruhs->pli_loc];
- }
-
- io_u->dtype = FDP_DIR_DTYPE;
- io_u->dspec = dspec;
-}
+++ /dev/null
-#ifndef FIO_FDP_H
-#define FIO_FDP_H
-
-#include "io_u.h"
-
-#define FDP_DIR_DTYPE 2
-#define FDP_MAX_RUHS 128
-
-/*
- * How fio chooses what placement identifier to use next. Choice of
- * uniformly random, or roundrobin.
- */
-
-enum {
- FIO_FDP_RANDOM = 0x1,
- FIO_FDP_RR = 0x2,
-};
-
-struct fio_ruhs_info {
- uint32_t nr_ruhs;
- uint32_t pli_loc;
- uint16_t plis[];
-};
-
-int fdp_init(struct thread_data *td);
-void fdp_free_ruhs_info(struct fio_file *f);
-void fdp_fill_dspec_data(struct thread_data *td, struct io_u *io_u);
-
-#endif /* FIO_FDP_H */
td_restore_runstate(td, old_state);
if (td->o.fdp) {
- err = fdp_init(td);
+ err = dp_init(td);
if (err)
goto err_out;
}
}
if (td->o.fdp)
- fdp_fill_dspec_data(td, io_u);
+ dp_fill_dspec_data(td, io_u);
if (io_u->offset + io_u->buflen > io_u->file->real_file_size) {
dprint(FD_IO, "io_u %p, off=0x%llx + len=0x%llx exceeds file size=0x%llx\n",
#include "flist.h"
#include "io_u.h"
#include "zbd_types.h"
-#include "fdp.h"
+#include "dataplacement.h"
#define FIO_IOOPS_VERSION 34