Hi, Dan,

I'm concerned about this check

+       if (!ndctl_test_attempt(test, KERNEL_VERSION(4, 19, 0)))

I read it as: this ndctl test only works for upstream kernel 4.19 and above.

For Linux distributors, such as us, we pick a major upstream release as the
base OS, then painstakingly backport desired upstream patches etc.
Our latest OS version string will be 4.14.x.y.z for a long while,
that means the ndctl test won't work even if we backport the 4.19 nvdimm
patches over.

Is it possible to come up with a more accommodating method?

One way might be is to 'dd' a block of 0s to the injected block
immediately after a successful injection?  For now, doing so leaves the
'badblocks' and the poison bit in place.

Thanks!
-jane


On 06/14/2018 05:28 PM, Dan Williams wrote:
Given that poison injection crashes the kernel, disable the test by
default until 4.19.

Signed-off-by: Dan Williams <dan.j.willi...@intel.com>
---
  test.h            |    8 ++++----
  test/Makefile.am  |    4 +++-
  test/dax-pmd.c    |   14 ++++++++++----
  test/dax-poison.c |    8 ++++++--
  test/dax.sh       |   19 ++++++++++++++-----
  test/device-dax.c |    2 +-
  6 files changed, 38 insertions(+), 17 deletions(-)

diff --git a/test.h b/test.h
index e627785a5334..fa0c0cff9daf 100644
--- a/test.h
+++ b/test.h
@@ -39,11 +39,11 @@ int test_parent_uuid(int loglevel, struct ndctl_test *test, 
struct ndctl_ctx *ct
  int test_multi_pmem(int loglevel, struct ndctl_test *test, struct ndctl_ctx 
*ctx);
  int test_dax_directio(int dax_fd, unsigned long align, void *dax_addr, off_t 
offset);
  #ifdef ENABLE_POISON
-int test_dax_poison(int dax_fd, unsigned long align, void *dax_addr,
-               off_t offset, bool fsdax);
+int test_dax_poison(struct ndctl_test *test, int dax_fd, unsigned long align,
+               void *dax_addr, off_t offset, bool fsdax);
  #else
-static inline int test_dax_poison(int dax_fd, unsigned long align,
-               void *dax_addr, off_t offset, bool fsdax)
+static inline int test_dax_poison(struct ndctl_test *test, int dax_fd,
+               unsigned long align, void *dax_addr, off_t offset, bool fsdax)
  {
        return 0;
  }
diff --git a/test/Makefile.am b/test/Makefile.am
index a9b8b3eccbbf..92cf29d6065e 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -94,7 +94,9 @@ parent_uuid_LDADD = $(LIBNDCTL_LIB) $(UUID_LIBS) $(KMOD_LIBS)
  dax_dev_SOURCES = dax-dev.c $(testcore)
  dax_dev_LDADD = $(LIBNDCTL_LIB) $(KMOD_LIBS)
-dax_pmd_SOURCES = dax-pmd.c
+dax_pmd_SOURCES = dax-pmd.c \
+               $(testcore)
+
  hugetlb_SOURCES = hugetlb.c \
                  dax-pmd.c
diff --git a/test/dax-pmd.c b/test/dax-pmd.c
index 0b4bd98edce4..8ed3e9b764f9 100644
--- a/test/dax-pmd.c
+++ b/test/dax-pmd.c
@@ -194,7 +194,7 @@ int test_dax_directio(int dax_fd, unsigned long align, void 
*dax_addr, off_t off
  }
/* test_pmd assumes that fd references a pre-allocated + dax-capable file */
-static int test_pmd(int fd)
+static int test_pmd(struct ndctl_test *test, int fd)
  {
        unsigned long long m_align, p_align, pmd_off;
        static const bool fsdax = true;
@@ -257,7 +257,7 @@ static int test_pmd(int fd)
        if (rc)
                goto err_directio;
- rc = test_dax_poison(fd, HPAGE_SIZE, pmd_addr, pmd_off, fsdax);
+       rc = test_dax_poison(test, fd, HPAGE_SIZE, pmd_addr, pmd_off, fsdax);
err_directio:
   err_extent:
@@ -268,14 +268,20 @@ static int test_pmd(int fd)
int __attribute__((weak)) main(int argc, char *argv[])
  {
+       struct ndctl_test *test = ndctl_test_new(0);
        int fd, rc;
+ if (!test) {
+               fprintf(stderr, "failed to initialize test\n");
+               return EXIT_FAILURE;
+       }
+
        if (argc < 1)
                return -EINVAL;
fd = open(argv[1], O_RDWR);
-       rc = test_pmd(fd);
+       rc = test_pmd(test, fd);
        if (fd >= 0)
                close(fd);
-       return rc;
+       return ndctl_test_result(test, rc);
  }
diff --git a/test/dax-poison.c b/test/dax-poison.c
index 7faa402e623c..a25bf0b17d61 100644
--- a/test/dax-poison.c
+++ b/test/dax-poison.c
@@ -15,6 +15,7 @@
  #include <test.h>
  #include <util/size.h>
  #include <stdbool.h>
+#include <linux/version.h>
#define fail() fprintf(stderr, "%s: failed at: %d (%s)\n", \
        __func__, __LINE__, strerror(errno))
@@ -43,8 +44,8 @@ static void sigbus_hdl(int sig, siginfo_t *si, void *ptr)
        siglongjmp(sj_env, 1);
  }
