On Mon, Mar 05, 2018 at 11:03:55AM -0800, Dave Hansen wrote:
> On 03/05/2018 08:26 AM, Kirill A. Shutemov wrote:
> > -#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
> > -   alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr)
> >  #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
> > +#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr)             
> >         \
> > +({                                                                         
> > \
> > +   struct page *page;                                                      
> > \
> > +   gfp_t gfp = movableflags | GFP_HIGHUSER;                                
> > \
> > +   if (vma_is_encrypted(vma))                                              
> > \
> > +           page = __alloc_zeroed_encrypted_user_highpage(gfp, vma, vaddr); 
> > \
> > +   else                                                                    
> > \
> > +           page = alloc_page_vma(gfp | __GFP_ZERO, vma, vaddr);            
> > \
> > +   page;                                                                   
> > \
> > +})
> 
> This is pretty darn ugly and also adds a big old branch into the hottest
> path in the page allocator.
> 
> It's also really odd that you strip __GFP_ZERO and then go ahead and
> zero the encrypted page unconditionally.  It really makes me wonder if
> this is the right spot to be doing this.
> 
> Can we not, for instance do it inside alloc_page_vma()?

Yes we can.

It would require substantial change into page allocation path for
CONFIG_NUMA=n as we don't path down vma at the moment. And without vma we
don't have a way to know which KeyID to use.

I will explore how it would fit together.

-- 
 Kirill A. Shutemov

Reply via email to