2014-10-23 15:36:32

by Minfei Huang

[permalink] [raw]
Subject: [PATCH] mm: Avoid overlap the fixmap area on i386

From: Minfei Huang <[email protected]>

It is a problem when configuring high memory off where the vmalloc
reserve area could end up overlapping the early_ioremap fixmap
area on i386.

The ordering of the VMALLOC_RESERVE space is:
FIXADDR_TOP
fixed_addresses
FIXADDR_START
early_ioremap fixed addresses
FIXADDR_BOOT_START
Persistent kmap area
PKMAP_BASE
VMALLOC_END
Vmalloc area
VMALLOC_START
high_memory

The available address we can use is lower than FIXADDR_BOOT_START. So
We will set the kmap boundary below the FIXADDR_BOOT_START, if configure
the high memory.

If we configure the high memory, the vmalloc reserve area should end
up to PKMAP_BASE, otherwise should end up to FIXADDR_BOOT_START.

Signed-off-by: Minfei Huang <[email protected]>
---
arch/x86/include/asm/pgtable_32_types.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/pgtable_32_types.h b/arch/x86/include/asm/pgtable_32_types.h
index ed5903b..2ac5fc8 100644
--- a/arch/x86/include/asm/pgtable_32_types.h
+++ b/arch/x86/include/asm/pgtable_32_types.h
@@ -43,7 +43,7 @@ extern bool __vmalloc_start_set; /* set once high_memory is set */
#ifdef CONFIG_HIGHMEM
# define VMALLOC_END (PKMAP_BASE - 2 * PAGE_SIZE)
#else
-# define VMALLOC_END (FIXADDR_START - 2 * PAGE_SIZE)
+# define VMALLOC_END (FIXADDR_BOOT_START - 2 * PAGE_SIZE)
#endif

#define MODULES_VADDR VMALLOC_START
--
1.8.3.1-


2014-10-28 11:06:17

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [PATCH] mm: Avoid overlap the fixmap area on i386

On Thu, 23 Oct 2014, Minfei Huang wrote:

> From: Minfei Huang <[email protected]>
>
> It is a problem when configuring high memory off where the vmalloc
> reserve area could end up overlapping the early_ioremap fixmap
> area on i386.
>
> The ordering of the VMALLOC_RESERVE space is:
> FIXADDR_TOP
> fixed_addresses
> FIXADDR_START
> early_ioremap fixed addresses
> FIXADDR_BOOT_START
> Persistent kmap area
> PKMAP_BASE
> VMALLOC_END
> Vmalloc area
> VMALLOC_START
> high_memory
>
> The available address we can use is lower than FIXADDR_BOOT_START. So
> We will set the kmap boundary below the FIXADDR_BOOT_START, if configure
> the high memory.
>
> If we configure the high memory, the vmalloc reserve area should end
> up to PKMAP_BASE, otherwise should end up to FIXADDR_BOOT_START.

Which is not really a problem, because the FIXADDR_BOOT area is only
used during boot for early_ioremap() and it's unused when ioremap() is
functional. vmalloc becomes available after early boot so the
FIXADDR_BOOT area is available for reuse.

Though in the highmem case the PKMAP area is not overlapping the
FIXADDR_BOOT area. So having the !highmem case use the same layout
(minus the PKMAP area) makes sense.

Acked-by: Thomas Gleixner <[email protected]>

> Signed-off-by: Minfei Huang <[email protected]>
> ---
> arch/x86/include/asm/pgtable_32_types.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/x86/include/asm/pgtable_32_types.h b/arch/x86/include/asm/pgtable_32_types.h
> index ed5903b..2ac5fc8 100644
> --- a/arch/x86/include/asm/pgtable_32_types.h
> +++ b/arch/x86/include/asm/pgtable_32_types.h
> @@ -43,7 +43,7 @@ extern bool __vmalloc_start_set; /* set once high_memory is set */
> #ifdef CONFIG_HIGHMEM
> # define VMALLOC_END (PKMAP_BASE - 2 * PAGE_SIZE)
> #else
> -# define VMALLOC_END (FIXADDR_START - 2 * PAGE_SIZE)
> +# define VMALLOC_END (FIXADDR_BOOT_START - 2 * PAGE_SIZE)
> #endif
>
> #define MODULES_VADDR VMALLOC_START
> --
> 1.8.3.1

Subject: [tip:x86/mm] x86/mm: Avoid overlap the fixmap area on i386

Commit-ID: 96e70f83285676d8794f62f3c294d0247bef6b21
Gitweb: http://git.kernel.org/tip/96e70f83285676d8794f62f3c294d0247bef6b21
Author: Minfei Huang <[email protected]>
AuthorDate: Thu, 23 Oct 2014 23:36:17 +0800
Committer: Ingo Molnar <[email protected]>
CommitDate: Tue, 28 Oct 2014 12:21:48 +0100

x86/mm: Avoid overlap the fixmap area on i386

It is a problem when configuring high memory off where the
vmalloc reserve area could end up overlapping the early_ioremap
fixmap area on i386.

The ordering of the VMALLOC_RESERVE space is:

FIXADDR_TOP
fixed_addresses
FIXADDR_START
early_ioremap fixed addresses
FIXADDR_BOOT_START
Persistent kmap area
PKMAP_BASE
VMALLOC_END
Vmalloc area
VMALLOC_START
high_memory

The available address we can use is lower than
FIXADDR_BOOT_START. So we will set the kmap boundary below the
FIXADDR_BOOT_START, if we configure high memory.

If we configure high memory, the vmalloc reserve area should
end up to PKMAP_BASE, otherwise should end up to
FIXADDR_BOOT_START.

