Re: [PATCHv5, REBASED 9/9] x86/mm: Allow to have userspace mappings above 47-bits

From: Michal Hocko
Date: Thu May 18 2017 - 13:13:40 EST


On Thu 18-05-17 19:22:55, Kirill A. Shutemov wrote:
> On Thu, May 18, 2017 at 05:59:14PM +0200, Michal Hocko wrote:
[...]
> > I basically mean something like the following
> > ---
> > diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c
> > index 74d1587b181d..d6f66ff02d0a 100644
> > --- a/arch/x86/kernel/sys_x86_64.c
> > +++ b/arch/x86/kernel/sys_x86_64.c
> > @@ -195,7 +195,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
> > goto bottomup;
> >
> > /* requesting a specific address */
> > - if (addr) {
> > + if (addr && addr <= DEFAULT_MAP_WINDOW) {
> > addr = PAGE_ALIGN(addr);
> > vma = find_vma(mm, addr);
> > if (TASK_SIZE - len >= addr &&
> > @@ -215,7 +215,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
> > * !in_compat_syscall() check to avoid high addresses for x32.
> > */
> > if (addr > DEFAULT_MAP_WINDOW && !in_compat_syscall())
> > - info.high_limit += TASK_SIZE_MAX - DEFAULT_MAP_WINDOW;
> > + info.high_limit += min(TASK_SIZE_MAX, address) - DEFAULT_MAP_WINDOW;
> >
> > info.align_mask = 0;
> > info.align_offset = pgoff << PAGE_SHIFT;
>
> You try to stretch the interface too far. With the patch you propose we
> have totally different behaviour wrt hint address if it below and above
> 47-bits:
>
> * <= 47-bits: allocate VM [addr; addr + len - 1], if free;

unless I am missing something fundamental here this is not how it works.
We just map a different range if the requested one is not free (in
absence of MAP_FIXED). And we do that in top->down direction so this is
already how it works. And you _do_ rely on the same thing when allowing
larger than 47b except you start from the top of the supported address
space. So how exactly is your new behavior any different and more clear?

Say you would do
mmap(1<<48, ...) # you will get 1<<48
mmap(1<<48, ...) # you will get something below TASK_SIZE_MAX

> * > 47-bits: allocate VM anywhere under addr;
>
> Sorry, no. That's ugly.
>
> If you feel that we need to guarantee that bits above certain limit are
> unused, introduce new interface. We have enough logic encoded in hint
> address already.

--
Michal Hocko
SUSE Labs