|
@@ -13,6 +13,7 @@
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/device.h>
|
|
|
#include <linux/slab.h>
|
|
|
+#include <linux/pmem.h>
|
|
|
#include <linux/nd.h>
|
|
|
#include "nd-core.h"
|
|
|
#include "nd.h"
|
|
@@ -76,11 +77,32 @@ static bool is_namespace_io(struct device *dev)
|
|
|
return dev ? dev->type == &namespace_io_device_type : false;
|
|
|
}
|
|
|
|
|
|
+bool pmem_should_map_pages(struct device *dev)
|
|
|
+{
|
|
|
+ struct nd_region *nd_region = to_nd_region(dev->parent);
|
|
|
+
|
|
|
+ if (!IS_ENABLED(CONFIG_ZONE_DEVICE))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (!test_bit(ND_REGION_PAGEMAP, &nd_region->flags))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (is_nd_pfn(dev) || is_nd_btt(dev))
|
|
|
+ return false;
|
|
|
+
|
|
|
+#ifdef ARCH_MEMREMAP_PMEM
|
|
|
+ return ARCH_MEMREMAP_PMEM == MEMREMAP_WB;
|
|
|
+#else
|
|
|
+ return false;
|
|
|
+#endif
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(pmem_should_map_pages);
|
|
|
+
|
|
|
const char *nvdimm_namespace_disk_name(struct nd_namespace_common *ndns,
|
|
|
char *name)
|
|
|
{
|
|
|
struct nd_region *nd_region = to_nd_region(ndns->dev.parent);
|
|
|
- const char *suffix = "";
|
|
|
+ const char *suffix = NULL;
|
|
|
|
|
|
if (ndns->claim) {
|
|
|
if (is_nd_btt(ndns->claim))
|
|
@@ -93,13 +115,16 @@ const char *nvdimm_namespace_disk_name(struct nd_namespace_common *ndns,
|
|
|
dev_name(ndns->claim));
|
|
|
}
|
|
|
|
|
|
- if (is_namespace_pmem(&ndns->dev) || is_namespace_io(&ndns->dev))
|
|
|
- sprintf(name, "pmem%d%s", nd_region->id, suffix);
|
|
|
- else if (is_namespace_blk(&ndns->dev)) {
|
|
|
+ if (is_namespace_pmem(&ndns->dev) || is_namespace_io(&ndns->dev)) {
|
|
|
+ if (!suffix && pmem_should_map_pages(&ndns->dev))
|
|
|
+ suffix = "m";
|
|
|
+ sprintf(name, "pmem%d%s", nd_region->id, suffix ? suffix : "");
|
|
|
+ } else if (is_namespace_blk(&ndns->dev)) {
|
|
|
struct nd_namespace_blk *nsblk;
|
|
|
|
|
|
nsblk = to_nd_namespace_blk(&ndns->dev);
|
|
|
- sprintf(name, "ndblk%d.%d%s", nd_region->id, nsblk->id, suffix);
|
|
|
+ sprintf(name, "ndblk%d.%d%s", nd_region->id, nsblk->id,
|
|
|
+ suffix ? suffix : "");
|
|
|
} else {
|
|
|
return NULL;
|
|
|
}
|