Skip to content

Commit

Permalink
configure: new --dynamic-libengines build option
Browse files Browse the repository at this point in the history
When enabled, some of the more dependency-heavy internal engines are
converted to "plugin" engines, i.e. they are built into separate object
files and are loaded by fio on demand.
This helps downstream distros package these engines separately and not
force a long list of package dependencies from the base fio package.

Signed-off-by: Yigal Korman <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
ykorman authored and axboe committed Jul 3, 2020
1 parent 439c45a commit 5a8a6a0
Show file tree
Hide file tree
Showing 19 changed files with 121 additions and 49 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
*.d
*.o
*.so
*.exe
/.depend
/FIO-VERSION-FILE
Expand Down
92 changes: 65 additions & 27 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,17 @@ ifdef CONFIG_LIBHDFS
endif

ifdef CONFIG_LIBISCSI
CFLAGS := $(LIBISCSI_CFLAGS) $(CFLAGS)
LIBS += $(LIBISCSI_LIBS)
SOURCE += engines/libiscsi.c
iscsi_SRCS = engines/libiscsi.c
iscsi_LIBS = $(LIBISCSI_LIBS)
iscsi_CFLAGS = $(LIBISCSI_LIBS)
ENGINES += iscsi
endif

ifdef CONFIG_LIBNBD
CFLAGS := $(LIBNBD_CFLAGS) $(CFLAGS)
LIBS += $(LIBNBD_LIBS)
SOURCE += engines/nbd.c
nbd_SRCS = engines/nbd.c
nbd_LIBS = $(LIBNBD_LIBS)
nbd_CFLAGS = $(LIBNBD_CFLAGS)
ENGINES += nbd
endif

ifdef CONFIG_64BIT
Expand All @@ -78,16 +80,19 @@ ifdef CONFIG_32BIT
CFLAGS := -DBITS_PER_LONG=32 $(CFLAGS)
endif
ifdef CONFIG_LIBAIO
SOURCE += engines/libaio.c
aio_SRCS = engines/libaio.c
aio_LIBS = -laio
ifdef CONFIG_LIBAIO_URING
LIBS += -luring
aio_LIBS = -luring
else
LIBS += -laio
aio_LIBS = -laio
endif
ENGINES += aio
endif
ifdef CONFIG_RDMA
SOURCE += engines/rdma.c
LIBS += -libverbs -lrdmacm
rdma_SRCS = engines/rdma.c
rdma_LIBS = -libverbs -lrdmacm
ENGINES += rdma
endif
ifdef CONFIG_POSIXAIO
SOURCE += engines/posixaio.c
Expand All @@ -102,7 +107,8 @@ ifdef CONFIG_LINUX_SPLICE
SOURCE += engines/splice.c
endif
ifdef CONFIG_GUASI
SOURCE += engines/guasi.c
guasi_SRCS = engines/guasi.c
ENGINES += guasi
endif
ifdef CONFIG_SOLARISAIO
SOURCE += engines/solarisaio.c
Expand All @@ -111,16 +117,19 @@ ifdef CONFIG_WINDOWSAIO
SOURCE += engines/windowsaio.c
endif
ifdef CONFIG_RADOS
SOURCE += engines/rados.c
LIBS += -lrados
rados_SRCS = engines/rados.c
rados_LIBS = -lrados
ENGINES += rados
endif
ifdef CONFIG_RBD
SOURCE += engines/rbd.c
LIBS += -lrbd -lrados
rbd_SRCS = engines/rbd.c
rbd_LIBS = -lrbd -lrados
ENGINES += rbd
endif
ifdef CONFIG_HTTP
SOURCE += engines/http.c
LIBS += -lcurl -lssl -lcrypto
http_SRCS = engines/http.c
http_LIBS = -lcurl -lssl -lcrypto
ENGINES += http
endif
SOURCE += oslib/asprintf.c
ifndef CONFIG_STRSEP
Expand Down Expand Up @@ -159,23 +168,27 @@ ifdef CONFIG_MTD
SOURCE += oslib/libmtd_legacy.c
endif
ifdef CONFIG_PMEMBLK
SOURCE += engines/pmemblk.c
LIBS += -lpmemblk
pmemblk_SRCS = engines/pmemblk.c
pmemblk_LIBS = -lpmemblk
ENGINES += pmemblk
endif
ifdef CONFIG_LINUX_DEVDAX
SOURCE += engines/dev-dax.c
LIBS += -lpmem
devdax_SRCS = engines/dev-dax.c
devdax_LIBS = -lpmem
ENGINES += dev-dax
endif
ifdef CONFIG_LIBPMEM
SOURCE += engines/libpmem.c
LIBS += -lpmem
pmem_SRCS = engines/libpmem.c
pmem_LIBS = -lpmem
ENGINES += pmem
endif
ifdef CONFIG_IME
SOURCE += engines/ime.c
endif
ifdef CONFIG_LIBZBC
SOURCE += engines/libzbc.c
LIBS += -lzbc
zbc_SRCS = engines/libzbc.c
zbc_LIBS = -lzbc
ENGINES += zbc
endif

