diff options
Diffstat (limited to 'mm/swap_state.c')
-rw-r--r-- | mm/swap_state.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/mm/swap_state.c b/mm/swap_state.c index ec42f01a8d02..f96e3ff1e791 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/backing-dev.h> | 17 | #include <linux/backing-dev.h> |
18 | #include <linux/pagevec.h> | 18 | #include <linux/pagevec.h> |
19 | #include <linux/migrate.h> | 19 | #include <linux/migrate.h> |
20 | #include <linux/memcontrol.h> | ||
20 | 21 | ||
21 | #include <asm/pgtable.h> | 22 | #include <asm/pgtable.h> |
22 | 23 | ||
@@ -76,6 +77,11 @@ int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask) | |||
76 | BUG_ON(PagePrivate(page)); | 77 | BUG_ON(PagePrivate(page)); |
77 | error = radix_tree_preload(gfp_mask); | 78 | error = radix_tree_preload(gfp_mask); |
78 | if (!error) { | 79 | if (!error) { |
80 | |||
81 | error = mem_cgroup_charge(page, current->mm); | ||
82 | if (error) | ||
83 | goto out; | ||
84 | |||
79 | write_lock_irq(&swapper_space.tree_lock); | 85 | write_lock_irq(&swapper_space.tree_lock); |
80 | error = radix_tree_insert(&swapper_space.page_tree, | 86 | error = radix_tree_insert(&swapper_space.page_tree, |
81 | entry.val, page); | 87 | entry.val, page); |
@@ -86,10 +92,13 @@ int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask) | |||
86 | total_swapcache_pages++; | 92 | total_swapcache_pages++; |
87 | __inc_zone_page_state(page, NR_FILE_PAGES); | 93 | __inc_zone_page_state(page, NR_FILE_PAGES); |
88 | INC_CACHE_INFO(add_total); | 94 | INC_CACHE_INFO(add_total); |
95 | } else { | ||
96 | mem_cgroup_uncharge_page(page); | ||
89 | } | 97 | } |
90 | write_unlock_irq(&swapper_space.tree_lock); | 98 | write_unlock_irq(&swapper_space.tree_lock); |
91 | radix_tree_preload_end(); | 99 | radix_tree_preload_end(); |
92 | } | 100 | } |
101 | out: | ||
93 | return error; | 102 | return error; |
94 | } | 103 | } |
95 | 104 | ||
@@ -104,6 +113,7 @@ void __delete_from_swap_cache(struct page *page) | |||
104 | BUG_ON(PageWriteback(page)); | 113 | BUG_ON(PageWriteback(page)); |
105 | BUG_ON(PagePrivate(page)); | 114 | BUG_ON(PagePrivate(page)); |
106 | 115 | ||
116 | mem_cgroup_uncharge_page(page); | ||
107 | radix_tree_delete(&swapper_space.page_tree, page_private(page)); | 117 | radix_tree_delete(&swapper_space.page_tree, page_private(page)); |
108 | set_page_private(page, 0); | 118 | set_page_private(page, 0); |
109 | ClearPageSwapCache(page); | 119 | ClearPageSwapCache(page); |