Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+102 -2
+17 -1
arch/x86/xen/enlighten.c
··· 987 987 988 988 native_write_cr4(cr4); 989 989 } 990 - 990 + #ifdef CONFIG_X86_64 991 + static inline unsigned long xen_read_cr8(void) 992 + { 993 + return 0; 994 + } 995 + static inline void xen_write_cr8(unsigned long val) 996 + { 997 + BUG_ON(val); 998 + } 999 + #endif 991 1000 static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) 992 1001 { 993 1002 int ret; ··· 1165 1156 .read_cr4_safe = native_read_cr4_safe, 1166 1157 .write_cr4 = xen_write_cr4, 1167 1158 1159 + #ifdef CONFIG_X86_64 1160 + .read_cr8 = xen_read_cr8, 1161 + .write_cr8 = xen_write_cr8, 1162 + #endif 1163 + 1168 1164 .wbinvd = native_wbinvd, 1169 1165 1170 1166 .read_msr = native_read_msr_safe, ··· 1177 1163 1178 1164 .read_tsc = native_read_tsc, 1179 1165 .read_pmc = native_read_pmc, 1166 + 1167 + .read_tscp = native_read_tscp, 1180 1168 1181 1169 .iret = xen_iret, 1182 1170 .irq_enable_sysexit = xen_sysexit,
+41
arch/x86/xen/mmu.c
··· 47 47 #include <linux/gfp.h> 48 48 #include <linux/memblock.h> 49 49 #include <linux/seq_file.h> 50 + #include <linux/crash_dump.h> 50 51 51 52 #include <trace/events/xen.h> 52 53 ··· 2382 2381 EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region); 2383 2382 2384 2383 #ifdef CONFIG_XEN_PVHVM 2384 + #ifdef CONFIG_PROC_VMCORE 2385 + /* 2386 + * This function is used in two contexts: 2387 + * - the kdump kernel has to check whether a pfn of the crashed kernel 2388 + * was a ballooned page. vmcore is using this function to decide 2389 + * whether to access a pfn of the crashed kernel. 2390 + * - the kexec kernel has to check whether a pfn was ballooned by the 2391 + * previous kernel. If the pfn is ballooned, handle it properly. 2392 + * Returns 0 if the pfn is not backed by a RAM page, the caller may 2393 + * handle the pfn special in this case. 2394 + */ 2395 + static int xen_oldmem_pfn_is_ram(unsigned long pfn) 2396 + { 2397 + struct xen_hvm_get_mem_type a = { 2398 + .domid = DOMID_SELF, 2399 + .pfn = pfn, 2400 + }; 2401 + int ram; 2402 + 2403 + if (HYPERVISOR_hvm_op(HVMOP_get_mem_type, &a)) 2404 + return -ENXIO; 2405 + 2406 + switch (a.mem_type) { 2407 + case HVMMEM_mmio_dm: 2408 + ram = 0; 2409 + break; 2410 + case HVMMEM_ram_rw: 2411 + case HVMMEM_ram_ro: 2412 + default: 2413 + ram = 1; 2414 + break; 2415 + } 2416 + 2417 + return ram; 2418 + } 2419 + #endif 2420 + 2385 2421 static void xen_hvm_exit_mmap(struct mm_struct *mm) 2386 2422 { 2387 2423 struct xen_hvm_pagetable_dying a; ··· 2449 2411 { 2450 2412 if (is_pagetable_dying_supported()) 2451 2413 pv_mmu_ops.exit_mmap = xen_hvm_exit_mmap; 2414 + #ifdef CONFIG_PROC_VMCORE 2415 + register_oldmem_pfn_is_ram(&xen_oldmem_pfn_is_ram); 2416 + #endif 2452 2417 } 2453 2418 #endif 2454 2419
+4 -1
drivers/tty/hvc/hvc_xen.c
··· 478 478 case XenbusStateInitialising: 479 479 case XenbusStateInitialised: 480 480 case XenbusStateUnknown: 481 - case XenbusStateClosed: 482 481 break; 483 482 484 483 case XenbusStateInitWait: ··· 487 488 xenbus_switch_state(dev, XenbusStateConnected); 488 489 break; 489 490 491 + case XenbusStateClosed: 492 + if (dev->state == XenbusStateClosed) 493 + break; 494 + /* Missed the backend's CLOSING state -- fallthrough */ 490 495 case XenbusStateClosing: 491 496 xenbus_frontend_closed(dev); 492 497 break;
+21
drivers/xen/xenbus/xenbus_xs.c
··· 48 48 #include <xen/xenbus.h> 49 49 #include <xen/xen.h> 50 50 #include "xenbus_comms.h" 51 + #include <asm/xen/hypervisor.h> 51 52 52 53 struct xs_stored_msg { 53 54 struct list_head list; ··· 619 618 620 619 return NULL; 621 620 } 621 + /* 622 + * Certain older XenBus toolstack cannot handle reading values that are 623 + * not populated. Some Xen 3.4 installation are incapable of doing this 624 + * so if we are running on anything older than 4 do not attempt to read 625 + * control/platform-feature-xs_reset_watches. 626 + */ 627 + static bool xen_strict_xenbus_quirk() 628 + { 629 + uint32_t eax, ebx, ecx, edx, base; 622 630 631 + base = xen_cpuid_base(); 632 + cpuid(base + 1, &eax, &ebx, &ecx, &edx); 633 + 634 + if ((eax >> 16) < 4) 635 + return true; 636 + return false; 637 + 638 + } 623 639 static void xs_reset_watches(void) 624 640 { 625 641 int err, supported = 0; 626 642 627 643 if (!xen_hvm_domain() || xen_initial_domain()) 644 + return; 645 + 646 + if (xen_strict_xenbus_quirk()) 628 647 return; 629 648 630 649 err = xenbus_scanf(XBT_NIL, "control",
+19
include/xen/interface/hvm/hvm_op.h
··· 43 43 typedef struct xen_hvm_pagetable_dying xen_hvm_pagetable_dying_t; 44 44 DEFINE_GUEST_HANDLE_STRUCT(xen_hvm_pagetable_dying_t); 45 45 46 + enum hvmmem_type_t { 47 + HVMMEM_ram_rw, /* Normal read/write guest RAM */ 48 + HVMMEM_ram_ro, /* Read-only; writes are discarded */ 49 + HVMMEM_mmio_dm, /* Reads and write go to the device model */ 50 + }; 51 + 52 + #define HVMOP_get_mem_type 15 53 + /* Return hvmmem_type_t for the specified pfn. */ 54 + struct xen_hvm_get_mem_type { 55 + /* Domain to be queried. */ 56 + domid_t domid; 57 + /* OUT variable. */ 58 + uint16_t mem_type; 59 + uint16_t pad[2]; /* align next field on 8-byte boundary */ 60 + /* IN variable. */ 61 + uint64_t pfn; 62 + }; 63 + DEFINE_GUEST_HANDLE_STRUCT(xen_hvm_get_mem_type); 64 + 46 65 #endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */