On Thu 06-09-18 13:18:52, Vlastimil Babka wrote: > On 08/30/2018 08:47 AM, Michal Hocko wrote: > > -static inline gfp_t alloc_hugepage_direct_gfpmask(struct vm_area_struct *vma) > > +static inline gfp_t alloc_hugepage_direct_gfpmask(struct vm_area_struct *vma, unsigned long addr) > > { > > const bool vma_madvised = !!(vma->vm_flags & VM_HUGEPAGE); > > + gfp_t this_node = 0; > > + struct mempolicy *pol; > > + > > +#ifdef CONFIG_NUMA > > + /* __GFP_THISNODE makes sense only if there is no explicit binding */ > > + pol = get_vma_policy(vma, addr); > > + if (pol->mode != MPOL_BIND) > > + this_node = __GFP_THISNODE; > > + mpol_cond_put(pol); > > The code is better without the hack in alloc_pages_vma() but I'm not > thrilled about getting vma policy here and then immediately again in > alloc_pages_vma(). But if it can't be helped... The whole function is an act of beauty isn't it. I wanted to get the policy from the caller but that would be even more messy so I've tried to keep it in the ugly corner and have it hidden there. You should ask your friends to read alloc_hugepage_direct_gfpmask unless they have done something terribly wrong. -- Michal Hocko SUSE Labs