diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/memcontrol.h | 49 | ||||
| -rw-r--r-- | include/linux/page_cgroup.h | 43 | ||||
| -rw-r--r-- | include/linux/swap.h | 12 |
3 files changed, 28 insertions, 76 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 1a9a096858e0..806b8fa15c5f 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
| @@ -60,15 +60,17 @@ void mem_cgroup_commit_charge(struct page *page, struct mem_cgroup *memcg, | |||
| 60 | bool lrucare); | 60 | bool lrucare); |
| 61 | void mem_cgroup_cancel_charge(struct page *page, struct mem_cgroup *memcg); | 61 | void mem_cgroup_cancel_charge(struct page *page, struct mem_cgroup *memcg); |
| 62 | 62 | ||
| 63 | struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *); | 63 | void mem_cgroup_uncharge(struct page *page); |
| 64 | struct lruvec *mem_cgroup_page_lruvec(struct page *, struct zone *); | 64 | |
| 65 | /* Batched uncharging */ | ||
| 66 | void mem_cgroup_uncharge_start(void); | ||
| 67 | void mem_cgroup_uncharge_end(void); | ||
| 65 | 68 | ||
| 66 | /* For coalescing uncharge for reducing memcg' overhead*/ | 69 | void mem_cgroup_migrate(struct page *oldpage, struct page *newpage, |
| 67 | extern void mem_cgroup_uncharge_start(void); | 70 | bool lrucare); |
| 68 | extern void mem_cgroup_uncharge_end(void); | ||
| 69 | 71 | ||
| 70 | extern void mem_cgroup_uncharge_page(struct page *page); | 72 | struct lruvec *mem_cgroup_zone_lruvec(struct zone *, struct mem_cgroup *); |
| 71 | extern void mem_cgroup_uncharge_cache_page(struct page *page); | 73 | struct lruvec *mem_cgroup_page_lruvec(struct page *, struct zone *); |
| 72 | 74 | ||
| 73 | bool __mem_cgroup_same_or_subtree(const struct mem_cgroup *root_memcg, | 75 | bool __mem_cgroup_same_or_subtree(const struct mem_cgroup *root_memcg, |
| 74 | struct mem_cgroup *memcg); | 76 | struct mem_cgroup *memcg); |
| @@ -96,12 +98,6 @@ bool mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *memcg) | |||
| 96 | 98 | ||
| 97 | extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg); | 99 | extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *memcg); |
| 98 | 100 | ||
| 99 | extern void | ||
| 100 | mem_cgroup_prepare_migration(struct page *page, struct page *newpage, | ||
| 101 | struct mem_cgroup **memcgp); | ||
| 102 | extern void mem_cgroup_end_migration(struct mem_cgroup *memcg, | ||
| 103 | struct page *oldpage, struct page *newpage, bool migration_ok); | ||
| 104 | |||
| 105 | struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *, | 101 | struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *, |
| 106 | struct mem_cgroup *, | 102 | struct mem_cgroup *, |
| 107 | struct mem_cgroup_reclaim_cookie *); | 103 | struct mem_cgroup_reclaim_cookie *); |
| @@ -116,8 +112,6 @@ unsigned long mem_cgroup_get_lru_size(struct lruvec *lruvec, enum lru_list); | |||
| 116 | void mem_cgroup_update_lru_size(struct lruvec *, enum lru_list, int); | 112 | void mem_cgroup_update_lru_size(struct lruvec *, enum lru_list, int); |
| 117 | extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, | 113 | extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, |
| 118 | struct task_struct *p); | 114 | struct task_struct *p); |
| 119 | extern void mem_cgroup_replace_page_cache(struct page *oldpage, | ||
| 120 | struct page *newpage); | ||
| 121 | 115 | ||
| 122 | static inline void mem_cgroup_oom_enable(void) | 116 | static inline void mem_cgroup_oom_enable(void) |
| 123 | { | 117 | { |
| @@ -235,19 +229,21 @@ static inline void mem_cgroup_cancel_charge(struct page *page, | |||
| 235 | { | 229 | { |
| 236 | } | 230 | } |
| 237 | 231 | ||
| 238 | static inline void mem_cgroup_uncharge_start(void) | 232 | static inline void mem_cgroup_uncharge(struct page *page) |
| 239 | { | 233 | { |
| 240 | } | 234 | } |
| 241 | 235 | ||
| 242 | static inline void mem_cgroup_uncharge_end(void) | 236 | static inline void mem_cgroup_uncharge_start(void) |
| 243 | { | 237 | { |
| 244 | } | 238 | } |
| 245 | 239 | ||
| 246 | static inline void mem_cgroup_uncharge_page(struct page *page) | 240 | static inline void mem_cgroup_uncharge_end(void) |
| 247 | { | 241 | { |
| 248 | } | 242 | } |
| 249 | 243 | ||
| 250 | static inline void mem_cgroup_uncharge_cache_page(struct page *page) | 244 | static inline void mem_cgroup_migrate(struct page *oldpage, |
| 245 | struct page *newpage, | ||
| 246 | bool lrucare) | ||
| 251 | { | 247 | { |
| 252 | } | 248 | } |
| 253 | 249 | ||
| @@ -286,17 +282,6 @@ static inline struct cgroup_subsys_state | |||
| 286 | return NULL; | 282 | return NULL; |
| 287 | } | 283 | } |
| 288 | 284 | ||
| 289 | static inline void | ||
| 290 | mem_cgroup_prepare_migration(struct page *page, struct page *newpage, | ||
| 291 | struct mem_cgroup **memcgp) | ||
| 292 | { | ||
| 293 | } | ||
| 294 | |||
| 295 | static inline void mem_cgroup_end_migration(struct mem_cgroup *memcg, | ||
| 296 | struct page *oldpage, struct page *newpage, bool migration_ok) | ||
| 297 | { | ||
| 298 | } | ||
| 299 | |||
| 300 | static inline struct mem_cgroup * | 285 | static inline struct mem_cgroup * |
| 301 | mem_cgroup_iter(struct mem_cgroup *root, | 286 | mem_cgroup_iter(struct mem_cgroup *root, |
| 302 | struct mem_cgroup *prev, | 287 | struct mem_cgroup *prev, |
| @@ -392,10 +377,6 @@ static inline | |||
| 392 | void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx) | 377 | void mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx) |
| 393 | { | 378 | { |
| 394 | } | 379 | } |
| 395 | static inline void mem_cgroup_replace_page_cache(struct page *oldpage, | ||
| 396 | struct page *newpage) | ||
| 397 | { | ||
| 398 | } | ||
| 399 | #endif /* CONFIG_MEMCG */ | 380 | #endif /* CONFIG_MEMCG */ |
| 400 | 381 | ||
| 401 | #if !defined(CONFIG_MEMCG) || !defined(CONFIG_DEBUG_VM) | 382 | #if !defined(CONFIG_MEMCG) || !defined(CONFIG_DEBUG_VM) |
diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h index 777a524716db..9bfb8e68a595 100644 --- a/include/linux/page_cgroup.h +++ b/include/linux/page_cgroup.h | |||
| @@ -3,9 +3,9 @@ | |||
| 3 | 3 | ||
| 4 | enum { | 4 | enum { |
| 5 | /* flags for mem_cgroup */ | 5 | /* flags for mem_cgroup */ |
| 6 | PCG_LOCK, /* Lock for pc->mem_cgroup and following bits. */ | 6 | PCG_USED = 0x01, /* This page is charged to a memcg */ |
| 7 | PCG_USED, /* this object is in use. */ | 7 | PCG_MEM = 0x02, /* This page holds a memory charge */ |
| 8 | PCG_MIGRATION, /* under page migration */ | 8 | PCG_MEMSW = 0x04, /* This page holds a memory+swap charge */ |
| 9 | __NR_PCG_FLAGS, | 9 | __NR_PCG_FLAGS, |
| 10 | }; | 10 | }; |
| 11 | 11 | ||
| @@ -44,42 +44,9 @@ static inline void __init page_cgroup_init(void) | |||
| 44 | struct page_cgroup *lookup_page_cgroup(struct page *page); | 44 | struct page_cgroup *lookup_page_cgroup(struct page *page); |
| 45 | struct page *lookup_cgroup_page(struct page_cgroup *pc); | 45 | struct page *lookup_cgroup_page(struct page_cgroup *pc); |
| 46 | 46 | ||
| 47 | #define TESTPCGFLAG(uname, lname) \ | 47 | static inline int PageCgroupUsed(struct page_cgroup *pc) |
| 48 | static inline int PageCgroup##uname(struct page_cgroup *pc) \ | ||
| 49 | { return test_bit(PCG_##lname, &pc->flags); } | ||
| 50 | |||
| 51 | #define SETPCGFLAG(uname, lname) \ | ||
| 52 | static inline void SetPageCgroup##uname(struct page_cgroup *pc)\ | ||
| 53 | { set_bit(PCG_##lname, &pc->flags); } | ||
| 54 | |||
| 55 | #define CLEARPCGFLAG(uname, lname) \ | ||
| 56 | static inline void ClearPageCgroup##uname(struct page_cgroup *pc) \ | ||
| 57 | { clear_bit(PCG_##lname, &pc->flags); } | ||
| 58 | |||
| 59 | #define TESTCLEARPCGFLAG(uname, lname) \ | ||
| 60 | static inline int TestClearPageCgroup##uname(struct page_cgroup *pc) \ | ||
| 61 | { return test_and_clear_bit(PCG_##lname, &pc->flags); } | ||
| 62 | |||
| 63 | TESTPCGFLAG(Used, USED) | ||
| 64 | CLEARPCGFLAG(Used, USED) | ||
| 65 | SETPCGFLAG(Used, USED) | ||
| 66 | |||
| 67 | SETPCGFLAG(Migration, MIGRATION) | ||
| 68 | CLEARPCGFLAG(Migration, MIGRATION) | ||
| 69 | TESTPCGFLAG(Migration, MIGRATION) | ||
| 70 | |||
| 71 | static inline void lock_page_cgroup(struct page_cgroup *pc) | ||
| 72 | { | ||
| 73 | /* | ||
| 74 | * Don't take this lock in IRQ context. | ||
| 75 | * This lock is for pc->mem_cgroup, USED, MIGRATION | ||
| 76 | */ | ||
| 77 | bit_spin_lock(PCG_LOCK, &pc->flags); | ||
| 78 | } | ||
| 79 | |||
| 80 | static inline void unlock_page_cgroup(struct page_cgroup *pc) | ||
| 81 | { | 48 | { |
| 82 | bit_spin_unlock(PCG_LOCK, &pc->flags); | 49 | return !!(pc->flags & PCG_USED); |
| 83 | } | 50 | } |
| 84 | 51 | ||
| 85 | #else /* CONFIG_MEMCG */ | 52 | #else /* CONFIG_MEMCG */ |
diff --git a/include/linux/swap.h b/include/linux/swap.h index 46a649e4e8cd..1b72060f093a 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
| @@ -381,9 +381,13 @@ static inline int mem_cgroup_swappiness(struct mem_cgroup *mem) | |||
| 381 | } | 381 | } |
| 382 | #endif | 382 | #endif |
| 383 | #ifdef CONFIG_MEMCG_SWAP | 383 | #ifdef CONFIG_MEMCG_SWAP |
| 384 | extern void mem_cgroup_uncharge_swap(swp_entry_t ent); | 384 | extern void mem_cgroup_swapout(struct page *page, swp_entry_t entry); |
| 385 | extern void mem_cgroup_uncharge_swap(swp_entry_t entry); | ||
| 385 | #else | 386 | #else |
| 386 | static inline void mem_cgroup_uncharge_swap(swp_entry_t ent) | 387 | static inline void mem_cgroup_swapout(struct page *page, swp_entry_t entry) |
| 388 | { | ||
| 389 | } | ||
| 390 | static inline void mem_cgroup_uncharge_swap(swp_entry_t entry) | ||
| 387 | { | 391 | { |
| 388 | } | 392 | } |
| 389 | #endif | 393 | #endif |
| @@ -443,7 +447,7 @@ extern void swap_shmem_alloc(swp_entry_t); | |||
| 443 | extern int swap_duplicate(swp_entry_t); | 447 | extern int swap_duplicate(swp_entry_t); |
| 444 | extern int swapcache_prepare(swp_entry_t); | 448 | extern int swapcache_prepare(swp_entry_t); |
| 445 | extern void swap_free(swp_entry_t); | 449 | extern void swap_free(swp_entry_t); |
| 446 | extern void swapcache_free(swp_entry_t, struct page *page); | 450 | extern void swapcache_free(swp_entry_t); |
| 447 | extern int free_swap_and_cache(swp_entry_t); | 451 | extern int free_swap_and_cache(swp_entry_t); |
| 448 | extern int swap_type_of(dev_t, sector_t, struct block_device **); | 452 | extern int swap_type_of(dev_t, sector_t, struct block_device **); |
| 449 | extern unsigned int count_swap_pages(int, int); | 453 | extern unsigned int count_swap_pages(int, int); |
| @@ -507,7 +511,7 @@ static inline void swap_free(swp_entry_t swp) | |||
| 507 | { | 511 | { |
| 508 | } | 512 | } |
| 509 | 513 | ||
| 510 | static inline void swapcache_free(swp_entry_t swp, struct page *page) | 514 | static inline void swapcache_free(swp_entry_t swp) |
| 511 | { | 515 | { |
| 512 | } | 516 | } |
| 513 | 517 | ||