-int test_dax_poison(int dax_fd, unsigned long align, void *dax_addr,
-               off_t offset, bool fsdax)
+int test_dax_poison(struct ndctl_test *test, int dax_fd, unsigned long align,
+               void *dax_addr, off_t offset, bool fsdax)
  {
        unsigned char *addr = MAP_FAILED;
        struct sigaction act;
@@ -52,6 +53,9 @@ int test_dax_poison(int dax_fd, unsigned long align, void 
*dax_addr,
        void *buf;
        int rc;
+ if (!ndctl_test_attempt(test, KERNEL_VERSION(4, 19, 0)))
+               return 77;
+
        /*
         * MADV_HWPOISON must be page aligned, and this routine assumes
         * align is >= 8K
diff --git a/test/dax.sh b/test/dax.sh
index e35f914a6425..30fe16721935 100755
--- a/test/dax.sh
+++ b/test/dax.sh
@@ -28,6 +28,15 @@ err() {
        exit $rc
  }
+run_test() {
+       if ! ./dax-pmd $MNT/$FILE; then
+               rc=$?
+               if [ $rc -ne 77 -a $rc -ne 0 ]; then
+                       err
+               fi
+       fi
+}
+
  set -e
  mkdir -p $MNT
  trap 'err $LINENO' ERR
@@ -40,7 +49,7 @@ rc=1
  mkfs.ext4 /dev/$blockdev
  mount /dev/$blockdev $MNT -o dax
  fallocate -l 1GiB $MNT/$FILE
-./dax-pmd $MNT/$FILE
+run_test
  umount $MNT
# convert pmem to put the memmap on the device
@@ -52,7 +61,7 @@ eval $(echo $json | sed -e "$json2var")
  mkfs.ext4 /dev/$blockdev
  mount /dev/$blockdev $MNT -o dax
  fallocate -l 1GiB $MNT/$FILE
-./dax-pmd $MNT/$FILE
+run_test
  umount $MNT
json=$($NDCTL create-namespace -m raw -f -e $dev)
@@ -62,7 +71,7 @@ eval $(echo $json | sed -e "$json2var")
  mkfs.xfs -f /dev/$blockdev
  mount /dev/$blockdev $MNT -o dax
  fallocate -l 1GiB $MNT/$FILE
-./dax-pmd $MNT/$FILE
+run_test
  umount $MNT
# convert pmem to put the memmap on the device
@@ -73,7 +82,7 @@ eval $(echo $json | sed -e "$json2var")
  mkfs.xfs -f /dev/$blockdev
  mount /dev/$blockdev $MNT -o dax
  fallocate -l 1GiB $MNT/$FILE
-./dax-pmd $MNT/$FILE
+run_test
  umount $MNT
# revert namespace to raw mode
@@ -81,4 +90,4 @@ json=$($NDCTL create-namespace -m raw -f -e $dev)
  eval $(echo $json | sed -e "$json2var")
  [ $mode != "fsdax" ] && echo "fail: $LINENO" &&  exit 1
-exit 0
+exit $rc
diff --git a/test/device-dax.c b/test/device-dax.c
index 712c247adfb2..dd92f9a9d2c5 100644
--- a/test/device-dax.c
+++ b/test/device-dax.c
@@ -279,7 +279,7 @@ static int __test_device_dax(unsigned long align, int 
loglevel,
fprintf(stderr, "%s: test dax poison\n",
                                ndctl_namespace_get_devname(ndns));
-               rc = test_dax_poison(fd, align, NULL, 0, devdax);
+               rc = test_dax_poison(test, fd, align, NULL, 0, devdax);
                if (rc) {
                        fprintf(stderr, "%s: failed dax poison\n",
                                        ndctl_namespace_get_devname(ndns));

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

Reply via email to