On Fri 15-06-12 16:01:03, Aneesh Kumar K.V wrote: > From: "Aneesh Kumar K.V" <aneesh.kumar@xxxxxxxxxxxxxxxxxx> > > page's hugetlb cgroup assign and moving to active list should happen with > hugetlb_lock held. Otherwise when we remove the hugetlb cgroup we would > iterate the active list and will find page with NULL hugetlb cgroup values. > > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxxxxxxx> Reviewed-by: Michal Hocko <mhocko@xxxxxxx> > --- > mm/hugetlb.c | 14 +++++++++----- > mm/hugetlb_cgroup.c | 3 +-- > 2 files changed, 10 insertions(+), 7 deletions(-) > > diff --git a/mm/hugetlb.c b/mm/hugetlb.c > index ec7b86e..10160cb 100644 > --- a/mm/hugetlb.c > +++ b/mm/hugetlb.c > @@ -1150,9 +1150,13 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma, > } > spin_lock(&hugetlb_lock); > page = dequeue_huge_page_vma(h, vma, addr, avoid_reserve); > - spin_unlock(&hugetlb_lock); > - > - if (!page) { > + if (page) { > + /* update page cgroup details */ > + hugetlb_cgroup_commit_charge(idx, pages_per_huge_page(h), > + h_cg, page); > + spin_unlock(&hugetlb_lock); > + } else { > + spin_unlock(&hugetlb_lock); > page = alloc_buddy_huge_page(h, NUMA_NO_NODE); > if (!page) { > hugetlb_cgroup_uncharge_cgroup(idx, > @@ -1163,14 +1167,14 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma, > } > spin_lock(&hugetlb_lock); > list_move(&page->lru, &h->hugepage_activelist); > + hugetlb_cgroup_commit_charge(idx, pages_per_huge_page(h), > + h_cg, page); > spin_unlock(&hugetlb_lock); > } > > set_page_private(page, (unsigned long)spool); > > vma_commit_reservation(h, vma, addr); > - /* update page cgroup details */ > - hugetlb_cgroup_commit_charge(idx, pages_per_huge_page(h), h_cg, page); > return page; > } > > diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c > index 8e7ca0a..d4f3f7b 100644 > --- a/mm/hugetlb_cgroup.c > +++ b/mm/hugetlb_cgroup.c > @@ -218,6 +218,7 @@ done: > return ret; > } > > +/* Should be called with hugetlb_lock held */ > void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages, > struct hugetlb_cgroup *h_cg, > struct page *page) > @@ -225,9 +226,7 @@ void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages, > if (hugetlb_cgroup_disabled() || !h_cg) > return; > > - spin_lock(&hugetlb_lock); > set_hugetlb_cgroup(page, h_cg); > - spin_unlock(&hugetlb_lock); > return; > } > > -- > 1.7.10 > -- Michal Hocko SUSE Labs SUSE LINUX s.r.o. Lihovarska 1060/12 190 00 Praha 9 Czech Republic -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>