1. 29 Feb, 2024 1 commit
    • Alexandre Ghiti's avatar
      Revert "riscv: mm: support Svnapot in huge vmap" · 16ab4646
      Alexandre Ghiti authored
      This reverts commit ce173474.
      
      We cannot correctly deal with NAPOT mappings in vmalloc/vmap because if
      some part of a NAPOT mapping is unmapped, the remaining mapping is not
      updated accordingly. For example:
      
      ptr = vmalloc_huge(64 * 1024, GFP_KERNEL);
      vunmap_range((unsigned long)(ptr + PAGE_SIZE),
      	     (unsigned long)(ptr + 64 * 1024));
      
      leads to the following kernel page table dump:
      
      0xffff8f8000ef0000-0xffff8f8000ef1000    0x00000001033c0000         4K PTE N   ..     ..   D A G . . W R V
      
      Meaning the first entry which was not unmapped still has the N bit set,
      which, if accessed first and cached in the TLB, could allow access to the
      unmapped range.
      
      That's because the logic to break the NAPOT mapping does not exist and
      likely won't. Indeed, to break a NAPOT mapping, we first have to clear
      the whole mapping, flush the TLB and then set the new mapping ("break-
      before-make" equivalent). That works fine in userspace since we can handle
      any pagefault occurring on the remaining mapping but we can't handle a kernel
      pagefault on such mapping.
      
      So fix this by reverting the commit that introduced the vmap/vmalloc
      support.
      
      Fixes: ce173474 ("riscv: mm: support Svnapot in huge vmap")
      Signed-off-by: default avatarAlexandre Ghiti <alexghiti@rivosinc.com>
      Link: https://lore.kernel.org/r/20240227205016.121901-2-alexghiti@rivosinc.comSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
      16ab4646
  2. 21 Jan, 2024 39 commits