arm: mm: fix lowmem virtual address range check
PATCH 1/1 arm: mm: fix lowmem virtual address range check
This patch makes sure the argument of __phys_to_virt is a valid physical address when clear lowmem memory maps.
The last few lines prepare_page_table() clear page mapping in the gap between largest low physical memory and the upper bound of lowmem. It uses __phys_to_virt(end) to calculate virtual address from where the clearing start.
However, if the platform uses private nonliner __phys_to_virt(), 'end' may goes into another mapping region.
This patch uses __phys_to_virt(end - 1) + 1 for insurance purposes.
--- arch/arm/mm/mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mm/mmu.c +1 -1
@@ -1217,7 +1217,7 @@ static inline void prepare_page_table(void)* Clear out all the kernel space mappings, except for the first * memory bank, up to the vmalloc region. */ -for (addr =__phys_to_virt (end); +for (addr =__phys_to_virt (end -1 ) +1 ; addr <VMALLOC_START ; addr +=PMD_SIZE )pmd_clear (pmd_off_k (addr)); }
Signature · 1 line
1.8.4
PATCH 1/1 arm: mm: fix lowmem virtual address range check
Quoted 25 lines · Wang Nan
This patch makes sure the argument of
__phys_to_virtis a valid physical address when clear lowmem memory maps.The last few lines
prepare_page_table()clear page mapping in the gap between largest low physical memory and the upper bound of lowmem. It uses__phys_to_virt(end)to calculate virtual address from where the clearing start.However, if the platform uses private nonliner
__phys_to_virt(), 'end' may goes into another mapping region.This patch uses
__phys_to_virt(end - 1)+ 1 for insurance purposes.Signed-off-by Wang Nan <[email protected]>Cc Geng Hui <[email protected]>Cc Will Deacon <[email protected]>--- arch/arm/mm/mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/arm/mm/mmu.c +0
-0
arch/arm/mm/mmu.c static inline void prepare_page_table(void) · line 1222
Quoted 7 lines
arch/arm/mm/mmu.c +1
-1@@ -1217,7 +1217,7 @@ static inline void prepare_page_table(void)* Clear out all the kernel space mappings, except for the first * memory bank, up to the vmalloc region. */ -for (addr =__phys_to_virt (end); +for (addr =__phys_to_virt (end -1 ) +1 ; addr <VMALLOC_START ; addr +=PMD_SIZE )pmd_clear (pmd_off_k (addr));
This looks correct to me, but I'd be interested to know which platform this is falling over on. Only realview seems to override __phys_to_virt and I don't think we want to add more of that if we can help it.
Will
PATCH 1/1 arm: mm: fix lowmem virtual address range check
Quoted 38 lines · Will Deacon
Quoted 25 lines · Wang Nan
This patch makes sure the argument of
__phys_to_virtis a valid physical address when clear lowmem memory maps.The last few lines
prepare_page_table()clear page mapping in the gap between largest low physical memory and the upper bound of lowmem. It uses__phys_to_virt(end)to calculate virtual address from where the clearing start.However, if the platform uses private nonliner
__phys_to_virt(), 'end' may goes into another mapping region.This patch uses
__phys_to_virt(end - 1)+ 1 for insurance purposes.Signed-off-by Wang Nan <[email protected]>Cc Geng Hui <[email protected]>Cc Will Deacon <[email protected]>--- arch/arm/mm/mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/arm/mm/mmu.c +0
-0arch/arm/mm/mmu.c static inline void prepare_page_table(void) · line 1222
Quoted 7 lines
arch/arm/mm/mmu.c +1
-1@@ -1217,7 +1217,7 @@ static inline void prepare_page_table(void)* Clear out all the kernel space mappings, except for the first * memory bank, up to the vmalloc region. */ -for (addr =__phys_to_virt (end); +for (addr =__phys_to_virt (end -1 ) +1 ; addr <VMALLOC_START ; addr +=PMD_SIZE )pmd_clear (pmd_off_k (addr));This looks correct to me, but I'd be interested to know which platform this is falling over on. Only realview seems to override
__phys_to_virtand I don't think we want to add more of that if we can help it.
Quoted 2 lines
Will
I'm working on realview code now, trying to make it support CONFIG_ARM_PATCH_PHYS_VIRT, and found this problem when working on its private __phys_to_virt. Realview is the only in-kernel arm board which uses sparse memory. I think it is a good example when testing sparse memory support of tools such as kexec-tools, kdump and crash.
PATCH 1/1 arm: mm: fix lowmem virtual address range check
Quoted 39 lines · Wang Nan
Quoted 38 lines · Will Deacon
Quoted 25 lines · Wang Nan
This patch makes sure the argument of
__phys_to_virtis a valid physical address when clear lowmem memory maps.The last few lines
prepare_page_table()clear page mapping in the gap between largest low physical memory and the upper bound of lowmem. It uses__phys_to_virt(end)to calculate virtual address from where the clearing start.However, if the platform uses private nonliner
__phys_to_virt(), 'end' may goes into another mapping region.This patch uses
__phys_to_virt(end - 1)+ 1 for insurance purposes.Signed-off-by Wang Nan <[email protected]>Cc Geng Hui <[email protected]>Cc Will Deacon <[email protected]>--- arch/arm/mm/mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/arm/mm/mmu.c +0
-0arch/arm/mm/mmu.c static inline void prepare_page_table(void) · line 1222
Quoted 7 lines
arch/arm/mm/mmu.c +1
-1@@ -1217,7 +1217,7 @@ static inline void prepare_page_table(void)* Clear out all the kernel space mappings, except for the first * memory bank, up to the vmalloc region. */ -for (addr =__phys_to_virt (end); +for (addr =__phys_to_virt (end -1 ) +1 ; addr <VMALLOC_START ; addr +=PMD_SIZE )pmd_clear (pmd_off_k (addr));This looks correct to me, but I'd be interested to know which platform this is falling over on. Only realview seems to override
__phys_to_virtand I don't think we want to add more of that if we can help it.
Quoted 7 lines
Quoted 2 lines
Will
I'm working on realview code now, trying to make it support
CONFIG_ARM_PATCH_PHYS_VIRT, and found this problem when working on its private__phys_to_virt. Realview is the only in-kernel arm board which uses sparse memory. I think it is a good example when testing sparse memory support of tools such as kexec-tools, kdump and crash.
Ok, but there's been recent talk of getting rid of that by the looks of it:
http://www.spinics.net/lists/arm-kernel/msg318362.html
So, whilst I still think your fix is valid, we should probably discourage any new users from overriding these macros.
Will
PATCH 1/1 arm: mm: fix lowmem virtual address range check
Quoted 48 lines · Will Deacon
Quoted 39 lines · Wang Nan
Quoted 38 lines · Will Deacon
Quoted 25 lines · Wang Nan
This patch makes sure the argument of
__phys_to_virtis a valid physical address when clear lowmem memory maps.The last few lines
prepare_page_table()clear page mapping in the gap between largest low physical memory and the upper bound of lowmem. It uses__phys_to_virt(end)to calculate virtual address from where the clearing start.However, if the platform uses private nonliner
__phys_to_virt(), 'end' may goes into another mapping region.This patch uses
__phys_to_virt(end - 1)+ 1 for insurance purposes.Signed-off-by Wang Nan <[email protected]>Cc Geng Hui <[email protected]>Cc Will Deacon <[email protected]>--- arch/arm/mm/mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/arm/mm/mmu.c +0
-0arch/arm/mm/mmu.c static inline void prepare_page_table(void) · line 1222
Quoted 7 lines
arch/arm/mm/mmu.c +1
-1@@ -1217,7 +1217,7 @@ static inline void prepare_page_table(void)* Clear out all the kernel space mappings, except for the first * memory bank, up to the vmalloc region. */ -for (addr =__phys_to_virt (end); +for (addr =__phys_to_virt (end -1 ) +1 ; addr <VMALLOC_START ; addr +=PMD_SIZE )pmd_clear (pmd_off_k (addr));This looks correct to me, but I'd be interested to know which platform this is falling over on. Only realview seems to override
__phys_to_virtand I don't think we want to add more of that if we can help it.Quoted 7 lines
Quoted 2 lines
Will
I'm working on realview code now, trying to make it support
CONFIG_ARM_PATCH_PHYS_VIRT, and found this problem when working on its private__phys_to_virt. Realview is the only in-kernel arm board which uses sparse memory. I think it is a good example when testing sparse memory support of tools such as kexec-tools, kdump and crash.
Quoted 7 lines
Ok, but there's been recent talk of getting rid of that by the looks of it:
http://www.spinics.net/lists/arm-kernel/msg318362.html
So, whilst I still think your fix is valid, we should probably discourage any new users from overriding these macros.
The patch in your link seems not been accepted?
The root problem this patch trying to deal with is the nonliner mapping of some boards (currently only realview does it and fortunately not cause problem). Do you mean we are going to eliminate such nonliner mapping in realview and prevent further boards to do nonliner mapping?
Quoted 2 lines
Will