diff options
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r-- | mm/memcontrol.c | 390 |
1 files changed, 229 insertions, 161 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index f72b5e52451a..795e525afaba 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -61,12 +61,12 @@ struct cgroup_subsys mem_cgroup_subsys __read_mostly; | |||
61 | #define MEM_CGROUP_RECLAIM_RETRIES 5 | 61 | #define MEM_CGROUP_RECLAIM_RETRIES 5 |
62 | static struct mem_cgroup *root_mem_cgroup __read_mostly; | 62 | static struct mem_cgroup *root_mem_cgroup __read_mostly; |
63 | 63 | ||
64 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | 64 | #ifdef CONFIG_MEMCG_SWAP |
65 | /* Turned on only when memory cgroup is enabled && really_do_swap_account = 1 */ | 65 | /* Turned on only when memory cgroup is enabled && really_do_swap_account = 1 */ |
66 | int do_swap_account __read_mostly; | 66 | int do_swap_account __read_mostly; |
67 | 67 | ||
68 | /* for remember boot option*/ | 68 | /* for remember boot option*/ |
69 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED | 69 | #ifdef CONFIG_MEMCG_SWAP_ENABLED |
70 | static int really_do_swap_account __initdata = 1; | 70 | static int really_do_swap_account __initdata = 1; |
71 | #else | 71 | #else |
72 | static int really_do_swap_account __initdata = 0; | 72 | static int really_do_swap_account __initdata = 0; |
@@ -87,7 +87,7 @@ enum mem_cgroup_stat_index { | |||
87 | MEM_CGROUP_STAT_CACHE, /* # of pages charged as cache */ | 87 | MEM_CGROUP_STAT_CACHE, /* # of pages charged as cache */ |
88 | MEM_CGROUP_STAT_RSS, /* # of pages charged as anon rss */ | 88 | MEM_CGROUP_STAT_RSS, /* # of pages charged as anon rss */ |
89 | MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */ | 89 | MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */ |
90 | MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */ | 90 | MEM_CGROUP_STAT_SWAP, /* # of pages, swapped out */ |
91 | MEM_CGROUP_STAT_NSTATS, | 91 | MEM_CGROUP_STAT_NSTATS, |
92 | }; | 92 | }; |
93 | 93 | ||
@@ -378,9 +378,7 @@ static bool move_file(void) | |||
378 | 378 | ||
379 | enum charge_type { | 379 | enum charge_type { |
380 | MEM_CGROUP_CHARGE_TYPE_CACHE = 0, | 380 | MEM_CGROUP_CHARGE_TYPE_CACHE = 0, |
381 | MEM_CGROUP_CHARGE_TYPE_MAPPED, | 381 | MEM_CGROUP_CHARGE_TYPE_ANON, |
382 | MEM_CGROUP_CHARGE_TYPE_SHMEM, /* used by page migration of shmem */ | ||
383 | MEM_CGROUP_CHARGE_TYPE_FORCE, /* used by force_empty */ | ||
384 | MEM_CGROUP_CHARGE_TYPE_SWAPOUT, /* for accounting swapcache */ | 382 | MEM_CGROUP_CHARGE_TYPE_SWAPOUT, /* for accounting swapcache */ |
385 | MEM_CGROUP_CHARGE_TYPE_DROP, /* a page was unused swap cache */ | 383 | MEM_CGROUP_CHARGE_TYPE_DROP, /* a page was unused swap cache */ |
386 | NR_CHARGE_TYPE, | 384 | NR_CHARGE_TYPE, |
@@ -407,8 +405,14 @@ enum charge_type { | |||
407 | static void mem_cgroup_get(struct mem_cgroup *memcg); | 405 | static void mem_cgroup_get(struct mem_cgroup *memcg); |
408 | static void mem_cgroup_put(struct mem_cgroup *memcg); | 406 | static void mem_cgroup_put(struct mem_cgroup *memcg); |
409 | 407 | ||
408 | static inline | ||
409 | struct mem_cgroup *mem_cgroup_from_css(struct cgroup_subsys_state *s) | ||
410 | { | ||
411 | return container_of(s, struct mem_cgroup, css); | ||
412 | } | ||
413 | |||
410 | /* Writing them here to avoid exposing memcg's inner layout */ | 414 | /* Writing them here to avoid exposing memcg's inner layout */ |
411 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM | 415 | #ifdef CONFIG_MEMCG_KMEM |
412 | #include <net/sock.h> | 416 | #include <net/sock.h> |
413 | #include <net/ip.h> | 417 | #include <net/ip.h> |
414 | 418 | ||
@@ -467,9 +471,9 @@ struct cg_proto *tcp_proto_cgroup(struct mem_cgroup *memcg) | |||
467 | } | 471 | } |
468 | EXPORT_SYMBOL(tcp_proto_cgroup); | 472 | EXPORT_SYMBOL(tcp_proto_cgroup); |
469 | #endif /* CONFIG_INET */ | 473 | #endif /* CONFIG_INET */ |
470 | #endif /* CONFIG_CGROUP_MEM_RES_CTLR_KMEM */ | 474 | #endif /* CONFIG_MEMCG_KMEM */ |
471 | 475 | ||
472 | #if defined(CONFIG_INET) && defined(CONFIG_CGROUP_MEM_RES_CTLR_KMEM) | 476 | #if defined(CONFIG_INET) && defined(CONFIG_MEMCG_KMEM) |
473 | static void disarm_sock_keys(struct mem_cgroup *memcg) | 477 | static void disarm_sock_keys(struct mem_cgroup *memcg) |
474 | { | 478 | { |
475 | if (!memcg_proto_activated(&memcg->tcp_mem.cg_proto)) | 479 | if (!memcg_proto_activated(&memcg->tcp_mem.cg_proto)) |
@@ -703,7 +707,7 @@ static void mem_cgroup_swap_statistics(struct mem_cgroup *memcg, | |||
703 | bool charge) | 707 | bool charge) |
704 | { | 708 | { |
705 | int val = (charge) ? 1 : -1; | 709 | int val = (charge) ? 1 : -1; |
706 | this_cpu_add(memcg->stat->count[MEM_CGROUP_STAT_SWAPOUT], val); | 710 | this_cpu_add(memcg->stat->count[MEM_CGROUP_STAT_SWAP], val); |
707 | } | 711 | } |
708 | 712 | ||
709 | static unsigned long mem_cgroup_read_events(struct mem_cgroup *memcg, | 713 | static unsigned long mem_cgroup_read_events(struct mem_cgroup *memcg, |
@@ -864,9 +868,8 @@ static void memcg_check_events(struct mem_cgroup *memcg, struct page *page) | |||
864 | 868 | ||
865 | struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont) | 869 | struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont) |
866 | { | 870 | { |
867 | return container_of(cgroup_subsys_state(cont, | 871 | return mem_cgroup_from_css( |
868 | mem_cgroup_subsys_id), struct mem_cgroup, | 872 | cgroup_subsys_state(cont, mem_cgroup_subsys_id)); |
869 | css); | ||
870 | } | 873 | } |
871 | 874 | ||
872 | struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p) | 875 | struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p) |
@@ -879,8 +882,7 @@ struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p) | |||
879 | if (unlikely(!p)) | 882 | if (unlikely(!p)) |
880 | return NULL; | 883 | return NULL; |
881 | 884 | ||
882 | return container_of(task_subsys_state(p, mem_cgroup_subsys_id), | 885 | return mem_cgroup_from_css(task_subsys_state(p, mem_cgroup_subsys_id)); |
883 | struct mem_cgroup, css); | ||
884 | } | 886 | } |
885 | 887 | ||
886 | struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm) | 888 | struct mem_cgroup *try_get_mem_cgroup_from_mm(struct mm_struct *mm) |
@@ -966,8 +968,7 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root, | |||
966 | css = css_get_next(&mem_cgroup_subsys, id + 1, &root->css, &id); | 968 | css = css_get_next(&mem_cgroup_subsys, id + 1, &root->css, &id); |
967 | if (css) { | 969 | if (css) { |
968 | if (css == &root->css || css_tryget(css)) | 970 | if (css == &root->css || css_tryget(css)) |
969 | memcg = container_of(css, | 971 | memcg = mem_cgroup_from_css(css); |
970 | struct mem_cgroup, css); | ||
971 | } else | 972 | } else |
972 | id = 0; | 973 | id = 0; |
973 | rcu_read_unlock(); | 974 | rcu_read_unlock(); |
@@ -1454,7 +1455,7 @@ static int mem_cgroup_count_children(struct mem_cgroup *memcg) | |||
1454 | /* | 1455 | /* |
1455 | * Return the memory (and swap, if configured) limit for a memcg. | 1456 | * Return the memory (and swap, if configured) limit for a memcg. |
1456 | */ | 1457 | */ |
1457 | u64 mem_cgroup_get_limit(struct mem_cgroup *memcg) | 1458 | static u64 mem_cgroup_get_limit(struct mem_cgroup *memcg) |
1458 | { | 1459 | { |
1459 | u64 limit; | 1460 | u64 limit; |
1460 | u64 memsw; | 1461 | u64 memsw; |
@@ -1470,6 +1471,73 @@ u64 mem_cgroup_get_limit(struct mem_cgroup *memcg) | |||
1470 | return min(limit, memsw); | 1471 | return min(limit, memsw); |
1471 | } | 1472 | } |
1472 | 1473 | ||
1474 | void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, | ||
1475 | int order) | ||
1476 | { | ||
1477 | struct mem_cgroup *iter; | ||
1478 | unsigned long chosen_points = 0; | ||
1479 | unsigned long totalpages; | ||
1480 | unsigned int points = 0; | ||
1481 | struct task_struct *chosen = NULL; | ||
1482 | |||
1483 | /* | ||
1484 | * If current has a pending SIGKILL, then automatically select it. The | ||
1485 | * goal is to allow it to allocate so that it may quickly exit and free | ||
1486 | * its memory. | ||
1487 | */ | ||
1488 | if (fatal_signal_pending(current)) { | ||
1489 | set_thread_flag(TIF_MEMDIE); | ||
1490 | return; | ||
1491 | } | ||
1492 | |||
1493 | check_panic_on_oom(CONSTRAINT_MEMCG, gfp_mask, order, NULL); | ||
1494 | totalpages = mem_cgroup_get_limit(memcg) >> PAGE_SHIFT ? : 1; | ||
1495 | for_each_mem_cgroup_tree(iter, memcg) { | ||
1496 | struct cgroup *cgroup = iter->css.cgroup; | ||
1497 | struct cgroup_iter it; | ||
1498 | struct task_struct *task; | ||
1499 | |||
1500 | cgroup_iter_start(cgroup, &it); | ||
1501 | while ((task = cgroup_iter_next(cgroup, &it))) { | ||
1502 | switch (oom_scan_process_thread(task, totalpages, NULL, | ||
1503 | false)) { | ||
1504 | case OOM_SCAN_SELECT: | ||
1505 | if (chosen) | ||
1506 | put_task_struct(chosen); | ||
1507 | chosen = task; | ||
1508 | chosen_points = ULONG_MAX; | ||
1509 | get_task_struct(chosen); | ||
1510 | /* fall through */ | ||
1511 | case OOM_SCAN_CONTINUE: | ||
1512 | continue; | ||
1513 | case OOM_SCAN_ABORT: | ||
1514 | cgroup_iter_end(cgroup, &it); | ||
1515 | mem_cgroup_iter_break(memcg, iter); | ||
1516 | if (chosen) | ||
1517 | put_task_struct(chosen); | ||
1518 | return; | ||
1519 | case OOM_SCAN_OK: | ||
1520 | break; | ||
1521 | }; | ||
1522 | points = oom_badness(task, memcg, NULL, totalpages); | ||
1523 | if (points > chosen_points) { | ||
1524 | if (chosen) | ||
1525 | put_task_struct(chosen); | ||
1526 | chosen = task; | ||
1527 | chosen_points = points; | ||
1528 | get_task_struct(chosen); | ||
1529 | } | ||
1530 | } | ||
1531 | cgroup_iter_end(cgroup, &it); | ||
1532 | } | ||
1533 | |||
1534 | if (!chosen) | ||
1535 | return; | ||
1536 | points = chosen_points * 1000 / totalpages; | ||
1537 | oom_kill_process(chosen, gfp_mask, order, points, totalpages, memcg, | ||
1538 | NULL, "Memory cgroup out of memory"); | ||
1539 | } | ||
1540 | |||
1473 | static unsigned long mem_cgroup_reclaim(struct mem_cgroup *memcg, | 1541 | static unsigned long mem_cgroup_reclaim(struct mem_cgroup *memcg, |
1474 | gfp_t gfp_mask, | 1542 | gfp_t gfp_mask, |
1475 | unsigned long flags) | 1543 | unsigned long flags) |
@@ -1899,7 +1967,7 @@ again: | |||
1899 | return; | 1967 | return; |
1900 | /* | 1968 | /* |
1901 | * If this memory cgroup is not under account moving, we don't | 1969 | * If this memory cgroup is not under account moving, we don't |
1902 | * need to take move_lock_page_cgroup(). Because we already hold | 1970 | * need to take move_lock_mem_cgroup(). Because we already hold |
1903 | * rcu_read_lock(), any calls to move_account will be delayed until | 1971 | * rcu_read_lock(), any calls to move_account will be delayed until |
1904 | * rcu_read_unlock() if mem_cgroup_stolen() == true. | 1972 | * rcu_read_unlock() if mem_cgroup_stolen() == true. |
1905 | */ | 1973 | */ |
@@ -1921,7 +1989,7 @@ void __mem_cgroup_end_update_page_stat(struct page *page, unsigned long *flags) | |||
1921 | /* | 1989 | /* |
1922 | * It's guaranteed that pc->mem_cgroup never changes while | 1990 | * It's guaranteed that pc->mem_cgroup never changes while |
1923 | * lock is held because a routine modifies pc->mem_cgroup | 1991 | * lock is held because a routine modifies pc->mem_cgroup |
1924 | * should take move_lock_page_cgroup(). | 1992 | * should take move_lock_mem_cgroup(). |
1925 | */ | 1993 | */ |
1926 | move_unlock_mem_cgroup(pc->mem_cgroup, flags); | 1994 | move_unlock_mem_cgroup(pc->mem_cgroup, flags); |
1927 | } | 1995 | } |
@@ -2268,7 +2336,7 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm, | |||
2268 | * We always charge the cgroup the mm_struct belongs to. | 2336 | * We always charge the cgroup the mm_struct belongs to. |
2269 | * The mm_struct's mem_cgroup changes on task migration if the | 2337 | * The mm_struct's mem_cgroup changes on task migration if the |
2270 | * thread group leader migrates. It's possible that mm is not | 2338 | * thread group leader migrates. It's possible that mm is not |
2271 | * set, if so charge the init_mm (happens for pagecache usage). | 2339 | * set, if so charge the root memcg (happens for pagecache usage). |
2272 | */ | 2340 | */ |
2273 | if (!*ptr && !mm) | 2341 | if (!*ptr && !mm) |
2274 | *ptr = root_mem_cgroup; | 2342 | *ptr = root_mem_cgroup; |
@@ -2429,7 +2497,7 @@ static struct mem_cgroup *mem_cgroup_lookup(unsigned short id) | |||
2429 | css = css_lookup(&mem_cgroup_subsys, id); | 2497 | css = css_lookup(&mem_cgroup_subsys, id); |
2430 | if (!css) | 2498 | if (!css) |
2431 | return NULL; | 2499 | return NULL; |
2432 | return container_of(css, struct mem_cgroup, css); | 2500 | return mem_cgroup_from_css(css); |
2433 | } | 2501 | } |
2434 | 2502 | ||
2435 | struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page) | 2503 | struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page) |
@@ -2473,11 +2541,7 @@ static void __mem_cgroup_commit_charge(struct mem_cgroup *memcg, | |||
2473 | bool anon; | 2541 | bool anon; |
2474 | 2542 | ||
2475 | lock_page_cgroup(pc); | 2543 | lock_page_cgroup(pc); |
2476 | if (unlikely(PageCgroupUsed(pc))) { | 2544 | VM_BUG_ON(PageCgroupUsed(pc)); |
2477 | unlock_page_cgroup(pc); | ||
2478 | __mem_cgroup_cancel_charge(memcg, nr_pages); | ||
2479 | return; | ||
2480 | } | ||
2481 | /* | 2545 | /* |
2482 | * we don't need page_cgroup_lock about tail pages, becase they are not | 2546 | * we don't need page_cgroup_lock about tail pages, becase they are not |
2483 | * accessed by any other context at this point. | 2547 | * accessed by any other context at this point. |
@@ -2519,7 +2583,7 @@ static void __mem_cgroup_commit_charge(struct mem_cgroup *memcg, | |||
2519 | spin_unlock_irq(&zone->lru_lock); | 2583 | spin_unlock_irq(&zone->lru_lock); |
2520 | } | 2584 | } |
2521 | 2585 | ||
2522 | if (ctype == MEM_CGROUP_CHARGE_TYPE_MAPPED) | 2586 | if (ctype == MEM_CGROUP_CHARGE_TYPE_ANON) |
2523 | anon = true; | 2587 | anon = true; |
2524 | else | 2588 | else |
2525 | anon = false; | 2589 | anon = false; |
@@ -2644,8 +2708,7 @@ out: | |||
2644 | 2708 | ||
2645 | static int mem_cgroup_move_parent(struct page *page, | 2709 | static int mem_cgroup_move_parent(struct page *page, |
2646 | struct page_cgroup *pc, | 2710 | struct page_cgroup *pc, |
2647 | struct mem_cgroup *child, | 2711 | struct mem_cgroup *child) |
2648 | gfp_t gfp_mask) | ||
2649 | { | 2712 | { |
2650 | struct mem_cgroup *parent; | 2713 | struct mem_cgroup *parent; |
2651 | unsigned int nr_pages; | 2714 | unsigned int nr_pages; |
@@ -2728,38 +2791,7 @@ int mem_cgroup_newpage_charge(struct page *page, | |||
2728 | VM_BUG_ON(page->mapping && !PageAnon(page)); | 2791 | VM_BUG_ON(page->mapping && !PageAnon(page)); |
2729 | VM_BUG_ON(!mm); | 2792 | VM_BUG_ON(!mm); |
2730 | return mem_cgroup_charge_common(page, mm, gfp_mask, | 2793 | return mem_cgroup_charge_common(page, mm, gfp_mask, |
2731 | MEM_CGROUP_CHARGE_TYPE_MAPPED); | 2794 | MEM_CGROUP_CHARGE_TYPE_ANON); |
2732 | } | ||
2733 | |||
2734 | static void | ||
2735 | __mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *ptr, | ||
2736 | enum charge_type ctype); | ||
2737 | |||
2738 | int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, | ||
2739 | gfp_t gfp_mask) | ||
2740 | { | ||
2741 | struct mem_cgroup *memcg = NULL; | ||
2742 | enum charge_type type = MEM_CGROUP_CHARGE_TYPE_CACHE; | ||
2743 | int ret; | ||
2744 | |||
2745 | if (mem_cgroup_disabled()) | ||
2746 | return 0; | ||
2747 | if (PageCompound(page)) | ||
2748 | return 0; | ||
2749 | |||
2750 | if (unlikely(!mm)) | ||
2751 | mm = &init_mm; | ||
2752 | if (!page_is_file_cache(page)) | ||
2753 | type = MEM_CGROUP_CHARGE_TYPE_SHMEM; | ||
2754 | |||
2755 | if (!PageSwapCache(page)) | ||
2756 | ret = mem_cgroup_charge_common(page, mm, gfp_mask, type); | ||
2757 | else { /* page is swapcache/shmem */ | ||
2758 | ret = mem_cgroup_try_charge_swapin(mm, page, gfp_mask, &memcg); | ||
2759 | if (!ret) | ||
2760 | __mem_cgroup_commit_charge_swapin(page, memcg, type); | ||
2761 | } | ||
2762 | return ret; | ||
2763 | } | 2795 | } |
2764 | 2796 | ||
2765 | /* | 2797 | /* |
@@ -2768,27 +2800,26 @@ int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, | |||
2768 | * struct page_cgroup is acquired. This refcnt will be consumed by | 2800 | * struct page_cgroup is acquired. This refcnt will be consumed by |
2769 | * "commit()" or removed by "cancel()" | 2801 | * "commit()" or removed by "cancel()" |
2770 | */ | 2802 | */ |
2771 | int mem_cgroup_try_charge_swapin(struct mm_struct *mm, | 2803 | static int __mem_cgroup_try_charge_swapin(struct mm_struct *mm, |
2772 | struct page *page, | 2804 | struct page *page, |
2773 | gfp_t mask, struct mem_cgroup **memcgp) | 2805 | gfp_t mask, |
2806 | struct mem_cgroup **memcgp) | ||
2774 | { | 2807 | { |
2775 | struct mem_cgroup *memcg; | 2808 | struct mem_cgroup *memcg; |
2809 | struct page_cgroup *pc; | ||
2776 | int ret; | 2810 | int ret; |
2777 | 2811 | ||
2778 | *memcgp = NULL; | 2812 | pc = lookup_page_cgroup(page); |
2779 | |||
2780 | if (mem_cgroup_disabled()) | ||
2781 | return 0; | ||
2782 | |||
2783 | if (!do_swap_account) | ||
2784 | goto charge_cur_mm; | ||
2785 | /* | 2813 | /* |
2786 | * A racing thread's fault, or swapoff, may have already updated | 2814 | * Every swap fault against a single page tries to charge the |
2787 | * the pte, and even removed page from swap cache: in those cases | 2815 | * page, bail as early as possible. shmem_unuse() encounters |
2788 | * do_swap_page()'s pte_same() test will fail; but there's also a | 2816 | * already charged pages, too. The USED bit is protected by |
2789 | * KSM case which does need to charge the page. | 2817 | * the page lock, which serializes swap cache removal, which |
2818 | * in turn serializes uncharging. | ||
2790 | */ | 2819 | */ |
2791 | if (!PageSwapCache(page)) | 2820 | if (PageCgroupUsed(pc)) |
2821 | return 0; | ||
2822 | if (!do_swap_account) | ||
2792 | goto charge_cur_mm; | 2823 | goto charge_cur_mm; |
2793 | memcg = try_get_mem_cgroup_from_page(page); | 2824 | memcg = try_get_mem_cgroup_from_page(page); |
2794 | if (!memcg) | 2825 | if (!memcg) |
@@ -2800,14 +2831,44 @@ int mem_cgroup_try_charge_swapin(struct mm_struct *mm, | |||
2800 | ret = 0; | 2831 | ret = 0; |
2801 | return ret; | 2832 | return ret; |
2802 | charge_cur_mm: | 2833 | charge_cur_mm: |
2803 | if (unlikely(!mm)) | ||
2804 | mm = &init_mm; | ||
2805 | ret = __mem_cgroup_try_charge(mm, mask, 1, memcgp, true); | 2834 | ret = __mem_cgroup_try_charge(mm, mask, 1, memcgp, true); |
2806 | if (ret == -EINTR) | 2835 | if (ret == -EINTR) |
2807 | ret = 0; | 2836 | ret = 0; |
2808 | return ret; | 2837 | return ret; |
2809 | } | 2838 | } |
2810 | 2839 | ||
2840 | int mem_cgroup_try_charge_swapin(struct mm_struct *mm, struct page *page, | ||
2841 | gfp_t gfp_mask, struct mem_cgroup **memcgp) | ||
2842 | { | ||
2843 | *memcgp = NULL; | ||
2844 | if (mem_cgroup_disabled()) | ||
2845 | return 0; | ||
2846 | /* | ||
2847 | * A racing thread's fault, or swapoff, may have already | ||
2848 | * updated the pte, and even removed page from swap cache: in | ||
2849 | * those cases unuse_pte()'s pte_same() test will fail; but | ||
2850 | * there's also a KSM case which does need to charge the page. | ||
2851 | */ | ||
2852 | if (!PageSwapCache(page)) { | ||
2853 | int ret; | ||
2854 | |||
2855 | ret = __mem_cgroup_try_charge(mm, gfp_mask, 1, memcgp, true); | ||
2856 | if (ret == -EINTR) | ||
2857 | ret = 0; | ||
2858 | return ret; | ||
2859 | } | ||
2860 | return __mem_cgroup_try_charge_swapin(mm, page, gfp_mask, memcgp); | ||
2861 | } | ||
2862 | |||
2863 | void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg) | ||
2864 | { | ||
2865 | if (mem_cgroup_disabled()) | ||
2866 | return; | ||
2867 | if (!memcg) | ||
2868 | return; | ||
2869 | __mem_cgroup_cancel_charge(memcg, 1); | ||
2870 | } | ||
2871 | |||
2811 | static void | 2872 | static void |
2812 | __mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *memcg, | 2873 | __mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *memcg, |
2813 | enum charge_type ctype) | 2874 | enum charge_type ctype) |
@@ -2842,16 +2903,30 @@ void mem_cgroup_commit_charge_swapin(struct page *page, | |||
2842 | struct mem_cgroup *memcg) | 2903 | struct mem_cgroup *memcg) |
2843 | { | 2904 | { |
2844 | __mem_cgroup_commit_charge_swapin(page, memcg, | 2905 | __mem_cgroup_commit_charge_swapin(page, memcg, |
2845 | MEM_CGROUP_CHARGE_TYPE_MAPPED); | 2906 | MEM_CGROUP_CHARGE_TYPE_ANON); |
2846 | } | 2907 | } |
2847 | 2908 | ||
2848 | void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *memcg) | 2909 | int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, |
2910 | gfp_t gfp_mask) | ||
2849 | { | 2911 | { |
2912 | struct mem_cgroup *memcg = NULL; | ||
2913 | enum charge_type type = MEM_CGROUP_CHARGE_TYPE_CACHE; | ||
2914 | int ret; | ||
2915 | |||
2850 | if (mem_cgroup_disabled()) | 2916 | if (mem_cgroup_disabled()) |
2851 | return; | 2917 | return 0; |
2852 | if (!memcg) | 2918 | if (PageCompound(page)) |
2853 | return; | 2919 | return 0; |
2854 | __mem_cgroup_cancel_charge(memcg, 1); | 2920 | |
2921 | if (!PageSwapCache(page)) | ||
2922 | ret = mem_cgroup_charge_common(page, mm, gfp_mask, type); | ||
2923 | else { /* page is swapcache/shmem */ | ||
2924 | ret = __mem_cgroup_try_charge_swapin(mm, page, | ||
2925 | gfp_mask, &memcg); | ||
2926 | if (!ret) | ||
2927 | __mem_cgroup_commit_charge_swapin(page, memcg, type); | ||
2928 | } | ||
2929 | return ret; | ||
2855 | } | 2930 | } |
2856 | 2931 | ||
2857 | static void mem_cgroup_do_uncharge(struct mem_cgroup *memcg, | 2932 | static void mem_cgroup_do_uncharge(struct mem_cgroup *memcg, |
@@ -2911,7 +2986,8 @@ direct_uncharge: | |||
2911 | * uncharge if !page_mapped(page) | 2986 | * uncharge if !page_mapped(page) |
2912 | */ | 2987 | */ |
2913 | static struct mem_cgroup * | 2988 | static struct mem_cgroup * |
2914 | __mem_cgroup_uncharge_common(struct page *page, enum charge_type ctype) | 2989 | __mem_cgroup_uncharge_common(struct page *page, enum charge_type ctype, |
2990 | bool end_migration) | ||
2915 | { | 2991 | { |
2916 | struct mem_cgroup *memcg = NULL; | 2992 | struct mem_cgroup *memcg = NULL; |
2917 | unsigned int nr_pages = 1; | 2993 | unsigned int nr_pages = 1; |
@@ -2921,8 +2997,7 @@ __mem_cgroup_uncharge_common(struct page *page, enum charge_type ctype) | |||
2921 | if (mem_cgroup_disabled()) | 2997 | if (mem_cgroup_disabled()) |
2922 | return NULL; | 2998 | return NULL; |
2923 | 2999 | ||
2924 | if (PageSwapCache(page)) | 3000 | VM_BUG_ON(PageSwapCache(page)); |
2925 | return NULL; | ||
2926 | 3001 | ||
2927 | if (PageTransHuge(page)) { | 3002 | if (PageTransHuge(page)) { |
2928 | nr_pages <<= compound_order(page); | 3003 | nr_pages <<= compound_order(page); |
@@ -2945,7 +3020,7 @@ __mem_cgroup_uncharge_common(struct page *page, enum charge_type ctype) | |||
2945 | anon = PageAnon(page); | 3020 | anon = PageAnon(page); |
2946 | 3021 | ||
2947 | switch (ctype) { | 3022 | switch (ctype) { |
2948 | case MEM_CGROUP_CHARGE_TYPE_MAPPED: | 3023 | case MEM_CGROUP_CHARGE_TYPE_ANON: |
2949 | /* | 3024 | /* |
2950 | * Generally PageAnon tells if it's the anon statistics to be | 3025 | * Generally PageAnon tells if it's the anon statistics to be |
2951 | * updated; but sometimes e.g. mem_cgroup_uncharge_page() is | 3026 | * updated; but sometimes e.g. mem_cgroup_uncharge_page() is |
@@ -2955,7 +3030,16 @@ __mem_cgroup_uncharge_common(struct page *page, enum charge_type ctype) | |||
2955 | /* fallthrough */ | 3030 | /* fallthrough */ |
2956 | case MEM_CGROUP_CHARGE_TYPE_DROP: | 3031 | case MEM_CGROUP_CHARGE_TYPE_DROP: |
2957 | /* See mem_cgroup_prepare_migration() */ | 3032 | /* See mem_cgroup_prepare_migration() */ |
2958 | if (page_mapped(page) || PageCgroupMigration(pc)) | 3033 | if (page_mapped(page)) |
3034 | goto unlock_out; | ||
3035 | /* | ||
3036 | * Pages under migration may not be uncharged. But | ||
3037 | * end_migration() /must/ be the one uncharging the | ||
3038 | * unused post-migration page and so it has to call | ||
3039 | * here with the migration bit still set. See the | ||
3040 | * res_counter handling below. | ||
3041 | */ | ||
3042 | if (!end_migration && PageCgroupMigration(pc)) | ||
2959 | goto unlock_out; | 3043 | goto unlock_out; |
2960 | break; | 3044 | break; |
2961 | case MEM_CGROUP_CHARGE_TYPE_SWAPOUT: | 3045 | case MEM_CGROUP_CHARGE_TYPE_SWAPOUT: |
@@ -2989,7 +3073,12 @@ __mem_cgroup_uncharge_common(struct page *page, enum charge_type ctype) | |||
2989 | mem_cgroup_swap_statistics(memcg, true); | 3073 | mem_cgroup_swap_statistics(memcg, true); |
2990 | mem_cgroup_get(memcg); | 3074 | mem_cgroup_get(memcg); |
2991 | } | 3075 | } |
2992 | if (!mem_cgroup_is_root(memcg)) | 3076 | /* |
3077 | * Migration does not charge the res_counter for the | ||
3078 | * replacement page, so leave it alone when phasing out the | ||
3079 | * page that is unused after the migration. | ||
3080 | */ | ||
3081 | if (!end_migration && !mem_cgroup_is_root(memcg)) | ||
2993 | mem_cgroup_do_uncharge(memcg, nr_pages, ctype); | 3082 | mem_cgroup_do_uncharge(memcg, nr_pages, ctype); |
2994 | 3083 | ||
2995 | return memcg; | 3084 | return memcg; |
@@ -3005,14 +3094,16 @@ void mem_cgroup_uncharge_page(struct page *page) | |||
3005 | if (page_mapped(page)) | 3094 | if (page_mapped(page)) |
3006 | return; | 3095 | return; |
3007 | VM_BUG_ON(page->mapping && !PageAnon(page)); | 3096 | VM_BUG_ON(page->mapping && !PageAnon(page)); |
3008 | __mem_cgroup_uncharge_common(page, MEM_CGROUP_CHARGE_TYPE_MAPPED); | 3097 | if (PageSwapCache(page)) |
3098 | return; | ||
3099 | __mem_cgroup_uncharge_common(page, MEM_CGROUP_CHARGE_TYPE_ANON, false); | ||
3009 | } | 3100 | } |
3010 | 3101 | ||
3011 | void mem_cgroup_uncharge_cache_page(struct page *page) | 3102 | void mem_cgroup_uncharge_cache_page(struct page *page) |
3012 | { | 3103 | { |
3013 | VM_BUG_ON(page_mapped(page)); | 3104 | VM_BUG_ON(page_mapped(page)); |
3014 | VM_BUG_ON(page->mapping); | 3105 | VM_BUG_ON(page->mapping); |
3015 | __mem_cgroup_uncharge_common(page, MEM_CGROUP_CHARGE_TYPE_CACHE); | 3106 | __mem_cgroup_uncharge_common(page, MEM_CGROUP_CHARGE_TYPE_CACHE, false); |
3016 | } | 3107 | } |
3017 | 3108 | ||
3018 | /* | 3109 | /* |
@@ -3076,7 +3167,7 @@ mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout) | |||
3076 | if (!swapout) /* this was a swap cache but the swap is unused ! */ | 3167 | if (!swapout) /* this was a swap cache but the swap is unused ! */ |
3077 | ctype = MEM_CGROUP_CHARGE_TYPE_DROP; | 3168 | ctype = MEM_CGROUP_CHARGE_TYPE_DROP; |
3078 | 3169 | ||
3079 | memcg = __mem_cgroup_uncharge_common(page, ctype); | 3170 | memcg = __mem_cgroup_uncharge_common(page, ctype, false); |
3080 | 3171 | ||
3081 | /* | 3172 | /* |
3082 | * record memcg information, if swapout && memcg != NULL, | 3173 | * record memcg information, if swapout && memcg != NULL, |
@@ -3087,7 +3178,7 @@ mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout) | |||
3087 | } | 3178 | } |
3088 | #endif | 3179 | #endif |
3089 | 3180 | ||
3090 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | 3181 | #ifdef CONFIG_MEMCG_SWAP |
3091 | /* | 3182 | /* |
3092 | * called from swap_entry_free(). remove record in swap_cgroup and | 3183 | * called from swap_entry_free(). remove record in swap_cgroup and |
3093 | * uncharge "memsw" account. | 3184 | * uncharge "memsw" account. |
@@ -3166,19 +3257,18 @@ static inline int mem_cgroup_move_swap_account(swp_entry_t entry, | |||
3166 | * Before starting migration, account PAGE_SIZE to mem_cgroup that the old | 3257 | * Before starting migration, account PAGE_SIZE to mem_cgroup that the old |
3167 | * page belongs to. | 3258 | * page belongs to. |
3168 | */ | 3259 | */ |
3169 | int mem_cgroup_prepare_migration(struct page *page, | 3260 | void mem_cgroup_prepare_migration(struct page *page, struct page *newpage, |
3170 | struct page *newpage, struct mem_cgroup **memcgp, gfp_t gfp_mask) | 3261 | struct mem_cgroup **memcgp) |
3171 | { | 3262 | { |
3172 | struct mem_cgroup *memcg = NULL; | 3263 | struct mem_cgroup *memcg = NULL; |
3173 | struct page_cgroup *pc; | 3264 | struct page_cgroup *pc; |
3174 | enum charge_type ctype; | 3265 | enum charge_type ctype; |
3175 | int ret = 0; | ||
3176 | 3266 | ||
3177 | *memcgp = NULL; | 3267 | *memcgp = NULL; |
3178 | 3268 | ||
3179 | VM_BUG_ON(PageTransHuge(page)); | 3269 | VM_BUG_ON(PageTransHuge(page)); |
3180 | if (mem_cgroup_disabled()) | 3270 | if (mem_cgroup_disabled()) |
3181 | return 0; | 3271 | return; |
3182 | 3272 | ||
3183 | pc = lookup_page_cgroup(page); | 3273 | pc = lookup_page_cgroup(page); |
3184 | lock_page_cgroup(pc); | 3274 | lock_page_cgroup(pc); |
@@ -3223,24 +3313,9 @@ int mem_cgroup_prepare_migration(struct page *page, | |||
3223 | * we return here. | 3313 | * we return here. |
3224 | */ | 3314 | */ |
3225 | if (!memcg) | 3315 | if (!memcg) |
3226 | return 0; | 3316 | return; |
3227 | 3317 | ||
3228 | *memcgp = memcg; | 3318 | *memcgp = memcg; |
3229 | ret = __mem_cgroup_try_charge(NULL, gfp_mask, 1, memcgp, false); | ||
3230 | css_put(&memcg->css);/* drop extra refcnt */ | ||
3231 | if (ret) { | ||
3232 | if (PageAnon(page)) { | ||
3233 | lock_page_cgroup(pc); | ||
3234 | ClearPageCgroupMigration(pc); | ||
3235 | unlock_page_cgroup(pc); | ||
3236 | /* | ||
3237 | * The old page may be fully unmapped while we kept it. | ||
3238 | */ | ||
3239 | mem_cgroup_uncharge_page(page); | ||
3240 | } | ||
3241 | /* we'll need to revisit this error code (we have -EINTR) */ | ||
3242 | return -ENOMEM; | ||
3243 | } | ||
3244 | /* | 3319 | /* |
3245 | * We charge new page before it's used/mapped. So, even if unlock_page() | 3320 | * We charge new page before it's used/mapped. So, even if unlock_page() |
3246 | * is called before end_migration, we can catch all events on this new | 3321 | * is called before end_migration, we can catch all events on this new |
@@ -3248,13 +3323,15 @@ int mem_cgroup_prepare_migration(struct page *page, | |||
3248 | * mapcount will be finally 0 and we call uncharge in end_migration(). | 3323 | * mapcount will be finally 0 and we call uncharge in end_migration(). |
3249 | */ | 3324 | */ |
3250 | if (PageAnon(page)) | 3325 | if (PageAnon(page)) |
3251 | ctype = MEM_CGROUP_CHARGE_TYPE_MAPPED; | 3326 | ctype = MEM_CGROUP_CHARGE_TYPE_ANON; |
3252 | else if (page_is_file_cache(page)) | ||
3253 | ctype = MEM_CGROUP_CHARGE_TYPE_CACHE; | ||
3254 | else | 3327 | else |
3255 | ctype = MEM_CGROUP_CHARGE_TYPE_SHMEM; | 3328 | ctype = MEM_CGROUP_CHARGE_TYPE_CACHE; |
3329 | /* | ||
3330 | * The page is committed to the memcg, but it's not actually | ||
3331 | * charged to the res_counter since we plan on replacing the | ||
3332 | * old one and only one page is going to be left afterwards. | ||
3333 | */ | ||
3256 | __mem_cgroup_commit_charge(memcg, newpage, 1, ctype, false); | 3334 | __mem_cgroup_commit_charge(memcg, newpage, 1, ctype, false); |
3257 | return ret; | ||
3258 | } | 3335 | } |
3259 | 3336 | ||
3260 | /* remove redundant charge if migration failed*/ | 3337 | /* remove redundant charge if migration failed*/ |
@@ -3276,6 +3353,12 @@ void mem_cgroup_end_migration(struct mem_cgroup *memcg, | |||
3276 | used = newpage; | 3353 | used = newpage; |
3277 | unused = oldpage; | 3354 | unused = oldpage; |
3278 | } | 3355 | } |
3356 | anon = PageAnon(used); | ||
3357 | __mem_cgroup_uncharge_common(unused, | ||
3358 | anon ? MEM_CGROUP_CHARGE_TYPE_ANON | ||
3359 | : MEM_CGROUP_CHARGE_TYPE_CACHE, | ||
3360 | true); | ||
3361 | css_put(&memcg->css); | ||
3279 | /* | 3362 | /* |
3280 | * We disallowed uncharge of pages under migration because mapcount | 3363 | * We disallowed uncharge of pages under migration because mapcount |
3281 | * of the page goes down to zero, temporarly. | 3364 | * of the page goes down to zero, temporarly. |
@@ -3285,10 +3368,6 @@ void mem_cgroup_end_migration(struct mem_cgroup *memcg, | |||
3285 | lock_page_cgroup(pc); | 3368 | lock_page_cgroup(pc); |
3286 | ClearPageCgroupMigration(pc); | 3369 | ClearPageCgroupMigration(pc); |
3287 | unlock_page_cgroup(pc); | 3370 | unlock_page_cgroup(pc); |
3288 | anon = PageAnon(used); | ||
3289 | __mem_cgroup_uncharge_common(unused, | ||
3290 | anon ? MEM_CGROUP_CHARGE_TYPE_MAPPED | ||
3291 | : MEM_CGROUP_CHARGE_TYPE_CACHE); | ||
3292 | 3371 | ||
3293 | /* | 3372 | /* |
3294 | * If a page is a file cache, radix-tree replacement is very atomic | 3373 | * If a page is a file cache, radix-tree replacement is very atomic |
@@ -3340,10 +3419,6 @@ void mem_cgroup_replace_page_cache(struct page *oldpage, | |||
3340 | */ | 3419 | */ |
3341 | if (!memcg) | 3420 | if (!memcg) |
3342 | return; | 3421 | return; |
3343 | |||
3344 | if (PageSwapBacked(oldpage)) | ||
3345 | type = MEM_CGROUP_CHARGE_TYPE_SHMEM; | ||
3346 | |||
3347 | /* | 3422 | /* |
3348 | * Even if newpage->mapping was NULL before starting replacement, | 3423 | * Even if newpage->mapping was NULL before starting replacement, |
3349 | * the newpage may be on LRU(or pagevec for LRU) already. We lock | 3424 | * the newpage may be on LRU(or pagevec for LRU) already. We lock |
@@ -3418,7 +3493,7 @@ static int mem_cgroup_resize_limit(struct mem_cgroup *memcg, | |||
3418 | /* | 3493 | /* |
3419 | * Rather than hide all in some function, I do this in | 3494 | * Rather than hide all in some function, I do this in |
3420 | * open coded manner. You see what this really does. | 3495 | * open coded manner. You see what this really does. |
3421 | * We have to guarantee memcg->res.limit < memcg->memsw.limit. | 3496 | * We have to guarantee memcg->res.limit <= memcg->memsw.limit. |
3422 | */ | 3497 | */ |
3423 | mutex_lock(&set_limit_mutex); | 3498 | mutex_lock(&set_limit_mutex); |
3424 | memswlimit = res_counter_read_u64(&memcg->memsw, RES_LIMIT); | 3499 | memswlimit = res_counter_read_u64(&memcg->memsw, RES_LIMIT); |
@@ -3479,7 +3554,7 @@ static int mem_cgroup_resize_memsw_limit(struct mem_cgroup *memcg, | |||
3479 | /* | 3554 | /* |
3480 | * Rather than hide all in some function, I do this in | 3555 | * Rather than hide all in some function, I do this in |
3481 | * open coded manner. You see what this really does. | 3556 | * open coded manner. You see what this really does. |
3482 | * We have to guarantee memcg->res.limit < memcg->memsw.limit. | 3557 | * We have to guarantee memcg->res.limit <= memcg->memsw.limit. |
3483 | */ | 3558 | */ |
3484 | mutex_lock(&set_limit_mutex); | 3559 | mutex_lock(&set_limit_mutex); |
3485 | memlimit = res_counter_read_u64(&memcg->res, RES_LIMIT); | 3560 | memlimit = res_counter_read_u64(&memcg->res, RES_LIMIT); |
@@ -3611,10 +3686,12 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, | |||
3611 | } | 3686 | } |
3612 | 3687 | ||
3613 | /* | 3688 | /* |
3614 | * This routine traverse page_cgroup in given list and drop them all. | 3689 | * Traverse a specified page_cgroup list and try to drop them all. This doesn't |
3615 | * *And* this routine doesn't reclaim page itself, just removes page_cgroup. | 3690 | * reclaim the pages page themselves - it just removes the page_cgroups. |
3691 | * Returns true if some page_cgroups were not freed, indicating that the caller | ||
3692 | * must retry this operation. | ||
3616 | */ | 3693 | */ |
3617 | static int mem_cgroup_force_empty_list(struct mem_cgroup *memcg, | 3694 | static bool mem_cgroup_force_empty_list(struct mem_cgroup *memcg, |
3618 | int node, int zid, enum lru_list lru) | 3695 | int node, int zid, enum lru_list lru) |
3619 | { | 3696 | { |
3620 | struct mem_cgroup_per_zone *mz; | 3697 | struct mem_cgroup_per_zone *mz; |
@@ -3622,7 +3699,6 @@ static int mem_cgroup_force_empty_list(struct mem_cgroup *memcg, | |||
3622 | struct list_head *list; | 3699 | struct list_head *list; |
3623 | struct page *busy; | 3700 | struct page *busy; |
3624 | struct zone *zone; | 3701 | struct zone *zone; |
3625 | int ret = 0; | ||
3626 | 3702 | ||
3627 | zone = &NODE_DATA(node)->node_zones[zid]; | 3703 | zone = &NODE_DATA(node)->node_zones[zid]; |
3628 | mz = mem_cgroup_zoneinfo(memcg, node, zid); | 3704 | mz = mem_cgroup_zoneinfo(memcg, node, zid); |
@@ -3636,7 +3712,6 @@ static int mem_cgroup_force_empty_list(struct mem_cgroup *memcg, | |||
3636 | struct page_cgroup *pc; | 3712 | struct page_cgroup *pc; |
3637 | struct page *page; | 3713 | struct page *page; |
3638 | 3714 | ||
3639 | ret = 0; | ||
3640 | spin_lock_irqsave(&zone->lru_lock, flags); | 3715 | spin_lock_irqsave(&zone->lru_lock, flags); |
3641 | if (list_empty(list)) { | 3716 | if (list_empty(list)) { |
3642 | spin_unlock_irqrestore(&zone->lru_lock, flags); | 3717 | spin_unlock_irqrestore(&zone->lru_lock, flags); |
@@ -3653,21 +3728,14 @@ static int mem_cgroup_force_empty_list(struct mem_cgroup *memcg, | |||
3653 | 3728 | ||
3654 | pc = lookup_page_cgroup(page); | 3729 | pc = lookup_page_cgroup(page); |
3655 | 3730 | ||
3656 | ret = mem_cgroup_move_parent(page, pc, memcg, GFP_KERNEL); | 3731 | if (mem_cgroup_move_parent(page, pc, memcg)) { |
3657 | if (ret == -ENOMEM || ret == -EINTR) | ||
3658 | break; | ||
3659 | |||
3660 | if (ret == -EBUSY || ret == -EINVAL) { | ||
3661 | /* found lock contention or "pc" is obsolete. */ | 3732 | /* found lock contention or "pc" is obsolete. */ |
3662 | busy = page; | 3733 | busy = page; |
3663 | cond_resched(); | 3734 | cond_resched(); |
3664 | } else | 3735 | } else |
3665 | busy = NULL; | 3736 | busy = NULL; |
3666 | } | 3737 | } |
3667 | 3738 | return !list_empty(list); | |
3668 | if (!ret && !list_empty(list)) | ||
3669 | return -EBUSY; | ||
3670 | return ret; | ||
3671 | } | 3739 | } |
3672 | 3740 | ||
3673 | /* | 3741 | /* |
@@ -3692,9 +3760,6 @@ move_account: | |||
3692 | ret = -EBUSY; | 3760 | ret = -EBUSY; |
3693 | if (cgroup_task_count(cgrp) || !list_empty(&cgrp->children)) | 3761 | if (cgroup_task_count(cgrp) || !list_empty(&cgrp->children)) |
3694 | goto out; | 3762 | goto out; |
3695 | ret = -EINTR; | ||
3696 | if (signal_pending(current)) | ||
3697 | goto out; | ||
3698 | /* This is for making all *used* pages to be on LRU. */ | 3763 | /* This is for making all *used* pages to be on LRU. */ |
3699 | lru_add_drain_all(); | 3764 | lru_add_drain_all(); |
3700 | drain_all_stock_sync(memcg); | 3765 | drain_all_stock_sync(memcg); |
@@ -3715,9 +3780,6 @@ move_account: | |||
3715 | } | 3780 | } |
3716 | mem_cgroup_end_move(memcg); | 3781 | mem_cgroup_end_move(memcg); |
3717 | memcg_oom_recover(memcg); | 3782 | memcg_oom_recover(memcg); |
3718 | /* it seems parent cgroup doesn't have enough mem */ | ||
3719 | if (ret == -ENOMEM) | ||
3720 | goto try_to_free; | ||
3721 | cond_resched(); | 3783 | cond_resched(); |
3722 | /* "ret" should also be checked to ensure all lists are empty. */ | 3784 | /* "ret" should also be checked to ensure all lists are empty. */ |
3723 | } while (res_counter_read_u64(&memcg->res, RES_USAGE) > 0 || ret); | 3785 | } while (res_counter_read_u64(&memcg->res, RES_USAGE) > 0 || ret); |
@@ -3779,6 +3841,10 @@ static int mem_cgroup_hierarchy_write(struct cgroup *cont, struct cftype *cft, | |||
3779 | parent_memcg = mem_cgroup_from_cont(parent); | 3841 | parent_memcg = mem_cgroup_from_cont(parent); |
3780 | 3842 | ||
3781 | cgroup_lock(); | 3843 | cgroup_lock(); |
3844 | |||
3845 | if (memcg->use_hierarchy == val) | ||
3846 | goto out; | ||
3847 | |||
3782 | /* | 3848 | /* |
3783 | * If parent's use_hierarchy is set, we can't make any modifications | 3849 | * If parent's use_hierarchy is set, we can't make any modifications |
3784 | * in the child subtrees. If it is unset, then the change can | 3850 | * in the child subtrees. If it is unset, then the change can |
@@ -3795,6 +3861,8 @@ static int mem_cgroup_hierarchy_write(struct cgroup *cont, struct cftype *cft, | |||
3795 | retval = -EBUSY; | 3861 | retval = -EBUSY; |
3796 | } else | 3862 | } else |
3797 | retval = -EINVAL; | 3863 | retval = -EINVAL; |
3864 | |||
3865 | out: | ||
3798 | cgroup_unlock(); | 3866 | cgroup_unlock(); |
3799 | 3867 | ||
3800 | return retval; | 3868 | return retval; |
@@ -3831,7 +3899,7 @@ static inline u64 mem_cgroup_usage(struct mem_cgroup *memcg, bool swap) | |||
3831 | val += mem_cgroup_recursive_stat(memcg, MEM_CGROUP_STAT_RSS); | 3899 | val += mem_cgroup_recursive_stat(memcg, MEM_CGROUP_STAT_RSS); |
3832 | 3900 | ||
3833 | if (swap) | 3901 | if (swap) |
3834 | val += mem_cgroup_recursive_stat(memcg, MEM_CGROUP_STAT_SWAPOUT); | 3902 | val += mem_cgroup_recursive_stat(memcg, MEM_CGROUP_STAT_SWAP); |
3835 | 3903 | ||
3836 | return val << PAGE_SHIFT; | 3904 | return val << PAGE_SHIFT; |
3837 | } | 3905 | } |
@@ -4015,7 +4083,7 @@ static int mem_cgroup_move_charge_write(struct cgroup *cgrp, | |||
4015 | #endif | 4083 | #endif |
4016 | 4084 | ||
4017 | #ifdef CONFIG_NUMA | 4085 | #ifdef CONFIG_NUMA |
4018 | static int mem_control_numa_stat_show(struct cgroup *cont, struct cftype *cft, | 4086 | static int memcg_numa_stat_show(struct cgroup *cont, struct cftype *cft, |
4019 | struct seq_file *m) | 4087 | struct seq_file *m) |
4020 | { | 4088 | { |
4021 | int nid; | 4089 | int nid; |
@@ -4074,7 +4142,7 @@ static inline void mem_cgroup_lru_names_not_uptodate(void) | |||
4074 | BUILD_BUG_ON(ARRAY_SIZE(mem_cgroup_lru_names) != NR_LRU_LISTS); | 4142 | BUILD_BUG_ON(ARRAY_SIZE(mem_cgroup_lru_names) != NR_LRU_LISTS); |
4075 | } | 4143 | } |
4076 | 4144 | ||
4077 | static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft, | 4145 | static int memcg_stat_show(struct cgroup *cont, struct cftype *cft, |
4078 | struct seq_file *m) | 4146 | struct seq_file *m) |
4079 | { | 4147 | { |
4080 | struct mem_cgroup *memcg = mem_cgroup_from_cont(cont); | 4148 | struct mem_cgroup *memcg = mem_cgroup_from_cont(cont); |
@@ -4082,7 +4150,7 @@ static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft, | |||
4082 | unsigned int i; | 4150 | unsigned int i; |
4083 | 4151 | ||
4084 | for (i = 0; i < MEM_CGROUP_STAT_NSTATS; i++) { | 4152 | for (i = 0; i < MEM_CGROUP_STAT_NSTATS; i++) { |
4085 | if (i == MEM_CGROUP_STAT_SWAPOUT && !do_swap_account) | 4153 | if (i == MEM_CGROUP_STAT_SWAP && !do_swap_account) |
4086 | continue; | 4154 | continue; |
4087 | seq_printf(m, "%s %ld\n", mem_cgroup_stat_names[i], | 4155 | seq_printf(m, "%s %ld\n", mem_cgroup_stat_names[i], |
4088 | mem_cgroup_read_stat(memcg, i) * PAGE_SIZE); | 4156 | mem_cgroup_read_stat(memcg, i) * PAGE_SIZE); |
@@ -4109,7 +4177,7 @@ static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft, | |||
4109 | for (i = 0; i < MEM_CGROUP_STAT_NSTATS; i++) { | 4177 | for (i = 0; i < MEM_CGROUP_STAT_NSTATS; i++) { |
4110 | long long val = 0; | 4178 | long long val = 0; |
4111 | 4179 | ||
4112 | if (i == MEM_CGROUP_STAT_SWAPOUT && !do_swap_account) | 4180 | if (i == MEM_CGROUP_STAT_SWAP && !do_swap_account) |
4113 | continue; | 4181 | continue; |
4114 | for_each_mem_cgroup_tree(mi, memcg) | 4182 | for_each_mem_cgroup_tree(mi, memcg) |
4115 | val += mem_cgroup_read_stat(mi, i) * PAGE_SIZE; | 4183 | val += mem_cgroup_read_stat(mi, i) * PAGE_SIZE; |
@@ -4533,7 +4601,7 @@ static int mem_cgroup_oom_control_write(struct cgroup *cgrp, | |||
4533 | return 0; | 4601 | return 0; |
4534 | } | 4602 | } |
4535 | 4603 | ||
4536 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM | 4604 | #ifdef CONFIG_MEMCG_KMEM |
4537 | static int memcg_init_kmem(struct mem_cgroup *memcg, struct cgroup_subsys *ss) | 4605 | static int memcg_init_kmem(struct mem_cgroup *memcg, struct cgroup_subsys *ss) |
4538 | { | 4606 | { |
4539 | return mem_cgroup_sockets_init(memcg, ss); | 4607 | return mem_cgroup_sockets_init(memcg, ss); |
@@ -4588,7 +4656,7 @@ static struct cftype mem_cgroup_files[] = { | |||
4588 | }, | 4656 | }, |
4589 | { | 4657 | { |
4590 | .name = "stat", | 4658 | .name = "stat", |
4591 | .read_seq_string = mem_control_stat_show, | 4659 | .read_seq_string = memcg_stat_show, |
4592 | }, | 4660 | }, |
4593 | { | 4661 | { |
4594 | .name = "force_empty", | 4662 | .name = "force_empty", |
@@ -4620,10 +4688,10 @@ static struct cftype mem_cgroup_files[] = { | |||
4620 | #ifdef CONFIG_NUMA | 4688 | #ifdef CONFIG_NUMA |
4621 | { | 4689 | { |
4622 | .name = "numa_stat", | 4690 | .name = "numa_stat", |
4623 | .read_seq_string = mem_control_numa_stat_show, | 4691 | .read_seq_string = memcg_numa_stat_show, |
4624 | }, | 4692 | }, |
4625 | #endif | 4693 | #endif |
4626 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | 4694 | #ifdef CONFIG_MEMCG_SWAP |
4627 | { | 4695 | { |
4628 | .name = "memsw.usage_in_bytes", | 4696 | .name = "memsw.usage_in_bytes", |
4629 | .private = MEMFILE_PRIVATE(_MEMSWAP, RES_USAGE), | 4697 | .private = MEMFILE_PRIVATE(_MEMSWAP, RES_USAGE), |
@@ -4810,7 +4878,7 @@ struct mem_cgroup *parent_mem_cgroup(struct mem_cgroup *memcg) | |||
4810 | } | 4878 | } |
4811 | EXPORT_SYMBOL(parent_mem_cgroup); | 4879 | EXPORT_SYMBOL(parent_mem_cgroup); |
4812 | 4880 | ||
4813 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | 4881 | #ifdef CONFIG_MEMCG_SWAP |
4814 | static void __init enable_swap_cgroup(void) | 4882 | static void __init enable_swap_cgroup(void) |
4815 | { | 4883 | { |
4816 | if (!mem_cgroup_disabled() && really_do_swap_account) | 4884 | if (!mem_cgroup_disabled() && really_do_swap_account) |
@@ -5541,7 +5609,7 @@ struct cgroup_subsys mem_cgroup_subsys = { | |||
5541 | .__DEPRECATED_clear_css_refs = true, | 5609 | .__DEPRECATED_clear_css_refs = true, |
5542 | }; | 5610 | }; |
5543 | 5611 | ||
5544 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | 5612 | #ifdef CONFIG_MEMCG_SWAP |
5545 | static int __init enable_swap_account(char *s) | 5613 | static int __init enable_swap_account(char *s) |
5546 | { | 5614 | { |
5547 | /* consider enabled if no parameter or 1 is given */ | 5615 | /* consider enabled if no parameter or 1 is given */ |