ifeq ($(CONFIG_TARGET_OS), Linux)
Expand Down Expand Up @@ -237,6 +250,26 @@ ifneq (,$(findstring CYGWIN,$(CONFIG_TARGET_OS)))
CFLAGS := -DPSAPI_VERSION=1 -Ios/windows/posix/include -Wno-format $(CFLAGS)
endif

ifdef CONFIG_DYNAMIC_ENGINES
DYNAMIC_ENGS := $(ENGINES)
define engine_template =
$(1)_OBJS := $$($(1)_SRCS:.c=.o)
$$($(1)_OBJS): CFLAGS := -fPIC $$($(1)_CFLAGS) $(CFLAGS)
engines/lib$(1).so: $$($(1)_OBJS)
$$(QUIET_LINK)$(CC) -shared -rdynamic -fPIC -Wl,-soname,lib$(1).so.1 $$($(1)_LIBS) -o $$@ $$<
ENGS_OBJS += engines/lib$(1).so
all install: $(ENGS_OBJS)
endef
else # !CONFIG_DYNAMIC_ENGINES
define engine_template =
SOURCE += $$($(1)_SRCS)
LIBS += $$($(1)_LIBS)
CFLAGS := $$($(1)_CFLAGS) $(CFLAGS)
endef
endif

$(foreach eng,$(ENGINES),$(eval $(call engine_template,$(eng))))

OBJS := $(SOURCE:.c=.o)

FIO_OBJS = $(OBJS) fio.o
Expand Down Expand Up @@ -388,6 +421,7 @@ else
endif
prefix = $(INSTALL_PREFIX)
bindir = $(prefix)/bin
libdir = $(prefix)/lib/fio

ifeq ($(CONFIG_TARGET_OS), Darwin)
mandir = /usr/share/man
Expand Down Expand Up @@ -536,7 +570,7 @@ unittests/unittest: $(UT_OBJS) $(UT_TARGET_OBJS)
endif

