aboutsummaryrefslogtreecommitdiffstats
path: root/mm/swap_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/swap_state.c')
-rw-r--r--mm/swap_state.c10
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 }
101out:
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);