aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-10-12 09:20:28 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-10-12 09:20:28 -0400
commitccff9b1db693062b0a9c9070f4304deb47ef215c (patch)
treea956cc800a03f11254105fbd9926bab537b6863f /arch
parent3dc329baa2ed1740036183041cefaf8ceb714038 (diff)
parentcb6b6df111e46b9d0f79eb971575fd50555f43f4 (diff)
Merge tag 'stable/for-linus-3.7-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen
Pull Xen fixes from Konrad Rzeszutek Wilk: "This has four bug-fixes and one tiny feature that I forgot to put initially in my tree due to oversight. The feature is for kdump kernels to speed up the /proc/vmcore reading. There is a ram_is_pfn helper function that the different platforms can register for. We are now doing that. The bug-fixes cover some embarrassing struct pv_cpu_ops variables being set to NULL on Xen (but not baremetal). We had a similar issue in the past with {write|read}_msr_safe and this fills the three missing ones. The other bug-fix is to make the console output (hvc) be capable of dealing with misbehaving backends and not fall flat on its face. Lastly, a quirk for older XenBus implementations that came with an ancient v3.4 hypervisor (so RHEL5 based) - reading of certain non-existent attributes just hangs the guest during bootup - so we take precaution of not doing that on such older installations. Feature: - Register a pfn_is_ram helper to speed up reading of /proc/vmcore. Bug-fixes: - Three pvops call for Xen were undefined causing BUG_ONs. - Add a quirk so that the shutdown watches (used by kdump) are not used with older Xen (3.4). - Fix ungraceful state transition for the HVC console." * tag 'stable/for-linus-3.7-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen: xen/pv-on-hvm kexec: add quirk for Xen 3.4 and shutdown watches. xen/bootup: allow {read|write}_cr8 pvops call. xen/bootup: allow read_tscp call for Xen PV guests. xen pv-on-hvm: add pfn_is_ram helper for kdump xen/hvc: handle backend CLOSED without CLOSING
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/xen/enlighten.c18
-rw-r--r--arch/x86/xen/mmu.c41
2 files changed, 58 insertions, 1 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index bf788d34530d..e3497f240eab 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -987,7 +987,16 @@ static void xen_write_cr4(unsigned long cr4)
987 987
988 native_write_cr4(cr4); 988 native_write_cr4(cr4);
989} 989}
990 990#ifdef CONFIG_X86_64
991static inline unsigned long xen_read_cr8(void)
992{
993 return 0;
994}
995static inline void xen_write_cr8(unsigned long val)
996{
997 BUG_ON(val);
998}
999#endif
991static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) 1000static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high)
992{ 1001{
993 int ret; 1002 int ret;
@@ -1156,6 +1165,11 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = {
1156 .read_cr4_safe = native_read_cr4_safe, 1165 .read_cr4_safe = native_read_cr4_safe,
1157 .write_cr4 = xen_write_cr4, 1166 .write_cr4 = xen_write_cr4,
1158 1167
1168#ifdef CONFIG_X86_64
1169 .read_cr8 = xen_read_cr8,
1170 .write_cr8 = xen_write_cr8,
1171#endif
1172
1159 .wbinvd = native_wbinvd, 1173 .wbinvd = native_wbinvd,
1160 1174
1161 .read_msr = native_read_msr_safe, 1175 .read_msr = native_read_msr_safe,
@@ -1164,6 +1178,8 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = {
1164 .read_tsc = native_read_tsc, 1178 .read_tsc = native_read_tsc,
1165 .read_pmc = native_read_pmc, 1179 .read_pmc = native_read_pmc,
1166 1180
1181 .read_tscp = native_read_tscp,
1182
1167 .iret = xen_iret, 1183 .iret = xen_iret,
1168 .irq_enable_sysexit = xen_sysexit, 1184 .irq_enable_sysexit = xen_sysexit,
1169#ifdef CONFIG_X86_64 1185#ifdef CONFIG_X86_64
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index fd28d86fe3d2..6226c99729b9 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -47,6 +47,7 @@
47#include <linux/gfp.h> 47#include <linux/gfp.h>
48#include <linux/memblock.h> 48#include <linux/memblock.h>
49#include <linux/seq_file.h> 49#include <linux/seq_file.h>
50#include <linux/crash_dump.h>
50 51
51#include <trace/events/xen.h> 52#include <trace/events/xen.h>
52 53
@@ -2381,6 +2382,43 @@ void xen_destroy_contiguous_region(unsigned long vstart, unsigned int order)
2381EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region); 2382EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region);
2382 2383
2383#ifdef CONFIG_XEN_PVHVM 2384#ifdef CONFIG_XEN_PVHVM
2385#ifdef CONFIG_PROC_VMCORE
2386/*
2387 * This function is used in two contexts:
2388 * - the kdump kernel has to check whether a pfn of the crashed kernel
2389 * was a ballooned page. vmcore is using this function to decide
2390 * whether to access a pfn of the crashed kernel.
2391 * - the kexec kernel has to check whether a pfn was ballooned by the
2392 * previous kernel. If the pfn is ballooned, handle it properly.
2393 * Returns 0 if the pfn is not backed by a RAM page, the caller may
2394 * handle the pfn special in this case.
2395 */
2396static int xen_oldmem_pfn_is_ram(unsigned long pfn)
2397{
2398 struct xen_hvm_get_mem_type a = {
2399 .domid = DOMID_SELF,
2400 .pfn = pfn,
2401 };
2402 int ram;
2403
2404 if (HYPERVISOR_hvm_op(HVMOP_get_mem_type, &a))
2405 return -ENXIO;
2406
2407 switch (a.mem_type) {
2408 case HVMMEM_mmio_dm:
2409 ram = 0;
2410 break;
2411 case HVMMEM_ram_rw:
2412 case HVMMEM_ram_ro:
2413 default:
2414 ram = 1;
2415 break;
2416 }
2417
2418 return ram;
2419}
2420#endif
2421
2384static void xen_hvm_exit_mmap(struct mm_struct *mm) 2422static void xen_hvm_exit_mmap(struct mm_struct *mm)
2385{ 2423{
2386 struct xen_hvm_pagetable_dying a; 2424 struct xen_hvm_pagetable_dying a;
@@ -2411,6 +2449,9 @@ void __init xen_hvm_init_mmu_ops(void)
2411{ 2449{
2412 if (is_pagetable_dying_supported()) 2450 if (is_pagetable_dying_supported())
2413 pv_mmu_ops.exit_mmap = xen_hvm_exit_mmap; 2451 pv_mmu_ops.exit_mmap = xen_hvm_exit_mmap;
2452#ifdef CONFIG_PROC_VMCORE
2453 register_oldmem_pfn_is_ram(&xen_oldmem_pfn_is_ram);
2454#endif
2414} 2455}
2415#endif 2456#endif
2416 2457