clean: FORCE
@rm -f .depend $(FIO_OBJS) $(GFIO_OBJS) $(OBJS) $(T_OBJS) $(UT_OBJS) $(PROGS) $(T_PROGS) $(T_TEST_PROGS) core.* core gfio unittests/unittest FIO-VERSION-FILE *.[do] lib/*.d oslib/*.[do] crc/*.d engines/*.[do] profiles/*.[do] t/*.[do] unittests/*.[do] unittests/*/*.[do] config-host.mak config-host.h y.tab.[ch] lex.yy.c exp/*.[do] lexer.h
@rm -f .depend $(FIO_OBJS) $(GFIO_OBJS) $(OBJS) $(T_OBJS) $(UT_OBJS) $(PROGS) $(T_PROGS) $(T_TEST_PROGS) core.* core gfio unittests/unittest FIO-VERSION-FILE *.[do] lib/*.d oslib/*.[do] crc/*.d engines/*.[do] engines/*.so profiles/*.[do] t/*.[do] unittests/*.[do] unittests/*/*.[do] config-host.mak config-host.h y.tab.[ch] lex.yy.c exp/*.[do] lexer.h
@rm -f t/fio-btrace2fio t/io_uring t/read-to-pipe-async
@rm -rf doc/output

Expand Down Expand Up @@ -576,6 +610,10 @@ fulltest:
install: $(PROGS) $(SCRIPTS) tools/plot/fio2gnuplot.1 FORCE
$(INSTALL) -m 755 -d $(DESTDIR)$(bindir)
$(INSTALL) $(PROGS) $(SCRIPTS) $(DESTDIR)$(bindir)
ifdef CONFIG_DYNAMIC_ENGINES
$(INSTALL) -m 755 -d $(DESTDIR)$(libdir)
$(INSTALL) -m 755 $(SRCDIR)/engines/*.so $(DESTDIR)$(libdir)
endif
$(INSTALL) -m 755 -d $(DESTDIR)$(mandir)/man1
$(INSTALL) -m 644 $(SRCDIR)/fio.1 $(DESTDIR)$(mandir)/man1
$(INSTALL) -m 644 $(SRCDIR)/tools/fio_generate_plots.1 $(DESTDIR)$(mandir)/man1
Expand Down
8 changes: 8 additions & 0 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ march_set="no"
libiscsi="no"
libnbd="no"
libaio_uring="no"
dynamic_engines="no"
prefix=/usr/local

# parse options
Expand Down Expand Up @@ -215,6 +216,8 @@ for opt do
;;
--enable-libaio-uring) libaio_uring="yes"
;;
--dynamic-libengines) dynamic_engines="yes"
;;
--help)
show_help="yes"
;;
Expand Down Expand Up @@ -254,6 +257,7 @@ if test "$show_help" = "yes" ; then
echo "--enable-libnbd Enable libnbd (NBD engine) support"
echo "--disable-tcmalloc Disable tcmalloc support"
echo "--enable-libaio-uring Enable libaio emulated over io_uring"
echo "--dynamic-libengines Lib-based ioengines as dynamic libraries"
exit $exit_val
fi

Expand Down Expand Up @@ -2954,6 +2958,10 @@ if test "$libnbd" = "yes" ; then
echo "LIBNBD_CFLAGS=$libnbd_cflags" >> $config_host_mak
echo "LIBNBD_LIBS=$libnbd_libs" >> $config_host_mak
fi
if test "$dynamic_engines" = "yes" ; then
output_sym "CONFIG_DYNAMIC_ENGINES"
fi
print_config "Lib-based ioengines dynamic" "$dynamic_engines"
cat > $TMPC << EOF
int main(int argc, char **argv)
{
Expand Down
2 changes: 1 addition & 1 deletion engines/dev-dax.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ fio_devdax_get_file_size(struct thread_data *td, struct fio_file *f)
return 0;
}

static struct ioengine_ops ioengine = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "dev-dax",
.version = FIO_IOOPS_VERSION,
.init = fio_devdax_init,
Expand Down
2 changes: 1 addition & 1 deletion engines/guasi.c
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ static int fio_guasi_init(struct thread_data *td)
return 0;
}

static struct ioengine_ops ioengine = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "guasi",
.version = FIO_IOOPS_VERSION,
.init = fio_guasi_init,
Expand Down
2 changes: 1 addition & 1 deletion engines/http.c
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,7 @@ static int fio_http_invalidate(struct thread_data *td, struct fio_file *f)
return 0;
}

static struct ioengine_ops ioengine = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "http",
.version = FIO_IOOPS_VERSION,
.flags = FIO_DISKLESSIO | FIO_SYNCIO,
Expand Down
2 changes: 1 addition & 1 deletion engines/libaio.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ static int fio_libaio_init(struct thread_data *td)
return 0;
}

static struct ioengine_ops ioengine = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "libaio",
.version = FIO_IOOPS_VERSION,
.flags = FIO_ASYNCIO_SYNC_TRIM,
Expand Down
6 changes: 3 additions & 3 deletions engines/libhdfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ static void fio_hdfsio_io_u_free(struct thread_data *td, struct io_u *io_u)
}
}

static struct ioengine_ops ioengine_hdfs = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "libhdfs",
.version = FIO_IOOPS_VERSION,
.flags = FIO_SYNCIO | FIO_DISKLESSIO | FIO_NODISKUTIL,
Expand All @@ -412,10 +412,10 @@ static struct ioengine_ops ioengine_hdfs = {

static void fio_init fio_hdfsio_register(void)
{
register_ioengine(&ioengine_hdfs);
register_ioengine(&ioengine);
}

static void fio_exit fio_hdfsio_unregister(void)
{
unregister_ioengine(&ioengine_hdfs);
unregister_ioengine(&ioengine);
}
6 changes: 3 additions & 3 deletions engines/libiscsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ static struct io_u *fio_iscsi_event(struct thread_data *td, int event)
return io_u;
}

static struct ioengine_ops ioengine_iscsi = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "libiscsi",
.version = FIO_IOOPS_VERSION,
.flags = FIO_SYNCIO | FIO_DISKLESSIO | FIO_NODISKUTIL,
Expand All @@ -402,10 +402,10 @@ static struct ioengine_ops ioengine_iscsi = {

static void fio_init fio_iscsi_register(void)
{
register_ioengine(&ioengine_iscsi);
register_ioengine(&ioengine);
}

static void fio_exit fio_iscsi_unregister(void)
{
unregister_ioengine(&ioengine_iscsi);
unregister_ioengine(&ioengine);
}
2 changes: 1 addition & 1 deletion engines/libpmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -558,7 +558,7 @@ static int fio_libpmem_close_file(struct thread_data *td, struct fio_file *f)
return generic_close_file(td, f);
}

static struct ioengine_ops ioengine = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "libpmem",
.version = FIO_IOOPS_VERSION,
.init = fio_libpmem_init,
Expand Down
2 changes: 1 addition & 1 deletion engines/libzbc.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ static enum fio_q_status libzbc_queue(struct thread_data *td, struct io_u *io_u)
return FIO_Q_COMPLETED;
}

static struct ioengine_ops ioengine = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "libzbc",
.version = FIO_IOOPS_VERSION,
.open_file = libzbc_open_file,
Expand Down
2 changes: 1 addition & 1 deletion engines/nbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ static int nbd_invalidate(struct thread_data *td, struct fio_file *f)
return 0;
}

static struct ioengine_ops ioengine = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "nbd",
.version = FIO_IOOPS_VERSION,
.options = options,
Expand Down
2 changes: 1 addition & 1 deletion engines/pmemblk.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ static int fio_pmemblk_unlink_file(struct thread_data *td, struct fio_file *f)
return 0;
}

static struct ioengine_ops ioengine = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "pmemblk",
.version = FIO_IOOPS_VERSION,
.queue = fio_pmemblk_queue,
Expand Down
2 changes: 1 addition & 1 deletion engines/rados.c
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ static int fio_rados_io_u_init(struct thread_data *td, struct io_u *io_u)
}

/* ioengine_ops for get_ioengine() */
static struct ioengine_ops ioengine = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "rados",
.version = FIO_IOOPS_VERSION,
.flags = FIO_DISKLESSIO,
Expand Down
2 changes: 1 addition & 1 deletion engines/rbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,7 @@ static int fio_rbd_io_u_init(struct thread_data *td, struct io_u *io_u)
return 0;
}

