tmp_suning_uos_patched/arch
Stefano Stabellini 279b706bf8 x86,xen: introduce x86_init.mapping.pagetable_reserve
Introduce a new x86_init hook called pagetable_reserve that at the end
of init_memory_mapping is used to reserve a range of memory addresses for
the kernel pagetable pages we used and free the other ones.

On native it just calls memblock_x86_reserve_range while on xen it also
takes care of setting the spare memory previously allocated
for kernel pagetable pages from RO to RW, so that it can be used for
other purposes.

A detailed explanation of the reason why this hook is needed follows.

As a consequence of the commit:

commit 4b239f458c
Author: Yinghai Lu <yinghai@kernel.org>
Date:   Fri Dec 17 16:58:28 2010 -0800

    x86-64, mm: Put early page table high

at some point init_memory_mapping is going to reach the pagetable pages
area and map those pages too (mapping them as normal memory that falls
in the range of addresses passed to init_memory_mapping as argument).
Some of those pages are already pagetable pages (they are in the range
pgt_buf_start-pgt_buf_end) therefore they are going to be mapped RO and
everything is fine.
Some of these pages are not pagetable pages yet (they fall in the range
pgt_buf_end-pgt_buf_top; for example the page at pgt_buf_end) so they
are going to be mapped RW.  When these pages become pagetable pages and
are hooked into the pagetable, xen will find that the guest has already
a RW mapping of them somewhere and fail the operation.
The reason Xen requires pagetables to be RO is that the hypervisor needs
to verify that the pagetables are valid before using them. The validation
operations are called "pinning" (more details in arch/x86/xen/mmu.c).

In order to fix the issue we mark all the pages in the entire range
pgt_buf_start-pgt_buf_top as RO, however when the pagetable allocation
is completed only the range pgt_buf_start-pgt_buf_end is reserved by
init_memory_mapping. Hence the kernel is going to crash as soon as one
of the pages in the range pgt_buf_end-pgt_buf_top is reused (b/c those
ranges are RO).

For this reason we need a hook to reserve the kernel pagetable pages we
used and free the other ones so that they can be reused for other
purposes.
On native it just means calling memblock_x86_reserve_range, on Xen it
also means marking RW the pagetable pages that we allocated before but
that haven't been used before.

Another way to fix this is without using the hook is by adding a 'if
(xen_pv_domain)' in the 'init_memory_mapping' code and calling the Xen
counterpart, but that is just nasty.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: Yinghai Lu <yinghai@kernel.org>
Acked-by: H. Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
2011-05-12 13:05:04 -04:00
..
alpha alpha: Fix uninitialized value in read_persistent_clock. 2011-04-17 14:41:30 -07:00
arm Merge branch 'fixes' of master.kernel.org:/home/rmk/linux-2.6-arm 2011-05-02 12:17:05 -07:00
avr32 avr32: add ATAG_BOARDINFO 2011-04-13 15:46:59 +02:00
blackfin Blackfin: SMP: fix cache flush loop 2011-04-13 19:34:06 -04:00
cris Fix common misspellings 2011-03-31 11:26:23 -03:00
frv Fix common misspellings 2011-03-31 11:26:23 -03:00
h8300 genirq: Remove the now obsolete config options and select statements 2011-03-30 14:13:23 +02:00
ia64 Merge branch 'for-linus2' of git://git.profusion.mobi/users/lucas/linux-2.6 2011-04-07 11:14:49 -07:00
m32r Fix common misspellings 2011-03-31 11:26:23 -03:00
m68k m68k/mm: Set all online nodes in N_NORMAL_MEMORY 2011-04-27 17:36:00 +02:00
microblaze usb: Fix Kconfig unmet dependencies for Microblaze EHCI 2011-04-13 15:43:59 -07:00
mips Fix common misspellings 2011-03-31 11:26:23 -03:00
mn10300 Fix common misspellings 2011-03-31 11:26:23 -03:00
parisc [PARISC] set memory ranges in N_NORMAL_MEMORY when onlined 2011-04-21 09:32:38 -05:00
powerpc Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 2011-05-02 18:00:43 -07:00
s390 [S390] irqstats: fix counting of pfault, dasd diag and virtio irqs 2011-04-29 10:42:25 +02:00
score Fix common misspellings 2011-03-31 11:26:23 -03:00
sh Merge branch 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6 2011-04-07 12:49:17 -07:00
sparc Merge branch 'for-linus2' of git://git.profusion.mobi/users/lucas/linux-2.6 2011-04-07 11:14:49 -07:00
tile Fix common misspellings 2011-03-31 11:26:23 -03:00
um um: adjust current_thread_info() for newer gcc versions 2011-04-28 11:28:21 -07:00
unicore32 Merge branch 'for-linus2' of git://git.profusion.mobi/users/lucas/linux-2.6 2011-04-07 11:14:49 -07:00
x86 x86,xen: introduce x86_init.mapping.pagetable_reserve 2011-05-12 13:05:04 -04:00
xtensa xtensa: Fixup irq conversion fallout and nmi_count 2011-04-20 00:32:09 +02:00
.gitignore
Kconfig oprofile, s390: Cleanups 2011-03-16 14:30:40 +01:00