diff options
author | Bob Liu <lliubbo@gmail.com> | 2013-04-30 18:26:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-30 20:04:00 -0400 |
commit | f066ea230a65f939afc354beae62716ab5f0e645 (patch) | |
tree | 1056e57d4b0c9819c74bd929006cf352994230d2 | |
parent | 1e01c968db3d0aebd48e31db15f24516b03128df (diff) |
mm: frontswap: cleanup code
After allowing tmem backends to build/run as modules, frontswap_enabled
always true if defined CONFIG_FRONTSWAP. But frontswap_test() depends on
whether backend is registered, mv it into frontswap.c using fronstswap_ops
to make the decision.
frontswap_set/clear are not used outside frontswap, so don't export them.
Signed-off-by: Bob Liu <lliubbo@gmail.com>
Cc: Wanpeng Li <liwanp@linux.vnet.ibm.com>
Cc: Andor Daam <andor.daam@googlemail.com>
Cc: Dan Magenheimer <dan.magenheimer@oracle.com>
Cc: Florian Schmaus <fschmaus@gmail.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Stefan Hengelein <ilendir@googlemail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | include/linux/frontswap.h | 28 | ||||
-rw-r--r-- | mm/frontswap.c | 57 |
2 files changed, 33 insertions, 52 deletions
diff --git a/include/linux/frontswap.h b/include/linux/frontswap.h index d4f29875c7cc..6c49e1eba552 100644 --- a/include/linux/frontswap.h +++ b/include/linux/frontswap.h | |||
@@ -22,6 +22,7 @@ extern void frontswap_writethrough(bool); | |||
22 | #define FRONTSWAP_HAS_EXCLUSIVE_GETS | 22 | #define FRONTSWAP_HAS_EXCLUSIVE_GETS |
23 | extern void frontswap_tmem_exclusive_gets(bool); | 23 | extern void frontswap_tmem_exclusive_gets(bool); |
24 | 24 | ||
25 | extern bool __frontswap_test(struct swap_info_struct *, pgoff_t); | ||
25 | extern void __frontswap_init(unsigned type); | 26 | extern void __frontswap_init(unsigned type); |
26 | extern int __frontswap_store(struct page *page); | 27 | extern int __frontswap_store(struct page *page); |
27 | extern int __frontswap_load(struct page *page); | 28 | extern int __frontswap_load(struct page *page); |
@@ -29,26 +30,11 @@ extern void __frontswap_invalidate_page(unsigned, pgoff_t); | |||
29 | extern void __frontswap_invalidate_area(unsigned); | 30 | extern void __frontswap_invalidate_area(unsigned); |
30 | 31 | ||
31 | #ifdef CONFIG_FRONTSWAP | 32 | #ifdef CONFIG_FRONTSWAP |
33 | #define frontswap_enabled (1) | ||
32 | 34 | ||
33 | static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) | 35 | static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) |
34 | { | 36 | { |
35 | bool ret = false; | 37 | return __frontswap_test(sis, offset); |
36 | |||
37 | if (frontswap_enabled && sis->frontswap_map) | ||
38 | ret = test_bit(offset, sis->frontswap_map); | ||
39 | return ret; | ||
40 | } | ||
41 | |||
42 | static inline void frontswap_set(struct swap_info_struct *sis, pgoff_t offset) | ||
43 | { | ||
44 | if (frontswap_enabled && sis->frontswap_map) | ||
45 | set_bit(offset, sis->frontswap_map); | ||
46 | } | ||
47 | |||
48 | static inline void frontswap_clear(struct swap_info_struct *sis, pgoff_t offset) | ||
49 | { | ||
50 | if (frontswap_enabled && sis->frontswap_map) | ||
51 | clear_bit(offset, sis->frontswap_map); | ||
52 | } | 38 | } |
53 | 39 | ||
54 | static inline void frontswap_map_set(struct swap_info_struct *p, | 40 | static inline void frontswap_map_set(struct swap_info_struct *p, |
@@ -71,14 +57,6 @@ static inline bool frontswap_test(struct swap_info_struct *sis, pgoff_t offset) | |||
71 | return false; | 57 | return false; |
72 | } | 58 | } |
73 | 59 | ||
74 | static inline void frontswap_set(struct swap_info_struct *sis, pgoff_t offset) | ||
75 | { | ||
76 | } | ||
77 | |||
78 | static inline void frontswap_clear(struct swap_info_struct *sis, pgoff_t offset) | ||
79 | { | ||
80 | } | ||
81 | |||
82 | static inline void frontswap_map_set(struct swap_info_struct *p, | 60 | static inline void frontswap_map_set(struct swap_info_struct *p, |
83 | unsigned long *map) | 61 | unsigned long *map) |
84 | { | 62 | { |
diff --git a/mm/frontswap.c b/mm/frontswap.c index e44c9cbd1443..2760b0f98822 100644 --- a/mm/frontswap.c +++ b/mm/frontswap.c | |||
@@ -27,14 +27,6 @@ | |||
27 | static struct frontswap_ops *frontswap_ops __read_mostly; | 27 | static struct frontswap_ops *frontswap_ops __read_mostly; |
28 | 28 | ||
29 | /* | 29 | /* |
30 | * This global enablement flag reduces overhead on systems where frontswap_ops | ||
31 | * has not been registered, so is preferred to the slower alternative: a | ||
32 | * function call that checks a non-global. | ||
33 | */ | ||
34 | bool frontswap_enabled __read_mostly; | ||
35 | EXPORT_SYMBOL(frontswap_enabled); | ||
36 | |||
37 | /* | ||
38 | * If enabled, frontswap_store will return failure even on success. As | 30 | * If enabled, frontswap_store will return failure even on success. As |
39 | * a result, the swap subsystem will always write the page to swap, in | 31 | * a result, the swap subsystem will always write the page to swap, in |
40 | * effect converting frontswap into a writethrough cache. In this mode, | 32 | * effect converting frontswap into a writethrough cache. In this mode, |
@@ -128,8 +120,6 @@ struct frontswap_ops *frontswap_register_ops(struct frontswap_ops *ops) | |||
128 | struct frontswap_ops *old = frontswap_ops; | 120 | struct frontswap_ops *old = frontswap_ops; |
129 | int i; | 121 | int i; |
130 | 122 | ||
131 | frontswap_enabled = true; | ||
132 | |||
133 | for (i = 0; i < MAX_SWAPFILES; i++) { | 123 | for (i = 0; i < MAX_SWAPFILES; i++) { |
134 | if (test_and_clear_bit(i, need_init)) | 124 | if (test_and_clear_bit(i, need_init)) |
135 | ops->init(i); | 125 | ops->init(i); |
@@ -183,9 +173,21 @@ void __frontswap_init(unsigned type) | |||
183 | } | 173 | } |
184 | EXPORT_SYMBOL(__frontswap_init); | 174 | EXPORT_SYMBOL(__frontswap_init); |
185 | 175 | ||
186 | static inline void __frontswap_clear(struct swap_info_struct *sis, pgoff_t offset) | 176 | bool __frontswap_test(struct swap_info_struct *sis, |
177 | pgoff_t offset) | ||
178 | { | ||
179 | bool ret = false; | ||
180 | |||
181 | if (frontswap_ops && sis->frontswap_map) | ||
182 | ret = test_bit(offset, sis->frontswap_map); | ||
183 | return ret; | ||
184 | } | ||
185 | EXPORT_SYMBOL(__frontswap_test); | ||
186 | |||
187 | static inline void __frontswap_clear(struct swap_info_struct *sis, | ||
188 | pgoff_t offset) | ||
187 | { | 189 | { |
188 | frontswap_clear(sis, offset); | 190 | clear_bit(offset, sis->frontswap_map); |
189 | atomic_dec(&sis->frontswap_pages); | 191 | atomic_dec(&sis->frontswap_pages); |
190 | } | 192 | } |
191 | 193 | ||
@@ -204,18 +206,20 @@ int __frontswap_store(struct page *page) | |||
204 | struct swap_info_struct *sis = swap_info[type]; | 206 | struct swap_info_struct *sis = swap_info[type]; |
205 | pgoff_t offset = swp_offset(entry); | 207 | pgoff_t offset = swp_offset(entry); |
206 | 208 | ||
207 | if (!frontswap_ops) { | 209 | /* |
208 | inc_frontswap_failed_stores(); | 210 | * Return if no backend registed. |
211 | * Don't need to inc frontswap_failed_stores here. | ||
212 | */ | ||
213 | if (!frontswap_ops) | ||
209 | return ret; | 214 | return ret; |
210 | } | ||
211 | 215 | ||
212 | BUG_ON(!PageLocked(page)); | 216 | BUG_ON(!PageLocked(page)); |
213 | BUG_ON(sis == NULL); | 217 | BUG_ON(sis == NULL); |
214 | if (frontswap_test(sis, offset)) | 218 | if (__frontswap_test(sis, offset)) |
215 | dup = 1; | 219 | dup = 1; |
216 | ret = frontswap_ops->store(type, offset, page); | 220 | ret = frontswap_ops->store(type, offset, page); |
217 | if (ret == 0) { | 221 | if (ret == 0) { |
218 | frontswap_set(sis, offset); | 222 | set_bit(offset, sis->frontswap_map); |
219 | inc_frontswap_succ_stores(); | 223 | inc_frontswap_succ_stores(); |
220 | if (!dup) | 224 | if (!dup) |
221 | atomic_inc(&sis->frontswap_pages); | 225 | atomic_inc(&sis->frontswap_pages); |
@@ -248,18 +252,18 @@ int __frontswap_load(struct page *page) | |||
248 | struct swap_info_struct *sis = swap_info[type]; | 252 | struct swap_info_struct *sis = swap_info[type]; |
249 | pgoff_t offset = swp_offset(entry); | 253 | pgoff_t offset = swp_offset(entry); |
250 | 254 | ||
251 | if (!frontswap_ops) | ||
252 | return ret; | ||
253 | |||
254 | BUG_ON(!PageLocked(page)); | 255 | BUG_ON(!PageLocked(page)); |
255 | BUG_ON(sis == NULL); | 256 | BUG_ON(sis == NULL); |
256 | if (frontswap_test(sis, offset)) | 257 | /* |
258 | * __frontswap_test() will check whether there is backend registered | ||
259 | */ | ||
260 | if (__frontswap_test(sis, offset)) | ||
257 | ret = frontswap_ops->load(type, offset, page); | 261 | ret = frontswap_ops->load(type, offset, page); |
258 | if (ret == 0) { | 262 | if (ret == 0) { |
259 | inc_frontswap_loads(); | 263 | inc_frontswap_loads(); |
260 | if (frontswap_tmem_exclusive_gets_enabled) { | 264 | if (frontswap_tmem_exclusive_gets_enabled) { |
261 | SetPageDirty(page); | 265 | SetPageDirty(page); |
262 | frontswap_clear(sis, offset); | 266 | __frontswap_clear(sis, offset); |
263 | } | 267 | } |
264 | } | 268 | } |
265 | return ret; | 269 | return ret; |
@@ -274,11 +278,11 @@ void __frontswap_invalidate_page(unsigned type, pgoff_t offset) | |||
274 | { | 278 | { |
275 | struct swap_info_struct *sis = swap_info[type]; | 279 | struct swap_info_struct *sis = swap_info[type]; |
276 | 280 | ||
277 | if (!frontswap_ops) | ||
278 | return; | ||
279 | |||
280 | BUG_ON(sis == NULL); | 281 | BUG_ON(sis == NULL); |
281 | if (frontswap_test(sis, offset)) { | 282 | /* |
283 | * __frontswap_test() will check whether there is backend registered | ||
284 | */ | ||
285 | if (__frontswap_test(sis, offset)) { | ||
282 | frontswap_ops->invalidate_page(type, offset); | 286 | frontswap_ops->invalidate_page(type, offset); |
283 | __frontswap_clear(sis, offset); | 287 | __frontswap_clear(sis, offset); |
284 | inc_frontswap_invalidates(); | 288 | inc_frontswap_invalidates(); |
@@ -435,7 +439,6 @@ static int __init init_frontswap(void) | |||
435 | debugfs_create_u64("invalidates", S_IRUGO, | 439 | debugfs_create_u64("invalidates", S_IRUGO, |
436 | root, &frontswap_invalidates); | 440 | root, &frontswap_invalidates); |
437 | #endif | 441 | #endif |
438 | frontswap_enabled = 1; | ||
439 | return 0; | 442 | return 0; |
440 | } | 443 | } |
441 | 444 | ||