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@xxxxxxxxxxxx> --- drivers/dax/kmem.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c index df7cfc8ace78..0ca6e14f7e73 100644 --- a/drivers/dax/kmem.c +++ b/drivers/dax/kmem.c @@ -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; } -- 2.30.2