aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2016-10-15 18:33:52 -0400
committerDan Williams <dan.j.williams@intel.com>2016-10-19 11:57:33 -0400
commit42237e393f64d619ed56e17fbf8fd27526485695 (patch)
tree51789f92c92ae65b02ef4e8834c05ee17045b9b8
parent8d7c22ac0c036978a072b7e13c607b5402c474e0 (diff)
libnvdimm: allow a platform to force enable label support
Platforms like QEMU-KVM implement an NFIT table and label DSMs. However, since that environment does not define an aliased configuration, the labels are currently ignored and the kernel registers a single full-sized pmem-namespace per region. Now that the kernel supports sub-divisions of pmem regions the labels have a purpose. Arrange for the labels to be honored when we find an existing / valid namespace index block. Cc: <qemu-devel@nongnu.org> Cc: Haozhong Zhang <haozhong.zhang@intel.com> Cc: Xiao Guangrong <guangrong.xiao@linux.intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r--drivers/nvdimm/dimm.c2
-rw-r--r--drivers/nvdimm/dimm_devs.c7
-rw-r--r--drivers/nvdimm/nd.h1
3 files changed, 10 insertions, 0 deletions
diff --git a/drivers/nvdimm/dimm.c b/drivers/nvdimm/dimm.c
index 619834e144d1..ee0b412827bf 100644
--- a/drivers/nvdimm/dimm.c
+++ b/drivers/nvdimm/dimm.c
@@ -64,6 +64,8 @@ static int nvdimm_probe(struct device *dev)
64 nd_label_copy(ndd, to_next_namespace_index(ndd), 64 nd_label_copy(ndd, to_next_namespace_index(ndd),
65 to_current_namespace_index(ndd)); 65 to_current_namespace_index(ndd));
66 rc = nd_label_reserve_dpa(ndd); 66 rc = nd_label_reserve_dpa(ndd);
67 if (ndd->ns_current >= 0)
68 nvdimm_set_aliasing(dev);
67 nvdimm_bus_unlock(dev); 69 nvdimm_bus_unlock(dev);
68 70
69 if (rc) 71 if (rc)
diff --git a/drivers/nvdimm/dimm_devs.c b/drivers/nvdimm/dimm_devs.c
index d614493ad5ac..0eedc49e0d47 100644
--- a/drivers/nvdimm/dimm_devs.c
+++ b/drivers/nvdimm/dimm_devs.c
@@ -184,6 +184,13 @@ int nvdimm_set_config_data(struct nvdimm_drvdata *ndd, size_t offset,
184 return rc; 184 return rc;
185} 185}
186 186
187void nvdimm_set_aliasing(struct device *dev)
188{
189 struct nvdimm *nvdimm = to_nvdimm(dev);
190
191 nvdimm->flags |= NDD_ALIASING;
192}
193
187static void nvdimm_release(struct device *dev) 194static void nvdimm_release(struct device *dev)
188{ 195{
189 struct nvdimm *nvdimm = to_nvdimm(dev); 196 struct nvdimm *nvdimm = to_nvdimm(dev);
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h
index 065abf1b8f32..35dd75057e16 100644
--- a/drivers/nvdimm/nd.h
+++ b/drivers/nvdimm/nd.h
@@ -238,6 +238,7 @@ int nvdimm_set_config_data(struct nvdimm_drvdata *ndd, size_t offset,
238 void *buf, size_t len); 238 void *buf, size_t len);
239long nvdimm_clear_poison(struct device *dev, phys_addr_t phys, 239long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
240 unsigned int len); 240 unsigned int len);
241void nvdimm_set_aliasing(struct device *dev);
241struct nd_btt *to_nd_btt(struct device *dev); 242struct nd_btt *to_nd_btt(struct device *dev);
242 243
243struct nd_gen_sb { 244struct nd_gen_sb {