Hello community, here is the log from the commit of package xen for openSUSE:Leap:15.2 checked in at 2020-02-10 16:41:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Leap:15.2/xen (Old) and /work/SRC/openSUSE:Leap:15.2/.xen.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xen" Mon Feb 10 16:41:38 2020 rev:81 rq:768894 version:4.13.0_06 Changes: -------- --- /work/SRC/openSUSE:Leap:15.2/xen/xen.changes 2020-01-15 16:30:10.692812759 +0100 +++ /work/SRC/openSUSE:Leap:15.2/.xen.new.26092/xen.changes 2020-02-10 16:41:56.355723879 +0100 @@ -1,0 +2,25 @@ +Tue Jan 28 14:10:38 UTC 2020 - oher...@suse.de + +- bsc#1159755 - use fixed qemu-3.1 machine type for HVM + qemu4 introduced incompatible changes in pc-i440fx, which revealed + a design bug in 'xenfv'. Live migration from domUs started with + qemu versions prior qemu4 can not be received with qemu4+. + libxl.lock-qemu-machine-for-hvm.patch + +------------------------------------------------------------------- +Tue Jan 14 09:19:31 MST 2020 - carn...@suse.com + +- Upstream bug fixes (bsc#1027519) + 5de65f84-gnttab-map-always-do-IOMMU-part.patch + 5de65fc4-x86-avoid-HPET-use-on-certain-Intel.patch + 5e15e03d-sched-fix-S3-resume-with-smt=0.patch + 5e16fb6a-x86-clear-per-cpu-stub-page-info.patch + 5e1da013-IRQ-u16-is-too-narrow-for-evtchn.patch + +------------------------------------------------------------------- +Wed Jan 8 11:43:04 UTC 2020 - Dominique Leuenberger <dims...@opensuse.org> + +- BuildRequire pkgconfig(libsystemd) instead of systemd-devel: + Allow OBS to shortcut through the -mini flavors. + +------------------------------------------------------------------- New: ---- 5de65f84-gnttab-map-always-do-IOMMU-part.patch 5de65fc4-x86-avoid-HPET-use-on-certain-Intel.patch 5e15e03d-sched-fix-S3-resume-with-smt=0.patch 5e16fb6a-x86-clear-per-cpu-stub-page-info.patch 5e1da013-IRQ-u16-is-too-narrow-for-evtchn.patch libxl.lock-qemu-machine-for-hvm.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xen.spec ++++++ --- /var/tmp/diff_new_pack.ovxjuJ/_old 2020-02-10 16:41:57.775724880 +0100 +++ /var/tmp/diff_new_pack.ovxjuJ/_new 2020-02-10 16:41:57.775724880 +0100 @@ -1,7 +1,7 @@ # # spec file for package xen # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -60,7 +60,7 @@ %define with_gcc48 0 %define _fwdefdir /etc/sysconfig/SuSEfirewall2.d/services %systemd_requires -BuildRequires: systemd-devel +BuildRequires: pkgconfig(libsystemd) %define with_systemd_modules_load %{_prefix}/lib/modules-load.d PreReq: %fillup_prereq %ifarch %arm aarch64 @@ -108,8 +108,8 @@ BuildRequires: acpica BuildRequires: openssl-devel BuildRequires: python3-devel -BuildRequires: systemd BuildRequires: xz-devel +BuildRequires: pkgconfig(systemd) %ifarch x86_64 BuildRequires: gcc-32bit BuildRequires: gcc-c++ @@ -127,7 +127,7 @@ BuildRequires: pesign-obs-integration %endif -Version: 4.13.0_04 +Version: 4.13.0_06 Release: 0 Summary: Xen Virtualization: Hypervisor (aka VMM aka Microkernel) License: GPL-2.0-only @@ -162,6 +162,11 @@ # For xen-libs Source99: baselibs.conf # Upstream patches +Patch1: 5de65f84-gnttab-map-always-do-IOMMU-part.patch +Patch2: 5de65fc4-x86-avoid-HPET-use-on-certain-Intel.patch +Patch3: 5e15e03d-sched-fix-S3-resume-with-smt=0.patch +Patch4: 5e16fb6a-x86-clear-per-cpu-stub-page-info.patch +Patch5: 5e1da013-IRQ-u16-is-too-narrow-for-evtchn.patch # Our platform specific patches Patch400: xen-destdir.patch Patch401: vif-bridge-no-iptables.patch @@ -193,6 +198,7 @@ Patch465: xen.libxl.dmmd.patch Patch466: libxl.set-migration-constraints-from-cmdline.patch Patch467: xenstore-run-in-studomain.patch +Patch468: libxl.lock-qemu-machine-for-hvm.patch Patch469: libxl.helper_done-crash.patch Patch470: libxl.LIBXL_HOTPLUG_TIMEOUT.patch # python3 conversion patches @@ -356,6 +362,11 @@ %prep %setup -q -n %xen_build_dir -a 1 -a 5 -a 6 -a 57 # Upstream patches +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 # Our platform specific patches %patch400 -p1 %patch401 -p1 @@ -387,6 +398,7 @@ %patch465 -p1 %patch466 -p1 %patch467 -p1 +%patch468 -p1 %patch469 -p1 %patch470 -p1 # python3 conversion patches ++++++ 5de65f84-gnttab-map-always-do-IOMMU-part.patch ++++++ # Commit 921f1f42260c7967bf18f8a143d39511d163c421 # Date 2019-12-03 14:13:40 +0100 # Author Jan Beulich <jbeul...@suse.com> # Committer Jan Beulich <jbeul...@suse.com> gnttab: make sure grant map operations don't skip their IOMMU part Two almost simultaneous mapping requests need to make sure that at the completion of the earlier one IOMMU mappings (established explicitly here in the PV case) have been put in place. Forever since the splitting of the grant table lock a violation of this has been possible (using simplified pin counts, as it doesn't matter whether we talk about read or write mappings here): initial state: act->pin = 0 vCPU A: progress the operation past the dropping of the locks after the act->pin updates (act->pin = 1, old_pin = 0, act_pin = 1) vCPU B: progress the operation past the dropping of the locks after the act->pin updates (act->pin = 2, old_pin = 1, act_pin = 2) vCPU B: (re-)acquire both gt locks, mapkind() returns 0, but both iommu_legacy_map() invocations get skipped due to non-zero old_pin vCPU B: return to caller without IOMMU mapping vCPU A: (re-)acquire both gt locks, mapkind() returns 0, iommu_legacy_map() gets invoked With the locks dropped intermediately, whether to invoke iommu_legacy_map() must depend on only the return value of mapkind() and of course the kind of mapping request being processed, just like is already the case in unmap_common(). Also fix the style of the adjacent comment, and correct a nearby one still referring to a prior name of what is now mapkind(). Signed-off-by: Jan Beulich <jbeul...@suse.com> Acked-by: Andrew Cooper <andrew.coop...@citrix.com> --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -948,8 +948,6 @@ map_grant_ref( mfn_t mfn; struct page_info *pg = NULL; int rc = GNTST_okay; - u32 old_pin; - u32 act_pin; unsigned int cache_flags, clear_flags = 0, refcnt = 0, typecnt = 0; bool host_map_created = false; struct active_grant_entry *act = NULL; @@ -1058,7 +1056,6 @@ map_grant_ref( } } - old_pin = act->pin; if ( op->flags & GNTMAP_device_map ) act->pin += (op->flags & GNTMAP_readonly) ? GNTPIN_devr_inc : GNTPIN_devw_inc; @@ -1067,7 +1064,6 @@ map_grant_ref( GNTPIN_hstr_inc : GNTPIN_hstw_inc; mfn = act->mfn; - act_pin = act->pin; cache_flags = (shah->flags & (GTF_PAT | GTF_PWT | GTF_PCD) ); @@ -1175,27 +1171,22 @@ map_grant_ref( if ( need_iommu ) { unsigned int kind; - int err = 0; double_gt_lock(lgt, rgt); - /* We're not translated, so we know that gmfns and mfns are - the same things, so the IOMMU entry is always 1-to-1. */ + /* + * We're not translated, so we know that dfns and mfns are + * the same things, so the IOMMU entry is always 1-to-1. + */ kind = mapkind(lgt, rd, mfn); - if ( (act_pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) && - !(old_pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) ) - { - if ( !(kind & MAPKIND_WRITE) ) - err = iommu_legacy_map(ld, _dfn(mfn_x(mfn)), mfn, 0, - IOMMUF_readable | IOMMUF_writable); - } - else if ( act_pin && !old_pin ) - { - if ( !kind ) - err = iommu_legacy_map(ld, _dfn(mfn_x(mfn)), mfn, 0, - IOMMUF_readable); - } - if ( err ) + if ( !(op->flags & GNTMAP_readonly) && + !(kind & MAPKIND_WRITE) ) + kind = IOMMUF_readable | IOMMUF_writable; + else if ( !kind ) + kind = IOMMUF_readable; + else + kind = 0; + if ( kind && iommu_legacy_map(ld, _dfn(mfn_x(mfn)), mfn, 0, kind) ) { double_gt_unlock(lgt, rgt); rc = GNTST_general_error; @@ -1210,7 +1201,7 @@ map_grant_ref( * other fields so just ensure the flags field is stored last. * * However, if gnttab_need_iommu_mapping() then this would race - * with a concurrent mapcount() call (on an unmap, for example) + * with a concurrent mapkind() call (on an unmap, for example) * and a lock is required. */ mt = &maptrack_entry(lgt, handle); ++++++ 5de65fc4-x86-avoid-HPET-use-on-certain-Intel.patch ++++++ # Commit d5294a302c8441191d47888452958aea25243723 # Date 2019-12-03 14:14:44 +0100 # Author Jan Beulich <jbeul...@suse.com> # Committer Jan Beulich <jbeul...@suse.com> x86: avoid HPET use on certain Intel platforms Linux commit fc5db58539b49351e76f19817ed1102bf7c712d0 says "Some Coffee Lake platforms have a skewed HPET timer once the SoCs entered PC10, which in consequence marks TSC as unstable because HPET is used as watchdog clocksource for TSC." Follow this for Xen as well. Looking at its patch context made me notice they have a pre-existing quirk for Bay Trail as well. The comment there, however, points at a Cherry Trail document. Looking at the datasheets of both, there appear to be similar issues, so go beyond Linux'es coverage and exclude both. Also key the disable on the PCI IDs of the actual affected devices, rather than those of 00:00.0. Apply the workarounds only when the use of HPET was not explicitly requested on the command line and when use of (deep) C-states was not disabled. Adjust a few types in touched or nearby code at the same time. Signed-off-by: Jan Beulich <jbeul...@suse.com> Acked-by: Andrew Cooper <andrew.coop...@citrix.com> --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -18,6 +18,7 @@ #include <xen/timer.h> #include <xen/smp.h> #include <xen/irq.h> +#include <xen/pci_ids.h> #include <xen/softirq.h> #include <xen/efi.h> #include <xen/cpuidle.h> @@ -367,12 +368,41 @@ static u64 read_hpet_count(void) return hpet_read32(HPET_COUNTER); } -static s64 __init init_hpet(struct platform_timesource *pts) +static int64_t __init init_hpet(struct platform_timesource *pts) { - u64 hpet_rate = hpet_setup(), start; - u32 count, target; + uint64_t hpet_rate, start; + uint32_t count, target; - if ( hpet_rate == 0 ) + if ( hpet_address && strcmp(opt_clocksource, pts->id) && + cpuidle_using_deep_cstate() ) + { + if ( pci_conf_read16(PCI_SBDF(0, 0, 0x1f, 0), + PCI_VENDOR_ID) == PCI_VENDOR_ID_INTEL ) + switch ( pci_conf_read16(PCI_SBDF(0, 0, 0x1f, 0), PCI_DEVICE_ID) ) + { + /* HPET on Bay Trail platforms will halt in deep C states. */ + case 0x0f1c: + /* HPET on Cherry Trail platforms will halt in deep C states. */ + case 0x229c: + hpet_address = 0; + break; + } + + /* + * Some Coffee Lake platforms have a skewed HPET timer once the SoCs + * entered PC10. + */ + if ( pci_conf_read16(PCI_SBDF(0, 0, 0, 0), + PCI_VENDOR_ID) == PCI_VENDOR_ID_INTEL && + pci_conf_read16(PCI_SBDF(0, 0, 0, 0), + PCI_DEVICE_ID) == 0x3ec4 ) + hpet_address = 0; + + if ( !hpet_address ) + printk("Disabling HPET for being unreliable\n"); + } + + if ( (hpet_rate = hpet_setup()) == 0 ) return 0; pts->frequency = hpet_rate; ++++++ 5e15e03d-sched-fix-S3-resume-with-smt=0.patch ++++++ # Commit d7f3c76317108ee9989f00545d394fa495fba752 # Date 2020-01-08 14:59:25 +0100 # Author Juergen Gross <jgr...@suse.com> # Committer Jan Beulich <jbeul...@suse.com> sched: fix resuming from S3 with smt=0 When resuming from S3 and smt=0 or maxcpus= are specified we must not do anything in cpu_schedule_callback(). This is not true today for taking down a cpu during resume. If anything goes wrong during resume all the scheduler related error handling is in cpupool.c, so we can just bail out early from cpu_schedule_callback() when suspending or resuming. This fixes commit 0763cd2687897b55e7 ("xen/sched: don't disable scheduler on cpus during suspend"). Reported-by: Marek Marczykowski-Górecki <marma...@invisiblethingslab.com> Tested-by: Marek Marczykowski-Górecki <marma...@invisiblethingslab.com> Signed-off-by: Juergen Gross <jgr...@suse.com> Acked-by: George Dunlap <george.dun...@citrix.com> --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -2562,6 +2562,13 @@ static int cpu_schedule_callback( unsigned int cpu = (unsigned long)hcpu; int rc = 0; + /* + * All scheduler related suspend/resume handling needed is done in + * cpupool.c. + */ + if ( system_state > SYS_STATE_active ) + return NOTIFY_DONE; + rcu_read_lock(&sched_res_rculock); /* @@ -2589,8 +2596,7 @@ static int cpu_schedule_callback( switch ( action ) { case CPU_UP_PREPARE: - if ( system_state != SYS_STATE_resume ) - rc = cpu_schedule_up(cpu); + rc = cpu_schedule_up(cpu); break; case CPU_DOWN_PREPARE: rcu_read_lock(&domlist_read_lock); @@ -2598,13 +2604,10 @@ static int cpu_schedule_callback( rcu_read_unlock(&domlist_read_lock); break; case CPU_DEAD: - if ( system_state == SYS_STATE_suspend ) - break; sched_rm_cpu(cpu); break; case CPU_UP_CANCELED: - if ( system_state != SYS_STATE_resume ) - cpu_schedule_down(cpu); + cpu_schedule_down(cpu); break; default: break; ++++++ 5e16fb6a-x86-clear-per-cpu-stub-page-info.patch ++++++ # Commit 774901788c5614798931a1cb2e20dd8b885f97ab # Date 2020-01-09 11:07:38 +0100 # Author Juergen Gross <jgr...@suse.com> # Committer Jan Beulich <jbeul...@suse.com> x86: clear per cpu stub page information in cpu_smpboot_free() cpu_smpboot_free() removes the stubs for the cpu going offline, but it isn't clearing the related percpu variables. This will result in crashes when a stub page is released due to all related cpus gone offline and one of those cpus going online later. Fix that by clearing stubs.addr and stubs.mfn in order to allocate a new stub page when needed, irrespective of whether the CPU gets parked or removed. Fixes: 2e6c8f182c9c50 ("x86: distinguish CPU offlining from CPU removal") Signed-off-by: Juergen Gross <jgr...@suse.com> Reviewed-by: Wei Liu <w...@xen.org> Reviewed-by: Jan Beulich <jbeul...@suse.com> Tested-by: Tao Xu <tao3...@intel.com> --- a/xen/arch/x86/smpboot.c +++ b/xen/arch/x86/smpboot.c @@ -942,6 +942,8 @@ static void cpu_smpboot_free(unsigned in unmap_domain_page(stub_page); destroy_xen_mappings(per_cpu(stubs.addr, cpu) & PAGE_MASK, (per_cpu(stubs.addr, cpu) | ~PAGE_MASK) + 1); + per_cpu(stubs.addr, cpu) = 0; + per_cpu(stubs.mfn, cpu) = 0; if ( i == STUBS_PER_PAGE ) free_domheap_page(mfn_to_page(mfn)); } ++++++ 5e1da013-IRQ-u16-is-too-narrow-for-evtchn.patch ++++++ # Commit 892b9dcebdb7f646657e11cfdd95a385107bbefa # Date 2020-01-14 12:03:47 +0100 # Author Jan Beulich <jbeul...@suse.com> # Committer Jan Beulich <jbeul...@suse.com> IRQ: u16 is too narrow for an event channel number FIFO event channels allow ports up to 2^17, so we need to use a wider field in struct pirq. Move "masked" such that it may share the 8-byte slot with struct arch_pirq on 64-bit arches, rather than leaving a 7-byte hole in all cases. Take the opportunity and also add a comment regarding "arch" placement within the structure. Signed-off-by: Jan Beulich <jbeul...@suse.com> Acked-by: Andrew Cooper <andrew.coop...@citrix.com> --- a/xen/include/xen/irq.h +++ b/xen/include/xen/irq.h @@ -127,9 +127,10 @@ struct vcpu; struct pirq { int pirq; - u16 evtchn; - bool_t masked; + evtchn_port_t evtchn; struct rcu_head rcu_head; + bool masked; + /* Architectures may require this field to be last. */ struct arch_pirq arch; }; ++++++ libxl.lock-qemu-machine-for-hvm.patch ++++++ From: Olaf Hering <o...@aepfle.de> Subject: libxl: lock qemu machine for hvm References: bsc#1159755 libxl must not use 'xenfv' as qemu machine type because it maps just to 'pc', which means 'the latest variant of pc-i440fx'. Each new qemu version will make slightly incompatible changes to this machine type, which makes it impossible to migrate a domU from one qemu to another. This happend to work until qemu-3, but broke with qemu-4: With qemu.git commit 7fccf2a06890e3bc3b30e29827ad3fb93fe88fea a new member smbus_no_migration_support was added, and enabled in two places. With qemu.git commit 4ab2f2a8aabfea95cc53c64e13b3f67960b27fdf the vmstate_acpi got new elements, which are conditionally filled. As a result, an incoming migration expected smbus related data unless smbus migration was disabled for a given MachineClass. Since qemu commit 7fccf2a06890e3bc3b30e29827ad3fb93fe88fea forgot to handle xenfv, live migration to receiving hosts using qemu-4.0 and later is broken. Start all new domUs with 'pc-i440fx-3.1' instead of 'xenfv'. Signed-off-by: Olaf Hering <o...@aepfle.de> --- tools/libxl/libxl_dm.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -1751,23 +1751,20 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, for (i = 0; b_info->extra && b_info->extra[i] != NULL; i++) flexarray_append(dm_args, b_info->extra[i]); - flexarray_append(dm_args, "-machine"); switch (b_info->type) { case LIBXL_DOMAIN_TYPE_PVH: case LIBXL_DOMAIN_TYPE_PV: + flexarray_append(dm_args, "-machine"); flexarray_append(dm_args, "xenpv"); for (i = 0; b_info->extra_pv && b_info->extra_pv[i] != NULL; i++) flexarray_append(dm_args, b_info->extra_pv[i]); break; case LIBXL_DOMAIN_TYPE_HVM: - if (!libxl_defbool_val(b_info->u.hvm.xen_platform_pci)) { - /* Switching here to the machine "pc" which does not add - * the xen-platform device instead of the default "xenfv" machine. - */ - machinearg = libxl__strdup(gc, "pc,accel=xen"); - } else { - machinearg = libxl__strdup(gc, "xenfv"); + if (libxl_defbool_val(b_info->u.hvm.xen_platform_pci)) { + flexarray_append(dm_args, "-device"); + flexarray_append(dm_args, "xen-platform"); } + machinearg = libxl__strdup(gc, "pc-i440fx-3.1,accel=xen"); if (b_info->u.hvm.mmio_hole_memkb) { uint64_t max_ram_below_4g = (1ULL << 32) - (b_info->u.hvm.mmio_hole_memkb << 10); @@ -1798,6 +1795,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, } } + flexarray_append(dm_args, "-machine"); flexarray_append(dm_args, machinearg); for (i = 0; b_info->extra_hvm && b_info->extra_hvm[i] != NULL; i++) flexarray_append(dm_args, b_info->extra_hvm[i]); ++++++ xen.bug1026236.suse_vtsc_tolerance.patch ++++++ --- /var/tmp/diff_new_pack.ovxjuJ/_old 2020-02-10 16:41:58.015725050 +0100 +++ /var/tmp/diff_new_pack.ovxjuJ/_new 2020-02-10 16:41:58.015725050 +0100 @@ -10,7 +10,7 @@ --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c -@@ -42,6 +42,9 @@ +@@ -43,6 +43,9 @@ static char __initdata opt_clocksource[10]; string_param("clocksource", opt_clocksource); @@ -20,7 +20,7 @@ unsigned long __read_mostly cpu_khz; /* CPU clock frequency in kHz. */ DEFINE_SPINLOCK(rtc_lock); unsigned long pit0_ticks; -@@ -2193,6 +2196,7 @@ int tsc_set_info(struct domain *d, +@@ -2223,6 +2226,7 @@ int tsc_set_info(struct domain *d, switch ( tsc_mode ) { @@ -28,7 +28,7 @@ case TSC_MODE_DEFAULT: case TSC_MODE_ALWAYS_EMULATE: d->arch.vtsc_offset = get_s_time() - elapsed_nsec; -@@ -2206,8 +2210,26 @@ int tsc_set_info(struct domain *d, +@@ -2236,8 +2240,26 @@ int tsc_set_info(struct domain *d, * When a guest is created, gtsc_khz is passed in as zero, making * d->arch.tsc_khz == cpu_khz. Thus no need to check incarnation. */ @@ -52,7 +52,7 @@ + if ( tsc_mode == TSC_MODE_DEFAULT && host_tsc_is_safe() && - (d->arch.tsc_khz == cpu_khz || -+ ( disable_vtsc || ++ (disable_vtsc || (is_hvm_domain(d) && hvm_get_tsc_scaling_ratio(d->arch.tsc_khz))) ) {