> On Aug 20, 2019, at 6:55 AM, Rik van Riel <riel@xxxxxx> wrote: > > On Tue, 2019-08-20 at 09:21 -0400, Song Liu wrote: >>> On Aug 20, 2019, at 4:16 AM, Thomas Gleixner <tglx@xxxxxxxxxxxxx> >>> wrote: >>> >>> On Tue, 20 Aug 2019, Peter Zijlstra wrote: >>>> What that code wants to do is skip to the end of the pud, a >>>> pmd_size >>>> increase will not do that. And right below this, there's a second >>>> instance of this exact pattern. >>>> >>>> Did I get the below right? >>>> >>>> --- >>>> diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c >>>> index b196524759ec..32b20b3cb227 100644 >>>> --- a/arch/x86/mm/pti.c >>>> +++ b/arch/x86/mm/pti.c >>>> @@ -330,12 +330,14 @@ pti_clone_pgtable(unsigned long start, >>>> unsigned long end, >>>> >>>> pud = pud_offset(p4d, addr); >>>> if (pud_none(*pud)) { >>>> + addr &= PUD_MASK; >>>> addr += PUD_SIZE; >>> >>> round_up(addr, PUD_SIZE); >> >> I guess we need "round_up(addr + PMD_SIZE, PUD_SIZE)". > > What does that do if start is less than PMD_SIZE > away from the next PUD_SIZE boundary? Great point! > > How about: round_up(addr + 1, PUD_SIZE) ? Yes. How about this? =========================== 8< ============================ >From 9ae74cff4faf4710a11cb8da4c4a3f3404bd9fdd Mon Sep 17 00:00:00 2001 From: Song Liu <songliubraving@xxxxxx> Date: Mon, 19 Aug 2019 23:59:47 -0700 Subject: [PATCH] x86/mm/pti: in pti_clone_pgtable(), increase addr properly Before 32-bit support, pti_clone_pmds() always adds PMD_SIZE to addr. This behavior changes after the 32-bit support: pti_clone_pgtable() increases addr by PUD_SIZE for pud_none(*pud) case, and increases addr by PMD_SIZE for pmd_none(*pmd) case. However, this is not accurate because addr may not be PUD_SIZE/PMD_SIZE aligned. Fix this issue by properly rounding up addr to next PUD_SIZE/PMD_SIZE in these two cases. Cc: stable@xxxxxxxxxxxxxxx # v4.19+ Fixes: 16a3fe634f6a ("x86/mm/pti: Clone kernel-image on PTE level for 32 bit") Signed-off-by: Song Liu <songliubraving@xxxxxx> Cc: Joerg Roedel <jroedel@xxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx> Cc: Andy Lutomirski <luto@xxxxxxxxxx> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> --- arch/x86/mm/pti.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c index b196524759ec..1337494e22ef 100644 --- a/arch/x86/mm/pti.c +++ b/arch/x86/mm/pti.c @@ -330,13 +330,13 @@ pti_clone_pgtable(unsigned long start, unsigned long end, pud = pud_offset(p4d, addr); if (pud_none(*pud)) { - addr += PUD_SIZE; + addr = round_up(addr + 1, PUD_SIZE); continue; } pmd = pmd_offset(pud, addr); if (pmd_none(*pmd)) { - addr += PMD_SIZE; + addr = round_up(addr + 1, PMD_SIZE); continue; } -- 2.17.1