tools/testing/nvdimm: replace CONFIG_DMA_CMA dependency with vmalloc()
authorDan Williams <dan.j.williams@intel.com>
Thu, 16 Jun 2016 03:34:17 +0000 (20:34 -0700)
committerDan Williams <dan.j.williams@intel.com>
Mon, 27 Jun 2016 18:40:46 +0000 (11:40 -0700)
DMA_CMA is incompatible with SWIOTLB used in enterprise distro
configurations.  Switch to vmalloc() allocations for all resources.

Acked-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
tools/testing/nvdimm/Kbuild
tools/testing/nvdimm/pmem-dax.c
tools/testing/nvdimm/test/iomap.c
tools/testing/nvdimm/test/nfit.c

index 4adfa9c..62d5ac3 100644 (file)
@@ -11,6 +11,8 @@ ldflags-y += --wrap=__devm_release_region
 ldflags-y += --wrap=__request_region
 ldflags-y += --wrap=__release_region
 ldflags-y += --wrap=devm_memremap_pages
+ldflags-y += --wrap=insert_resource
+ldflags-y += --wrap=remove_resource
 
 DRIVERS := ../../../drivers
 NVDIMM_SRC := $(DRIVERS)/nvdimm
index fdba77f..1e0218c 100644 (file)
@@ -21,14 +21,26 @@ long pmem_direct_access(struct block_device *bdev, sector_t sector,
        struct pmem_device *pmem = bdev->bd_queue->queuedata;
        resource_size_t offset = sector * 512 + pmem->data_offset;
 
-       /* disable DAX for nfit_test pmem devices */
-       if (get_nfit_res(pmem->phys_addr + offset)) {
-               dev_info_once(pmem->bb.dev, "dax is disabled for nfit_test\n");
+       if (unlikely(is_bad_pmem(&pmem->bb, sector, size)))
                return -EIO;
+
+       /*
+        * Limit dax to a single page at a time given vmalloc()-backed
+        * in the nfit_test case.
+        */
+       if (get_nfit_res(pmem->phys_addr + offset)) {
+               struct page *page;
+
+               *kaddr = pmem->virt_addr + offset;
+               page = vmalloc_to_page(pmem->virt_addr + offset);
+               *pfn = page_to_pfn_t(page);
+               dev_dbg_ratelimited(disk_to_dev(bdev->bd_disk)->parent,
+                               "%s: sector: %#llx pfn: %#lx\n", __func__,
+                               (unsigned long long) sector, page_to_pfn(page));
+
+               return PAGE_SIZE;
        }
 
-       if (unlikely(is_bad_pmem(&pmem->bb, sector, size)))
-               return -EIO;
        *kaddr = pmem->virt_addr + offset;
        *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags);
 
index 9966f09..804705f 100644 (file)
@@ -230,6 +230,22 @@ struct resource *__wrap___request_region(struct resource *parent,
 }
 EXPORT_SYMBOL(__wrap___request_region);
 
+int __wrap_insert_resource(struct resource *parent, struct resource *res)
+{
+       if (get_nfit_res(res->start))
+               return 0;
+       return insert_resource(parent, res);
+}
+EXPORT_SYMBOL(__wrap_insert_resource);
+
+int __wrap_remove_resource(struct resource *res)
+{
+       if (get_nfit_res(res->start))
+               return 0;
+       return remove_resource(res);
+}
+EXPORT_SYMBOL(__wrap_remove_resource);
+
 struct resource *__wrap___devm_request_region(struct device *dev,
                struct resource *parent, resource_size_t start,
                resource_size_t n, const char *name)
index c919866..4fdd139 100644 (file)
@@ -470,11 +470,7 @@ static void release_nfit_res(void *data)
        list_del(&nfit_res->list);
        spin_unlock(&nfit_test_lock);
 
-       if (is_vmalloc_addr(nfit_res->buf))
-               vfree(nfit_res->buf);
-       else
-               dma_free_coherent(nfit_res->dev, resource_size(res),
-                               nfit_res->buf, res->start);
+       vfree(nfit_res->buf);
        kfree(res);
        kfree(nfit_res);
 }
