linux/arch/x86/xen
Chris Lalancette 9f32d21c98 xen: fix Xen domU boot with batched mprotect
Impact: fix guest kernel boot crash on certain configs

Recent i686 2.6.27 kernels with a certain amount of memory (between
736 and 855MB) have a problem booting under a hypervisor that supports
batched mprotect (this includes the RHEL-5 Xen hypervisor as well as
any 3.3 or later Xen hypervisor).

The problem ends up being that xen_ptep_modify_prot_commit() is using
virt_to_machine to calculate which pfn to update.  However, this only
works for pages that are in the p2m list, and the pages coming from
change_pte_range() in mm/mprotect.c are kmap_atomic pages.  Because of
this, we can run into the situation where the lookup in the p2m table
returns an INVALID_MFN, which we then try to pass to the hypervisor,
which then (correctly) denies the request to a totally bogus pfn.

The right thing to do is to use arbitrary_virt_to_machine, so that we
can be sure we are modifying the right pfn.  This unfortunately
introduces a performance penalty because of a full page-table-walk,
but we can avoid that penalty for pages in the p2m list by checking if
virt_addr_valid is true, and if so, just doing the lookup in the p2m
table.

The attached patch implements this, and allows my 2.6.27 i686 based
guest with 768MB of memory to boot on a RHEL-5 hypervisor again.
Thanks to Jeremy for the suggestions about how to fix this particular
issue.

Signed-off-by: Chris Lalancette <clalance@redhat.com>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Chris Lalancette <clalance@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2008-10-27 14:11:20 +01:00
..
debugfs.c xen: add debugfs support 2008-08-21 13:52:58 +02:00
debugfs.h xen: add debugfs support 2008-08-21 13:52:58 +02:00
enlighten.c mm: rewrite vmap layer 2008-10-20 08:52:32 -07:00
grant-table.c xen: make grant table arch portable 2008-04-24 23:57:32 +02:00
irq.c xen: Fix bug `do_IRQ: cannot handle IRQ -1 vector 0x6 cpu 1' 2008-10-16 16:52:58 +02:00
Kconfig xen: make CONFIG_XEN_SAVE_RESTORE depend on CONFIG_XEN 2008-09-30 09:58:05 +02:00
Makefile xen: add debugfs support 2008-08-21 13:52:58 +02:00
mmu.c xen: fix Xen domU boot with batched mprotect 2008-10-27 14:11:20 +01:00
mmu.h xen: use spin_lock_nest_lock when pinning a pagetable 2008-10-09 14:25:19 +02:00
multicalls.c xen: add debugfs support 2008-08-21 13:52:58 +02:00
multicalls.h xen: add mechanism to extend existing multicalls 2008-06-25 15:17:34 +02:00
setup.c xen: fix for xen guest with mem > 3.7G 2008-09-14 16:46:34 +02:00
smp.c xen: make CPU hotplug functions static 2008-09-08 19:12:24 +02:00
spinlock.c genirq: revert dynarray 2008-10-16 16:53:15 +02:00
suspend.c xen: add xen_arch_resume()/xen_timer_resume hook for ia64 support 2008-07-16 10:55:50 +02:00
time.c x86: paravirt: factor out cpu_khz to common code 2008-10-15 10:15:17 +02:00
vdso.h i386: move xen 2007-10-11 11:16:51 +02:00
xen-asm_32.S xen: compile irq functions without -pg for ftrace 2008-07-31 12:39:39 +02:00
xen-asm_64.S xen: clean up x86-64 warnings 2008-10-03 10:04:10 +02:00
xen-head.S xen64: add xen-head code to head_64.S 2008-07-16 10:58:41 +02:00
xen-ops.h xen: make CPU hotplug functions static 2008-09-08 19:12:24 +02:00