diff mbox

[ndctl,5/5] ndctl: fall back to nfit_test for test/{blk|pmem}-ns

Message ID 20160317005455.3025.68568.stgit@dwillia2-desk3.jf.intel.com (mailing list archive)
State Accepted
Commit 62c6b386aae1
Headers show

Commit Message

Dan Williams March 17, 2016, 12:54 a.m. UTC
Prevent these tests from bitrotting going forward by arranging for them
to be run against nfit_test resources in the case that an ACPI.NFIT
provider is not found.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 test/blk_namespaces.c  |   56 ++++++++++++++++++++++++++++++++----------
 test/pmem_namespaces.c |   64 ++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 92 insertions(+), 28 deletions(-)

Comments

Ross Zwisler March 18, 2016, 4:24 p.m. UTC | #1
On Wed, Mar 16, 2016 at 05:54:55PM -0700, Dan Williams wrote:
> Prevent these tests from bitrotting going forward by arranging for them
> to be run against nfit_test resources in the case that an ACPI.NFIT
> provider is not found.
> 
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>

I'm testing on a system without nfit_test, but with a working block namespace
and PMEM namespace.

Prior to this change both the blk-ns and pmem-ns tests pass, but with this
patch they are both skipped.

I'm guessing that it's looking for nfit_test resources, not finding them, and
then just skipping the test instead of running against my real PMEM & BLK
namespaces?

