libnvdimm, pmem: kill pmem->ndns
authorDan Williams <dan.j.williams@intel.com>
Tue, 15 Mar 2016 23:41:04 +0000 (16:41 -0700)
committerDan Williams <dan.j.williams@intel.com>
Fri, 22 Apr 2016 17:59:54 +0000 (10:59 -0700)
We can derive the common namespace from other information.  We also do
not need to cache it because all the usages are in slow paths.

Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/nvdimm/blk.c
drivers/nvdimm/btt.c
drivers/nvdimm/nd.h
drivers/nvdimm/pmem.c

index e9ff9229d942ac5b0c08c4fc94d8f58acdf6ed76..24649396b638a8348418d67bdeecf93ea79d8a93 100644 (file)
@@ -336,7 +336,7 @@ static int nd_blk_remove(struct device *dev)
        struct nd_blk_device *blk_dev = dev_get_drvdata(dev);
 
        if (is_nd_btt(dev))
-               nvdimm_namespace_detach_btt(to_nd_btt(dev)->ndns);
+               nvdimm_namespace_detach_btt(to_nd_btt(dev));
        else
                nd_blk_detach_disk(blk_dev);
        kfree(blk_dev);
index f068b6513cd286659b1e468e726c45d868a05b7b..676c31a8fb6d20778618c6f90a2995d8e4f49b9d 100644 (file)
@@ -1406,9 +1406,8 @@ int nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns)
 }
 EXPORT_SYMBOL(nvdimm_namespace_attach_btt);
 
-int nvdimm_namespace_detach_btt(struct nd_namespace_common *ndns)
+int nvdimm_namespace_detach_btt(struct nd_btt *nd_btt)
 {
-       struct nd_btt *nd_btt = to_nd_btt(ndns->claim);
        struct btt *btt = nd_btt->btt;
 
        btt_fini(btt);
index 875c524fafb0ed2235a9724517601bf45107c80a..b0a4ab91307b8bce451d5505d132abaeaf537281 100644 (file)
@@ -263,7 +263,7 @@ struct resource *nvdimm_allocate_dpa(struct nvdimm_drvdata *ndd,
 resource_size_t nvdimm_namespace_capacity(struct nd_namespace_common *ndns);
 struct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev);
 int nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns);
-int nvdimm_namespace_detach_btt(struct nd_namespace_common *ndns);
+int nvdimm_namespace_detach_btt(struct nd_btt *nd_btt);
 const char *nvdimm_namespace_disk_name(struct nd_namespace_common *ndns,
                char *name);
 void nvdimm_badblocks_populate(struct nd_region *nd_region,
index f798899338eddb6955c06f5b44c26c405dffdade..2b51d4d34207dae229416429d6cfc8a4babdb8ac 100644 (file)
@@ -35,7 +35,6 @@
 struct pmem_device {
        struct request_queue    *pmem_queue;
        struct gendisk          *pmem_disk;
-       struct nd_namespace_common *ndns;
 
        /* One contiguous memory region per device */
        phys_addr_t             phys_addr;
@@ -436,9 +435,8 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn)
        return -ENXIO;
 }
 
-static int nvdimm_namespace_detach_pfn(struct nd_namespace_common *ndns)
+static int nvdimm_namespace_detach_pfn(struct nd_pfn *nd_pfn)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(ndns->claim);
        struct pmem_device *pmem;
 
        /* free pmem disk */
@@ -537,7 +535,7 @@ static int __nvdimm_namespace_attach_pfn(struct nd_pfn *nd_pfn)
 
        return rc;
  err:
-       nvdimm_namespace_detach_pfn(ndns);
+       nvdimm_namespace_detach_pfn(nd_pfn);
        return rc;
 
 }
@@ -573,7 +571,6 @@ static int nd_pmem_probe(struct device *dev)
        if (IS_ERR(pmem))
                return PTR_ERR(pmem);
 
-       pmem->ndns = ndns;
        dev_set_drvdata(dev, pmem);
        ndns->rw_bytes = pmem_rw_bytes;
        if (devm_init_badblocks(dev, &pmem->bb))
@@ -607,9 +604,9 @@ static int nd_pmem_remove(struct device *dev)
        struct pmem_device *pmem = dev_get_drvdata(dev);
 
        if (is_nd_btt(dev))
-               nvdimm_namespace_detach_btt(pmem->ndns);
+               nvdimm_namespace_detach_btt(to_nd_btt(dev));
        else if (is_nd_pfn(dev))
-               nvdimm_namespace_detach_pfn(pmem->ndns);
+               nvdimm_namespace_detach_pfn(to_nd_pfn(dev));
        else
                pmem_detach_disk(pmem);
 
@@ -618,26 +615,33 @@ static int nd_pmem_remove(struct device *dev)
 
 static void nd_pmem_notify(struct device *dev, enum nvdimm_event event)
 {
-       struct pmem_device *pmem = dev_get_drvdata(dev);
-       struct nd_namespace_common *ndns = pmem->ndns;
        struct nd_region *nd_region = to_nd_region(dev->parent);
-       struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev);
-       struct resource res = {
-               .start = nsio->res.start + pmem->data_offset,
-               .end = nsio->res.end,
-       };
+       struct pmem_device *pmem = dev_get_drvdata(dev);
+       resource_size_t offset = 0, end_trunc = 0;
+       struct nd_namespace_common *ndns;
+       struct nd_namespace_io *nsio;
+       struct resource res;
 
        if (event != NVDIMM_REVALIDATE_POISON)
                return;
 
-       if (is_nd_pfn(dev)) {
+       if (is_nd_btt(dev)) {
+               struct nd_btt *nd_btt = to_nd_btt(dev);
+
+               ndns = nd_btt->ndns;
+       } else if (is_nd_pfn(dev)) {
                struct nd_pfn *nd_pfn = to_nd_pfn(dev);
                struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb;
 
-               res.start += __le32_to_cpu(pfn_sb->start_pad);
-               res.end -= __le32_to_cpu(pfn_sb->end_trunc);
-       }
+               ndns = nd_pfn->ndns;
+               offset = pmem->data_offset + __le32_to_cpu(pfn_sb->start_pad);
+               end_trunc = __le32_to_cpu(pfn_sb->end_trunc);
+       } else
+               ndns = to_ndns(dev);
 
+       nsio = to_nd_namespace_io(&ndns->dev);
+       res.start = nsio->res.start + offset;
+       res.end = nsio->res.end - end_trunc;
        nvdimm_badblocks_populate(nd_region, &pmem->bb, &res);
 }