On 02/17/19 at 08:53am, Kees Cook wrote: > On Sat, Feb 16, 2019 at 6:03 AM Baoquan He <b...@redhat.com> wrote: > > > > In memory region KASLR, __PHYSICAL_MASK_SHIFT is taken to calculate > > the initial size of the direct mapping region. This is correct in > > the old code where __PHYSICAL_MASK_SHIFT was equal to MAX_PHYSMEM_BITS, > > 46 bits, and only 4-level mode was supported. > > > > Later, in commit b83ce5ee91471d ("x86/mm/64: Make __PHYSICAL_MASK_SHIFT > > always 52"), __PHYSICAL_MASK_SHIFT was changed to be always 52 bits, no > > matter it's 5-level or 4-level. This is wrong for 4-level paging. Then > > when we adapt physical memory region size based on available memory, it > > will overflow if the amount of system RAM and the padding is bigger > > than 64 TB. > > > > In fact, here MAX_PHYSMEM_BITS should be used instead. Fix it by > > replacing __PHYSICAL_MASK_SHIFT with MAX_PHYSMEM_BITS. > > > > Fixes: b83ce5ee9147 ("x86/mm/64: Make __PHYSICAL_MASK_SHIFT always 52") > > Acked-by: Kirill A. Shutemov <kirill.shute...@linux.intel.com> > > Reviewed-by: Thomas Garnier <thgar...@google.com> > > Signed-off-by: Baoquan He <b...@redhat.com> > > Nice catch! I wish I had a system with >64TB RAM. ;) > > Acked-by: Kees Cook <keesc...@chromium.org>
Thanks for reviewing and ack-ing. I don't have system with 64 TB RAM either. This fix is from code reading. In patch 0006, the UV system issue is a serious regression when I introduced KASLR into RHEL, now even though a RHEL-only fix has been merged in our distros, the tracker bug which tracks upstream fix will go to me during planning stage of each RHEL version. After Kirill pushed 5-level code, SGI UV dev said the old bug can't be reproduced any more in upstream kernel, I read code and found that the code bug fixed in this patch will hide the SGI UV issue :-). > > > --- > > arch/x86/mm/kaslr.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c > > index bf680929fe26..97768df923e3 100644 > > --- a/arch/x86/mm/kaslr.c > > +++ b/arch/x86/mm/kaslr.c > > @@ -137,7 +137,7 @@ void __init kernel_randomize_memory(void) > > if (!kaslr_memory_enabled()) > > return; > > > > - kaslr_regions[0].size_tb = 1 << (__PHYSICAL_MASK_SHIFT - TB_SHIFT); > > + kaslr_regions[0].size_tb = 1 << (MAX_PHYSMEM_BITS - TB_SHIFT); > > kaslr_regions[1].size_tb = VMALLOC_SIZE_TB; > > > > /* > > -- > > 2.17.2 > > > > > -- > Kees Cook