@@ -474,6 +474,46 @@ int kmem_persist_cleanup(struct dev_dax *dev_dax,
return 0;
}
+/*
+ * A NONE type for DAX KMEM persistence which does not expose any persistent
+ * device or filesystem on the memory.
+ */
+
+static int kmem_persist_none_format(struct dev_dax *dev_dax)
+{
+ struct kmem_persist_superblock *super =
+ kmap_local_page(dax_kmem_index_to_page(0, dev_dax));
+ super->magic = kmem_persist_magic;
+ super->type = KMEM_PERSIST_NONE;
+ kunmap_local(super);
+ return 0;
+}
+
+static int kmem_persist_none_probe(struct dev_dax *dev_dax, void **data)
+{
+ unsigned long num_pages = dax_kmem_num_pages(dev_dax);
+ unsigned long i;
+
+ for (i = 1; i < num_pages; i++)
+ __free_page(dax_kmem_index_to_page(i, dev_dax));
+
+ *data = NULL;
+ return 0;
+}
+
+static int kmem_persist_none_cleanup(struct dev_dax *dev_dax, void *data)
+{
+ __free_page(dax_kmem_index_to_page(0, dev_dax));
+ return 0;
+}
+
+static struct kmem_persist_ops kmem_persist_none_ops = {
+ .type = KMEM_PERSIST_NONE,
+ .format = kmem_persist_none_format,
+ .probe = kmem_persist_none_probe,
+ .cleanup = kmem_persist_none_cleanup
+};
+
#endif /* CONFIG_DEV_DAX_KMEM_PERSIST */
static struct dax_device_driver device_dax_kmem_driver = {
@@ -493,6 +533,10 @@ static int __init dax_kmem_init(void)
rc = dax_driver_register(&device_dax_kmem_driver);
if (rc)
kfree_const(kmem_name);
+#ifdef CONFIG_DEV_DAX_KMEM_PERSIST
+ if (rc == 0)
+ kmem_persist_type_register(&kmem_persist_none_ops);
+#endif
return rc;
}
The NONE type allows us to format DAX KMEM so that all the memory is usable as system memory. This does not allow us to store any persistent data. Signed-off-by: Srinivas Aji <srinivas.aji@memverge.com> --- drivers/dax/kmem.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+)