diff options
| author | KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | 2009-06-16 18:32:53 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-16 22:47:42 -0400 |
| commit | 355cfa73ddff2fb8fa14e93bd94a057cc022512e (patch) | |
| tree | 7ff70cd56d533070d50b06db6ba0086e8aab0d71 /include/linux | |
| parent | cb4b86ba47bb0937b71fb825b3ed88adf7a190f0 (diff) | |
mm: modify swap_map and add SWAP_HAS_CACHE flag
This is a part of the patches for fixing memcg's swap accountinf leak.
But, IMHO, not a bad patch even if no memcg.
There are 2 kinds of references to swap.
- reference from swap entry
- reference from swap cache
Then,
- If there is swap cache && swap's refcnt is 1, there is only swap cache.
(*) swapcount(entry) == 1 && find_get_page(swapper_space, entry) != NULL
This counting logic have worked well for a long time. But considering
that we cannot know there is a _real_ reference or not by swap_map[],
current usage of counter is not very good.
This patch adds a flag SWAP_HAS_CACHE and recored information that a swap
entry has a cache or not. This will remove -1 magic used in swapfile.c
and be a help to avoid unnecessary find_get_page().
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Tested-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Hugh Dickins <hugh.dickins@tiscali.co.uk>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Li Zefan <lizf@cn.fujitsu.com>
Cc: Dhaval Giani <dhaval@linux.vnet.ibm.com>
Cc: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/swap.h | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/include/linux/swap.h b/include/linux/swap.h index 259e96c150ef..fed5e8e1104b 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
| @@ -129,9 +129,10 @@ enum { | |||
| 129 | 129 | ||
| 130 | #define SWAP_CLUSTER_MAX 32 | 130 | #define SWAP_CLUSTER_MAX 32 |
| 131 | 131 | ||
| 132 | #define SWAP_MAP_MAX 0x7fff | 132 | #define SWAP_MAP_MAX 0x7ffe |
| 133 | #define SWAP_MAP_BAD 0x8000 | 133 | #define SWAP_MAP_BAD 0x7fff |
| 134 | 134 | #define SWAP_HAS_CACHE 0x8000 /* There is a swap cache of entry. */ | |
| 135 | #define SWAP_COUNT_MASK (~SWAP_HAS_CACHE) | ||
| 135 | /* | 136 | /* |
| 136 | * The in-memory structure used to track swap areas. | 137 | * The in-memory structure used to track swap areas. |
| 137 | */ | 138 | */ |
| @@ -281,7 +282,7 @@ extern long total_swap_pages; | |||
| 281 | extern void si_swapinfo(struct sysinfo *); | 282 | extern void si_swapinfo(struct sysinfo *); |
| 282 | extern swp_entry_t get_swap_page(void); | 283 | extern swp_entry_t get_swap_page(void); |
| 283 | extern swp_entry_t get_swap_page_of_type(int); | 284 | extern swp_entry_t get_swap_page_of_type(int); |
| 284 | extern int swap_duplicate(swp_entry_t); | 285 | extern void swap_duplicate(swp_entry_t); |
| 285 | extern int swapcache_prepare(swp_entry_t); | 286 | extern int swapcache_prepare(swp_entry_t); |
| 286 | extern int valid_swaphandles(swp_entry_t, unsigned long *); | 287 | extern int valid_swaphandles(swp_entry_t, unsigned long *); |
| 287 | extern void swap_free(swp_entry_t); | 288 | extern void swap_free(swp_entry_t); |
| @@ -353,9 +354,12 @@ static inline void show_swap_cache_info(void) | |||
| 353 | } | 354 | } |
| 354 | 355 | ||
| 355 | #define free_swap_and_cache(swp) is_migration_entry(swp) | 356 | #define free_swap_and_cache(swp) is_migration_entry(swp) |
| 356 | #define swap_duplicate(swp) is_migration_entry(swp) | ||
| 357 | #define swapcache_prepare(swp) is_migration_entry(swp) | 357 | #define swapcache_prepare(swp) is_migration_entry(swp) |
| 358 | 358 | ||
| 359 | static inline void swap_duplicate(swp_entry_t swp) | ||
| 360 | { | ||
| 361 | } | ||
| 362 | |||
| 359 | static inline void swap_free(swp_entry_t swp) | 363 | static inline void swap_free(swp_entry_t swp) |
| 360 | { | 364 | { |
| 361 | } | 365 | } |
