diff options
author | Dan Magenheimer <dan.magenheimer@oracle.com> | 2013-04-30 18:27:03 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-30 20:04:01 -0400 |
commit | 1ac37bee81531cb62a9a64e78ffdad7da9b20ea2 (patch) | |
tree | d9460e2c71cdaa991696f1058cefa2c8a17cc4a3 /drivers | |
parent | f42158fe6785dd366073c7fd00f159a65c631597 (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.h | 6 | ||||
-rw-r--r-- | drivers/staging/zcache/ramster/debug.c | 2 | ||||
-rw-r--r-- | drivers/staging/zcache/ramster/nodemanager.c | 9 | ||||
-rw-r--r-- | drivers/staging/zcache/ramster/ramster.c | 29 | ||||
-rw-r--r-- | drivers/staging/zcache/ramster/ramster.h | 2 | ||||
-rw-r--r-- | drivers/staging/zcache/ramster/ramster_nodemanager.h | 2 | ||||
-rw-r--r-- | drivers/staging/zcache/zcache-main.c | 2 |
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 |
17 | static inline void ramster_init(bool x, bool y, bool z) | 21 | static 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 | ||
46 | int __init ramster_debugfs_init(void) | 46 | int 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 | ||
952 | static int __init init_r2nm(void) | 952 | int r2nm_init(void) |
953 | { | 953 | { |
954 | int ret = -1; | 954 | int ret = -1; |
955 | 955 | ||
@@ -986,10 +986,11 @@ out_r2hb: | |||
986 | out: | 986 | out: |
987 | return ret; | 987 | return ret; |
988 | } | 988 | } |
989 | EXPORT_SYMBOL_GPL(r2nm_init); | ||
989 | 990 | ||
990 | MODULE_AUTHOR("Oracle"); | 991 | MODULE_AUTHOR("Oracle"); |
991 | MODULE_LICENSE("GPL"); | 992 | MODULE_LICENSE("GPL"); |
992 | 993 | ||
993 | /* module_init(init_r2nm) */ | 994 | #ifndef CONFIG_RAMSTER_MODULE |
994 | late_initcall(init_r2nm); | 995 | late_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 | } |
124 | EXPORT_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 | } |
392 | EXPORT_SYMBOL_GPL(ramster_pampd_free); | ||
391 | 393 | ||
392 | void ramster_count_foreign_pages(bool eph, int count) | 394 | void 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 | } |
413 | EXPORT_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 | ||
596 | void __init ramster_remotify_init(void) | 599 | void 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; | |||
768 | static void selfshrink_process(struct work_struct *work); | 771 | static void selfshrink_process(struct work_struct *work); |
769 | static DECLARE_DELAYED_WORK(selfshrink_worker, selfshrink_process); | 772 | static 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. */ |
772 | static bool use_frontswap_selfshrink __initdata = true; | 776 | static 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 | ||
827 | static int __init ramster_nofrontswap_selfshrink_setup(char *s) | 833 | static 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 | ||
835 | static void selfshrink_process(struct work_struct *work) | 842 | static 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 | } |
859 | EXPORT_SYMBOL_GPL(ramster_cpu_up); | ||
852 | 860 | ||
853 | void ramster_cpu_down(int cpu) | 861 | void 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 | } |
875 | EXPORT_SYMBOL_GPL(ramster_cpu_down); | ||
867 | 876 | ||
868 | void ramster_register_pamops(struct tmem_pamops *pamops) | 877 | void 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 | } |
886 | EXPORT_SYMBOL_GPL(ramster_register_pamops); | ||
877 | 887 | ||
878 | void __init ramster_init(bool cleancache, bool frontswap, | 888 | void 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 | } |
923 | EXPORT_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); | |||
147 | extern int r2net_remote_target_node_set(int); | 147 | extern int r2net_remote_target_node_set(int); |
148 | 148 | ||
149 | extern int ramster_remotify_pageframe(bool); | 149 | extern int ramster_remotify_pageframe(bool); |
150 | extern void ramster_init(bool, bool, bool); | 150 | extern void ramster_init(bool, bool, bool, bool); |
151 | extern void ramster_register_pamops(struct tmem_pamops *); | 151 | extern void ramster_register_pamops(struct tmem_pamops *); |
152 | extern int ramster_localify(int, struct tmem_oid *oidp, uint32_t, char *, | 152 | extern 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 | ||
39 | extern 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); |
1898 | out: | 1898 | out: |
1899 | return ret; | 1899 | return ret; |
1900 | } | 1900 | } |