riscv: mm: Fixup & Optimize COMPAT code
Subsystems (2)
v3 cover riscv: mm: Fixup & Optimize COMPAT code
From: Guo Ren <[email protected]>
When the task is in COMPAT mode, the TASK_SIZE should be 2GB, so STACK_TOP_MAX and arch_get_mmap_end must be limited to 2 GB. This series fixes the problem made by commit: add2cc6b6515 ("RISC-V: mm: Restrict address space for sv39,sv48,sv57") and optimizes the related coding convention of TASK_SIZE.
Changelog:
v3:
- Remove wrong modification of arch_get_mmap_end
- Remove is_compat_task optimization
- Update comment log
v2:
https://lore.kernel.org/linux-riscv/[email protected]/
- Separate rename from fixup
- Add STACK_TOP_MAX fixup for compat
- Add Cleanup & rename patches
v1:
https://lore.kernel.org/linux-riscv/[email protected]/
Guo Ren (4):
riscv: mm: Fixup compat mode boot failure
riscv: mm: Fixup compat arch_get_mmap_end
riscv: mm: Remove unused TASK_SIZE_MIN
riscv: mm: Optimize TASK_SIZE definition
arch/riscv/include/asm/pgtable.h | 7 +++---- arch/riscv/include/asm/processor.h | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-)
Signature · 1 line
2.40.1
PATCH v3 1/4 riscv: mm: Fixup compat mode boot failure
From: Guo Ren <[email protected]>
In COMPAT mode, the STACK_TOP is DEFAULT_MAP_WINDOW (0x80000000), but the TASK_SIZE is 0x7fff000. When the user stack is upon 0x7fff000, it will cause a user segment fault. Sometimes, it would cause boot failure when the whole rootfs is rv32.
Freeing unused kernel image (initmem) memory: 2236K
Run /sbin/init as init process
Starting init: /sbin/init exists but couldn't execute it (error -14) Run /etc/init as init process
...
Increase the TASK_SIZE to cover STACK_TOP.
--- arch/riscv/include/asm/pgtable.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/include/asm/pgtable.h +1 -1
@@ -881,7 +881,7 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)#define TASK_SIZE_MIN (PGDIR_SIZE_L3 * PTRS_PER_PGD / 2)#ifdef CONFIG_COMPAT -#define TASK_SIZE_32 (_AC(0x80000000, UL) - PAGE_SIZE) +#define TASK_SIZE_32 (_AC(0x80000000, UL))#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ TASK_SIZE_32 : TASK_SIZE_64)#else
Signature · 1 line
2.40.1
Re: [PATCH V3 1/4] riscv: mm: Fixup compat mode boot failure
Quoted 39 lines · On Fri, Dec 22, 2023 at 06:57:00AM -0500, [email protected] wrote:
From: Guo Ren <[email protected]>
In COMPAT mode, the
STACK_TOPisDEFAULT_MAP_WINDOW(0x80000000), but theTASK_SIZEis0x7fff000. When the user stack is upon0x7fff000, it will cause a user segment fault. Sometimes, it would cause boot failure when the whole rootfs is rv32.Freeing unused kernel image (initmem) memory: 2236K
Run/sbin/initas init process
Starting init:/sbin/initexists but couldn't execute it (error -14) Run/etc/initas init process
...Increase the
TASK_SIZEto coverSTACK_TOP.Fixes add2cc6b6515 ("RISC-V: mm: Restrict address space for sv39,sv48,sv57")Signed-off-by Guo Ren <[email protected]>Signed-off-by Guo Ren <[email protected]>--- arch/riscv/include/asm/pgtable.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/riscv/include/asm/pgtable.h +1
-1@@ -881,7 +881,7 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)#define TASK_SIZE_MIN (PGDIR_SIZE_L3 * PTRS_PER_PGD / 2)#ifdef CONFIG_COMPAT -#define TASK_SIZE_32 (_AC(0x80000000, UL) - PAGE_SIZE) +#define TASK_SIZE_32 (_AC(0x80000000, UL))#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ TASK_SIZE_32 : TASK_SIZE_64)#else Signature · 1 line
2.40.1
I am not really involved in the issue this is solving, so I have no technical opinion on the solution.
IIUC there should always be (TASK_SIZE >= STACK_TOP), so by itself this is fixing an issue.
I have reviewed the code and it does exactly as stated into the commit message, so FWIW:
Re: [PATCH V3 1/4] riscv: mm: Fixup compat mode boot failure
Quoted 45 lines · Leonardo Bras
Quoted 37 lines · On Fri, Dec 22, 2023 at 06:57:00AM -0500, [email protected] wrote:
From: Guo Ren <[email protected]>
In COMPAT mode, the
STACK_TOPisDEFAULT_MAP_WINDOW(0x80000000), but theTASK_SIZEis0x7fff000. When the user stack is upon0x7fff000, it will cause a user segment fault. Sometimes, it would cause boot failure when the whole rootfs is rv32.Freeing unused kernel image (initmem) memory: 2236K
Run/sbin/initas init process
Starting init:/sbin/initexists but couldn't execute it (error -14) Run/etc/initas init process
...Increase the
TASK_SIZEto coverSTACK_TOP.Fixes add2cc6b6515 ("RISC-V: mm: Restrict address space for sv39,sv48,sv57")Signed-off-by Guo Ren <[email protected]>Signed-off-by Guo Ren <[email protected]>--- arch/riscv/include/asm/pgtable.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/riscv/include/asm/pgtable.h +1
-2@@ -881,7 +881,7 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)#define TASK_SIZE_MIN (PGDIR_SIZE_L3 * PTRS_PER_PGD / 2)#ifdef CONFIG_COMPAT -#define TASK_SIZE_32 (_AC(0x80000000, UL) - PAGE_SIZE) +#define TASK_SIZE_32 (_AC(0x80000000, UL))#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ TASK_SIZE_32 : TASK_SIZE_64)#else --Quoted 2 lines
2.40.1
I am not really involved in the issue this is solving, so I have no technical opinion on the solution.
Quoted 6 lines
IIUC there should always be (
TASK_SIZE>=STACK_TOP), so by itself this is fixing an issue.I have reviewed the code and it does exactly as stated into the commit message, so FWIW:
Reviewed-by Leonardo Bras <[email protected]>
Thx,
I found this problem because it can't boot my rv32 buildroot-rootfs in v6.6. But it's okay in v6.5. So I used git bisect and found commit:add2cc6b6515 ("RISC-V: mm: Restrict address space for sv39,sv48,sv57"), which caused that.
Ping Charlie, I hope it can be fixed in the v6.6 long-term version.
Quoted 1 line
--
Best Regards
Guo Ren
Charlie Jenkins
Reviewed-byRe: [PATCH V3 1/4] riscv: mm: Fixup compat mode boot failure
Quoted 52 lines · Guo Ren
Quoted 45 lines · Leonardo Bras
Quoted 37 lines · On Fri, Dec 22, 2023 at 06:57:00AM -0500, [email protected] wrote:
From: Guo Ren <[email protected]>
In COMPAT mode, the
STACK_TOPisDEFAULT_MAP_WINDOW(0x80000000), but theTASK_SIZEis0x7fff000. When the user stack is upon0x7fff000, it will cause a user segment fault. Sometimes, it would cause boot failure when the whole rootfs is rv32.Freeing unused kernel image (initmem) memory: 2236K
Run/sbin/initas init process
Starting init:/sbin/initexists but couldn't execute it (error -14) Run/etc/initas init process
...Increase the
TASK_SIZEto coverSTACK_TOP.Fixes add2cc6b6515 ("RISC-V: mm: Restrict address space for sv39,sv48,sv57")Signed-off-by Guo Ren <[email protected]>Signed-off-by Guo Ren <[email protected]>--- arch/riscv/include/asm/pgtable.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/riscv/include/asm/pgtable.h +1
-2@@ -881,7 +881,7 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)#define TASK_SIZE_MIN (PGDIR_SIZE_L3 * PTRS_PER_PGD / 2)#ifdef CONFIG_COMPAT -#define TASK_SIZE_32 (_AC(0x80000000, UL) - PAGE_SIZE) +#define TASK_SIZE_32 (_AC(0x80000000, UL))#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ TASK_SIZE_32 : TASK_SIZE_64)#else --Quoted 2 lines
2.40.1
I am not really involved in the issue this is solving, so I have no technical opinion on the solution.
Quoted 6 lines
IIUC there should always be (
TASK_SIZE>=STACK_TOP), so by itself this is fixing an issue.I have reviewed the code and it does exactly as stated into the commit message, so FWIW:
Reviewed-by Leonardo Bras <[email protected]>
Quoted 8 lines
Thx,
I found this problem because it can't boot my rv32 buildroot-rootfs in v6.6. But it's okay in v6.5. So I used git bisect and found commit:
add2cc6b6515("RISC-V: mm: Restrict address space for sv39,sv48,sv57"), which caused that.Ping Charlie, I hope it can be fixed in the v6.6 long-term version.
I have looked at this more I do agree that this change makes sense. I was thinking that it was valid to have STACK_TOP that was greater than TASK_SIZE but I am no longer convinced that is true. Thank you for looking into this.
Quoted 8 lines
Quoted 2 lines
--
Best Regards
Guo Ren
PATCH v3 2/4 riscv: mm: Fixup compat arch_get_mmap_end
In reply to [email protected]From: Guo Ren <[email protected]>
When the task is in COMPAT mode, the arch_get_mmap_end should be 2GB, not TASK_SIZE_64. The TASK_SIZE has contained is_compat_mode() detection, so change the definition of STACK_TOP_MAX to TASK_SIZE directly.
--- arch/riscv/include/asm/processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/include/asm/processor.h +1 -1
@@ -16,7 +16,7 @@#ifdef CONFIG_64BIT #define DEFAULT_MAP_WINDOW (UL(1) << (MMAP_VA_BITS - 1)) -#define STACK_TOP_MAX TASK_SIZE_64 +#define STACK_TOP_MAX TASK_SIZE#define arch_get_mmap_end (addr, len, flags) \ ({ \
Signature · 1 line
2.40.1
Re: [PATCH V3 2/4] riscv: mm: Fixup compat arch_get_mmap_end
Quoted 31 lines · On Fri, Dec 22, 2023 at 06:57:01AM -0500, [email protected] wrote:
From: Guo Ren <[email protected]>
When the task is in COMPAT mode, the
arch_get_mmap_endshould be 2GB, notTASK_SIZE_64. TheTASK_SIZEhas containedis_compat_mode()detection, so change the definition ofSTACK_TOP_MAXtoTASK_SIZEdirectly.Fixes add2cc6b6515 ("RISC-V: mm: Restrict address space for sv39,sv48,sv57")Signed-off-by Guo Ren <[email protected]>Signed-off-by Guo Ren <[email protected]>--- arch/riscv/include/asm/processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/riscv/include/asm/processor.h +1
-1@@ -16,7 +16,7 @@#ifdef CONFIG_64BIT #define DEFAULT_MAP_WINDOW (UL(1) << (MMAP_VA_BITS - 1)) -#define STACK_TOP_MAX TASK_SIZE_64 +#define STACK_TOP_MAX TASK_SIZE#define arch_get_mmap_end (addr, len, flags) \ ({ \Signature · 1 line
2.40.1
LGTM.
FWIW:
Charlie Jenkins
Reviewed-byRe: [PATCH V3 2/4] riscv: mm: Fixup compat arch_get_mmap_end
Quoted 36 lines · Leonardo Bras
Quoted 31 lines · On Fri, Dec 22, 2023 at 06:57:01AM -0500, [email protected] wrote:
From: Guo Ren <[email protected]>
When the task is in COMPAT mode, the
arch_get_mmap_endshould be 2GB, notTASK_SIZE_64. TheTASK_SIZEhas containedis_compat_mode()detection, so change the definition ofSTACK_TOP_MAXtoTASK_SIZEdirectly.Fixes add2cc6b6515 ("RISC-V: mm: Restrict address space for sv39,sv48,sv57")Signed-off-by Guo Ren <[email protected]>Signed-off-by Guo Ren <[email protected]>--- arch/riscv/include/asm/processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/riscv/include/asm/processor.h +1
-1@@ -16,7 +16,7 @@#ifdef CONFIG_64BIT #define DEFAULT_MAP_WINDOW (UL(1) << (MMAP_VA_BITS - 1)) -#define STACK_TOP_MAX TASK_SIZE_64 +#define STACK_TOP_MAX TASK_SIZE#define arch_get_mmap_end (addr, len, flags) \ ({ \Signature · 1 line
2.40.1LGTM.
Quoted 2 lines
FWIW:
Reviewed-by Leonardo Bras <[email protected]>
Quoted 1 line
PATCH v3 3/4 riscv: mm: Remove unused TASK_SIZE_MIN
In reply to [email protected]From: Guo Ren <[email protected]>
Remove TASK_SIZE_MIN because it's not used anymore.
--- arch/riscv/include/asm/pgtable.h | 2 -- 1 file changed, 2 deletions(-)
arch/riscv/include/asm/pgtable.h +0 -2
@@ -878,7 +878,6 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)*/ #ifdef CONFIG_64BIT #define TASK_SIZE_64 (PGDIR_SIZE * PTRS_PER_PGD / 2) -#define TASK_SIZE_MIN (PGDIR_SIZE_L3 * PTRS_PER_PGD / 2)#ifdef CONFIG_COMPAT #define TASK_SIZE_32 (_AC(0x80000000, UL))
@@ -890,7 +889,6 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)#else #define TASK_SIZE FIXADDR_START -#define TASK_SIZE_MIN TASK_SIZE#endif #else /* CONFIG_MMU */
Signature · 1 line
2.40.1
Re: [PATCH V3 3/4] riscv: mm: Remove unused TASK_SIZE_MIN
Quoted 34 lines · On Fri, Dec 22, 2023 at 06:57:02AM -0500, [email protected] wrote:
From: Guo Ren <[email protected]>
Remove
TASK_SIZE_MINbecause it's not used anymore.Reviewed-by Leonardo Bras <[email protected]>Signed-off-by Guo Ren <[email protected]>Signed-off-by Guo Ren <[email protected]>--- arch/riscv/include/asm/pgtable.h | 2 -- 1 file changed, 2 deletions(-)arch/riscv/include/asm/pgtable.h +0
-2@@ -878,7 +878,6 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)*/ #ifdef CONFIG_64BIT #define TASK_SIZE_64 (PGDIR_SIZE * PTRS_PER_PGD / 2) -#define TASK_SIZE_MIN (PGDIR_SIZE_L3 * PTRS_PER_PGD / 2)#ifdef CONFIG_COMPAT #define TASK_SIZE_32 (_AC(0x80000000, UL))@@ -890,7 +889,6 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)#else #define TASK_SIZE FIXADDR_START -#define TASK_SIZE_MIN TASK_SIZE#endif #else /* CONFIG_MMU */ Signature · 1 line
2.40.1
PATCH v3 4/4 riscv: mm: Optimize TASK_SIZE definition
In reply to [email protected]From: Guo Ren <[email protected]>
Unify the TASK_SIZE definition with VA_BITS for better readability. Add COMPAT mode user address space info in the comment.
--- arch/riscv/include/asm/pgtable.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/riscv/include/asm/pgtable.h +3 -2
@@ -866,6 +866,7 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)* Note that PGDIR_SIZE must evenly divide TASK_SIZE. * Task size is: * - 0x9fc00000 (~2.5GB) for RV32. +* - 0x80000000 ( 2GB) for RV64 compat mode * - 0x4000000000 ( 256GB) for RV64 using SV39 mmu * - 0x800000000000 ( 128TB) for RV64 using SV48 mmu * - 0x100000000000000 ( 64PB) for RV64 using SV57 mmu
@@ -877,10 +878,10 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)* Similarly for SV57, bits 63–57 must be equal to bit 56. */ #ifdef CONFIG_64BIT -#define TASK_SIZE_64 (PGDIR_SIZE * PTRS_PER_PGD / 2) +#define TASK_SIZE_64 (UL(1) << (VA_BITS - 1))#ifdef CONFIG_COMPAT -#define TASK_SIZE_32 (_AC(0x80000000, UL)) +#define TASK_SIZE_32 (UL(1) << (VA_BITS_SV32 - 1))#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ TASK_SIZE_32 : TASK_SIZE_64)#else
Signature · 1 line
2.40.1
Re: [PATCH V3 4/4] riscv: mm: Optimize TASK_SIZE definition
Quoted 40 lines · On Fri, Dec 22, 2023 at 06:57:03AM -0500, [email protected] wrote:
From: Guo Ren <[email protected]>
Unify the
TASK_SIZEdefinition withVA_BITSfor better readability. Add COMPAT mode user address space info in the comment.Reviewed-by Leonardo Bras <[email protected]>Signed-off-by Guo Ren <[email protected]>Signed-off-by Guo Ren <[email protected]>--- arch/riscv/include/asm/pgtable.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)arch/riscv/include/asm/pgtable.h +3
-2@@ -866,6 +866,7 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)* Note that PGDIR_SIZE must evenly divide TASK_SIZE. * Task size is: * - 0x9fc00000 (~2.5GB) for RV32. +* - 0x80000000 ( 2GB) for RV64 compat mode * - 0x4000000000 ( 256GB) for RV64 using SV39 mmu * - 0x800000000000 ( 128TB) for RV64 using SV48 mmu * - 0x100000000000000 ( 64PB) for RV64 using SV57 mmu @@ -877,10 +878,10 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)* Similarly for SV57, bits 63–57 must be equal to bit 56. */ #ifdef CONFIG_64BIT -#define TASK_SIZE_64 (PGDIR_SIZE * PTRS_PER_PGD / 2) +#define TASK_SIZE_64 (UL(1) << (VA_BITS - 1))#ifdef CONFIG_COMPAT -#define TASK_SIZE_32 (_AC(0x80000000, UL)) +#define TASK_SIZE_32 (UL(1) << (VA_BITS_SV32 - 1))#define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ TASK_SIZE_32 : TASK_SIZE_64)#else Signature · 1 line
2.40.1
This series was applied to riscv/linux.git (for-next) by Palmer Dabbelt <[email protected]>:
Hello:
This series was applied to riscv/linux.git (for-next) by Palmer Dabbelt <[email protected]>:
Quoted 9 lines · On Fri, 22 Dec 2023 06:56:59 -0500 you wrote:
From: Guo Ren <[email protected]>
When the task is in COMPAT mode, the
TASK_SIZEshould be 2GB, soSTACK_TOP_MAXandarch_get_mmap_endmust be limited to 2 GB. This series fixes the problem made by commit:add2cc6b6515("RISC-V: mm: Restrict address space for sv39,sv48,sv57") and optimizes the related coding convention ofTASK_SIZE.[...]
Here is the summary with links:
- [V3,1/4] riscv: mm: Fixup compat mode boot failure
https://git.kernel.org/riscv/c/5f449e245e5b - [V3,2/4] riscv: mm: Fixup compat arch_get_mmap_end https://git.kernel.org/riscv/c/97b7ac69be2e
- [V3,3/4] riscv: mm: Remove unused TASK_SIZE_MIN (no matching commit)
- [V3,4/4] riscv: mm: Optimize TASK_SIZE definition (no matching commit)
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html