|
@@ -5,6 +5,7 @@
|
|
|
* Author: Dan Magenheimer
|
|
|
*/
|
|
|
|
|
|
+#include <linux/module.h>
|
|
|
#include <linux/kernel.h>
|
|
|
#include <linux/types.h>
|
|
|
#include <linux/init.h>
|
|
@@ -128,6 +129,7 @@ static int xen_tmem_flush_object(u32 pool_id, struct tmem_oid oid)
|
|
|
return xen_tmem_op(TMEM_FLUSH_OBJECT, pool_id, oid, 0, 0, 0, 0, 0);
|
|
|
}
|
|
|
|
|
|
+#ifndef CONFIG_XEN_TMEM_MODULE
|
|
|
bool __read_mostly tmem_enabled = false;
|
|
|
|
|
|
static int __init enable_tmem(char *s)
|
|
@@ -136,6 +138,7 @@ static int __init enable_tmem(char *s)
|
|
|
return 1;
|
|
|
}
|
|
|
__setup("tmem", enable_tmem);
|
|
|
+#endif
|
|
|
|
|
|
#ifdef CONFIG_CLEANCACHE
|
|
|
static int xen_tmem_destroy_pool(u32 pool_id)
|
|
@@ -227,14 +230,19 @@ static int tmem_cleancache_init_shared_fs(char *uuid, size_t pagesize)
|
|
|
return xen_tmem_new_pool(shared_uuid, TMEM_POOL_SHARED, pagesize);
|
|
|
}
|
|
|
|
|
|
-static bool __initdata use_cleancache = true;
|
|
|
-
|
|
|
+static bool disable_cleancache __read_mostly;
|
|
|
+static bool disable_selfballooning __read_mostly;
|
|
|
+#ifdef CONFIG_XEN_TMEM_MODULE
|
|
|
+module_param(disable_cleancache, bool, S_IRUGO);
|
|
|
+module_param(disable_selfballooning, bool, S_IRUGO);
|
|
|
+#else
|
|
|
static int __init no_cleancache(char *s)
|
|
|
{
|
|
|
- use_cleancache = false;
|
|
|
+ disable_cleancache = true;
|
|
|
return 1;
|
|
|
}
|
|
|
__setup("nocleancache", no_cleancache);
|
|
|
+#endif
|
|
|
|
|
|
static struct cleancache_ops tmem_cleancache_ops = {
|
|
|
.put_page = tmem_cleancache_put_page,
|
|
@@ -353,14 +361,19 @@ static void tmem_frontswap_init(unsigned ignored)
|
|
|
xen_tmem_new_pool(private, TMEM_POOL_PERSIST, PAGE_SIZE);
|
|
|
}
|
|
|
|
|
|
-static bool __initdata use_frontswap = true;
|
|
|
-
|
|
|
+static bool disable_frontswap __read_mostly;
|
|
|
+static bool disable_frontswap_selfshrinking __read_mostly;
|
|
|
+#ifdef CONFIG_XEN_TMEM_MODULE
|
|
|
+module_param(disable_frontswap, bool, S_IRUGO);
|
|
|
+module_param(disable_frontswap_selfshrinking, bool, S_IRUGO);
|
|
|
+#else
|
|
|
static int __init no_frontswap(char *s)
|
|
|
{
|
|
|
- use_frontswap = false;
|
|
|
+ disable_frontswap = true;
|
|
|
return 1;
|
|
|
}
|
|
|
__setup("nofrontswap", no_frontswap);
|
|
|
+#endif
|
|
|
|
|
|
static struct frontswap_ops tmem_frontswap_ops = {
|
|
|
.store = tmem_frontswap_store,
|
|
@@ -369,14 +382,16 @@ static struct frontswap_ops tmem_frontswap_ops = {
|
|
|
.invalidate_area = tmem_frontswap_flush_area,
|
|
|
.init = tmem_frontswap_init
|
|
|
};
|
|
|
+#else /* CONFIG_FRONTSWAP */
|
|
|
+#define disable_frontswap_selfshrinking 1
|
|
|
#endif
|
|
|
|
|
|
-static int __init xen_tmem_init(void)
|
|
|
+static int xen_tmem_init(void)
|
|
|
{
|
|
|
if (!xen_domain())
|
|
|
return 0;
|
|
|
#ifdef CONFIG_FRONTSWAP
|
|
|
- if (tmem_enabled && use_frontswap) {
|
|
|
+ if (tmem_enabled && !disable_frontswap) {
|
|
|
char *s = "";
|
|
|
struct frontswap_ops *old_ops =
|
|
|
frontswap_register_ops(&tmem_frontswap_ops);
|
|
@@ -390,7 +405,7 @@ static int __init xen_tmem_init(void)
|
|
|
#endif
|
|
|
#ifdef CONFIG_CLEANCACHE
|
|
|
BUG_ON(sizeof(struct cleancache_filekey) != sizeof(struct tmem_oid));
|
|
|
- if (tmem_enabled && use_cleancache) {
|
|
|
+ if (tmem_enabled && !disable_cleancache) {
|
|
|
char *s = "";
|
|
|
struct cleancache_ops *old_ops =
|
|
|
cleancache_register_ops(&tmem_cleancache_ops);
|
|
@@ -399,8 +414,15 @@ static int __init xen_tmem_init(void)
|
|
|
printk(KERN_INFO "cleancache enabled, RAM provided by "
|
|
|
"Xen Transcendent Memory%s\n", s);
|
|
|
}
|
|
|
+#endif
|
|
|
+#ifdef CONFIG_XEN_SELFBALLOONING
|
|
|
+ xen_selfballoon_init(!disable_selfballooning,
|
|
|
+ !disable_frontswap_selfshrinking);
|
|
|
#endif
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
module_init(xen_tmem_init)
|
|
|
+MODULE_LICENSE("GPL");
|
|
|
+MODULE_AUTHOR("Dan Magenheimer <dan.magenheimer@oracle.com>");
|
|
|
+MODULE_DESCRIPTION("Shim to Xen transcendent memory");
|