Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Linux: Kernel

[PATCH v2 15/22] ARM: mm: use physical addresses in highmem sanity checks

 

 

Linux kernel RSS feed   Index | Next | Previous | View Threaded


cyril at ti

Aug 10, 2012, 6:24 PM

Post #1 of 2 (32 views)
Permalink
[PATCH v2 15/22] ARM: mm: use physical addresses in highmem sanity checks

This patch modifies the highmem sanity checking code to use physical addresses
instead. This change eliminates the wrap-around problems associated with the
original virtual address based checks, and this simplifies the code a bit.

The one constraint imposed here is that low physical memory must be mapped in
a monotonically increasing fashion if there are multiple banks of memory,
i.e., x < y must => pa(x) < pa(y).

Signed-off-by: Cyril Chemparathy <cyril [at] ti>
Signed-off-by: Vitaly Andrianov <vitalya [at] ti>
---
arch/arm/mm/mmu.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 53eeeb8..f764c03 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -895,6 +895,7 @@ phys_addr_t arm_lowmem_limit __initdata = 0;
void __init sanity_check_meminfo(void)
{
int i, j, highmem = 0;
+ phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1;

for (i = 0, j = 0; i < meminfo.nr_banks; i++) {
struct membank *bank = &meminfo.bank[j];
@@ -904,8 +905,7 @@ void __init sanity_check_meminfo(void)
highmem = 1;

#ifdef CONFIG_HIGHMEM
- if (__va(bank->start) >= vmalloc_min ||
- __va(bank->start) < (void *)PAGE_OFFSET)
+ if (bank->start >= vmalloc_limit)
highmem = 1;

bank->highmem = highmem;
@@ -914,8 +914,8 @@ void __init sanity_check_meminfo(void)
* Split those memory banks which are partially overlapping
* the vmalloc area greatly simplifying things later.
*/
- if (!highmem && __va(bank->start) < vmalloc_min &&
- bank->size > vmalloc_min - __va(bank->start)) {
+ if (!highmem && bank->start < vmalloc_limit &&
+ bank->size > vmalloc_limit - bank->start) {
if (meminfo.nr_banks >= NR_BANKS) {
printk(KERN_CRIT "NR_BANKS too low, "
"ignoring high memory\n");
@@ -924,12 +924,12 @@ void __init sanity_check_meminfo(void)
(meminfo.nr_banks - i) * sizeof(*bank));
meminfo.nr_banks++;
i++;
- bank[1].size -= vmalloc_min - __va(bank->start);
- bank[1].start = __pa(vmalloc_min - 1) + 1;
+ bank[1].size -= vmalloc_limit - bank->start;
+ bank[1].start = vmalloc_limit;
bank[1].highmem = highmem = 1;
j++;
}
- bank->size = vmalloc_min - __va(bank->start);
+ bank->size = vmalloc_limit - bank->start;
}
#else
bank->highmem = highmem;
@@ -949,8 +949,7 @@ void __init sanity_check_meminfo(void)
* Check whether this memory bank would entirely overlap
* the vmalloc area.
*/
- if (__va(bank->start) >= vmalloc_min ||
- __va(bank->start) < (void *)PAGE_OFFSET) {
+ if (bank->start >= vmalloc_limit) {
printk(KERN_NOTICE "Ignoring RAM at %.8llx-%.8llx "
"(vmalloc region overlap).\n",
(unsigned long long)bank->start,
@@ -962,9 +961,8 @@ void __init sanity_check_meminfo(void)
* Check whether this memory bank would partially overlap
* the vmalloc area.
*/
- if (__va(bank->start + bank->size) > vmalloc_min ||
- __va(bank->start + bank->size) < __va(bank->start)) {
- unsigned long newsize = vmalloc_min - __va(bank->start);
+ if (bank->start + bank->size > vmalloc_limit)
+ unsigned long newsize = vmalloc_limit - bank->start;
printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx "
"to -%.8llx (vmalloc region overlap).\n",
(unsigned long long)bank->start,
--
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/


nicolas.pitre at linaro

Aug 11, 2012, 9:29 PM

Post #2 of 2 (28 views)
Permalink
Re: [PATCH v2 15/22] ARM: mm: use physical addresses in highmem sanity checks [In reply to]

On Fri, 10 Aug 2012, Cyril Chemparathy wrote:

> This patch modifies the highmem sanity checking code to use physical addresses
> instead. This change eliminates the wrap-around problems associated with the
> original virtual address based checks, and this simplifies the code a bit.
>
> The one constraint imposed here is that low physical memory must be mapped in
> a monotonically increasing fashion if there are multiple banks of memory,
> i.e., x < y must => pa(x) < pa(y).
>
> Signed-off-by: Cyril Chemparathy <cyril [at] ti>
> Signed-off-by: Vitaly Andrianov <vitalya [at] ti>

Acked-by: Nicolas Pitre <nico [at] linaro>


> ---
> arch/arm/mm/mmu.c | 22 ++++++++++------------
> 1 file changed, 10 insertions(+), 12 deletions(-)
>
> diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
> index 53eeeb8..f764c03 100644
> --- a/arch/arm/mm/mmu.c
> +++ b/arch/arm/mm/mmu.c
> @@ -895,6 +895,7 @@ phys_addr_t arm_lowmem_limit __initdata = 0;
> void __init sanity_check_meminfo(void)
> {
> int i, j, highmem = 0;
> + phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1;
>
> for (i = 0, j = 0; i < meminfo.nr_banks; i++) {
> struct membank *bank = &meminfo.bank[j];
> @@ -904,8 +905,7 @@ void __init sanity_check_meminfo(void)
> highmem = 1;
>
> #ifdef CONFIG_HIGHMEM
> - if (__va(bank->start) >= vmalloc_min ||
> - __va(bank->start) < (void *)PAGE_OFFSET)
> + if (bank->start >= vmalloc_limit)
> highmem = 1;
>
> bank->highmem = highmem;
> @@ -914,8 +914,8 @@ void __init sanity_check_meminfo(void)
> * Split those memory banks which are partially overlapping
> * the vmalloc area greatly simplifying things later.
> */
> - if (!highmem && __va(bank->start) < vmalloc_min &&
> - bank->size > vmalloc_min - __va(bank->start)) {
> + if (!highmem && bank->start < vmalloc_limit &&
> + bank->size > vmalloc_limit - bank->start) {
> if (meminfo.nr_banks >= NR_BANKS) {
> printk(KERN_CRIT "NR_BANKS too low, "
> "ignoring high memory\n");
> @@ -924,12 +924,12 @@ void __init sanity_check_meminfo(void)
> (meminfo.nr_banks - i) * sizeof(*bank));
> meminfo.nr_banks++;
> i++;
> - bank[1].size -= vmalloc_min - __va(bank->start);
> - bank[1].start = __pa(vmalloc_min - 1) + 1;
> + bank[1].size -= vmalloc_limit - bank->start;
> + bank[1].start = vmalloc_limit;
> bank[1].highmem = highmem = 1;
> j++;
> }
> - bank->size = vmalloc_min - __va(bank->start);
> + bank->size = vmalloc_limit - bank->start;
> }
> #else
> bank->highmem = highmem;
> @@ -949,8 +949,7 @@ void __init sanity_check_meminfo(void)
> * Check whether this memory bank would entirely overlap
> * the vmalloc area.
> */
> - if (__va(bank->start) >= vmalloc_min ||
> - __va(bank->start) < (void *)PAGE_OFFSET) {
> + if (bank->start >= vmalloc_limit) {
> printk(KERN_NOTICE "Ignoring RAM at %.8llx-%.8llx "
> "(vmalloc region overlap).\n",
> (unsigned long long)bank->start,
> @@ -962,9 +961,8 @@ void __init sanity_check_meminfo(void)
> * Check whether this memory bank would partially overlap
> * the vmalloc area.
> */
> - if (__va(bank->start + bank->size) > vmalloc_min ||
> - __va(bank->start + bank->size) < __va(bank->start)) {
> - unsigned long newsize = vmalloc_min - __va(bank->start);
> + if (bank->start + bank->size > vmalloc_limit)
> + unsigned long newsize = vmalloc_limit - bank->start;
> printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx "
> "to -%.8llx (vmalloc region overlap).\n",
> (unsigned long long)bank->start,
> --
> 1.7.9.5
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Linux kernel RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.