Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 298f2bc5 authored by Dan Williams's avatar Dan Williams
Browse files

libnvdimm, pmem: kill pmem->ndns



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: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent c3b46c73
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
+1 −2
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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,
+22 −18
Original line number Diff line number Diff line
@@ -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);
}