x86: Lift restriction on the location of FIX_BTMAP_*
The early ioremap fixmap entries cover half (or for 32-bit
non-PAE, a quarter) of a page table, yet they got
uncondtitionally aligned so far to a 256-entry boundary. This is
not necessary if the range of page table entries anyway falls
into a single page table.
This buys back, for (theoretically) 50% of all configurations
(25% of all non-PAE ones), at least some of the lowmem
necessarily lost with commit e621bd1895
.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
LKML-Reference: <4B2BB66F0200007800026AD6@vpn.id2.novell.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -118,14 +118,20 @@ enum fixed_addresses {
|
|||||||
* 256 temporary boot-time mappings, used by early_ioremap(),
|
* 256 temporary boot-time mappings, used by early_ioremap(),
|
||||||
* before ioremap() is functional.
|
* before ioremap() is functional.
|
||||||
*
|
*
|
||||||
* We round it up to the next 256 pages boundary so that we
|
* If necessary we round it up to the next 256 pages boundary so
|
||||||
* can have a single pgd entry and a single pte table:
|
* that we can have a single pgd entry and a single pte table:
|
||||||
*/
|
*/
|
||||||
#define NR_FIX_BTMAPS 64
|
#define NR_FIX_BTMAPS 64
|
||||||
#define FIX_BTMAPS_SLOTS 4
|
#define FIX_BTMAPS_SLOTS 4
|
||||||
FIX_BTMAP_END = __end_of_permanent_fixed_addresses + 256 -
|
#define TOTAL_FIX_BTMAPS (NR_FIX_BTMAPS * FIX_BTMAPS_SLOTS)
|
||||||
(__end_of_permanent_fixed_addresses & 255),
|
FIX_BTMAP_END =
|
||||||
FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1,
|
(__end_of_permanent_fixed_addresses ^
|
||||||
|
(__end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS - 1)) &
|
||||||
|
-PTRS_PER_PTE
|
||||||
|
? __end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS -
|
||||||
|
(__end_of_permanent_fixed_addresses & (TOTAL_FIX_BTMAPS - 1))
|
||||||
|
: __end_of_permanent_fixed_addresses,
|
||||||
|
FIX_BTMAP_BEGIN = FIX_BTMAP_END + TOTAL_FIX_BTMAPS - 1,
|
||||||
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
|
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
|
||||||
FIX_OHCI1394_BASE,
|
FIX_OHCI1394_BASE,
|
||||||
#endif
|
#endif
|
||||||
|
@@ -422,6 +422,10 @@ void __init early_ioremap_init(void)
|
|||||||
* The boot-ioremap range spans multiple pmds, for which
|
* The boot-ioremap range spans multiple pmds, for which
|
||||||
* we are not prepared:
|
* we are not prepared:
|
||||||
*/
|
*/
|
||||||
|
#define __FIXADDR_TOP (-PAGE_SIZE)
|
||||||
|
BUILD_BUG_ON((__fix_to_virt(FIX_BTMAP_BEGIN) >> PMD_SHIFT)
|
||||||
|
!= (__fix_to_virt(FIX_BTMAP_END) >> PMD_SHIFT));
|
||||||
|
#undef __FIXADDR_TOP
|
||||||
if (pmd != early_ioremap_pmd(fix_to_virt(FIX_BTMAP_END))) {
|
if (pmd != early_ioremap_pmd(fix_to_virt(FIX_BTMAP_END))) {
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
printk(KERN_WARNING "pmd %p != %p\n",
|
printk(KERN_WARNING "pmd %p != %p\n",
|
||||||
|
Reference in New Issue
Block a user