static struct ioengine_ops ioengine = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "rbd",
.version = FIO_IOOPS_VERSION,
.setup = fio_rbd_setup,
Expand Down
9 changes: 5 additions & 4 deletions engines/rdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,8 @@ static int client_recv(struct thread_data *td, struct ibv_wc *wc)
rd->rmt_nr = ntohl(rd->recv_buf.nr);

for (i = 0; i < rd->rmt_nr; i++) {
rd->rmt_us[i].buf = be64_to_cpu(rd->recv_buf.rmt_us[i].buf);
rd->rmt_us[i].buf = __be64_to_cpu(
rd->recv_buf.rmt_us[i].buf);
rd->rmt_us[i].rkey = ntohl(rd->recv_buf.rmt_us[i].rkey);
rd->rmt_us[i].size = ntohl(rd->recv_buf.rmt_us[i].size);

Expand Down Expand Up @@ -1389,7 +1390,7 @@ static int fio_rdmaio_setup(struct thread_data *td)
return 0;
}

static struct ioengine_ops ioengine_rw = {
FIO_STATIC struct ioengine_ops ioengine = {
.name = "rdma",
.version = FIO_IOOPS_VERSION,
.setup = fio_rdmaio_setup,
Expand All @@ -1410,10 +1411,10 @@ static struct ioengine_ops ioengine_rw = {

static void fio_init fio_rdmaio_register(void)
{
register_ioengine(&ioengine_rw);
register_ioengine(&ioengine);
}

static void fio_exit fio_rdmaio_unregister(void)
{
unregister_ioengine(&ioengine_rw);
unregister_ioengine(&ioengine);
}
Loading

0 comments on commit 5a8a6a0

Please sign in to comment.