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); |
