riscv: Add pte bit to distinguish swap from invalid
PATCH 1/1 riscv: Add pte bit to distinguish swap from invalid
Previously, invalid PTEs and swap PTEs had the same binary representation, causing errors when attempting to unmap PROT_NONE mappings, including implicit unmap on exit.
Typical error:
swap_info_get: Bad swap file entry 40000000007a9879
BUG: Bad page map in process a.out pte:3d4c3cc0 pmd:3e521401
--- arch/riscv/include/asm/pgtable-bits.h | 6 ++++++ arch/riscv/include/asm/pgtable.h | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-)
Reproducer:
#include <sys/mman.h>
int
main (void)
{
char *a = mmap (0, 4096, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
++*a;
mprotect (a, 4096, PROT_NONE);
}
arch/riscv/include/asm/pgtable-bits.h +6 -0
@@ -35,6 +35,12 @@#define _PAGE_SPECIAL _PAGE_SOFT#define _PAGE_TABLE _PAGE_PRESENT +/* +* _PAGE_PROT_NONE is set on not-present pages (and ignored by the hardware) to +* distinguish them from swapped out pages +*/ +#define _PAGE_PROT_NONE _PAGE_READ +#define _PAGE_PFN_SHIFT 10/* Set of bits to preserve across pte_modify() */
arch/riscv/include/asm/pgtable.h +4 -4
@@ -44,7 +44,7 @@/* Page protection bits */ #define _PAGE_BASE (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_USER) -#define PAGE_NONE __pgprot(0) +#define PAGE_NONE __pgprot(_PAGE_PROT_NONE)#define PAGE_READ __pgprot(_PAGE_BASE | _PAGE_READ)#define PAGE_WRITE __pgprot(_PAGE_BASE | _PAGE_READ | _PAGE_WRITE)#define PAGE_EXEC __pgprot(_PAGE_BASE | _PAGE_EXEC)
@@ -98,7 +98,7 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];static inline int pmd_present (pmd_t pmd) { -return (pmd_val (pmd) & _PAGE_PRESENT); +return (pmd_val (pmd) & (_PAGE_PRESENT | _PAGE_PROT_NONE)); }static inline int pmd_none (pmd_t pmd)
@@ -178,7 +178,7 @@ static inline pte_t *pte_offset_kernel(pmd_t *pmd, unsigned long addr)static inline int pte_present (pte_t pte) { -return (pte_val (pte) & _PAGE_PRESENT); +return (pte_val (pte) & (_PAGE_PRESENT | _PAGE_PROT_NONE)); }static inline int pte_none (pte_t pte)
@@ -380,7 +380,7 @@ static inline int ptep_clear_flush_young(struct vm_area_struct *vma,* * Format of swap PTE: * bit 0: _PAGE_PRESENT (zero) -* bit 1: reserved for future use (zero) +* bit 1: _PAGE_PROT_NONE (zero) * bits 2 to 6: swap type * bits 7 to XLEN-1: swap offset */
Signature · 7 lines
2.8.0 _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv
Quoted 11 lines · Stefan O'Rear
Previously, invalid PTEs and swap PTEs had the same binary representation, causing errors when attempting to unmap
PROT_NONEmappings, including implicit unmap on exit.Typical error:
swap_info_get: Bad swap file entry40000000007a9879BUG: Bad page map in process a.out pte:3d4c3cc0 pmd:3e521401Signed-off-by Stefan O'Rear <[email protected]>
Looks fine:
_______________________________________________
linux-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-riscv
Palmer, could you review/consider this patch for next rcX or next merge window?
david
Quoted 14 lines · Christoph Hellwig
Quoted 11 lines · Stefan O'Rear
Previously, invalid PTEs and swap PTEs had the same binary representation, causing errors when attempting to unmap
PROT_NONEmappings, including implicit unmap on exit.Typical error:
swap_info_get: Bad swap file entry40000000007a9879BUG: Bad page map in process a.out pte:3d4c3cc0 pmd:3e521401Signed-off-by Stefan O'Rear <[email protected]>
Quoted 8 lines
Looks fine:
Reviewed-by Christoph Hellwig <[email protected]>_______________________________________________
linux-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-riscv
_______________________________________________
linux-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-riscv
Quoted 1 line · On Fri, 08 Feb 2019 09:36:19 PST (-0800), [email protected] wrote:
Palmer, could you review/consider this patch for next rcX or next merge window?
I'll include this in next week's PR.
Quoted 26 lines
david
Quoted 22 lines · Christoph Hellwig
Quoted 11 lines · Stefan O'Rear
Previously, invalid PTEs and swap PTEs had the same binary representation, causing errors when attempting to unmap
PROT_NONEmappings, including implicit unmap on exit.Typical error:
swap_info_get: Bad swap file entry40000000007a9879BUG: Bad page map in process a.out pte:3d4c3cc0 pmd:3e521401Signed-off-by Stefan O'Rear <[email protected]>Looks fine:
Reviewed-by Christoph Hellwig <[email protected]>_______________________________________________
linux-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-riscv
_______________________________________________
linux-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-riscv