Signed-off-by: Minfei Huang <[email protected]>
Acked-by: Thomas Gleixner <[email protected]>
Cc: Linus Torvalds <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
---
arch/x86/include/asm/pgtable_32_types.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/pgtable_32_types.h b/arch/x86/include/asm/pgtable_32_types.h
index ed5903b..2ac5fc8 100644
--- a/arch/x86/include/asm/pgtable_32_types.h
+++ b/arch/x86/include/asm/pgtable_32_types.h
@@ -43,7 +43,7 @@ extern bool __vmalloc_start_set; /* set once high_memory is set */
#ifdef CONFIG_HIGHMEM
# define VMALLOC_END (PKMAP_BASE - 2 * PAGE_SIZE)
#else
-# define VMALLOC_END (FIXADDR_START - 2 * PAGE_SIZE)
+# define VMALLOC_END (FIXADDR_BOOT_START - 2 * PAGE_SIZE)
#endif

#define MODULES_VADDR VMALLOC_START

2014-10-28 17:24:24

by H. Peter Anvin

[permalink] [raw]
Subject: Re: [PATCH] mm: Avoid overlap the fixmap area on i386

On 10/28/2014 04:06 AM, Thomas Gleixner wrote:
>>
>> The available address we can use is lower than FIXADDR_BOOT_START. So
>> We will set the kmap boundary below the FIXADDR_BOOT_START, if configure
>> the high memory.
>>
>> If we configure the high memory, the vmalloc reserve area should end
>> up to PKMAP_BASE, otherwise should end up to FIXADDR_BOOT_START.
>
> Which is not really a problem, because the FIXADDR_BOOT area is only
> used during boot for early_ioremap() and it's unused when ioremap() is
> functional. vmalloc becomes available after early boot so the
> FIXADDR_BOOT area is available for reuse.
>

Given the very limited address space available on i386, it would be
extremely undesirable to not reuse address space when possible.

-hpa

2014-10-28 17:29:19

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [PATCH] mm: Avoid overlap the fixmap area on i386

On Tue, 28 Oct 2014, H. Peter Anvin wrote:
> On 10/28/2014 04:06 AM, Thomas Gleixner wrote:
> >>
> >> The available address we can use is lower than FIXADDR_BOOT_START. So
> >> We will set the kmap boundary below the FIXADDR_BOOT_START, if configure
> >> the high memory.
> >>
> >> If we configure the high memory, the vmalloc reserve area should end
> >> up to PKMAP_BASE, otherwise should end up to FIXADDR_BOOT_START.
> >
> > Which is not really a problem, because the FIXADDR_BOOT area is only
> > used during boot for early_ioremap() and it's unused when ioremap() is
> > functional. vmalloc becomes available after early boot so the
> > FIXADDR_BOOT area is available for reuse.
> >
>
> Given the very limited address space available on i386, it would be
> extremely undesirable to not reuse address space when possible.

Fair enough. Then we should do that for the highmem=y case as well.

Thanks,

tglx

2014-10-29 03:14:16

by H. Peter Anvin

[permalink] [raw]
Subject: Re: [PATCH] mm: Avoid overlap the fixmap area on i386

On 10/28/2014 10:29 AM, Thomas Gleixner wrote:
> On Tue, 28 Oct 2014, H. Peter Anvin wrote:
>> On 10/28/2014 04:06 AM, Thomas Gleixner wrote:
>>>>
>>>> The available address we can use is lower than FIXADDR_BOOT_START. So
>>>> We will set the kmap boundary below the FIXADDR_BOOT_START, if configure
>>>> the high memory.
>>>>
>>>> If we configure the high memory, the vmalloc reserve area should end
>>>> up to PKMAP_BASE, otherwise should end up to FIXADDR_BOOT_START.
>>>
>>> Which is not really a problem, because the FIXADDR_BOOT area is only
>>> used during boot for early_ioremap() and it's unused when ioremap() is
>>> functional. vmalloc becomes available after early boot so the
>>> FIXADDR_BOOT area is available for reuse.
>>>
>>
>> Given the very limited address space available on i386, it would be
>> extremely undesirable to not reuse address space when possible.
>
> Fair enough. Then we should do that for the highmem=y case as well.
>

It is probably even more important for highmem=y...

-hpa

2014-10-29 04:30:39

by Minfei Huang

[permalink] [raw]
Subject: Re: [PATCH] mm: Avoid overlap the fixmap area on i386

On 10/28/14 at 08:14pm, H. Peter Anvin wrote:
> On 10/28/2014 10:29 AM, Thomas Gleixner wrote:
> > On Tue, 28 Oct 2014, H. Peter Anvin wrote:
> >> On 10/28/2014 04:06 AM, Thomas Gleixner wrote:
> >>>>
> >>>> The available address we can use is lower than FIXADDR_BOOT_START. So
> >>>> We will set the kmap boundary below the FIXADDR_BOOT_START, if configure
> >>>> the high memory.
> >>>>
> >>>> If we configure the high memory, the vmalloc reserve area should end
> >>>> up to PKMAP_BASE, otherwise should end up to FIXADDR_BOOT_START.
> >>>
> >>> Which is not really a problem, because the FIXADDR_BOOT area is only
> >>> used during boot for early_ioremap() and it's unused when ioremap() is
> >>> functional. vmalloc becomes available after early boot so the
> >>> FIXADDR_BOOT area is available for reuse.
> >>>
> >>
> >> Given the very limited address space available on i386, it would be
> >> extremely undesirable to not reuse address space when possible.
> >
> > Fair enough. Then we should do that for the highmem=y case as well.
> >
>
> It is probably even more important for highmem=y...
>
> -hpa

Agree. Maybe we can overlap the early_ioremap fix address to re-use
it. Virtual address is more precious on i386, especially when turn on the
high memory.

I will post an patch to fix it.

>
>