On Mon 11-06-12 14:58:45, Aneesh Kumar K.V wrote: > Michal Hocko <mhocko@xxxxxxx> writes: > > > On Sat 09-06-12 14:29:56, Aneesh Kumar K.V wrote: > >> From: "Aneesh Kumar K.V" <aneesh.kumar@xxxxxxxxxxxxxxxxxx> > >> > >> This patchset add the charge and uncharge routines for hugetlb cgroup. > >> This will be used in later patches when we allocate/free HugeTLB > >> pages. > > > > Please describe the locking rules. > > All the update happen within hugetlb_lock. Yes, I figured but it is definitely worth mentioning in the patch description. [...] > >> +void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages, > >> + struct hugetlb_cgroup *h_cg, > >> + struct page *page) > >> +{ > >> + if (hugetlb_cgroup_disabled() || !h_cg) > >> + return; > >> + > >> + spin_lock(&hugetlb_lock); > >> + if (hugetlb_cgroup_from_page(page)) { > > > > How can this happen? Is it possible that two CPUs are trying to charge > > one page? > > That is why I added that. I looked at the alloc_huge_page, and I > don't see we would end with same page from different CPUs but then > we have similar checks in memcg, where we drop the charge if we find > the page cgroup already used. Yes but memcg is little bit more complicated than hugetlb which has which doesn't have to cope with async charges. Hugetlb allocation is serialized by hugetlb_lock so only one caller gets the page. I do not think the check is required here or add a comment explaining how it can happen. [...] -- 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>