Until recently the kernel would crash when walking smaps with
pmd_devmap() entries in the page table.

Signed-off-by: Dan Williams <[email protected]>
---
 test/device-dax.c |   26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/test/device-dax.c b/test/device-dax.c
index a14e2a95db7e..04d53da544cd 100644
--- a/test/device-dax.c
+++ b/test/device-dax.c
@@ -60,12 +60,12 @@ static int test_device_dax(int loglevel, struct ndctl_test 
*test,
                struct ndctl_ctx *ctx)
 {
        int fd, rc, *p;
-       char *buf, path[100];
        struct sigaction act;
        struct ndctl_dax *dax;
        struct daxctl_dev *dev;
        struct ndctl_namespace *ndns;
        struct daxctl_region *dax_region;
+       char *buf, path[100], data[4096];
 
        memset (&act, 0, sizeof(act));
        act.sa_sigaction = sigbus;
@@ -123,14 +123,36 @@ static int test_device_dax(int loglevel, struct 
ndctl_test *test,
        p = (int *) (buf + (1UL << 20));
        *p = 0;
 
+       /*
+        * Prior to 4.8-final these tests cause crashes, or are
+        * otherwise not supported.
+        */
        if (ndctl_test_attempt(test, KERNEL_VERSION(4, 9, 0))) {
-               /* prior to 4.8-final this crashes */
+               int fd2;
+
                rc = test_dax_directio(fd, NULL, 0);
                if (rc) {
                        fprintf(stderr, "%s: failed dax direct-i/o\n",
                                        ndctl_namespace_get_devname(ndns));
                        return rc;
                }
+
+               fd2 = open("/proc/self/smaps", O_RDONLY);
+               if (fd2 < 0) {
+                       fprintf(stderr, "%s: failed smaps open\n",
+                                       ndctl_namespace_get_devname(ndns));
+                       return -ENXIO;
+               }
+
+               do {
+                       rc = read(fd2, data, sizeof(data));
+               } while (rc > 0);
+
+               if (rc) {
+                       fprintf(stderr, "%s: failed smaps retrieval\n",
+                                       ndctl_namespace_get_devname(ndns));
+                       return -ENXIO;
+               }
        }
 
        rc = reset_device_dax(ndns);

_______________________________________________
Linux-nvdimm mailing list
[email protected]
https://lists.01.org/mailman/listinfo/linux-nvdimm

Reply via email to