New upstream version v3.26

Previously included patches are now upstream
This commit is contained in:
Eric Sandeen 2021-03-12 12:20:56 -06:00
parent c47191feb8
commit c69ce05970
5 changed files with 7 additions and 200 deletions

1
.gitignore vendored
View File

@ -25,3 +25,4 @@
/fio-3.23.tar.bz2
/fio-3.24.tar.bz2
/fio-3.25.tar.bz2
/fio-3.26.tar.bz2

View File

@ -1,84 +0,0 @@
From 48ff7df9daea86c82a572b0a840bb8371b6b1a29 Mon Sep 17 00:00:00 2001
From: Eric Sandeen <sandeen@redhat.com>
Date: Mon, 25 Jan 2021 13:23:48 -0600
Subject: [PATCH] fio: fix dlopen refcounting of dynamic engines
ioengine_load() will dlclose the dynamic library if it matches one
that we've already got open, but this defeats the built-in refcounting
done by dlopen/dlclose. As each thread exits, it calls free_ioengine(),
and this may do a final dlclose on a dynamic ioengine that is still
in use if we don't have the proper reference count.
Fix this by dropping the explicit dlclose of a "matching" dlopened
dynamic engine library, and let each dlclose decrement the refcount
on the engine library as is normal.
This also adds/modifies a couple of debug messages to help track this.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
init.c | 5 +----
ioengines.c | 8 ++++++--
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/init.c b/init.c
index ab38b334..d6dbaf7c 100644
--- a/init.c
+++ b/init.c
@@ -1109,11 +1109,8 @@ int ioengine_load(struct thread_data *td)
if (!ops)
goto fail;
- if (ops == td->io_ops && dlhandle == td->io_ops->dlhandle) {
- if (dlhandle)
- dlclose(dlhandle);
+ if (ops == td->io_ops && dlhandle == td->io_ops->dlhandle)
return 0;
- }
if (dlhandle && dlhandle != td->io_ops->dlhandle)
dlclose(dlhandle);
diff --git a/ioengines.c b/ioengines.c
index dcc9496d..f88b0537 100644
--- a/ioengines.c
+++ b/ioengines.c
@@ -95,6 +95,7 @@ static void *dlopen_external(struct thread_data *td, const char *engine)
sprintf(engine_path, "%s/fio-%s.so", FIO_EXT_ENG_DIR, engine);
+ dprint(FD_IO, "dlopen external %s\n", engine_path);
dlhandle = dlopen(engine_path, RTLD_LAZY);
if (!dlhandle)
log_info("Engine %s not found; Either name is invalid, was not built, or fio-engine-%s package is missing.\n",
@@ -116,7 +117,7 @@ static struct ioengine_ops *dlopen_ioengine(struct thread_data *td,
!strncmp(engine_lib, "aio", 3))
engine_lib = "libaio";
- dprint(FD_IO, "dload engine %s\n", engine_lib);
+ dprint(FD_IO, "dlopen engine %s\n", engine_lib);
dlerror();
dlhandle = dlopen(engine_lib, RTLD_LAZY);
@@ -194,7 +195,9 @@ struct ioengine_ops *load_ioengine(struct thread_data *td)
* so as not to break job files not using the prefix.
*/
ops = __load_ioengine(td->o.ioengine);
- if (!ops)
+
+ /* We do re-dlopen existing handles, for reference counting */
+ if (!ops || ops->dlhandle)
ops = dlopen_ioengine(td, name);
/*
@@ -229,6 +232,7 @@ void free_ioengine(struct thread_data *td)
}
if (td->io_ops->dlhandle) {
+ dprint(FD_IO, "dlclose ioengine %s\n", td->io_ops->name);
dlclose(td->io_ops->dlhandle);
td->io_ops->dlhandle = NULL;
}
--
2.26.2

View File

@ -1,110 +0,0 @@
From f6931a1dd35896433c8cc2e10de51372a2c496c4 Mon Sep 17 00:00:00 2001
From: Eric Sandeen <sandeen@redhat.com>
Date: Mon, 25 Jan 2021 13:18:31 -0600
Subject: [PATCH] fio: move dynamic library handle to io_ops structure
Keeping a dynamic engine's dlopen'd dlhandle on a thread structure doesn't
make sense; that thread may exit while others are still using the engine.
Move the dlhandle onto the ops structure itself.
We still only call dlopen for the first thead, which leaves a refcounting
issue which will be fixed in the next patch.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
fio.h | 1 -
init.c | 6 +++---
ioengines.c | 8 ++++----
ioengines.h | 3 ++-
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/fio.h b/fio.h
index ee582a72..062abfa7 100644
--- a/fio.h
+++ b/fio.h
@@ -281,7 +281,6 @@ struct thread_data {
* IO engine private data and dlhandle.
*/
void *io_ops_data;
- void *io_ops_dlhandle;
/*
* Queue depth of io_u's that fio MIGHT do
diff --git a/init.c b/init.c
index 1d14df16..ab38b334 100644
--- a/init.c
+++ b/init.c
@@ -1104,18 +1104,18 @@ int ioengine_load(struct thread_data *td)
* for this name and see if they match. If they do, then
* the engine is unchanged.
*/
- dlhandle = td->io_ops_dlhandle;
+ dlhandle = td->io_ops->dlhandle;
ops = load_ioengine(td);
if (!ops)
goto fail;
- if (ops == td->io_ops && dlhandle == td->io_ops_dlhandle) {
+ if (ops == td->io_ops && dlhandle == td->io_ops->dlhandle) {
if (dlhandle)
dlclose(dlhandle);
return 0;
}
- if (dlhandle && dlhandle != td->io_ops_dlhandle)
+ if (dlhandle && dlhandle != td->io_ops->dlhandle)
dlclose(dlhandle);
/* Unload the old engine. */
diff --git a/ioengines.c b/ioengines.c
index 5ac512ae..dcc9496d 100644
--- a/ioengines.c
+++ b/ioengines.c
@@ -155,7 +155,7 @@ static struct ioengine_ops *dlopen_ioengine(struct thread_data *td,
return NULL;
}
- td->io_ops_dlhandle = dlhandle;
+ ops->dlhandle = dlhandle;
return ops;
}
@@ -228,9 +228,9 @@ void free_ioengine(struct thread_data *td)
td->eo = NULL;
}
- if (td->io_ops_dlhandle) {
- dlclose(td->io_ops_dlhandle);
- td->io_ops_dlhandle = NULL;
+ if (td->io_ops->dlhandle) {
+ dlclose(td->io_ops->dlhandle);
+ td->io_ops->dlhandle = NULL;
}
td->io_ops = NULL;
diff --git a/ioengines.h b/ioengines.h
index a928b211..839b318d 100644
--- a/ioengines.h
+++ b/ioengines.h
@@ -8,7 +8,7 @@
#include "io_u.h"
#include "zbd_types.h"
-#define FIO_IOOPS_VERSION 27
+#define FIO_IOOPS_VERSION 28
#ifndef CONFIG_DYNAMIC_ENGINES
#define FIO_STATIC static
@@ -30,6 +30,7 @@ struct ioengine_ops {
const char *name;
int version;
int flags;
+ void *dlhandle;
int (*setup)(struct thread_data *);
int (*init)(struct thread_data *);
int (*post_init)(struct thread_data *);
--
2.26.2

View File

@ -1,15 +1,12 @@
Name: fio
Version: 3.25
Release: 3%{?dist}
Version: 3.26
Release: 1%{?dist}
Summary: Multithreaded IO generation tool
License: GPLv2
URL: http://git.kernel.dk/?p=fio.git;a=summary
Source: http://brick.kernel.dk/snaps/%{name}-%{version}.tar.bz2
Patch0: 0001-fio-move-dynamic-library-handle-to-io_ops-structure.patch
Patch1: 0001-fio-fix-dlopen-refcounting-of-dynamic-engines.patch
BuildRequires: gcc
BuildRequires: libaio-devel
BuildRequires: zlib-devel
@ -210,6 +207,9 @@ make install prefix=%{_prefix} mandir=%{_mandir} libdir=%{_libdir}/fio DESTDIR=$
%endif
%changelog
* Fri Mar 12 2021 Eric Sandeen <sandeen@redhat.com> 3.26-1
- New upstream version
* Mon Feb 08 2021 Eric Sandeen <sandeen@redhat.com> 3.25-3
- Fix segfault with external IO engines and multiple threads
- Enable dev-dax, pmemblk, libpmem engines for ppc64le

View File

@ -1 +1 @@
SHA512 (fio-3.25.tar.bz2) = 68f1432a9a0b25a12add512571e0642d219029306a763421ff4ac557a3a556d833f7d0b7c05f3b62982f8a9786f6156666efa09967e60d90335b7372e97c364e
SHA512 (fio-3.26.tar.bz2) = ce2e4aeaf44eb729053b4e1f96fb7ba21ccb4f1532edb5b4de150298554346b3823d482e9b4a6574cd6ef56e71861e799c71c2fe9c30a797df97069890d549c0