> ---
>  test/blk_namespaces.c  |   56 ++++++++++++++++++++++++++++++++----------
>  test/pmem_namespaces.c |   64 ++++++++++++++++++++++++++++++++++++++----------
>  2 files changed, 92 insertions(+), 28 deletions(-)
> 
> diff --git a/test/blk_namespaces.c b/test/blk_namespaces.c
> index db30a1fe567c..b4d677b4d0d6 100644
> --- a/test/blk_namespaces.c
> +++ b/test/blk_namespaces.c
> @@ -27,6 +27,7 @@
>  #include <uuid/uuid.h>
>  #include <linux/version.h>
>  #include <test.h>
> +#include <libkmod.h>
>  
>  /* The purpose of this test is to verify that we can successfully do I/O to
>   * multiple nd_blk namespaces that have discontiguous segments.  It first
> @@ -44,8 +45,6 @@
>  #define err(msg)\
>  	fprintf(stderr, "%s:%d: %s (%s)\n", __func__, __LINE__, msg, strerror(errno))
>  
> -static const char *provider = "ACPI.NFIT";
> -
>  static struct ndctl_namespace *create_blk_namespace(int region_fraction,
>  		struct ndctl_region *region)
>  {
> @@ -214,9 +213,11 @@ int test_blk_namespaces(int log_level, struct ndctl_test *test)
>  	char bdev[50];
>  	struct ndctl_ctx *ctx;
>  	struct ndctl_bus *bus;
> -	struct ndctl_namespace *ndns[2], *_n;
> -	struct ndctl_region *region, *blk_region = NULL;
> +	struct kmod_module *mod;
>  	struct ndctl_dimm *dimm;
> +	struct kmod_ctx *kmod_ctx;
> +	struct ndctl_namespace *ndns[2];
> +	struct ndctl_region *region, *blk_region = NULL;
>  
>  	if (!ndctl_test_attempt(test, KERNEL_VERSION(4, 2, 0)))
>  		return 77;
> @@ -227,12 +228,33 @@ int test_blk_namespaces(int log_level, struct ndctl_test *test)
>  
>  	ndctl_set_log_priority(ctx, log_level);
>  
> -	bus = ndctl_bus_get_by_provider(ctx, provider);
> +	kmod_ctx = kmod_new(NULL, NULL);
> +	if (!kmod_ctx)
> +		goto err_kmod;
> +	kmod_set_log_priority(kmod_ctx, log_level);
> +
> +	rc = kmod_module_new_from_name(kmod_ctx, "nfit_test", &mod);
> +	if (rc < 0)
> +		goto err_module;
> +
> +	rc = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST,
> +			NULL, NULL, NULL, NULL);
> +	if (rc < 0) {
> +		rc = 77;
> +		ndctl_test_skip(test);
> +		fprintf(stderr, "nfit_test unavailable skipping tests\n");
> +		goto err_module;
> +	}
> +
> +	bus = ndctl_bus_get_by_provider(ctx, "ACPI.NFIT");
> +	if (!bus)
> +		bus = ndctl_bus_get_by_provider(ctx, "nfit_test.0");
> +
>  	if (!bus) {
>  		fprintf(stderr, "%s: failed to find NFIT-provider\n", comm);
>  		ndctl_test_skip(test);
>  		rc = 77;
> -		goto err_nobus;
> +		goto err_cleanup;
>  	} else {
>  		fprintf(stderr, "%s: found provider: %s\n", comm,
>  				ndctl_bus_get_provider(bus));
> @@ -314,15 +336,21 @@ int test_blk_namespaces(int log_level, struct ndctl_test *test)
>  	rc = 0;
>  
>   err_cleanup:
> -	if (blk_region) {
> -		ndctl_namespace_foreach_safe(blk_region, ndns[0], _n)
> -			if (ndctl_namespace_get_size(ndns[0]) != 0)
> -				disable_blk_namespace(ndns[0]);
> -	}
> -
> - err_nobus:
> +	/* unload nfit_test */
> +	bus = ndctl_bus_get_by_provider(ctx, "nfit_test.0");
> +	if (bus)
> +		ndctl_region_foreach(bus, region)
> +			ndctl_region_disable_invalidate(region);
> +	bus = ndctl_bus_get_by_provider(ctx, "nfit_test.1");
> +	if (bus)
> +		ndctl_region_foreach(bus, region)
> +			ndctl_region_disable_invalidate(region);
> +	kmod_module_remove_module(mod, 0);
> +
> + err_module:
> +	kmod_unref(kmod_ctx);
> + err_kmod:
>  	ndctl_unref(ctx);
> -
>  	return rc;
>  }
>  
> diff --git a/test/pmem_namespaces.c b/test/pmem_namespaces.c
> index f7dfce618c1a..198f8ef0cb37 100644
> --- a/test/pmem_namespaces.c
> +++ b/test/pmem_namespaces.c
> @@ -25,14 +25,13 @@
>  #include <sys/types.h>
>  #include <unistd.h>
>  #include <uuid/uuid.h>
> +#include <libkmod.h>
>  #include <linux/version.h>
>  #include <test.h>
>  
>  #define err(msg)\
>  	fprintf(stderr, "%s:%d: %s (%s)\n", __func__, __LINE__, msg, strerror(errno))
>  
> -static const char *provider = "ACPI.NFIT";
> -
>  static struct ndctl_namespace *create_pmem_namespace(struct ndctl_region *region)
>  {
>  	struct ndctl_namespace *seed_ns = NULL;
> @@ -175,7 +174,9 @@ int test_pmem_namespaces(int log_level, struct ndctl_test *test)
>  {
>  	struct ndctl_region *region, *pmem_region = NULL;
>  	struct ndctl_namespace *ndns;
> +	struct kmod_ctx *kmod_ctx;
>  	struct ndctl_dimm *dimm;
> +	struct kmod_module *mod;
>  	struct ndctl_ctx *ctx;
>  	struct ndctl_bus *bus;
>  	char bdev[50];
> @@ -190,7 +191,28 @@ int test_pmem_namespaces(int log_level, struct ndctl_test *test)
>  
>  	ndctl_set_log_priority(ctx, log_level);
>  
> -	bus = ndctl_bus_get_by_provider(ctx, provider);
> +	kmod_ctx = kmod_new(NULL, NULL);
> +	if (!kmod_ctx)
> +		goto err_kmod;
> +	kmod_set_log_priority(kmod_ctx, log_level);
> +
> +	rc = kmod_module_new_from_name(kmod_ctx, "nfit_test", &mod);
> +	if (rc < 0)
> +		goto err_module;
> +
> +	rc = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST,
> +			NULL, NULL, NULL, NULL);
> +	if (rc < 0) {
> +		rc = 77;
> +		ndctl_test_skip(test);
> +		fprintf(stderr, "nfit_test unavailable skipping tests\n");
> +		goto err_module;
> +	}
> +
> +	bus = ndctl_bus_get_by_provider(ctx, "ACPI.NFIT");
> +	if (!bus)
> +		bus = ndctl_bus_get_by_provider(ctx, "nfit_test.0");
> +
>  	if (!bus) {
>  		fprintf(stderr, "%s: failed to find NFIT-provider\n", comm);
>  		ndctl_test_skip(test);
> @@ -202,16 +224,16 @@ int test_pmem_namespaces(int log_level, struct ndctl_test *test)
>  
>  	/* get the system to a clean state */
>          ndctl_region_foreach(bus, region)
> -                ndctl_region_disable_invalidate(region);
> -
> -        ndctl_dimm_foreach(bus, dimm) {
> -                rc = ndctl_dimm_zero_labels(dimm);
> -                if (rc < 0) {
> -                        fprintf(stderr, "failed to zero %s\n",
> -                                        ndctl_dimm_get_devname(dimm));
> -                        return rc;
> -                }
> -        }
> +		ndctl_region_disable_invalidate(region);
> +
> +	ndctl_dimm_foreach(bus, dimm) {
> +		rc = ndctl_dimm_zero_labels(dimm);
> +		if (rc < 0) {
> +			fprintf(stderr, "failed to zero %s\n",
> +					ndctl_dimm_get_devname(dimm));
> +			goto err;
> +		}
> +	}
>  
>  	/* create our config */
>  	ndctl_region_foreach(bus, region)
> @@ -237,9 +259,23 @@ int test_pmem_namespaces(int log_level, struct ndctl_test *test)
>  	rc = ns_do_io(bdev);
>  
>  	disable_pmem_namespace(ndns);
> +
>   err:
> +	/* unload nfit_test */
> +	bus = ndctl_bus_get_by_provider(ctx, "nfit_test.0");
> +	if (bus)
> +		ndctl_region_foreach(bus, region)
> +			ndctl_region_disable_invalidate(region);
> +	bus = ndctl_bus_get_by_provider(ctx, "nfit_test.1");
> +	if (bus)
> +		ndctl_region_foreach(bus, region)
> +			ndctl_region_disable_invalidate(region);
> +	kmod_module_remove_module(mod, 0);
> +
> + err_module:
> +	kmod_unref(kmod_ctx);
> + err_kmod:
>  	ndctl_unref(ctx);
> -
>  	return rc;
>  }
>  
>
Dan Williams March 18, 2016, 4:48 p.m. UTC | #2
On Fri, Mar 18, 2016 at 9:24 AM, Ross Zwisler
<ross.zwisler@linux.intel.com> wrote:
> On Wed, Mar 16, 2016 at 05:54:55PM -0700, Dan Williams wrote:
>> Prevent these tests from bitrotting going forward by arranging for them
>> to be run against nfit_test resources in the case that an ACPI.NFIT
>> provider is not found.
>>
>> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
>
> I'm testing on a system without nfit_test, but with a working block namespace
> and PMEM namespace.
>
> Prior to this change both the blk-ns and pmem-ns tests pass, but with this
> patch they are both skipped.
>
> I'm guessing that it's looking for nfit_test resources, not finding them, and
> then just skipping the test instead of running against my real PMEM & BLK
> namespaces?

Ah, yes, it bails if it can't load nfit_test.ko.  Let me re-order that
a bit.  Thanks Ross!
diff mbox

Patch

diff --git a/test/blk_namespaces.c b/test/blk_namespaces.c
index db30a1fe567c..b4d677b4d0d6 100644
--- a/test/blk_namespaces.c
+++ b/test/blk_namespaces.c
@@ -27,6 +27,7 @@ 
 #include <uuid/uuid.h>
 #include <linux/version.h>
 #include <test.h>
+#include <libkmod.h>
 
 /* The purpose of this test is to verify that we can successfully do I/O to
  * multiple nd_blk namespaces that have discontiguous segments.  It first
@@ -44,8 +45,6 @@ 
 #define err(msg)\
 	fprintf(stderr, "%s:%d: %s (%s)\n", __func__, __LINE__, msg, strerror(errno))
 
-static const char *provider = "ACPI.NFIT";
-
 static struct ndctl_namespace *create_blk_namespace(int region_fraction,
 		struct ndctl_region *region)
 {
@@ -214,9 +213,11 @@  int test_blk_namespaces(int log_level, struct ndctl_test *test)
 	char bdev[50];
 	struct ndctl_ctx *ctx;
 	struct ndctl_bus *bus;
-	struct ndctl_namespace *ndns[2], *_n;
-	struct ndctl_region *region, *blk_region = NULL;
+	struct kmod_module *mod;
 	struct ndctl_dimm *dimm;
+	struct kmod_ctx *kmod_ctx;
+	struct ndctl_namespace *ndns[2];
+	struct ndctl_region *region, *blk_region = NULL;
 
 	if (!ndctl_test_attempt(test, KERNEL_VERSION(4, 2, 0)))
 		return 77;
@@ -227,12 +228,33 @@  int test_blk_namespaces(int log_level, struct ndctl_test *test)
 
 	ndctl_set_log_priority(ctx, log_level);
 
-	bus = ndctl_bus_get_by_provider(ctx, provider);
+	kmod_ctx = kmod_new(NULL, NULL);
+	if (!kmod_ctx)
+		goto err_kmod;
+	kmod_set_log_priority(kmod_ctx, log_level);
+
+	rc = kmod_module_new_from_name(kmod_ctx, "nfit_test", &mod);
+	if (rc < 0)
+		goto err_module;
+
+	rc = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST,
+			NULL, NULL, NULL, NULL);
+	if (rc < 0) {
+		rc = 77;
+		ndctl_test_skip(test);
+		fprintf(stderr, "nfit_test unavailable skipping tests\n");
+		goto err_module;
+	}
+
+	bus = ndctl_bus_get_by_provider(ctx, "ACPI.NFIT");
+	if (!bus)
+		bus = ndctl_bus_get_by_provider(ctx, "nfit_test.0");
+
 	if (!bus) {
 		fprintf(stderr, "%s: failed to find NFIT-provider\n", comm);
 		ndctl_test_skip(test);
 		rc = 77;
-		goto err_nobus;
+		goto err_cleanup;
 	} else {
 		fprintf(stderr, "%s: found provider: %s\n", comm,
 				ndctl_bus_get_provider(bus));
@@ -314,15 +336,21 @@  int test_blk_namespaces(int log_level, struct ndctl_test *test)
 	rc = 0;
 
  err_cleanup:
-	if (blk_region) {
-		ndctl_namespace_foreach_safe(blk_region, ndns[0], _n)
-			if (ndctl_namespace_get_size(ndns[0]) != 0)
-				disable_blk_namespace(ndns[0]);
-	}
-
- err_nobus:
+	/* unload nfit_test */
+	bus = ndctl_bus_get_by_provider(ctx, "nfit_test.0");
+	if (bus)
+		ndctl_region_foreach(bus, region)
+			ndctl_region_disable_invalidate(region);
+	bus = ndctl_bus_get_by_provider(ctx, "nfit_test.1");
+	if (bus)
+		ndctl_region_foreach(bus, region)
+			ndctl_region_disable_invalidate(region);
+	kmod_module_remove_module(mod, 0);
+
+ err_module:
+	kmod_unref(kmod_ctx);
+ err_kmod:
 	ndctl_unref(ctx);
-
 	return rc;
 }
 
