diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5dba2933c9c0..7cfdcd808f52 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -2697,7 +2697,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, | |||
2697 | int migratetype = allocflags_to_migratetype(gfp_mask); | 2697 | int migratetype = allocflags_to_migratetype(gfp_mask); |
2698 | unsigned int cpuset_mems_cookie; | 2698 | unsigned int cpuset_mems_cookie; |
2699 | int alloc_flags = ALLOC_WMARK_LOW|ALLOC_CPUSET|ALLOC_FAIR; | 2699 | int alloc_flags = ALLOC_WMARK_LOW|ALLOC_CPUSET|ALLOC_FAIR; |
2700 | struct mem_cgroup *memcg = NULL; | ||
2701 | 2700 | ||
2702 | gfp_mask &= gfp_allowed_mask; | 2701 | gfp_mask &= gfp_allowed_mask; |
2703 | 2702 | ||
@@ -2716,13 +2715,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, | |||
2716 | if (unlikely(!zonelist->_zonerefs->zone)) | 2715 | if (unlikely(!zonelist->_zonerefs->zone)) |
2717 | return NULL; | 2716 | return NULL; |
2718 | 2717 | ||
2719 | /* | ||
2720 | * Will only have any effect when __GFP_KMEMCG is set. This is | ||
2721 | * verified in the (always inline) callee | ||
2722 | */ | ||
2723 | if (!memcg_kmem_newpage_charge(gfp_mask, &memcg, order)) | ||
2724 | return NULL; | ||
2725 | |||
2726 | retry_cpuset: | 2718 | retry_cpuset: |
2727 | cpuset_mems_cookie = read_mems_allowed_begin(); | 2719 | cpuset_mems_cookie = read_mems_allowed_begin(); |
2728 | 2720 | ||
@@ -2782,8 +2774,6 @@ out: | |||
2782 | if (unlikely(!page && read_mems_allowed_retry(cpuset_mems_cookie))) | 2774 | if (unlikely(!page && read_mems_allowed_retry(cpuset_mems_cookie))) |
2783 | goto retry_cpuset; | 2775 | goto retry_cpuset; |
2784 | 2776 | ||
2785 | memcg_kmem_commit_charge(page, memcg, order); | ||
2786 | |||
2787 | return page; | 2777 | return page; |
2788 | } | 2778 | } |
2789 | EXPORT_SYMBOL(__alloc_pages_nodemask); | 2779 | EXPORT_SYMBOL(__alloc_pages_nodemask); |
@@ -2837,27 +2827,51 @@ void free_pages(unsigned long addr, unsigned int order) | |||
2837 | EXPORT_SYMBOL(free_pages); | 2827 | EXPORT_SYMBOL(free_pages); |
2838 | 2828 | ||
2839 | /* | 2829 | /* |
2840 | * __free_memcg_kmem_pages and free_memcg_kmem_pages will free | 2830 | * alloc_kmem_pages charges newly allocated pages to the kmem resource counter |
2841 | * pages allocated with __GFP_KMEMCG. | 2831 | * of the current memory cgroup. |
2842 | * | 2832 | * |
2843 | * Those pages are accounted to a particular memcg, embedded in the | 2833 | * It should be used when the caller would like to use kmalloc, but since the |
2844 | * corresponding page_cgroup. To avoid adding a hit in the allocator to search | 2834 | * allocation is large, it has to fall back to the page allocator. |
2845 | * for that information only to find out that it is NULL for users who have no | 2835 | */ |
2846 | * interest in that whatsoever, we provide these functions. | 2836 | struct page *alloc_kmem_pages(gfp_t gfp_mask, unsigned int order) |
2847 | * | 2837 | { |
2848 | * The caller knows better which flags it relies on. | 2838 | struct page *page; |
2839 | struct mem_cgroup *memcg = NULL; | ||
2840 | |||
2841 | if (!memcg_kmem_newpage_charge(gfp_mask, &memcg, order)) | ||
2842 | return NULL; | ||
2843 | page = alloc_pages(gfp_mask, order); | ||
2844 | memcg_kmem_commit_charge(page, memcg, order); | ||
2845 | return page; | ||
2846 | } | ||
2847 | |||
2848 | struct page *alloc_kmem_pages_node(int nid, gfp_t gfp_mask, unsigned int order) | ||
2849 | { | ||
2850 | struct page *page; | ||
2851 | struct mem_cgroup *memcg = NULL; | ||
2852 | |||
2853 | if (!memcg_kmem_newpage_charge(gfp_mask, &memcg, order)) | ||
2854 | return NULL; | ||
2855 | page = alloc_pages_node(nid, gfp_mask, order); | ||
2856 | memcg_kmem_commit_charge(page, memcg, order); | ||
2857 | return page; | ||
2858 | } | ||
2859 | |||
2860 | /* | ||
2861 | * __free_kmem_pages and free_kmem_pages will free pages allocated with | ||
2862 | * alloc_kmem_pages. | ||
2849 | */ | 2863 | */ |
2850 | void __free_memcg_kmem_pages(struct page *page, unsigned int order) | 2864 | void __free_kmem_pages(struct page *page, unsigned int order) |
2851 | { | 2865 | { |
2852 | memcg_kmem_uncharge_pages(page, order); | 2866 | memcg_kmem_uncharge_pages(page, order); |
2853 | __free_pages(page, order); | 2867 | __free_pages(page, order); |
2854 | } | 2868 | } |
2855 | 2869 | ||
2856 | void free_memcg_kmem_pages(unsigned long addr, unsigned int order) | 2870 | void free_kmem_pages(unsigned long addr, unsigned int order) |
2857 | { | 2871 | { |
2858 | if (addr != 0) { | 2872 | if (addr != 0) { |
2859 | VM_BUG_ON(!virt_addr_valid((void *)addr)); | 2873 | VM_BUG_ON(!virt_addr_valid((void *)addr)); |
2860 | __free_memcg_kmem_pages(virt_to_page((void *)addr), order); | 2874 | __free_kmem_pages(virt_to_page((void *)addr), order); |
2861 | } | 2875 | } |
2862 | } | 2876 | } |
2863 | 2877 | ||