diff options
| author | Hugh Dickins <hughd@google.com> | 2012-05-29 18:07:09 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-29 19:22:28 -0400 |
| commit | fa9add641b1b1c564db916accac1db346e7a2759 (patch) | |
| tree | 875e74ec4d7fed0018fdbc134ad899949c5e3384 /include/linux | |
| parent | 75b00af77ed5b5a3d55549f9e0c33f3969b9330c (diff) | |
mm/memcg: apply add/del_page to lruvec
Take lruvec further: pass it instead of zone to add_page_to_lru_list() and
del_page_from_lru_list(); and pagevec_lru_move_fn() pass lruvec down to
its target functions.
This cleanup eliminates a swathe of cruft in memcontrol.c, including
mem_cgroup_lru_add_list(), mem_cgroup_lru_del_list() and
mem_cgroup_lru_move_lists() - which never actually touched the lists.
In their place, mem_cgroup_page_lruvec() to decide the lruvec, previously
a side-effect of add, and mem_cgroup_update_lru_size() to maintain the
lru_size stats.
Whilst these are simplifications in their own right, the goal is to bring
the evaluation of lruvec next to the spin_locking of the lrus, in
preparation for a future patch.
Signed-off-by: Hugh Dickins <hughd@google.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Acked-by: Michal Hocko <mhocko@suse.cz>
Acked-by: Konstantin Khlebnikov <khlebnikov@openvz.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
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/memcontrol.h | 32 | ||||
| -rw-r--r-- | include/linux/mm_inline.h | 20 | ||||
| -rw-r--r-- | include/linux/swap.h | 4 |
3 files changed, 19 insertions, 37 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 609ef7c28c6c..83e7ba90d6e5 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
| @@ -63,11 +63,7 @@ extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, | |||
| 63 | gfp_t gfp_mask); | 63 | gfp_t gfp_mask); |
| 64 | 64 | ||
| 65 | struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *); | 65 | struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *); |
| 66 | struct lruvec *mem_cgroup_lru_add_list(struct zone *, struct page *, | 66 | struct lruvec *mem_cgroup_page_lruvec(struct page *, struct zone *); |
| 67 | enum lru_list); | ||
| 68 | void mem_cgroup_lru_del_list(struct page *, enum lru_list); | ||
| 69 | struct lruvec *mem_cgroup_lru_move_lists(struct zone *, struct page *, | ||
| 70 | enum lru_list, enum lru_list); | ||
| 71 | 67 | ||
| 72 | /* For coalescing uncharge for reducing memcg' overhead*/ | 68 | /* For coalescing uncharge for reducing memcg' overhead*/ |
| 73 | extern void mem_cgroup_uncharge_start(void); | 69 | extern void mem_cgroup_uncharge_start(void); |
| @@ -122,8 +118,7 @@ int mem_cgroup_inactive_anon_is_low(struct lruvec *lruvec); | |||
| 122 | int mem_cgroup_inactive_file_is_low(struct lruvec *lruvec); | 118 | int mem_cgroup_inactive_file_is_low(struct lruvec *lruvec); |
| 123 | int mem_cgroup_select_victim_node(struct mem_cgroup *memcg); | 119 | int mem_cgroup_select_victim_node(struct mem_cgroup *memcg); |
| 124 | unsigned long mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list); | 120 | unsigned long mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list); |
| 125 | struct zone_reclaim_stat* | 121 | void mem_cgroup_update_lru_size(struct lruvec *, enum lru_list, int); |
| 126 | mem_cgroup_get_reclaim_stat_from_page(struct page *page); | ||
| 127 | extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, | 122 | extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, |
| 128 | struct task_struct *p); | 123 | struct task_struct *p); |
| 129 | extern void mem_cgroup_replace_page_cache(struct page *oldpage, | 124 | extern void mem_cgroup_replace_page_cache(struct page *oldpage, |
| @@ -250,21 +245,8 @@ static inline struct lruvec *mem_cgroup_zone_lruvec(struct zone *zone, | |||
| 250 | return &zone->lruvec; | 245 | return &zone->lruvec; |
| 251 | } | 246 | } |
| 252 | 247 | ||
| 253 | static inline struct lruvec *mem_cgroup_lru_add_list(struct zone *zone, | 248 | static inline struct lruvec *mem_cgroup_page_lruvec(struct page *page, |
| 254 | struct page *page, | 249 | struct zone *zone) |
| 255 | enum lru_list lru) | ||
| 256 | { | ||
| 257 | return &zone->lruvec; | ||
| 258 | } | ||
| 259 | |||
| 260 | static inline void mem_cgroup_lru_del_list(struct page *page, enum lru_list lru) | ||
| 261 | { | ||
| 262 | } | ||
| 263 | |||
| 264 | static inline struct lruvec *mem_cgroup_lru_move_lists(struct zone *zone, | ||
| 265 | struct page *page, | ||
| 266 | enum lru_list from, | ||
| 267 | enum lru_list to) | ||
| 268 | { | 250 | { |
| 269 | return &zone->lruvec; | 251 | return &zone->lruvec; |
| 270 | } | 252 | } |
| @@ -345,10 +327,10 @@ mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list lru) | |||
| 345 | return 0; | 327 | return 0; |
| 346 | } | 328 | } |
| 347 | 329 | ||
| 348 | static inline struct zone_reclaim_stat* | 330 | static inline void |
| 349 | mem_cgroup_get_reclaim_stat_from_page(struct page *page) | 331 | mem_cgroup_update_lru_size(struct lruvec *lruvec, enum lru_list lru, |
| 332 | int increment) | ||
| 350 | { | 333 | { |
| 351 | return NULL; | ||
| 352 | } | 334 | } |
| 353 | 335 | ||
| 354 | static inline void | 336 | static inline void |
diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index 16d45d9c31a4..1397ccf81e91 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h | |||
| @@ -21,22 +21,22 @@ static inline int page_is_file_cache(struct page *page) | |||
| 21 | return !PageSwapBacked(page); | 21 | return !PageSwapBacked(page); |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | static __always_inline void | 24 | static __always_inline void add_page_to_lru_list(struct page *page, |
| 25 | add_page_to_lru_list(struct zone *zone, struct page *page, enum lru_list lru) | 25 | struct lruvec *lruvec, enum lru_list lru) |
| 26 | { | 26 | { |
| 27 | struct lruvec *lruvec; | 27 | int nr_pages = hpage_nr_pages(page); |
| 28 | 28 | mem_cgroup_update_lru_size(lruvec, lru, nr_pages); | |
| 29 | lruvec = mem_cgroup_lru_add_list(zone, page, lru); | ||
| 30 | list_add(&page->lru, &lruvec->lists[lru]); | 29 | list_add(&page->lru, &lruvec->lists[lru]); |
| 31 | __mod_zone_page_state(zone, NR_LRU_BASE + lru, hpage_nr_pages(page)); | 30 | __mod_zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru, nr_pages); |
| 32 | } | 31 | } |
| 33 | 32 | ||
| 34 | static __always_inline void | 33 | static __always_inline void del_page_from_lru_list(struct page *page, |
| 35 | del_page_from_lru_list(struct zone *zone, struct page *page, enum lru_list lru) | 34 | struct lruvec *lruvec, enum lru_list lru) |
| 36 | { | 35 | { |
| 37 | mem_cgroup_lru_del_list(page, lru); | 36 | int nr_pages = hpage_nr_pages(page); |
| 37 | mem_cgroup_update_lru_size(lruvec, lru, -nr_pages); | ||
| 38 | list_del(&page->lru); | 38 | list_del(&page->lru); |
| 39 | __mod_zone_page_state(zone, NR_LRU_BASE + lru, -hpage_nr_pages(page)); | 39 | __mod_zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru, -nr_pages); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | /** | 42 | /** |
diff --git a/include/linux/swap.h b/include/linux/swap.h index ff38eb7c0ec4..b6661933e252 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
| @@ -221,8 +221,8 @@ extern unsigned int nr_free_pagecache_pages(void); | |||
| 221 | /* linux/mm/swap.c */ | 221 | /* linux/mm/swap.c */ |
| 222 | extern void __lru_cache_add(struct page *, enum lru_list lru); | 222 | extern void __lru_cache_add(struct page *, enum lru_list lru); |
| 223 | extern void lru_cache_add_lru(struct page *, enum lru_list lru); | 223 | extern void lru_cache_add_lru(struct page *, enum lru_list lru); |
| 224 | extern void lru_add_page_tail(struct zone* zone, | 224 | extern void lru_add_page_tail(struct page *page, struct page *page_tail, |
| 225 | struct page *page, struct page *page_tail); | 225 | struct lruvec *lruvec); |
| 226 | extern void activate_page(struct page *); | 226 | extern void activate_page(struct page *); |
| 227 | extern void mark_page_accessed(struct page *); | 227 | extern void mark_page_accessed(struct page *); |
| 228 | extern void lru_add_drain(void); | 228 | extern void lru_add_drain(void); |