diff --git a/test/pmem_namespaces.c b/test/pmem_namespaces.c
index f7dfce618c1a..198f8ef0cb37 100644
--- a/test/pmem_namespaces.c
+++ b/test/pmem_namespaces.c
@@ -25,14 +25,13 @@ 
 #include <sys/types.h>
 #include <unistd.h>
 #include <uuid/uuid.h>
+#include <libkmod.h>
 #include <linux/version.h>
 #include <test.h>
 
 #define err(msg)\
 	fprintf(stderr, "%s:%d: %s (%s)\n", __func__, __LINE__, msg, strerror(errno))
 
-static const char *provider = "ACPI.NFIT";
-
 static struct ndctl_namespace *create_pmem_namespace(struct ndctl_region *region)
 {
 	struct ndctl_namespace *seed_ns = NULL;
@@ -175,7 +174,9 @@  int test_pmem_namespaces(int log_level, struct ndctl_test *test)
 {
 	struct ndctl_region *region, *pmem_region = NULL;
 	struct ndctl_namespace *ndns;
+	struct kmod_ctx *kmod_ctx;
 	struct ndctl_dimm *dimm;
+	struct kmod_module *mod;
 	struct ndctl_ctx *ctx;
 	struct ndctl_bus *bus;
 	char bdev[50];
@@ -190,7 +191,28 @@  int test_pmem_namespaces(int log_level, struct ndctl_test *test)
 
 	ndctl_set_log_priority(ctx, log_level);
 
-	bus = ndctl_bus_get_by_provider(ctx, provider);
+	kmod_ctx = kmod_new(NULL, NULL);
+	if (!kmod_ctx)
+		goto err_kmod;
+	kmod_set_log_priority(kmod_ctx, log_level);
+
+	rc = kmod_module_new_from_name(kmod_ctx, "nfit_test", &mod);
+	if (rc < 0)
+		goto err_module;
+
+	rc = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST,
+			NULL, NULL, NULL, NULL);
+	if (rc < 0) {
+		rc = 77;
+		ndctl_test_skip(test);
+		fprintf(stderr, "nfit_test unavailable skipping tests\n");
+		goto err_module;
+	}
+
+	bus = ndctl_bus_get_by_provider(ctx, "ACPI.NFIT");
+	if (!bus)
+		bus = ndctl_bus_get_by_provider(ctx, "nfit_test.0");
+
 	if (!bus) {
 		fprintf(stderr, "%s: failed to find NFIT-provider\n", comm);
 		ndctl_test_skip(test);
@@ -202,16 +224,16 @@  int test_pmem_namespaces(int log_level, struct ndctl_test *test)
 
 	/* get the system to a clean state */
         ndctl_region_foreach(bus, region)
-                ndctl_region_disable_invalidate(region);
-
-        ndctl_dimm_foreach(bus, dimm) {
-                rc = ndctl_dimm_zero_labels(dimm);
-                if (rc < 0) {
-                        fprintf(stderr, "failed to zero %s\n",
-                                        ndctl_dimm_get_devname(dimm));
-                        return rc;
-                }
-        }
+		ndctl_region_disable_invalidate(region);
+
+	ndctl_dimm_foreach(bus, dimm) {
+		rc = ndctl_dimm_zero_labels(dimm);
+		if (rc < 0) {
+			fprintf(stderr, "failed to zero %s\n",
+					ndctl_dimm_get_devname(dimm));
+			goto err;
+		}
+	}
 
 	/* create our config */
 	ndctl_region_foreach(bus, region)
@@ -237,9 +259,23 @@  int test_pmem_namespaces(int log_level, struct ndctl_test *test)
 	rc = ns_do_io(bdev);
 
 	disable_pmem_namespace(ndns);
+
  err:
+	/* unload nfit_test */
+	bus = ndctl_bus_get_by_provider(ctx, "nfit_test.0");
+	if (bus)
+		ndctl_region_foreach(bus, region)
+			ndctl_region_disable_invalidate(region);
+	bus = ndctl_bus_get_by_provider(ctx, "nfit_test.1");
+	if (bus)
+		ndctl_region_foreach(bus, region)
+			ndctl_region_disable_invalidate(region);
+	kmod_module_remove_module(mod, 0);
+
+ err_module:
+	kmod_unref(kmod_ctx);
+ err_kmod:
 	ndctl_unref(ctx);
-
 	return rc;
 }