summaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c56
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
2726retry_cpuset: 2718retry_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}
2789EXPORT_SYMBOL(__alloc_pages_nodemask); 2779EXPORT_SYMBOL(__alloc_pages_nodemask);
@@ -2837,27 +2827,51 @@ void free_pages(unsigned long addr, unsigned int order)
2837EXPORT_SYMBOL(free_pages); 2827EXPORT_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. 2836struct 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
2848struct 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 */
2850void __free_memcg_kmem_pages(struct page *page, unsigned int order) 2864void __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
2856void free_memcg_kmem_pages(unsigned long addr, unsigned int order) 2870void 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