[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Wed, 4 Apr 2018 10:24:55 +0200
From: Laurent Dufour <ldufour@...ux.vnet.ibm.com>
To: David Rientjes <rientjes@...gle.com>
Cc: paulmck@...ux.vnet.ibm.com, peterz@...radead.org,
akpm@...ux-foundation.org, kirill@...temov.name,
ak@...ux.intel.com, mhocko@...nel.org, dave@...olabs.net,
jack@...e.cz, Matthew Wilcox <willy@...radead.org>,
benh@...nel.crashing.org, mpe@...erman.id.au, paulus@...ba.org,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>, hpa@...or.com,
Will Deacon <will.deacon@....com>,
Sergey Senozhatsky <sergey.senozhatsky@...il.com>,
Andrea Arcangeli <aarcange@...hat.com>,
Alexei Starovoitov <alexei.starovoitov@...il.com>,
kemi.wang@...el.com, sergey.senozhatsky.work@...il.com,
Daniel Jordan <daniel.m.jordan@...cle.com>,
linux-kernel@...r.kernel.org, linux-mm@...ck.org,
haren@...ux.vnet.ibm.com, khandual@...ux.vnet.ibm.com,
npiggin@...il.com, bsingharora@...il.com,
Tim Chen <tim.c.chen@...ux.intel.com>,
linuxppc-dev@...ts.ozlabs.org, x86@...nel.org
Subject: Re: [PATCH v9 09/24] mm: protect mremap() against SPF hanlder
On 28/03/2018 23:21, David Rientjes wrote:
> On Wed, 28 Mar 2018, Laurent Dufour wrote:
>
>>>> @@ -326,7 +336,10 @@ static unsigned long move_vma(struct vm_area_struct *vma,
>>>> mremap_userfaultfd_prep(new_vma, uf);
>>>> arch_remap(mm, old_addr, old_addr + old_len,
>>>> new_addr, new_addr + new_len);
>>>> + if (vma != new_vma)
>>>> + vm_raw_write_end(vma);
>>>> }
>>>> + vm_raw_write_end(new_vma);
>>>
>>> Just do
>>>
>>> vm_raw_write_end(vma);
>>> vm_raw_write_end(new_vma);
>>>
>>> here.
>>
>> Are you sure ? we can have vma = new_vma done if (unlikely(err))
>>
>
> Sorry, what I meant was do
>
> if (vma != new_vma)
> vm_raw_write_end(vma);
> vm_raw_write_end(new_vma);
>
> after the conditional. Having the locking unnecessarily embedded in the
> conditional has been an issue in the past with other areas of core code,
> unless you have a strong reason for it.
Unfortunately, I can't see how doing this in another way since vma = new_vma is
done in the error branch.
So releasing the VMAs outside of the conditional may lead to miss 'vma' if the
error branch is taken.
Here is the code snippet as a reminder:
new_vma = copy_vma(&vma, new_addr, new_len, new_pgoff,
&need_rmap_locks);
[...]
if (vma != new_vma)
vm_raw_write_begin(vma);
[...]
if (unlikely(err)) {
[...]
if (vma != new_vma)
vm_raw_write_end(vma);
vma = new_vma; <<<< here we lost reference to vma
[...]
} else {
[...]
if (vma != new_vma)
vm_raw_write_end(vma);
}
vm_raw_write_end(new_vma);
Powered by blists - more mailing lists