From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============5126124561498117396==" MIME-Version: 1.0 From: ramesh.thomas at intel.com Subject: [Accel-config] [PATCH v2 5/5] accel-config: Manage idxd_mdev and idxd kernel Date: Tue, 08 Dec 2020 16:16:18 -0500 Message-ID: <20201208211617.351761-6-ramesh.thomas@intel.com> In-Reply-To: 20201208211617.351761-1-ramesh.thomas@intel.com To: accel-config@lists.01.org List-ID: --===============5126124561498117396== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Ramesh Thomas modules To: accel-config(a)lists.01.org Cc: tony.luck(a)intel.com, dave.jiang(a)intel.com Two interdependent modules, idxd_mdev and idxd needs to be loaded. Loading of either loads the other module, however idxd cannot be unloaded without unloading idxd_mdev. If at start, idxd_mdev is not loaded, load it and check for idxd. On error, unref modules and context and exit. At the end, do a reset of driver by unloading idxd_mdev and reloading it. Signed-off-by: Ramesh Thomas Reviewed-by: Dave Jiang --- test/libaccfg.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/test/libaccfg.c b/test/libaccfg.c index 94d6156..88108a9 100644 --- a/test/libaccfg.c +++ b/test/libaccfg.c @@ -1039,7 +1039,7 @@ static struct _test_case test_cases[] =3D { }; = static int idxd_kmod_init(struct kmod_ctx **ctx, struct kmod_module **mod, - int log_level) + struct kmod_module **mdev_mod, int log_level) { struct log_ctx log_ctx; int rc; @@ -1057,11 +1057,25 @@ static int idxd_kmod_init(struct kmod_ctx **ctx, st= ruct kmod_module **mod, kmod_unref(*ctx); return rc; } - - rc =3D kmod_module_get_initstate(*mod); + rc =3D kmod_module_new_from_name(*ctx, "idxd_mdev", mdev_mod); + if (rc < 0) { + kmod_module_unref(*mod); + kmod_unref(*ctx); + return rc; + } + rc =3D kmod_module_get_initstate(*mdev_mod); if (rc =3D=3D -ENOENT) - rc =3D kmod_module_probe_insert_module(*mod, 0, NULL, NULL, NULL, + rc =3D kmod_module_probe_insert_module(*mdev_mod, 0, NULL, NULL, NULL, NULL); + if (rc >=3D 0) + rc =3D kmod_module_get_initstate(*mod); + + if (rc < 0) { + kmod_module_unref(*mod); + kmod_module_unref(*mdev_mod); + kmod_unref(*ctx); + } + return rc; } = @@ -1071,14 +1085,14 @@ int test_libaccfg(int loglevel, struct accfg_test *= test, unsigned int i; int err, result =3D EXIT_FAILURE; struct kmod_ctx *kmod_ctx; - struct kmod_module *mod; + struct kmod_module *mod, *mdev_mod; struct accfg_device *device; = if (!accfg_test_attempt(test, KERNEL_VERSION(5, 6, 0))) return EXIT_SKIP; = accfg_set_log_priority(ctx, loglevel); - err =3D idxd_kmod_init(&kmod_ctx, &mod, loglevel); + err =3D idxd_kmod_init(&kmod_ctx, &mod, &mdev_mod, loglevel); if (err < 0) { accfg_test_skip(test); fprintf(stderr, "idxd kmod unavailable skipping tests\n"); @@ -1123,11 +1137,13 @@ int test_libaccfg(int loglevel, struct accfg_test *= test, = if (i >=3D ARRAY_SIZE(test_cases)) result =3D EXIT_SUCCESS; - else - test_cleanup(ctx); = - kmod_module_remove_module(mod, 0); - kmod_module_probe_insert_module(mod, 0, NULL, NULL, NULL, NULL); + test_cleanup(ctx); + + kmod_module_remove_module(mdev_mod, 0); + kmod_module_probe_insert_module(mdev_mod, 0, NULL, NULL, NULL, NULL); + kmod_module_unref(mod); + kmod_module_unref(mdev_mod); kmod_unref(kmod_ctx); = return result; -- = 2.26.2 --===============5126124561498117396==--