aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDan Magenheimer <dan.magenheimer@oracle.com>2013-04-30 18:27:03 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-04-30 20:04:01 -0400
commit1ac37bee81531cb62a9a64e78ffdad7da9b20ea2 (patch)
treed9460e2c71cdaa991696f1058cefa2c8a17cc4a3 /drivers
parentf42158fe6785dd366073c7fd00f159a65c631597 (diff)
staging: zcache: enable ramster to be built/loaded as a module
Enable module support for ramster. Note runtime dependency disallows loading if cleancache/frontswap lazy initialization patches are not present. If built-in (not built as a module), the original mechanism of enabling via a kernel boot parameter is retained, but this should be considered deprecated. Note that module unload is explicitly not yet supported. [v1: Fixed compile issues since ramster_init now has four arguments] [v2: Fixed rebase on ramster->zcache move] [akpm@linux-foundation.org: use_frontswap_selfshrink cannot be __initdata] Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Signed-off-by: Bob Liu <lliubbo@gmail.com> Cc: Wanpeng Li <liwanp@linux.vnet.ibm.com> Cc: Andor Daam <andor.daam@googlemail.com> Cc: Florian Schmaus <fschmaus@gmail.com> Cc: Minchan Kim <minchan@kernel.org> Cc: Stefan Hengelein <ilendir@googlemail.com> Cc: Wu Fengguang <fengguang.wu@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/staging/zcache/ramster.h6
-rw-r--r--drivers/staging/zcache/ramster/debug.c2
-rw-r--r--drivers/staging/zcache/ramster/nodemanager.c9
-rw-r--r--drivers/staging/zcache/ramster/ramster.c29
-rw-r--r--drivers/staging/zcache/ramster/ramster.h2
-rw-r--r--drivers/staging/zcache/ramster/ramster_nodemanager.h2
-rw-r--r--drivers/staging/zcache/zcache-main.c2
7 files changed, 39 insertions, 13 deletions
diff --git a/drivers/staging/zcache/ramster.h b/drivers/staging/zcache/ramster.h
index 1b71aea2ff62..e1f91d5a0f6a 100644
--- a/drivers/staging/zcache/ramster.h
+++ b/drivers/staging/zcache/ramster.h
@@ -11,10 +11,14 @@
11#ifndef _ZCACHE_RAMSTER_H_ 11#ifndef _ZCACHE_RAMSTER_H_
12#define _ZCACHE_RAMSTER_H_ 12#define _ZCACHE_RAMSTER_H_
13 13
14#ifdef CONFIG_RAMSTER_MODULE
15#define CONFIG_RAMSTER
16#endif
17
14#ifdef CONFIG_RAMSTER 18#ifdef CONFIG_RAMSTER
15#include "ramster/ramster.h" 19#include "ramster/ramster.h"
16#else 20#else
17static inline void ramster_init(bool x, bool y, bool z) 21static inline void ramster_init(bool x, bool y, bool z, bool w)
18{ 22{
19} 23}
20 24
diff --git a/drivers/staging/zcache/ramster/debug.c b/drivers/staging/zcache/ramster/debug.c
index bf34133cc631..327e4f0d98e1 100644
--- a/drivers/staging/zcache/ramster/debug.c
+++ b/drivers/staging/zcache/ramster/debug.c
@@ -43,7 +43,7 @@ static struct debug_entry {
43}; 43};
44#undef ATTR 44#undef ATTR
45 45
46int __init ramster_debugfs_init(void) 46int ramster_debugfs_init(void)
47{ 47{
48 int i; 48 int i;
49 struct dentry *root = debugfs_create_dir("ramster", NULL); 49 struct dentry *root = debugfs_create_dir("ramster", NULL);
diff --git a/drivers/staging/zcache/ramster/nodemanager.c b/drivers/staging/zcache/ramster/nodemanager.c
index c0f48158735d..2cfe93342c0d 100644
--- a/drivers/staging/zcache/ramster/nodemanager.c
+++ b/drivers/staging/zcache/ramster/nodemanager.c
@@ -949,7 +949,7 @@ static void __exit exit_r2nm(void)
949 r2hb_exit(); 949 r2hb_exit();
950} 950}
951 951
952static int __init init_r2nm(void) 952int r2nm_init(void)
953{ 953{
954 int ret = -1; 954 int ret = -1;
955 955
@@ -986,10 +986,11 @@ out_r2hb:
986out: 986out:
987 return ret; 987 return ret;
988} 988}
989EXPORT_SYMBOL_GPL(r2nm_init);
989 990
990MODULE_AUTHOR("Oracle"); 991MODULE_AUTHOR("Oracle");
991MODULE_LICENSE("GPL"); 992MODULE_LICENSE("GPL");
992 993
993/* module_init(init_r2nm) */ 994#ifndef CONFIG_RAMSTER_MODULE
994late_initcall(init_r2nm); 995late_initcall(r2nm_init);
995/* module_exit(exit_r2nm) */ 996#endif
diff --git a/drivers/staging/zcache/ramster/ramster.c b/drivers/staging/zcache/ramster/ramster.c
index 87816279ce3c..b18b887db79f 100644
--- a/drivers/staging/zcache/ramster/ramster.c
+++ b/drivers/staging/zcache/ramster/ramster.c
@@ -121,6 +121,7 @@ int ramster_do_preload_flnode(struct tmem_pool *pool)
121 kmem_cache_free(ramster_flnode_cache, flnode); 121 kmem_cache_free(ramster_flnode_cache, flnode);
122 return ret; 122 return ret;
123} 123}
124EXPORT_SYMBOL_GPL(ramster_do_preload_flnode);
124 125
125/* 126/*
126 * Called by the message handler after a (still compressed) page has been 127 * Called by the message handler after a (still compressed) page has been
@@ -388,6 +389,7 @@ void *ramster_pampd_free(void *pampd, struct tmem_pool *pool,
388 } 389 }
389 return local_pampd; 390 return local_pampd;
390} 391}
392EXPORT_SYMBOL_GPL(ramster_pampd_free);
391 393
392void ramster_count_foreign_pages(bool eph, int count) 394void ramster_count_foreign_pages(bool eph, int count)
393{ 395{
@@ -408,6 +410,7 @@ void ramster_count_foreign_pages(bool eph, int count)
408 } 410 }
409 } 411 }
410} 412}
413EXPORT_SYMBOL_GPL(ramster_count_foreign_pages);
411 414
412/* 415/*
413 * For now, just push over a few pages every few seconds to 416 * For now, just push over a few pages every few seconds to
@@ -593,7 +596,7 @@ requeue:
593 ramster_remotify_queue_delayed_work(HZ); 596 ramster_remotify_queue_delayed_work(HZ);
594} 597}
595 598
596void __init ramster_remotify_init(void) 599void ramster_remotify_init(void)
597{ 600{
598 unsigned long n = 60UL; 601 unsigned long n = 60UL;
599 ramster_remotify_workqueue = 602 ramster_remotify_workqueue =
@@ -768,8 +771,10 @@ static bool frontswap_selfshrinking __read_mostly;
768static void selfshrink_process(struct work_struct *work); 771static void selfshrink_process(struct work_struct *work);
769static DECLARE_DELAYED_WORK(selfshrink_worker, selfshrink_process); 772static DECLARE_DELAYED_WORK(selfshrink_worker, selfshrink_process);
770 773
774#ifndef CONFIG_RAMSTER_MODULE
771/* Enable/disable with kernel boot option. */ 775/* Enable/disable with kernel boot option. */
772static bool use_frontswap_selfshrink __initdata = true; 776static bool use_frontswap_selfshrink = true;
777#endif
773 778
774/* 779/*
775 * The default values for the following parameters were deemed reasonable 780 * The default values for the following parameters were deemed reasonable
@@ -824,6 +829,7 @@ static void frontswap_selfshrink(void)
824 frontswap_shrink(tgt_frontswap_pages); 829 frontswap_shrink(tgt_frontswap_pages);
825} 830}
826 831
832#ifndef CONFIG_RAMSTER_MODULE
827static int __init ramster_nofrontswap_selfshrink_setup(char *s) 833static int __init ramster_nofrontswap_selfshrink_setup(char *s)
828{ 834{
829 use_frontswap_selfshrink = false; 835 use_frontswap_selfshrink = false;
@@ -831,6 +837,7 @@ static int __init ramster_nofrontswap_selfshrink_setup(char *s)
831} 837}
832 838
833__setup("noselfshrink", ramster_nofrontswap_selfshrink_setup); 839__setup("noselfshrink", ramster_nofrontswap_selfshrink_setup);
840#endif
834 841
835static void selfshrink_process(struct work_struct *work) 842static void selfshrink_process(struct work_struct *work)
836{ 843{
@@ -849,6 +856,7 @@ void ramster_cpu_up(int cpu)
849 per_cpu(ramster_remoteputmem1, cpu) = p1; 856 per_cpu(ramster_remoteputmem1, cpu) = p1;
850 per_cpu(ramster_remoteputmem2, cpu) = p2; 857 per_cpu(ramster_remoteputmem2, cpu) = p2;
851} 858}
859EXPORT_SYMBOL_GPL(ramster_cpu_up);
852 860
853void ramster_cpu_down(int cpu) 861void ramster_cpu_down(int cpu)
854{ 862{
@@ -864,6 +872,7 @@ void ramster_cpu_down(int cpu)
864 kp->flnode = NULL; 872 kp->flnode = NULL;
865 } 873 }
866} 874}
875EXPORT_SYMBOL_GPL(ramster_cpu_down);
867 876
868void ramster_register_pamops(struct tmem_pamops *pamops) 877void ramster_register_pamops(struct tmem_pamops *pamops)
869{ 878{
@@ -874,9 +883,11 @@ void ramster_register_pamops(struct tmem_pamops *pamops)
874 pamops->repatriate = ramster_pampd_repatriate; 883 pamops->repatriate = ramster_pampd_repatriate;
875 pamops->repatriate_preload = ramster_pampd_repatriate_preload; 884 pamops->repatriate_preload = ramster_pampd_repatriate_preload;
876} 885}
886EXPORT_SYMBOL_GPL(ramster_register_pamops);
877 887
878void __init ramster_init(bool cleancache, bool frontswap, 888void ramster_init(bool cleancache, bool frontswap,
879 bool frontswap_exclusive_gets) 889 bool frontswap_exclusive_gets,
890 bool frontswap_selfshrink)
880{ 891{
881 int ret = 0; 892 int ret = 0;
882 893
@@ -891,10 +902,17 @@ void __init ramster_init(bool cleancache, bool frontswap,
891 if (ret) 902 if (ret)
892 pr_err("ramster: can't create sysfs for ramster\n"); 903 pr_err("ramster: can't create sysfs for ramster\n");
893 (void)r2net_register_handlers(); 904 (void)r2net_register_handlers();
905#ifdef CONFIG_RAMSTER_MODULE
906 ret = r2nm_init();
907 if (ret)
908 pr_err("ramster: can't init r2net\n");
909 frontswap_selfshrinking = frontswap_selfshrink;
910#else
911 frontswap_selfshrinking = use_frontswap_selfshrink;
912#endif
894 INIT_LIST_HEAD(&ramster_rem_op_list); 913 INIT_LIST_HEAD(&ramster_rem_op_list);
895 ramster_flnode_cache = kmem_cache_create("ramster_flnode", 914 ramster_flnode_cache = kmem_cache_create("ramster_flnode",
896 sizeof(struct flushlist_node), 0, 0, NULL); 915 sizeof(struct flushlist_node), 0, 0, NULL);
897 frontswap_selfshrinking = use_frontswap_selfshrink;
898 if (frontswap_selfshrinking) { 916 if (frontswap_selfshrinking) {
899 pr_info("ramster: Initializing frontswap selfshrink driver.\n"); 917 pr_info("ramster: Initializing frontswap selfshrink driver.\n");
900 schedule_delayed_work(&selfshrink_worker, 918 schedule_delayed_work(&selfshrink_worker,
@@ -902,3 +920,4 @@ void __init ramster_init(bool cleancache, bool frontswap,
902 } 920 }
903 ramster_remotify_init(); 921 ramster_remotify_init();
904} 922}
923EXPORT_SYMBOL_GPL(ramster_init);
diff --git a/drivers/staging/zcache/ramster/ramster.h b/drivers/staging/zcache/ramster/ramster.h
index 12ae56f09ca4..6d41a7a772e3 100644
--- a/drivers/staging/zcache/ramster/ramster.h
+++ b/drivers/staging/zcache/ramster/ramster.h
@@ -147,7 +147,7 @@ extern int r2net_register_handlers(void);
147extern int r2net_remote_target_node_set(int); 147extern int r2net_remote_target_node_set(int);
148 148
149extern int ramster_remotify_pageframe(bool); 149extern int ramster_remotify_pageframe(bool);
150extern void ramster_init(bool, bool, bool); 150extern void ramster_init(bool, bool, bool, bool);
151extern void ramster_register_pamops(struct tmem_pamops *); 151extern void ramster_register_pamops(struct tmem_pamops *);
152extern int ramster_localify(int, struct tmem_oid *oidp, uint32_t, char *, 152extern int ramster_localify(int, struct tmem_oid *oidp, uint32_t, char *,
153 unsigned int, void *); 153 unsigned int, void *);
diff --git a/drivers/staging/zcache/ramster/ramster_nodemanager.h b/drivers/staging/zcache/ramster/ramster_nodemanager.h
index 49f879d943ab..dbaae34ea613 100644
--- a/drivers/staging/zcache/ramster/ramster_nodemanager.h
+++ b/drivers/staging/zcache/ramster/ramster_nodemanager.h
@@ -36,4 +36,6 @@
36/* host name, group name, cluster name all 64 bytes */ 36/* host name, group name, cluster name all 64 bytes */
37#define R2NM_MAX_NAME_LEN 64 /* __NEW_UTS_LEN */ 37#define R2NM_MAX_NAME_LEN 64 /* __NEW_UTS_LEN */
38 38
39extern int r2nm_init(void);
40
39#endif /* _RAMSTER_NODEMANAGER_H */ 41#endif /* _RAMSTER_NODEMANAGER_H */
diff --git a/drivers/staging/zcache/zcache-main.c b/drivers/staging/zcache/zcache-main.c
index 118602ff3aed..326c2ea17c38 100644
--- a/drivers/staging/zcache/zcache-main.c
+++ b/drivers/staging/zcache/zcache-main.c
@@ -1894,7 +1894,7 @@ static int __init zcache_init(void)
1894 } 1894 }
1895 if (ramster_enabled) 1895 if (ramster_enabled)
1896 ramster_init(!disable_cleancache, !disable_frontswap, 1896 ramster_init(!disable_cleancache, !disable_frontswap,
1897 frontswap_has_exclusive_gets); 1897 frontswap_has_exclusive_gets, false);
1898out: 1898out:
1899 return ret; 1899 return ret;
1900} 1900}