@@ -507,9 +503,7 @@ static void *__test_alloc(struct nfit_test *t, size_t size, dma_addr_t *dma,
 
        return nfit_res->buf;
  err:
-       if (buf && !is_vmalloc_addr(buf))
-               dma_free_coherent(dev, size, buf, *dma);
-       else if (buf)
+       if (buf)
                vfree(buf);
        kfree(res);
        kfree(nfit_res);
@@ -524,15 +518,6 @@ static void *test_alloc(struct nfit_test *t, size_t size, dma_addr_t *dma)
        return __test_alloc(t, size, dma, buf);
 }
 
-static void *test_alloc_coherent(struct nfit_test *t, size_t size,
-               dma_addr_t *dma)
-{
-       struct device *dev = &t->pdev.dev;
-       void *buf = dma_alloc_coherent(dev, size, dma, GFP_KERNEL);
-
-       return __test_alloc(t, size, dma, buf);
-}
-
 static struct nfit_test_resource *nfit_test_lookup(resource_size_t addr)
 {
        int i;
@@ -592,15 +577,15 @@ static int nfit_test0_alloc(struct nfit_test *t)
                return -ENOMEM;
        t->nfit_size = nfit_size;
 
-       t->spa_set[0] = test_alloc_coherent(t, SPA0_SIZE, &t->spa_set_dma[0]);
+       t->spa_set[0] = test_alloc(t, SPA0_SIZE, &t->spa_set_dma[0]);
        if (!t->spa_set[0])
                return -ENOMEM;
 
-       t->spa_set[1] = test_alloc_coherent(t, SPA1_SIZE, &t->spa_set_dma[1]);
+       t->spa_set[1] = test_alloc(t, SPA1_SIZE, &t->spa_set_dma[1]);
        if (!t->spa_set[1])
                return -ENOMEM;
 
-       t->spa_set[2] = test_alloc_coherent(t, SPA0_SIZE, &t->spa_set_dma[2]);
+       t->spa_set[2] = test_alloc(t, SPA0_SIZE, &t->spa_set_dma[2]);
        if (!t->spa_set[2])
                return -ENOMEM;
 
@@ -639,7 +624,7 @@ static int nfit_test1_alloc(struct nfit_test *t)
                return -ENOMEM;
        t->nfit_size = nfit_size;
 
-       t->spa_set[0] = test_alloc_coherent(t, SPA2_SIZE, &t->spa_set_dma[0]);
+       t->spa_set[0] = test_alloc(t, SPA2_SIZE, &t->spa_set_dma[0]);
        if (!t->spa_set[0])
                return -ENOMEM;
 
@@ -1523,12 +1508,6 @@ static struct platform_driver nfit_test_driver = {
        .id_table = nfit_test_id,
 };
 
-#ifdef CONFIG_CMA_SIZE_MBYTES
-#define CMA_SIZE_MBYTES CONFIG_CMA_SIZE_MBYTES
-#else
-#define CMA_SIZE_MBYTES 0
-#endif
-
 static __init int nfit_test_init(void)
 {
        int rc, i;
@@ -1538,7 +1517,6 @@ static __init int nfit_test_init(void)
        for (i = 0; i < NUM_NFITS; i++) {
                struct nfit_test *nfit_test;
                struct platform_device *pdev;
-               static int once;
 
                nfit_test = kzalloc(sizeof(*nfit_test), GFP_KERNEL);
                if (!nfit_test) {
@@ -1577,20 +1555,6 @@ static __init int nfit_test_init(void)
                        goto err_register;
 
                instances[i] = nfit_test;
-
-               if (!once++) {
-                       dma_addr_t dma;
-                       void *buf;
-
-                       buf = dma_alloc_coherent(&pdev->dev, SZ_128M, &dma,
-                                       GFP_KERNEL);
-                       if (!buf) {
-                               rc = -ENOMEM;
-                               dev_warn(&pdev->dev, "need 128M of free cma\n");
-                               goto err_register;
-                       }
-                       dma_free_coherent(&pdev->dev, SZ_128M, buf, dma);
-               }
        }
 
        rc = platform_driver_register(&nfit_test_driver);