- Load blktap module in xencommons init script. blktap2 doesn't
support qcow2, so blktap is needed to support domains with 'tap:qcow2' disk configurations. modified tmp-initscript-modprobe.patch - bnc#809203 - xen.efi isn't signed with SUSE Secure Boot key xen.spec - Fix adding managed PCI device to an inactive domain modified xen-managed-pci-device.patch - bnc#805094 - xen hot plug attach/detach fails modified blktap-pv-cdrom.patch - bnc# 802690 - domain locking can prevent a live migration from completing modified xend-domain-lock.patch - bnc#797014 - no way to control live migrations 26675-tools-xentoollog_update_tty_detection_in_stdiostream_progress.patch xen.migrate.tools-xc_print_messages_from_xc_save_with_xc_report.patch xen.migrate.tools-xc_document_printf_calls_in_xc_restore.patch xen.migrate.tools-xc_rework_xc_save.cswitch_qemu_logdirty.patch xen.migrate.tools_set_migration_constraints_from_cmdline.patch xen.migrate.tools_add_xm_migrate_--log_progress_option.patch - Upstream patches from Jan 26585-x86-mm-Take-the-p2m-lock-even-in-shadow-mode.patch 26595-x86-nhvm-properly-clean-up-after-failure-to-set-up-all-vCPU-s.patch 26601-honor-ACPI-v4-FADT-flags.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=232
This commit is contained in:
parent
48ad4c1310
commit
9621add6e3
@ -82,7 +82,15 @@ Committed-by: Jan Beulich <jbeulich@suse.com>
|
|||||||
+}
|
+}
|
||||||
--- a/xen/drivers/passthrough/vtd/dmar.c
|
--- a/xen/drivers/passthrough/vtd/dmar.c
|
||||||
+++ b/xen/drivers/passthrough/vtd/dmar.c
|
+++ b/xen/drivers/passthrough/vtd/dmar.c
|
||||||
@@ -786,7 +786,18 @@ out:
|
@@ -776,6 +776,7 @@ out:
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86
|
||||||
|
+#include <asm/fixmap.h>
|
||||||
|
#include <asm/tboot.h>
|
||||||
|
/* ACPI tables may not be DMA protected by tboot, so use DMAR copy */
|
||||||
|
/* SINIT saved in SinitMleData in TXT heap (which is DMA protected) */
|
||||||
|
@@ -786,7 +787,32 @@ out:
|
||||||
|
|
||||||
int __init acpi_dmar_init(void)
|
int __init acpi_dmar_init(void)
|
||||||
{
|
{
|
||||||
@ -93,12 +101,26 @@ Committed-by: Jan Beulich <jbeulich@suse.com>
|
|||||||
+ if ( ACPI_SUCCESS(acpi_get_table_phys(ACPI_SIG_DMAR, 0,
|
+ if ( ACPI_SUCCESS(acpi_get_table_phys(ACPI_SIG_DMAR, 0,
|
||||||
+ &dmar_addr, &dmar_len)) )
|
+ &dmar_addr, &dmar_len)) )
|
||||||
+ {
|
+ {
|
||||||
|
+#ifdef CONFIG_X86_32
|
||||||
|
+ if ( dmar_addr + dmar_len > (DIRECTMAP_MBYTES << 20) )
|
||||||
|
+ {
|
||||||
|
+ unsigned long offset = dmar_addr & (PAGE_SIZE - 1);
|
||||||
|
+ unsigned long mapped_size = PAGE_SIZE - offset;
|
||||||
|
+
|
||||||
|
+ set_fixmap(FIX_DMAR_ZAP_LO, dmar_addr);
|
||||||
|
+ if ( mapped_size < sizeof(*dmar_table) )
|
||||||
|
+ set_fixmap(FIX_DMAR_ZAP_HI, dmar_addr + PAGE_SIZE);
|
||||||
|
+ dmar_table = (void *)fix_to_virt(FIX_DMAR_ZAP_LO) + offset;
|
||||||
|
+ goto exit;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
+ map_pages_to_xen((unsigned long)__va(dmar_addr), PFN_DOWN(dmar_addr),
|
+ map_pages_to_xen((unsigned long)__va(dmar_addr), PFN_DOWN(dmar_addr),
|
||||||
+ PFN_UP(dmar_addr + dmar_len) - PFN_DOWN(dmar_addr),
|
+ PFN_UP(dmar_addr + dmar_len) - PFN_DOWN(dmar_addr),
|
||||||
+ PAGE_HYPERVISOR);
|
+ PAGE_HYPERVISOR);
|
||||||
+ dmar_table = __va(dmar_addr);
|
+ dmar_table = __va(dmar_addr);
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
+ exit: __attribute__((__unused__))
|
||||||
return parse_dmar_table(acpi_parse_dmar);
|
return parse_dmar_table(acpi_parse_dmar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,3 +136,14 @@ Committed-by: Jan Beulich <jbeulich@suse.com>
|
|||||||
/*
|
/*
|
||||||
* Namespace and name interfaces
|
* Namespace and name interfaces
|
||||||
*/
|
*/
|
||||||
|
--- a/xen/include/asm-x86/fixmap.h
|
||||||
|
+++ b/xen/include/asm-x86/fixmap.h
|
||||||
|
@@ -50,6 +50,8 @@ enum fixed_addresses {
|
||||||
|
FIX_PAE_HIGHMEM_END = FIX_PAE_HIGHMEM_0 + NR_CPUS-1,
|
||||||
|
#define FIX_VGC_END FIX_PAE_HIGHMEM_0
|
||||||
|
#define FIX_VGC_BEGIN FIX_PAE_HIGHMEM_END
|
||||||
|
+ FIX_DMAR_ZAP_HI,
|
||||||
|
+ FIX_DMAR_ZAP_LO,
|
||||||
|
#else
|
||||||
|
FIX_VGC_END,
|
||||||
|
FIX_VGC_BEGIN = FIX_VGC_END
|
||||||
|
50
26585-x86-mm-Take-the-p2m-lock-even-in-shadow-mode.patch
Normal file
50
26585-x86-mm-Take-the-p2m-lock-even-in-shadow-mode.patch
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Commit a15d87475ed95840dba693ab0a56d0b48a215cbc
|
||||||
|
# Date 2013-02-21 15:16:20 +0000
|
||||||
|
# Author Tim Deegan <tim@xen.org>
|
||||||
|
# Committer Tim Deegan <tim@xen.org>
|
||||||
|
x86/mm: Take the p2m lock even in shadow mode.
|
||||||
|
|
||||||
|
The reworking of p2m lookups to use get_gfn()/put_gfn() left the
|
||||||
|
shadow code not taking the p2m lock, even in cases where the p2m would
|
||||||
|
be updated (i.e. PoD).
|
||||||
|
|
||||||
|
In many cases, shadow code doesn't need the exclusion that
|
||||||
|
get_gfn()/put_gfn() provides, as it has its own interlocks against p2m
|
||||||
|
updates, but this is taking things too far, and can lead to crashes in
|
||||||
|
the PoD code.
|
||||||
|
|
||||||
|
Now that most shadow-code p2m lookups are done with explicitly
|
||||||
|
unlocked accessors, or with the get_page_from_gfn() accessor, which is
|
||||||
|
often lock-free, we can just turn this locking on.
|
||||||
|
|
||||||
|
The remaining locked lookups are in sh_page_fault() (in a path that's
|
||||||
|
almost always already serializing on the paging lock), and in
|
||||||
|
emulate_map_dest() (which can probably be updated to use
|
||||||
|
get_page_from_gfn()). They're not addressed here but may be in a
|
||||||
|
follow-up patch.
|
||||||
|
|
||||||
|
Signed-off-by: Tim Deegan <tim@xen.org>
|
||||||
|
Acked-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/mm/p2m.c
|
||||||
|
+++ b/xen/arch/x86/mm/p2m.c
|
||||||
|
@@ -163,8 +163,7 @@ mfn_t __get_gfn_type_access(struct p2m_d
|
||||||
|
return _mfn(gfn);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* For now only perform locking on hap domains */
|
||||||
|
- if ( locked && (hap_enabled(p2m->domain)) )
|
||||||
|
+ if ( locked )
|
||||||
|
/* Grab the lock here, don't release until put_gfn */
|
||||||
|
gfn_lock(p2m, gfn, 0);
|
||||||
|
|
||||||
|
@@ -197,8 +196,7 @@ mfn_t __get_gfn_type_access(struct p2m_d
|
||||||
|
|
||||||
|
void __put_gfn(struct p2m_domain *p2m, unsigned long gfn)
|
||||||
|
{
|
||||||
|
- if ( !p2m || !paging_mode_translate(p2m->domain)
|
||||||
|
- || !hap_enabled(p2m->domain) )
|
||||||
|
+ if ( !p2m || !paging_mode_translate(p2m->domain) )
|
||||||
|
/* Nothing to do in this case */
|
||||||
|
return;
|
||||||
|
|
@ -0,0 +1,57 @@
|
|||||||
|
# Commit 17281aea1a9a10f1ee165c6e6a2921a67b7b1df2
|
||||||
|
# Date 2013-02-22 11:21:38 +0100
|
||||||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
x86/nhvm: properly clean up after failure to set up all vCPU-s
|
||||||
|
|
||||||
|
Otherwise we may leak memory when setting up nHVM fails half way.
|
||||||
|
|
||||||
|
This implies that the individual destroy functions will have to remain
|
||||||
|
capable (in the VMX case they first need to be made so, following
|
||||||
|
26486:7648ef657fe7 and 26489:83a3fa9c8434) of being called for a vCPU
|
||||||
|
that the corresponding init function was never run on.
|
||||||
|
|
||||||
|
Once at it, also remove a redundant check from the corresponding
|
||||||
|
parameter validation code.
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||||
|
Acked-by: Tim Deegan <tim@xen.org>
|
||||||
|
Tested-by: Olaf Hering <olaf@aepfle.de>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/hvm/hvm.c
|
||||||
|
+++ b/xen/arch/x86/hvm/hvm.c
|
||||||
|
@@ -3941,18 +3941,20 @@ long do_hvm_op(unsigned long op, XEN_GUE
|
||||||
|
#else
|
||||||
|
if ( a.value > 1 )
|
||||||
|
rc = -EINVAL;
|
||||||
|
- if ( !is_hvm_domain(d) )
|
||||||
|
- rc = -EINVAL;
|
||||||
|
/* Remove the check below once we have
|
||||||
|
* shadow-on-shadow.
|
||||||
|
*/
|
||||||
|
if ( cpu_has_svm && !paging_mode_hap(d) && a.value )
|
||||||
|
rc = -EINVAL;
|
||||||
|
/* Set up NHVM state for any vcpus that are already up */
|
||||||
|
- if ( !d->arch.hvm_domain.params[HVM_PARAM_NESTEDHVM] )
|
||||||
|
+ if ( a.value &&
|
||||||
|
+ !d->arch.hvm_domain.params[HVM_PARAM_NESTEDHVM] )
|
||||||
|
for_each_vcpu(d, v)
|
||||||
|
if ( rc == 0 )
|
||||||
|
rc = nestedhvm_vcpu_initialise(v);
|
||||||
|
+ if ( !a.value || rc )
|
||||||
|
+ for_each_vcpu(d, v)
|
||||||
|
+ nestedhvm_vcpu_destroy(v);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case HVM_PARAM_BUFIOREQ_EVTCHN:
|
||||||
|
--- a/xen/arch/x86/hvm/nestedhvm.c
|
||||||
|
+++ b/xen/arch/x86/hvm/nestedhvm.c
|
||||||
|
@@ -88,7 +88,7 @@ nestedhvm_vcpu_initialise(struct vcpu *v
|
||||||
|
void
|
||||||
|
nestedhvm_vcpu_destroy(struct vcpu *v)
|
||||||
|
{
|
||||||
|
- if ( nestedhvm_enabled(v->domain) && hvm_funcs.nhvm_vcpu_destroy )
|
||||||
|
+ if ( hvm_funcs.nhvm_vcpu_destroy )
|
||||||
|
hvm_funcs.nhvm_vcpu_destroy(v);
|
||||||
|
}
|
||||||
|
|
158
26601-honor-ACPI-v4-FADT-flags.patch
Normal file
158
26601-honor-ACPI-v4-FADT-flags.patch
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
# Commit 992fdf6f46252a459c6b1b8d971b2c71f01460f8
|
||||||
|
# Date 2013-02-22 11:56:54 +0100
|
||||||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
honor ACPI v4 FADT flags
|
||||||
|
|
||||||
|
- force use of physical APIC mode if indicated so (as we don't support
|
||||||
|
xAPIC cluster mode, the respective flag is taken to force physical
|
||||||
|
mode too)
|
||||||
|
- don't use MSI if indicated so (implies no IOMMU)
|
||||||
|
|
||||||
|
Both can be overridden on the command line, for the MSI case this at
|
||||||
|
once adds a new command line option allowing to turn off PCI MSI (IOMMU
|
||||||
|
and HPET are unaffected by this).
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||||
|
Acked-by: Keir Fraser <keir@xen.org>
|
||||||
|
|
||||||
|
--- a/docs/misc/xen-command-line.markdown
|
||||||
|
+++ b/docs/misc/xen-command-line.markdown
|
||||||
|
@@ -602,6 +602,13 @@ limit is ignored by Xen.
|
||||||
|
|
||||||
|
Specify if the MMConfig space should be enabled.
|
||||||
|
|
||||||
|
+### msi
|
||||||
|
+> `= <boolean>`
|
||||||
|
+
|
||||||
|
+> Default: `true`
|
||||||
|
+
|
||||||
|
+Force Xen to (not) use PCI-MSI, even if ACPI FADT says otherwise.
|
||||||
|
+
|
||||||
|
### nmi
|
||||||
|
> `= ignore | dom0 | fatal`
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/genapic/bigsmp.c
|
||||||
|
+++ b/xen/arch/x86/genapic/bigsmp.c
|
||||||
|
@@ -40,7 +40,14 @@ static struct dmi_system_id __initdata b
|
||||||
|
|
||||||
|
static __init int probe_bigsmp(void)
|
||||||
|
{
|
||||||
|
- if (!def_to_bigsmp)
|
||||||
|
+ /*
|
||||||
|
+ * We don't implement cluster mode, so force use of
|
||||||
|
+ * physical mode in both cases.
|
||||||
|
+ */
|
||||||
|
+ if (acpi_gbl_FADT.flags &
|
||||||
|
+ (ACPI_FADT_APIC_CLUSTER | ACPI_FADT_APIC_PHYSICAL))
|
||||||
|
+ def_to_bigsmp = 1;
|
||||||
|
+ else if (!def_to_bigsmp)
|
||||||
|
dmi_check_system(bigsmp_dmi_table);
|
||||||
|
return def_to_bigsmp;
|
||||||
|
}
|
||||||
|
--- a/xen/arch/x86/genapic/x2apic.c
|
||||||
|
+++ b/xen/arch/x86/genapic/x2apic.c
|
||||||
|
@@ -29,9 +29,6 @@
|
||||||
|
#include <xen/smp.h>
|
||||||
|
#include <asm/mach-default/mach_mpparse.h>
|
||||||
|
|
||||||
|
-static bool_t __initdata x2apic_phys; /* By default we use logical cluster mode. */
|
||||||
|
-boolean_param("x2apic_phys", x2apic_phys);
|
||||||
|
-
|
||||||
|
static void init_apic_ldr_x2apic_phys(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
@@ -121,8 +118,14 @@ static const struct genapic apic_x2apic_
|
||||||
|
.send_IPI_self = send_IPI_self_x2apic
|
||||||
|
};
|
||||||
|
|
||||||
|
+static s8 __initdata x2apic_phys = -1; /* By default we use logical cluster mode. */
|
||||||
|
+boolean_param("x2apic_phys", x2apic_phys);
|
||||||
|
+
|
||||||
|
const struct genapic *__init apic_x2apic_probe(void)
|
||||||
|
{
|
||||||
|
+ if ( x2apic_phys < 0 )
|
||||||
|
+ x2apic_phys = !!(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL);
|
||||||
|
+
|
||||||
|
return x2apic_phys ? &apic_x2apic_phys : &apic_x2apic_cluster;
|
||||||
|
}
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/msi.c
|
||||||
|
+++ b/xen/arch/x86/msi.c
|
||||||
|
@@ -31,6 +31,9 @@
|
||||||
|
#include <xen/iommu.h>
|
||||||
|
#include <xsm/xsm.h>
|
||||||
|
|
||||||
|
+static s8 __read_mostly use_msi = -1;
|
||||||
|
+boolean_param("msi", use_msi);
|
||||||
|
+
|
||||||
|
/* bitmap indicate which fixed map is free */
|
||||||
|
DEFINE_SPINLOCK(msix_fixmap_lock);
|
||||||
|
DECLARE_BITMAP(msix_fixmap_pages, FIX_MSIX_MAX_PAGES);
|
||||||
|
@@ -958,6 +961,9 @@ int pci_enable_msi(struct msi_info *msi,
|
||||||
|
{
|
||||||
|
ASSERT(spin_is_locked(&pcidevs_lock));
|
||||||
|
|
||||||
|
+ if ( !use_msi )
|
||||||
|
+ return -EPERM;
|
||||||
|
+
|
||||||
|
return msi->table_base ? __pci_enable_msix(msi, desc) :
|
||||||
|
__pci_enable_msi(msi, desc);
|
||||||
|
}
|
||||||
|
@@ -1003,7 +1009,10 @@ int pci_restore_msi_state(struct pci_dev
|
||||||
|
|
||||||
|
ASSERT(spin_is_locked(&pcidevs_lock));
|
||||||
|
|
||||||
|
- if (!pdev)
|
||||||
|
+ if ( !use_msi )
|
||||||
|
+ return -EOPNOTSUPP;
|
||||||
|
+
|
||||||
|
+ if ( !pdev )
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
ret = xsm_resource_setup_pci((pdev->seg << 16) | (pdev->bus << 8) | pdev->devfn);
|
||||||
|
@@ -1062,7 +1071,7 @@ unsigned int pci_msix_get_table_len(stru
|
||||||
|
func = PCI_FUNC(pdev->devfn);
|
||||||
|
|
||||||
|
pos = pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSIX);
|
||||||
|
- if ( !pos )
|
||||||
|
+ if ( !pos || !use_msi )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
control = pci_conf_read16(seg, bus, slot, func, msix_control_reg(pos));
|
||||||
|
@@ -1135,6 +1144,9 @@ static struct keyhandler dump_msi_keyhan
|
||||||
|
|
||||||
|
static int __init msi_setup_keyhandler(void)
|
||||||
|
{
|
||||||
|
+ if ( use_msi < 0 )
|
||||||
|
+ use_msi = !(acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI);
|
||||||
|
+
|
||||||
|
register_keyhandler('M', &dump_msi_keyhandler);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--- a/xen/drivers/passthrough/amd/iommu_acpi.c
|
||||||
|
+++ b/xen/drivers/passthrough/amd/iommu_acpi.c
|
||||||
|
@@ -1066,5 +1066,8 @@ int __init amd_iommu_get_ivrs_dev_entrie
|
||||||
|
|
||||||
|
int __init amd_iommu_update_ivrs_mapping_acpi(void)
|
||||||
|
{
|
||||||
|
+ if ( unlikely(acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI) )
|
||||||
|
+ return -EPERM;
|
||||||
|
+
|
||||||
|
return acpi_table_parse(ACPI_SIG_IVRS, parse_ivrs_table);
|
||||||
|
}
|
||||||
|
--- a/xen/drivers/passthrough/vtd/iommu.c
|
||||||
|
+++ b/xen/drivers/passthrough/vtd/iommu.c
|
||||||
|
@@ -2119,6 +2119,12 @@ int __init intel_vtd_setup(void)
|
||||||
|
if ( list_empty(&acpi_drhd_units) )
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
+ if ( unlikely(acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI) )
|
||||||
|
+ {
|
||||||
|
+ ret = -EPERM;
|
||||||
|
+ goto error;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
platform_quirks_init();
|
||||||
|
|
||||||
|
/* We enable the following features only if they are supported by all VT-d
|
@ -0,0 +1,22 @@
|
|||||||
|
# Commit c40e24a8ef74f9d0ee59dd9b8ca890be08b0b874
|
||||||
|
# Date 2013-02-25 12:44:25 +0100
|
||||||
|
# Author Xi Wang <xi@mit.edu>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
x86: fix null pointer dereference in intel_get_extended_msrs()
|
||||||
|
|
||||||
|
`memset(&mc_ext, 0, ...)' leads to a buffer overflow and a subsequent
|
||||||
|
null pointer dereference. Replace `&mc_ext' with `mc_ext'.
|
||||||
|
|
||||||
|
Signed-off-by: Xi Wang <xi@mit.edu>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/cpu/mcheck/mce_intel.c
|
||||||
|
+++ b/xen/arch/x86/cpu/mcheck/mce_intel.c
|
||||||
|
@@ -534,7 +534,7 @@ intel_get_extended_msrs(struct mcinfo_gl
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this function will called when CAP(9).MCG_EXT_P = 1 */
|
||||||
|
- memset(&mc_ext, 0, sizeof(struct mcinfo_extended));
|
||||||
|
+ memset(mc_ext, 0, sizeof(*mc_ext));
|
||||||
|
mc_ext->common.type = MC_TYPE_EXTENDED;
|
||||||
|
mc_ext->common.size = sizeof(struct mcinfo_extended);
|
||||||
|
|
73
26659-AMD-IOMMU-erratum-746-workaround.patch
Normal file
73
26659-AMD-IOMMU-erratum-746-workaround.patch
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# Commit 0f8adcb2a7183bea5063f6fffba7d7e1aa14fc84
|
||||||
|
# Date 2013-02-26 10:14:53 +0100
|
||||||
|
# Author Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
IOMMU, AMD Family15h Model10-1Fh erratum 746 Workaround
|
||||||
|
|
||||||
|
The IOMMU may stop processing page translations due to a perceived lack
|
||||||
|
of credits for writing upstream peripheral page service request (PPR)
|
||||||
|
or event logs. If the L2B miscellaneous clock gating feature is enabled
|
||||||
|
the IOMMU does not properly register credits after the log request has
|
||||||
|
completed, leading to a potential system hang.
|
||||||
|
|
||||||
|
BIOSes are supposed to disable L2B micellaneous clock gating by setting
|
||||||
|
L2_L2B_CK_GATE_CONTROL[CKGateL2BMiscDisable](D0F2xF4_x90[2]) = 1b. This
|
||||||
|
patch corrects that for those which do not enable this workaround.
|
||||||
|
|
||||||
|
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
|
--- a/xen/drivers/passthrough/amd/iommu_init.c
|
||||||
|
+++ b/xen/drivers/passthrough/amd/iommu_init.c
|
||||||
|
@@ -795,6 +795,42 @@ static int __init set_iommu_interrupt_ha
|
||||||
|
return irq;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Family15h Model 10h-1fh erratum 746 (IOMMU Logging May Stall Translations)
|
||||||
|
+ * Workaround:
|
||||||
|
+ * BIOS should disable L2B micellaneous clock gating by setting
|
||||||
|
+ * L2_L2B_CK_GATE_CONTROL[CKGateL2BMiscDisable](D0F2xF4_x90[2]) = 1b
|
||||||
|
+ */
|
||||||
|
+static void amd_iommu_erratum_746_workaround(struct amd_iommu *iommu)
|
||||||
|
+{
|
||||||
|
+ u32 value;
|
||||||
|
+ u8 bus = PCI_BUS(iommu->bdf);
|
||||||
|
+ u8 dev = PCI_SLOT(iommu->bdf);
|
||||||
|
+ u8 func = PCI_FUNC(iommu->bdf);
|
||||||
|
+
|
||||||
|
+ if ( (boot_cpu_data.x86 != 0x15) ||
|
||||||
|
+ (boot_cpu_data.x86_model < 0x10) ||
|
||||||
|
+ (boot_cpu_data.x86_model > 0x1f) )
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ pci_conf_write32(iommu->seg, bus, dev, func, 0xf0, 0x90);
|
||||||
|
+ value = pci_conf_read32(iommu->seg, bus, dev, func, 0xf4);
|
||||||
|
+
|
||||||
|
+ if ( value & (1 << 2) )
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ /* Select NB indirect register 0x90 and enable writing */
|
||||||
|
+ pci_conf_write32(iommu->seg, bus, dev, func, 0xf0, 0x90 | (1 << 8));
|
||||||
|
+
|
||||||
|
+ pci_conf_write32(iommu->seg, bus, dev, func, 0xf4, value | (1 << 2));
|
||||||
|
+ printk(XENLOG_INFO
|
||||||
|
+ "AMD-Vi: Applying erratum 746 workaround for IOMMU at %04x:%02x:%02x.%u\n",
|
||||||
|
+ iommu->seg, bus, dev, func);
|
||||||
|
+
|
||||||
|
+ /* Clear the enable writing bit */
|
||||||
|
+ pci_conf_write32(iommu->seg, bus, dev, func, 0xf0, 0x90);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void enable_iommu(struct amd_iommu *iommu)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
@@ -807,6 +843,8 @@ static void enable_iommu(struct amd_iomm
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ amd_iommu_erratum_746_workaround(iommu);
|
||||||
|
+
|
||||||
|
register_iommu_dev_table_in_mmio_space(iommu);
|
||||||
|
register_iommu_cmd_buffer_in_mmio_space(iommu);
|
||||||
|
register_iommu_event_log_in_mmio_space(iommu);
|
128
26660-x86-fix-CMCI-injection.patch
Normal file
128
26660-x86-fix-CMCI-injection.patch
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
# Commit 2f8c55ccefe49bb526df0eaf5fa9b7b788422208
|
||||||
|
# Date 2013-02-26 10:15:56 +0100
|
||||||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
x86: fix CMCI injection
|
||||||
|
|
||||||
|
This fixes the wrong use of literal vector 0xF7 with an "int"
|
||||||
|
instruction (invalidated by 25113:14609be41f36) and the fact that doing
|
||||||
|
the injection via a software interrupt was never valid anyway (because
|
||||||
|
cmci_interrupt() acks the LAPIC, which does the wrong thing if the
|
||||||
|
interrupt didn't get delivered though it).
|
||||||
|
|
||||||
|
In order to do latter, the patch introduces send_IPI_self(), at once
|
||||||
|
removing two opend coded uses of "genapic" in the IRQ handling code.
|
||||||
|
|
||||||
|
Reported-by: Yongjie Ren <yongjie.ren@intel.com>
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||||
|
Tested-by: Yongjie Ren <yongjie.ren@intel.com>
|
||||||
|
Acked-by: Keir Fraser <keir@xen.org>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/cpu/mcheck/mce.c
|
||||||
|
+++ b/xen/arch/x86/cpu/mcheck/mce.c
|
||||||
|
@@ -30,6 +30,7 @@ bool_t __read_mostly mce_broadcast = 0;
|
||||||
|
bool_t is_mc_panic;
|
||||||
|
unsigned int __read_mostly nr_mce_banks;
|
||||||
|
unsigned int __read_mostly firstbank;
|
||||||
|
+uint8_t __read_mostly cmci_apic_vector;
|
||||||
|
|
||||||
|
static void intpose_init(void);
|
||||||
|
static void mcinfo_clear(struct mc_info *);
|
||||||
|
@@ -1277,12 +1278,6 @@ static void x86_mc_mceinject(void *data)
|
||||||
|
__asm__ __volatile__("int $0x12");
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void x86_cmci_inject(void *data)
|
||||||
|
-{
|
||||||
|
- printk("Simulating CMCI on cpu %d\n", smp_processor_id());
|
||||||
|
- __asm__ __volatile__("int $0xf7");
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
#if BITS_PER_LONG == 64
|
||||||
|
|
||||||
|
#define ID2COOKIE(id) ((mctelem_cookie_t)(id))
|
||||||
|
@@ -1568,11 +1563,15 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u
|
||||||
|
on_selected_cpus(cpumap, x86_mc_mceinject, NULL, 1);
|
||||||
|
break;
|
||||||
|
case XEN_MC_INJECT_TYPE_CMCI:
|
||||||
|
- if ( !cmci_support )
|
||||||
|
+ if ( !cmci_apic_vector )
|
||||||
|
ret = x86_mcerr(
|
||||||
|
"No CMCI supported in platform\n", -EINVAL);
|
||||||
|
else
|
||||||
|
- on_selected_cpus(cpumap, x86_cmci_inject, NULL, 1);
|
||||||
|
+ {
|
||||||
|
+ if ( cpumask_test_cpu(smp_processor_id(), cpumap) )
|
||||||
|
+ send_IPI_self(cmci_apic_vector);
|
||||||
|
+ send_IPI_mask(cpumap, cmci_apic_vector);
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret = x86_mcerr("Wrong mca type\n", -EINVAL);
|
||||||
|
--- a/xen/arch/x86/cpu/mcheck/mce.h
|
||||||
|
+++ b/xen/arch/x86/cpu/mcheck/mce.h
|
||||||
|
@@ -38,6 +38,8 @@ enum mcheck_type {
|
||||||
|
mcheck_intel
|
||||||
|
};
|
||||||
|
|
||||||
|
+extern uint8_t cmci_apic_vector;
|
||||||
|
+
|
||||||
|
/* Init functions */
|
||||||
|
enum mcheck_type amd_k7_mcheck_init(struct cpuinfo_x86 *c);
|
||||||
|
enum mcheck_type amd_k8_mcheck_init(struct cpuinfo_x86 *c);
|
||||||
|
--- a/xen/arch/x86/cpu/mcheck/mce_intel.c
|
||||||
|
+++ b/xen/arch/x86/cpu/mcheck/mce_intel.c
|
||||||
|
@@ -1164,7 +1164,6 @@ static void intel_init_cmci(struct cpuin
|
||||||
|
{
|
||||||
|
u32 l, apic;
|
||||||
|
int cpu = smp_processor_id();
|
||||||
|
- static uint8_t cmci_apic_vector;
|
||||||
|
|
||||||
|
if (!mce_available(c) || !cmci_support) {
|
||||||
|
if (opt_cpu_info)
|
||||||
|
--- a/xen/arch/x86/irq.c
|
||||||
|
+++ b/xen/arch/x86/irq.c
|
||||||
|
@@ -646,7 +646,7 @@ void irq_move_cleanup_interrupt(struct c
|
||||||
|
* to myself.
|
||||||
|
*/
|
||||||
|
if (irr & (1 << (vector % 32))) {
|
||||||
|
- genapic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR);
|
||||||
|
+ send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR);
|
||||||
|
TRACE_3D(TRC_HW_IRQ_MOVE_CLEANUP_DELAY,
|
||||||
|
irq, vector, smp_processor_id());
|
||||||
|
goto unlock;
|
||||||
|
@@ -692,7 +692,7 @@ static void send_cleanup_vector(struct i
|
||||||
|
|
||||||
|
cpumask_and(&cleanup_mask, desc->arch.old_cpu_mask, &cpu_online_map);
|
||||||
|
desc->arch.move_cleanup_count = cpumask_weight(&cleanup_mask);
|
||||||
|
- genapic->send_IPI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
|
||||||
|
+ send_IPI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
|
||||||
|
|
||||||
|
desc->arch.move_in_progress = 0;
|
||||||
|
}
|
||||||
|
--- a/xen/arch/x86/smp.c
|
||||||
|
+++ b/xen/arch/x86/smp.c
|
||||||
|
@@ -43,6 +43,11 @@ void send_IPI_mask(const cpumask_t *mask
|
||||||
|
genapic->send_IPI_mask(mask, vector);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void send_IPI_self(int vector)
|
||||||
|
+{
|
||||||
|
+ genapic->send_IPI_self(vector);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Some notes on x86 processor bugs affecting SMP operation:
|
||||||
|
*
|
||||||
|
--- a/xen/include/asm-x86/smp.h
|
||||||
|
+++ b/xen/include/asm-x86/smp.h
|
||||||
|
@@ -29,7 +29,8 @@ DECLARE_PER_CPU(cpumask_var_t, cpu_core_
|
||||||
|
|
||||||
|
void smp_send_nmi_allbutself(void);
|
||||||
|
|
||||||
|
-void send_IPI_mask(const cpumask_t *mask, int vector);
|
||||||
|
+void send_IPI_mask(const cpumask_t *, int vector);
|
||||||
|
+void send_IPI_self(int vector);
|
||||||
|
|
||||||
|
extern void (*mtrr_hook) (void);
|
||||||
|
|
107
26672-vmx-fix-handling-of-NMI-VMEXIT.patch
Normal file
107
26672-vmx-fix-handling-of-NMI-VMEXIT.patch
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
# Commit 7dd3b06ff031c9a8c727df16c5def2afb382101c
|
||||||
|
# Date 2013-02-28 14:00:18 +0000
|
||||||
|
# Author Tim Deegan <tim@xen.org>
|
||||||
|
# Committer Tim Deegan <tim@xen.org>
|
||||||
|
vmx: fix handling of NMI VMEXIT.
|
||||||
|
|
||||||
|
Call do_nmi() directly and explicitly re-enable NMIs rather than
|
||||||
|
raising an NMI through the APIC. Since NMIs are disabled after the
|
||||||
|
VMEXIT, the raised NMI would be blocked until the next IRET
|
||||||
|
instruction (i.e. the next real interrupt, or after scheduling a PV
|
||||||
|
guest) and in the meantime the guest will spin taking NMI VMEXITS.
|
||||||
|
|
||||||
|
Also, handle NMIs before re-enabling interrupts, since if we handle an
|
||||||
|
interrupt (and therefore IRET) before calling do_nmi(), we may end up
|
||||||
|
running the NMI handler with NMIs enabled.
|
||||||
|
|
||||||
|
Signed-off-by: Tim Deegan <tim@xen.org>
|
||||||
|
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||||
|
Acked-by: Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/hvm/vmx/vmx.c
|
||||||
|
+++ b/xen/arch/x86/hvm/vmx/vmx.c
|
||||||
|
@@ -2421,6 +2421,13 @@ void vmx_vmexit_handler(struct cpu_user_
|
||||||
|
vector = intr_info & INTR_INFO_VECTOR_MASK;
|
||||||
|
if ( vector == TRAP_machine_check )
|
||||||
|
do_machine_check(regs);
|
||||||
|
+ if ( vector == TRAP_nmi
|
||||||
|
+ && ((intr_info & INTR_INFO_INTR_TYPE_MASK) ==
|
||||||
|
+ (X86_EVENTTYPE_NMI << 8)) )
|
||||||
|
+ {
|
||||||
|
+ do_nmi(regs);
|
||||||
|
+ enable_nmis();
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
case EXIT_REASON_MCE_DURING_VMENTRY:
|
||||||
|
do_machine_check(regs);
|
||||||
|
@@ -2594,7 +2601,7 @@ void vmx_vmexit_handler(struct cpu_user_
|
||||||
|
(X86_EVENTTYPE_NMI << 8) )
|
||||||
|
goto exit_and_crash;
|
||||||
|
HVMTRACE_0D(NMI);
|
||||||
|
- self_nmi(); /* Real NMI, vector 2: normal processing. */
|
||||||
|
+ /* Already handled above. */
|
||||||
|
break;
|
||||||
|
case TRAP_machine_check:
|
||||||
|
HVMTRACE_0D(MCE);
|
||||||
|
--- a/xen/arch/x86/x86_32/entry.S
|
||||||
|
+++ b/xen/arch/x86/x86_32/entry.S
|
||||||
|
@@ -621,6 +621,14 @@ ENTRY(machine_check)
|
||||||
|
pushl $TRAP_machine_check<<16
|
||||||
|
jmp handle_nmi_mce
|
||||||
|
|
||||||
|
+/* Enable NMIs. No special register assumptions. All registers are preserved. */
|
||||||
|
+ENTRY(enable_nmis)
|
||||||
|
+ /* Set up stack frame */
|
||||||
|
+ pushf # EFLAGS
|
||||||
|
+ push %cs # CS
|
||||||
|
+ push $.Lret # EIP
|
||||||
|
+ iret # Disable the hardware NMI latch
|
||||||
|
+
|
||||||
|
ENTRY(setup_vm86_frame)
|
||||||
|
mov %ecx,%ds
|
||||||
|
mov %ecx,%es
|
||||||
|
@@ -634,7 +642,7 @@ ENTRY(setup_vm86_frame)
|
||||||
|
.endm
|
||||||
|
copy_vm86_words
|
||||||
|
addl $16,%esp
|
||||||
|
- ret
|
||||||
|
+.Lret: ret
|
||||||
|
|
||||||
|
.section .rodata, "a", @progbits
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/x86_64/entry.S
|
||||||
|
+++ b/xen/arch/x86/x86_64/entry.S
|
||||||
|
@@ -643,6 +643,22 @@ ENTRY(machine_check)
|
||||||
|
movl $TRAP_machine_check,4(%rsp)
|
||||||
|
jmp handle_ist_exception
|
||||||
|
|
||||||
|
+/* Enable NMIs. No special register assumptions. Only %rax is not preserved. */
|
||||||
|
+ENTRY(enable_nmis)
|
||||||
|
+ movq %rsp, %rax /* Grab RSP before pushing */
|
||||||
|
+
|
||||||
|
+ /* Set up stack frame */
|
||||||
|
+ pushq $0 /* SS */
|
||||||
|
+ pushq %rax /* RSP */
|
||||||
|
+ pushfq /* RFLAGS */
|
||||||
|
+ pushq $__HYPERVISOR_CS /* CS */
|
||||||
|
+ leaq 1f(%rip),%rax
|
||||||
|
+ pushq %rax /* RIP */
|
||||||
|
+
|
||||||
|
+ iretq /* Disable the hardware NMI latch */
|
||||||
|
+1:
|
||||||
|
+ retq
|
||||||
|
+
|
||||||
|
.section .rodata, "a", @progbits
|
||||||
|
|
||||||
|
ENTRY(exception_table)
|
||||||
|
--- a/xen/include/asm-x86/processor.h
|
||||||
|
+++ b/xen/include/asm-x86/processor.h
|
||||||
|
@@ -584,6 +584,8 @@ DECLARE_TRAP_HANDLER(alignment_check);
|
||||||
|
DECLARE_TRAP_HANDLER(spurious_interrupt_bug);
|
||||||
|
#undef DECLARE_TRAP_HANDLER
|
||||||
|
|
||||||
|
+void enable_nmis(void);
|
||||||
|
+
|
||||||
|
void syscall_enter(void);
|
||||||
|
void sysenter_entry(void);
|
||||||
|
void sysenter_eflags_saved(void);
|
@ -0,0 +1,80 @@
|
|||||||
|
# Commit 482300def7d08e773ccd2a0d978bcb9469fdd810
|
||||||
|
# Date 2013-02-28 14:56:45 +0000
|
||||||
|
# Author Juergen Gross <juergen.gross@ts.fujitsu.com>
|
||||||
|
# Committer Keir Fraser <keir@xen.org>
|
||||||
|
Avoid stale pointer when moving domain to another cpupool
|
||||||
|
|
||||||
|
When a domain is moved to another cpupool the scheduler private data pointers
|
||||||
|
in vcpu and domain structures must never point to an already freed memory
|
||||||
|
area.
|
||||||
|
|
||||||
|
While at it, simplify sched_init_vcpu() by using DOM2OP instead VCPU2OP.
|
||||||
|
|
||||||
|
Signed-off-by: Juergen Gross <juergen.gross@ts.fujitsu.com>
|
||||||
|
|
||||||
|
--- a/xen/common/schedule.c
|
||||||
|
+++ b/xen/common/schedule.c
|
||||||
|
@@ -220,7 +220,7 @@ int sched_init_vcpu(struct vcpu *v, unsi
|
||||||
|
if ( v->sched_priv == NULL )
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
- SCHED_OP(VCPU2OP(v), insert_vcpu, v);
|
||||||
|
+ SCHED_OP(DOM2OP(d), insert_vcpu, v);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -231,6 +231,9 @@ int sched_move_domain(struct domain *d,
|
||||||
|
unsigned int new_p;
|
||||||
|
void **vcpu_priv;
|
||||||
|
void *domdata;
|
||||||
|
+ void *vcpudata;
|
||||||
|
+ struct scheduler *old_ops;
|
||||||
|
+ void *old_domdata;
|
||||||
|
|
||||||
|
domdata = SCHED_OP(c->sched, alloc_domdata, d);
|
||||||
|
if ( domdata == NULL )
|
||||||
|
@@ -261,21 +264,22 @@ int sched_move_domain(struct domain *d,
|
||||||
|
|
||||||
|
domain_pause(d);
|
||||||
|
|
||||||
|
+ old_ops = DOM2OP(d);
|
||||||
|
+ old_domdata = d->sched_priv;
|
||||||
|
+
|
||||||
|
for_each_vcpu ( d, v )
|
||||||
|
{
|
||||||
|
- SCHED_OP(VCPU2OP(v), remove_vcpu, v);
|
||||||
|
- SCHED_OP(VCPU2OP(v), free_vdata, v->sched_priv);
|
||||||
|
- v->sched_priv = NULL;
|
||||||
|
+ SCHED_OP(old_ops, remove_vcpu, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
- SCHED_OP(DOM2OP(d), free_domdata, d->sched_priv);
|
||||||
|
-
|
||||||
|
d->cpupool = c;
|
||||||
|
d->sched_priv = domdata;
|
||||||
|
|
||||||
|
new_p = cpumask_first(c->cpu_valid);
|
||||||
|
for_each_vcpu ( d, v )
|
||||||
|
{
|
||||||
|
+ vcpudata = v->sched_priv;
|
||||||
|
+
|
||||||
|
migrate_timer(&v->periodic_timer, new_p);
|
||||||
|
migrate_timer(&v->singleshot_timer, new_p);
|
||||||
|
migrate_timer(&v->poll_timer, new_p);
|
||||||
|
@@ -288,12 +292,16 @@ int sched_move_domain(struct domain *d,
|
||||||
|
new_p = cpumask_cycle(new_p, c->cpu_valid);
|
||||||
|
|
||||||
|
SCHED_OP(c->sched, insert_vcpu, v);
|
||||||
|
+
|
||||||
|
+ SCHED_OP(old_ops, free_vdata, vcpudata);
|
||||||
|
}
|
||||||
|
|
||||||
|
domain_update_node_affinity(d);
|
||||||
|
|
||||||
|
domain_unpause(d);
|
||||||
|
|
||||||
|
+ SCHED_OP(old_ops, free_domdata, old_domdata);
|
||||||
|
+
|
||||||
|
xfree(vcpu_priv);
|
||||||
|
|
||||||
|
return 0;
|
@ -0,0 +1,43 @@
|
|||||||
|
changeset: 26675:3eb62c576a1a
|
||||||
|
user: Olaf Hering <olaf@aepfle.de>
|
||||||
|
date: Wed Feb 27 14:16:36 2013 +0000
|
||||||
|
files: tools/libxc/xtl_logger_stdio.c
|
||||||
|
description:
|
||||||
|
tools/xentoollog: update tty detection in stdiostream_progress
|
||||||
|
|
||||||
|
As suggested by IanJ:
|
||||||
|
Check isatty only once to preserve the errno of ->progress users, and to
|
||||||
|
reduce the noice in strace output.
|
||||||
|
|
||||||
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||||
|
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
||||||
|
|
||||||
|
|
||||||
|
diff -r 4b25c1e6cfbb -r 3eb62c576a1a tools/libxc/xtl_logger_stdio.c
|
||||||
|
--- a/tools/libxc/xtl_logger_stdio.c Wed Feb 27 11:16:47 2013 +0000
|
||||||
|
+++ b/tools/libxc/xtl_logger_stdio.c Wed Feb 27 14:16:36 2013 +0000
|
||||||
|
@@ -35,6 +35,7 @@ struct xentoollog_logger_stdiostream {
|
||||||
|
xentoollog_level min_level;
|
||||||
|
unsigned flags;
|
||||||
|
int progress_erase_len, progress_last_percent;
|
||||||
|
+ int tty;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void progress_erase(xentoollog_logger_stdiostream *lg) {
|
||||||
|
@@ -118,7 +119,7 @@ static void stdiostream_progress(struct
|
||||||
|
|
||||||
|
lg->progress_last_percent = percent;
|
||||||
|
|
||||||
|
- if (isatty(fileno(lg->f)) <= 0) {
|
||||||
|
+ if (!lg->tty) {
|
||||||
|
stdiostream_message(logger_in, this_level, context,
|
||||||
|
"%s: %lu/%lu %3d%%",
|
||||||
|
doing_what, done, total, percent);
|
||||||
|
@@ -166,6 +167,7 @@ xentoollog_logger_stdiostream *xtl_creat
|
||||||
|
newlogger.f = f;
|
||||||
|
newlogger.min_level = min_level;
|
||||||
|
newlogger.flags = flags;
|
||||||
|
+ newlogger.tty = isatty(fileno(newlogger.f)) > 0;
|
||||||
|
|
||||||
|
if (newlogger.flags & XTL_STDIOSTREAM_SHOW_DATE) tzset();
|
||||||
|
|
24
26676-fix-compat-memory-exchange-op-splitting.patch
Normal file
24
26676-fix-compat-memory-exchange-op-splitting.patch
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Commit 53decd322157e922cac2988e07da6d39538c8033
|
||||||
|
# Date 2013-03-01 16:59:49 +0100
|
||||||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
fix compat memory exchange op splitting
|
||||||
|
|
||||||
|
A shift with a negative count was erroneously used here, yielding
|
||||||
|
undefined behavior.
|
||||||
|
|
||||||
|
Reported-by: Xi Wang <xi@mit.edu>
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||||
|
Acked-by: Keir Fraser <keir@xen.org>
|
||||||
|
|
||||||
|
--- a/xen/common/compat/memory.c
|
||||||
|
+++ b/xen/common/compat/memory.c
|
||||||
|
@@ -172,7 +172,7 @@ int compat_memory_op(unsigned int cmd, X
|
||||||
|
if ( order_delta >= 0 )
|
||||||
|
nat.xchg->out.nr_extents = end_extent >> order_delta;
|
||||||
|
else
|
||||||
|
- nat.xchg->out.nr_extents = end_extent << order_delta;
|
||||||
|
+ nat.xchg->out.nr_extents = end_extent << -order_delta;
|
||||||
|
++split;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,78 @@
|
|||||||
|
# Commit 7ffc9779aa5120c5098d938cb88f69a1dda9a0fe
|
||||||
|
# Date 2013-03-04 10:16:04 +0100
|
||||||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
x86: make certain memory sub-ops return valid values
|
||||||
|
|
||||||
|
When a domain's shared info field "max_pfn" is zero,
|
||||||
|
domain_get_maximum_gpfn() so far returned ULONG_MAX, which
|
||||||
|
do_memory_op() in turn converted to -1 (i.e. -EPERM). Make the former
|
||||||
|
always return a sensible number (i.e. zero if the field was zero) and
|
||||||
|
have the latter no longer truncate return values.
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||||
|
Acked-by: Tim Deegan <tim@xen.org>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/mm.c
|
||||||
|
+++ b/xen/arch/x86/mm.c
|
||||||
|
@@ -437,7 +437,7 @@ unsigned long domain_get_maximum_gpfn(st
|
||||||
|
if ( is_hvm_domain(d) )
|
||||||
|
return p2m_get_hostp2m(d)->max_mapped_pfn;
|
||||||
|
/* NB. PV guests specify nr_pfns rather than max_pfn so we adjust here. */
|
||||||
|
- return arch_get_max_pfn(d) - 1;
|
||||||
|
+ return (arch_get_max_pfn(d) ?: 1) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void share_xen_page_with_guest(
|
||||||
|
--- a/xen/common/compat/memory.c
|
||||||
|
+++ b/xen/common/compat/memory.c
|
||||||
|
@@ -15,7 +15,8 @@ CHECK_TYPE(domid);
|
||||||
|
|
||||||
|
int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE(void) compat)
|
||||||
|
{
|
||||||
|
- int rc, split, op = cmd & MEMOP_CMD_MASK;
|
||||||
|
+ int split, op = cmd & MEMOP_CMD_MASK;
|
||||||
|
+ long rc;
|
||||||
|
unsigned int start_extent = cmd >> MEMOP_EXTENT_SHIFT;
|
||||||
|
|
||||||
|
do
|
||||||
|
@@ -204,7 +205,7 @@ int compat_memory_op(unsigned int cmd, X
|
||||||
|
|
||||||
|
rc = do_memory_op(cmd, nat.hnd);
|
||||||
|
if ( rc < 0 )
|
||||||
|
- return rc;
|
||||||
|
+ break;
|
||||||
|
|
||||||
|
cmd = 0;
|
||||||
|
if ( hypercall_xlat_continuation(&cmd, 0x02, nat.hnd, compat) )
|
||||||
|
@@ -318,5 +319,11 @@ int compat_memory_op(unsigned int cmd, X
|
||||||
|
__HYPERVISOR_memory_op, "ih", cmd, compat);
|
||||||
|
} while ( split > 0 );
|
||||||
|
|
||||||
|
+ if ( unlikely(rc > INT_MAX) )
|
||||||
|
+ return INT_MAX;
|
||||||
|
+
|
||||||
|
+ if ( unlikely(rc < INT_MIN) )
|
||||||
|
+ return INT_MIN;
|
||||||
|
+
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
--- a/xen/common/memory.c
|
||||||
|
+++ b/xen/common/memory.c
|
||||||
|
@@ -532,14 +532,13 @@ static long memory_exchange(XEN_GUEST_HA
|
||||||
|
long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE(void) arg)
|
||||||
|
{
|
||||||
|
struct domain *d;
|
||||||
|
- int rc, op;
|
||||||
|
+ long rc;
|
||||||
|
unsigned int address_bits;
|
||||||
|
unsigned long start_extent;
|
||||||
|
struct xen_memory_reservation reservation;
|
||||||
|
struct memop_args args;
|
||||||
|
domid_t domid;
|
||||||
|
-
|
||||||
|
- op = cmd & MEMOP_CMD_MASK;
|
||||||
|
+ int op = cmd & MEMOP_CMD_MASK;
|
||||||
|
|
||||||
|
switch ( op )
|
||||||
|
{
|
58
26678-SEDF-avoid-gathering-vCPU-s-on-pCPU0.patch
Normal file
58
26678-SEDF-avoid-gathering-vCPU-s-on-pCPU0.patch
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# Commit e6a6fd63652814e5c36a0016c082032f798ced1f
|
||||||
|
# Date 2013-03-04 10:17:52 +0100
|
||||||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
SEDF: avoid gathering vCPU-s on pCPU0
|
||||||
|
|
||||||
|
The introduction of vcpu_force_reschedule() in 14320:215b799fa181 was
|
||||||
|
incompatible with the SEDF scheduler: Any vCPU using
|
||||||
|
VCPUOP_stop_periodic_timer (e.g. any vCPU of half way modern PV Linux
|
||||||
|
guests) ends up on pCPU0 after that call. Obviously, running all PV
|
||||||
|
guests' (and namely Dom0's) vCPU-s on pCPU0 causes problems for those
|
||||||
|
guests rather sooner than later.
|
||||||
|
|
||||||
|
So the main thing that was clearly wrong (and bogus from the beginning)
|
||||||
|
was the use of cpumask_first() in sedf_pick_cpu(). It is being replaced
|
||||||
|
by a construct that prefers to put back the vCPU on the pCPU that it
|
||||||
|
got launched on.
|
||||||
|
|
||||||
|
However, there's one more glitch: When reducing the affinity of a vCPU
|
||||||
|
temporarily, and then widening it again to a set that includes the pCPU
|
||||||
|
that the vCPU was last running on, the generic scheduler code would not
|
||||||
|
force a migration of that vCPU, and hence it would forever stay on the
|
||||||
|
pCPU it last ran on. Since that can again create a load imbalance, the
|
||||||
|
SEDF scheduler wants a migration to happen regardless of it being
|
||||||
|
apparently unnecessary.
|
||||||
|
|
||||||
|
Of course, an alternative to checking for SEDF explicitly in
|
||||||
|
vcpu_set_affinity() would be to introduce a flags field in struct
|
||||||
|
scheduler, and have SEDF set a "always-migrate-on-affinity-change"
|
||||||
|
flag.
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||||
|
Acked-by: Keir Fraser <keir@xen.org>
|
||||||
|
|
||||||
|
--- a/xen/common/sched_sedf.c
|
||||||
|
+++ b/xen/common/sched_sedf.c
|
||||||
|
@@ -396,7 +396,8 @@ static int sedf_pick_cpu(const struct sc
|
||||||
|
|
||||||
|
online = cpupool_scheduler_cpumask(v->domain->cpupool);
|
||||||
|
cpumask_and(&online_affinity, v->cpu_affinity, online);
|
||||||
|
- return cpumask_first(&online_affinity);
|
||||||
|
+ return cpumask_cycle(v->vcpu_id % cpumask_weight(&online_affinity) - 1,
|
||||||
|
+ &online_affinity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
--- a/xen/common/schedule.c
|
||||||
|
+++ b/xen/common/schedule.c
|
||||||
|
@@ -611,7 +611,8 @@ int vcpu_set_affinity(struct vcpu *v, co
|
||||||
|
vcpu_schedule_lock_irq(v);
|
||||||
|
|
||||||
|
cpumask_copy(v->cpu_affinity, affinity);
|
||||||
|
- if ( !cpumask_test_cpu(v->processor, v->cpu_affinity) )
|
||||||
|
+ if ( VCPU2OP(v)->sched_id == XEN_SCHEDULER_SEDF ||
|
||||||
|
+ !cpumask_test_cpu(v->processor, v->cpu_affinity) )
|
||||||
|
set_bit(_VPF_migrating, &v->pause_flags);
|
||||||
|
|
||||||
|
vcpu_schedule_unlock_irq(v);
|
134
26679-x86-defer-processing-events-on-the-NMI-exit-path.patch
Normal file
134
26679-x86-defer-processing-events-on-the-NMI-exit-path.patch
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
# Commit d463b005bbd6475ed930a302821efe239e1b2cf9
|
||||||
|
# Date 2013-03-04 10:19:34 +0100
|
||||||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
x86: defer processing events on the NMI exit path
|
||||||
|
|
||||||
|
Otherwise, we may end up in the scheduler, keeping NMIs masked for a
|
||||||
|
possibly unbounded period of time (until whenever the next IRET gets
|
||||||
|
executed). Enforce timely event processing by sending a self IPI.
|
||||||
|
|
||||||
|
Of course it's open for discussion whether to always use the straight
|
||||||
|
exit path from handle_ist_exception.
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||||
|
Acked-by: Keir Fraser <keir@xen.org>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/x86_32/entry.S
|
||||||
|
+++ b/xen/arch/x86/x86_32/entry.S
|
||||||
|
@@ -60,6 +60,7 @@
|
||||||
|
#include <asm/apicdef.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
#include <public/xen.h>
|
||||||
|
+#include <irq_vectors.h>
|
||||||
|
|
||||||
|
ALIGN
|
||||||
|
restore_all_guest:
|
||||||
|
@@ -561,6 +562,8 @@ ENTRY(early_page_fault)
|
||||||
|
jmp restore_all_xen
|
||||||
|
.popsection
|
||||||
|
|
||||||
|
+ENTRY(nmi)
|
||||||
|
+ pushl $TRAP_nmi<<16
|
||||||
|
handle_nmi_mce:
|
||||||
|
#ifdef CONFIG_X86_SUPERVISOR_MODE_KERNEL
|
||||||
|
# NMI/MCE entry protocol is incompatible with guest kernel in ring 0.
|
||||||
|
@@ -581,7 +584,24 @@ handle_nmi_mce:
|
||||||
|
* cases we have put guest DS/ES on the guest stack frame, which will
|
||||||
|
* be detected by SAVE_ALL(), or we have rolled back restore_guest.
|
||||||
|
*/
|
||||||
|
- jmp ret_from_intr
|
||||||
|
+ cmpb $TRAP_nmi,UREGS_entry_vector(%esp)
|
||||||
|
+ jne ret_from_intr
|
||||||
|
+ /* We want to get straight to the IRET on the NMI exit path. */
|
||||||
|
+ GET_CURRENT(%ebx)
|
||||||
|
+ movl UREGS_eflags(%esp),%eax
|
||||||
|
+ movb UREGS_cs(%esp),%al
|
||||||
|
+ testl $(3|X86_EFLAGS_VM),%eax
|
||||||
|
+ jz restore_all_xen
|
||||||
|
+ /* Send an IPI to ourselves to cover for the lack of event checking. */
|
||||||
|
+ movl VCPU_processor(%ebx),%eax
|
||||||
|
+ shll $IRQSTAT_shift,%eax
|
||||||
|
+ cmpl $0,irq_stat(%eax)
|
||||||
|
+ je restore_all_guest
|
||||||
|
+ pushl $EVENT_CHECK_VECTOR
|
||||||
|
+ call send_IPI_self
|
||||||
|
+ addl $4,%esp
|
||||||
|
+ jmp restore_all_guest
|
||||||
|
+
|
||||||
|
.Lnmi_mce_xen:
|
||||||
|
/* Check the outer (guest) context for %ds/%es state validity. */
|
||||||
|
GET_CPUINFO_FIELD(CPUINFO_guest_cpu_user_regs,%ebx)
|
||||||
|
@@ -613,10 +633,6 @@ handle_nmi_mce:
|
||||||
|
jmp .Lnmi_mce_common
|
||||||
|
#endif /* !CONFIG_X86_SUPERVISOR_MODE_KERNEL */
|
||||||
|
|
||||||
|
-ENTRY(nmi)
|
||||||
|
- pushl $TRAP_nmi<<16
|
||||||
|
- jmp handle_nmi_mce
|
||||||
|
-
|
||||||
|
ENTRY(machine_check)
|
||||||
|
pushl $TRAP_machine_check<<16
|
||||||
|
jmp handle_nmi_mce
|
||||||
|
--- a/xen/arch/x86/x86_64/compat/entry.S
|
||||||
|
+++ b/xen/arch/x86/x86_64/compat/entry.S
|
||||||
|
@@ -171,7 +171,7 @@ compat_bad_hypercall:
|
||||||
|
jmp compat_test_all_events
|
||||||
|
|
||||||
|
/* %rbx: struct vcpu, interrupts disabled */
|
||||||
|
-compat_restore_all_guest:
|
||||||
|
+ENTRY(compat_restore_all_guest)
|
||||||
|
ASSERT_INTERRUPTS_DISABLED
|
||||||
|
RESTORE_ALL
|
||||||
|
addq $8,%rsp
|
||||||
|
--- a/xen/arch/x86/x86_64/entry.S
|
||||||
|
+++ b/xen/arch/x86/x86_64/entry.S
|
||||||
|
@@ -11,6 +11,7 @@
|
||||||
|
#include <asm/apicdef.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
#include <public/xen.h>
|
||||||
|
+#include <irq_vectors.h>
|
||||||
|
|
||||||
|
ALIGN
|
||||||
|
/* %rbx: struct vcpu */
|
||||||
|
@@ -617,6 +618,9 @@ ENTRY(early_page_fault)
|
||||||
|
jmp restore_all_xen
|
||||||
|
.popsection
|
||||||
|
|
||||||
|
+ENTRY(nmi)
|
||||||
|
+ pushq $0
|
||||||
|
+ movl $TRAP_nmi,4(%rsp)
|
||||||
|
handle_ist_exception:
|
||||||
|
SAVE_ALL
|
||||||
|
testb $3,UREGS_cs(%rsp)
|
||||||
|
@@ -631,12 +635,25 @@ handle_ist_exception:
|
||||||
|
movl UREGS_entry_vector(%rsp),%eax
|
||||||
|
leaq exception_table(%rip),%rdx
|
||||||
|
callq *(%rdx,%rax,8)
|
||||||
|
- jmp ret_from_intr
|
||||||
|
+ cmpb $TRAP_nmi,UREGS_entry_vector(%rsp)
|
||||||
|
+ jne ret_from_intr
|
||||||
|
|
||||||
|
-ENTRY(nmi)
|
||||||
|
- pushq $0
|
||||||
|
- movl $TRAP_nmi,4(%rsp)
|
||||||
|
- jmp handle_ist_exception
|
||||||
|
+ /* We want to get straight to the IRET on the NMI exit path. */
|
||||||
|
+ testb $3,UREGS_cs(%rsp)
|
||||||
|
+ jz restore_all_xen
|
||||||
|
+ GET_CURRENT(%rbx)
|
||||||
|
+ /* Send an IPI to ourselves to cover for the lack of event checking. */
|
||||||
|
+ movl VCPU_processor(%rbx),%eax
|
||||||
|
+ shll $IRQSTAT_shift,%eax
|
||||||
|
+ leaq irq_stat(%rip),%rcx
|
||||||
|
+ cmpl $0,(%rcx,%rax,1)
|
||||||
|
+ je 1f
|
||||||
|
+ movl $EVENT_CHECK_VECTOR,%edi
|
||||||
|
+ call send_IPI_self
|
||||||
|
+1: movq VCPU_domain(%rbx),%rax
|
||||||
|
+ cmpb $0,DOMAIN_is_32bit_pv(%rax)
|
||||||
|
+ je restore_all_guest
|
||||||
|
+ jmp compat_restore_all_guest
|
||||||
|
|
||||||
|
ENTRY(machine_check)
|
||||||
|
pushq $0
|
@ -0,0 +1,113 @@
|
|||||||
|
# Commit be6507509454adf3bb5a50b9406c88504e996d5a
|
||||||
|
# Date 2013-03-04 13:37:39 +0100
|
||||||
|
# Author George Dunlap <george.dunlap@eu.citrix.com>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
credit1: Use atomic bit operations for the flags structure
|
||||||
|
|
||||||
|
The flags structure is not protected by locks (or more precisely,
|
||||||
|
it is protected using an inconsistent set of locks); we therefore need
|
||||||
|
to make sure that all accesses are atomic-safe. This is particulary
|
||||||
|
important in the case of the PARKED flag, which if clobbered while
|
||||||
|
changing the YIELD bit will leave a vcpu wedged in an offline state.
|
||||||
|
|
||||||
|
Using the atomic bitops also requires us to change the size of the "flags"
|
||||||
|
element.
|
||||||
|
|
||||||
|
Spotted-by: Igor Pavlikevich <ipavlikevich@gmail.com>
|
||||||
|
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
|
||||||
|
|
||||||
|
--- a/xen/common/sched_credit.c
|
||||||
|
+++ b/xen/common/sched_credit.c
|
||||||
|
@@ -58,8 +58,8 @@
|
||||||
|
/*
|
||||||
|
* Flags
|
||||||
|
*/
|
||||||
|
-#define CSCHED_FLAG_VCPU_PARKED 0x0001 /* VCPU over capped credits */
|
||||||
|
-#define CSCHED_FLAG_VCPU_YIELD 0x0002 /* VCPU yielding */
|
||||||
|
+#define CSCHED_FLAG_VCPU_PARKED 0x0 /* VCPU over capped credits */
|
||||||
|
+#define CSCHED_FLAG_VCPU_YIELD 0x1 /* VCPU yielding */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -132,7 +132,7 @@ struct csched_vcpu {
|
||||||
|
struct vcpu *vcpu;
|
||||||
|
atomic_t credit;
|
||||||
|
s_time_t start_time; /* When we were scheduled (used for credit) */
|
||||||
|
- uint16_t flags;
|
||||||
|
+ unsigned flags;
|
||||||
|
int16_t pri;
|
||||||
|
#ifdef CSCHED_STATS
|
||||||
|
struct {
|
||||||
|
@@ -214,7 +214,7 @@ __runq_insert(unsigned int cpu, struct c
|
||||||
|
/* If the vcpu yielded, try to put it behind one lower-priority
|
||||||
|
* runnable vcpu if we can. The next runq_sort will bring it forward
|
||||||
|
* within 30ms if the queue too long. */
|
||||||
|
- if ( svc->flags & CSCHED_FLAG_VCPU_YIELD
|
||||||
|
+ if ( test_bit(CSCHED_FLAG_VCPU_YIELD, &svc->flags)
|
||||||
|
&& __runq_elem(iter)->pri > CSCHED_PRI_IDLE )
|
||||||
|
{
|
||||||
|
iter=iter->next;
|
||||||
|
@@ -776,7 +776,7 @@ csched_vcpu_wake(const struct scheduler
|
||||||
|
* those.
|
||||||
|
*/
|
||||||
|
if ( svc->pri == CSCHED_PRI_TS_UNDER &&
|
||||||
|
- !(svc->flags & CSCHED_FLAG_VCPU_PARKED) )
|
||||||
|
+ !test_bit(CSCHED_FLAG_VCPU_PARKED, &svc->flags) )
|
||||||
|
{
|
||||||
|
svc->pri = CSCHED_PRI_TS_BOOST;
|
||||||
|
}
|
||||||
|
@@ -789,12 +789,12 @@ csched_vcpu_wake(const struct scheduler
|
||||||
|
static void
|
||||||
|
csched_vcpu_yield(const struct scheduler *ops, struct vcpu *vc)
|
||||||
|
{
|
||||||
|
- struct csched_vcpu * const sv = CSCHED_VCPU(vc);
|
||||||
|
+ struct csched_vcpu * const svc = CSCHED_VCPU(vc);
|
||||||
|
|
||||||
|
if ( !sched_credit_default_yield )
|
||||||
|
{
|
||||||
|
/* Let the scheduler know that this vcpu is trying to yield */
|
||||||
|
- sv->flags |= CSCHED_FLAG_VCPU_YIELD;
|
||||||
|
+ set_bit(CSCHED_FLAG_VCPU_YIELD, &svc->flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1122,11 +1122,10 @@ csched_acct(void* dummy)
|
||||||
|
/* Park running VCPUs of capped-out domains */
|
||||||
|
if ( sdom->cap != 0U &&
|
||||||
|
credit < -credit_cap &&
|
||||||
|
- !(svc->flags & CSCHED_FLAG_VCPU_PARKED) )
|
||||||
|
+ !test_and_set_bit(CSCHED_FLAG_VCPU_PARKED, &svc->flags) )
|
||||||
|
{
|
||||||
|
CSCHED_STAT_CRANK(vcpu_park);
|
||||||
|
vcpu_pause_nosync(svc->vcpu);
|
||||||
|
- svc->flags |= CSCHED_FLAG_VCPU_PARKED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lower bound on credits */
|
||||||
|
@@ -1142,7 +1141,7 @@ csched_acct(void* dummy)
|
||||||
|
svc->pri = CSCHED_PRI_TS_UNDER;
|
||||||
|
|
||||||
|
/* Unpark any capped domains whose credits go positive */
|
||||||
|
- if ( svc->flags & CSCHED_FLAG_VCPU_PARKED)
|
||||||
|
+ if ( test_and_clear_bit(CSCHED_FLAG_VCPU_PARKED, &svc->flags) )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* It's important to unset the flag AFTER the unpause()
|
||||||
|
@@ -1151,7 +1150,6 @@ csched_acct(void* dummy)
|
||||||
|
*/
|
||||||
|
CSCHED_STAT_CRANK(vcpu_unpark);
|
||||||
|
vcpu_unpause(svc->vcpu);
|
||||||
|
- svc->flags &= ~CSCHED_FLAG_VCPU_PARKED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Upper bound on credits means VCPU stops earning */
|
||||||
|
@@ -1410,8 +1408,7 @@ csched_schedule(
|
||||||
|
/*
|
||||||
|
* Clear YIELD flag before scheduling out
|
||||||
|
*/
|
||||||
|
- if ( scurr->flags & CSCHED_FLAG_VCPU_YIELD )
|
||||||
|
- scurr->flags &= ~(CSCHED_FLAG_VCPU_YIELD);
|
||||||
|
+ clear_bit(CSCHED_FLAG_VCPU_YIELD, &scurr->flags);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SMP Load balance:
|
36
26686-xentrace-fix-off-by-one-in-calculate_tbuf_size.patch
Normal file
36
26686-xentrace-fix-off-by-one-in-calculate_tbuf_size.patch
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# Commit d9fb28ae6d41c8201482948660e52889481830dd
|
||||||
|
# Date 2013-03-04 13:42:17 +0100
|
||||||
|
# Author Olaf Hering <olaf@aepfle.de>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
xentrace: fix off-by-one in calculate_tbuf_size
|
||||||
|
|
||||||
|
Commit "xentrace: reduce trace buffer size to something mfn_offset can
|
||||||
|
reach" contains an off-by-one bug. max_mfn_offset needs to be reduced by
|
||||||
|
exactly the value of t_info_first_offset.
|
||||||
|
|
||||||
|
If the system has two cpus and the number of requested trace pages is
|
||||||
|
very large, the final number of trace pages + the offset will not fit
|
||||||
|
into a short. As a result the variable offset in alloc_trace_bufs() will
|
||||||
|
wrap while allocating buffers for the second cpu. Later
|
||||||
|
share_xen_page_with_privileged_guests() will be called with a wrong page
|
||||||
|
and the ASSERT in this function triggers. If the ASSERT is ignored by
|
||||||
|
running a non-dbg hypervisor the asserts in xentrace itself trigger
|
||||||
|
because "cons" is not aligned because the very last trace page for the
|
||||||
|
second cpu is a random mfn.
|
||||||
|
|
||||||
|
Thanks to Jan for the quick analysis.
|
||||||
|
|
||||||
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||||
|
Acked-by: George Dunlap <george.dunlap@eu.citrix.com>
|
||||||
|
|
||||||
|
--- a/xen/common/trace.c
|
||||||
|
+++ b/xen/common/trace.c
|
||||||
|
@@ -133,7 +133,7 @@ static int calculate_tbuf_size(unsigned
|
||||||
|
* The array of mfns for the highest cpu can start at the maximum value
|
||||||
|
* mfn_offset can hold. So reduce the number of cpus and also the mfn_offset.
|
||||||
|
*/
|
||||||
|
- max_mfn_offset -= t_info_first_offset - 1;
|
||||||
|
+ max_mfn_offset -= t_info_first_offset;
|
||||||
|
max_cpus--;
|
||||||
|
if ( max_cpus )
|
||||||
|
max_mfn_offset /= max_cpus;
|
25
26689-fix-domain-unlocking-in-some-xsm-error-paths.patch
Normal file
25
26689-fix-domain-unlocking-in-some-xsm-error-paths.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# Commit 9581c4f9a55372a21e759cd449cb676d0e8feddb
|
||||||
|
# Date 2013-03-06 17:10:26 +0100
|
||||||
|
# Author Matthew Daley <mattjd@gmail.com>
|
||||||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||||||
|
fix domain unlocking in some xsm error paths
|
||||||
|
|
||||||
|
A couple of xsm error/access-denied code paths in hypercalls neglect to
|
||||||
|
unlock a previously locked domain. Fix by ensuring the domains are
|
||||||
|
unlocked correctly.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Daley <mattjd@gmail.com>
|
||||||
|
Reviewed-by: Jan Beulich <jbeulich@suse.com>
|
||||||
|
Acked-by: Keir Fraser <keir@xen.org>
|
||||||
|
|
||||||
|
--- a/xen/common/grant_table.c
|
||||||
|
+++ b/xen/common/grant_table.c
|
||||||
|
@@ -2262,7 +2262,7 @@ gnttab_get_status_frames(XEN_GUEST_HANDL
|
||||||
|
rc = xsm_grant_setup(current->domain, d);
|
||||||
|
if ( rc ) {
|
||||||
|
op.status = GNTST_permission_denied;
|
||||||
|
- goto out1;
|
||||||
|
+ goto out2;
|
||||||
|
}
|
||||||
|
|
||||||
|
gt = d->grant_table;
|
@ -2,7 +2,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -2966,7 +2966,7 @@ class XendDomainInfo:
|
@@ -2982,7 +2982,7 @@ class XendDomainInfo:
|
||||||
|
|
||||||
self.guest_bitsize = self.image.getBitSize()
|
self.guest_bitsize = self.image.getBitSize()
|
||||||
# Make sure there's enough RAM available for the domain
|
# Make sure there's enough RAM available for the domain
|
||||||
|
@ -9,10 +9,10 @@
|
|||||||
xen/include/public/io/cdromif.h | 122 ++++
|
xen/include/public/io/cdromif.h | 122 ++++
|
||||||
8 files changed, 726 insertions(+), 3 deletions(-)
|
8 files changed, 726 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/tools/blktap/drivers/Makefile
|
Index: xen-4.2.1-testing/tools/blktap/drivers/Makefile
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/blktap/drivers/Makefile
|
--- xen-4.2.1-testing.orig/tools/blktap/drivers/Makefile
|
||||||
+++ xen-4.2.0-testing/tools/blktap/drivers/Makefile
|
+++ xen-4.2.1-testing/tools/blktap/drivers/Makefile
|
||||||
@@ -38,8 +38,9 @@ endif
|
@@ -38,8 +38,9 @@ endif
|
||||||
CFLAGS += $(PTHREAD_CFLAGS)
|
CFLAGS += $(PTHREAD_CFLAGS)
|
||||||
LDFLAGS += $(PTHREAD_LDFLAGS)
|
LDFLAGS += $(PTHREAD_LDFLAGS)
|
||||||
@ -33,11 +33,11 @@ Index: xen-4.2.0-testing/tools/blktap/drivers/Makefile
|
|||||||
BLK-OBJS-y += aes.o
|
BLK-OBJS-y += aes.o
|
||||||
BLK-OBJS-y += tapaio.o
|
BLK-OBJS-y += tapaio.o
|
||||||
BLK-OBJS-$(CONFIG_Linux) += blk_linux.o
|
BLK-OBJS-$(CONFIG_Linux) += blk_linux.o
|
||||||
Index: xen-4.2.0-testing/tools/blktap/drivers/block-cdrom.c
|
Index: xen-4.2.1-testing/tools/blktap/drivers/block-cdrom.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ xen-4.2.0-testing/tools/blktap/drivers/block-cdrom.c
|
+++ xen-4.2.1-testing/tools/blktap/drivers/block-cdrom.c
|
||||||
@@ -0,0 +1,565 @@
|
@@ -0,0 +1,568 @@
|
||||||
+/* block-cdrom.c
|
+/* block-cdrom.c
|
||||||
+ *
|
+ *
|
||||||
+ * simple slow synchronous cdrom disk implementation. Based off
|
+ * simple slow synchronous cdrom disk implementation. Based off
|
||||||
@ -514,6 +514,9 @@ Index: xen-4.2.0-testing/tools/blktap/drivers/block-cdrom.c
|
|||||||
+ unsigned int len;
|
+ unsigned int len;
|
||||||
+
|
+
|
||||||
+ media_present = xs_read(prv->xs_handle, XBT_NULL, vec[XS_WATCH_PATH], &len);
|
+ media_present = xs_read(prv->xs_handle, XBT_NULL, vec[XS_WATCH_PATH], &len);
|
||||||
|
+ if (media_present == NULL)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
+ if (strcmp(media_present, "0") == 0) {
|
+ if (strcmp(media_present, "0") == 0) {
|
||||||
+ close(prv->fd);
|
+ close(prv->fd);
|
||||||
+ prv->fd = -1;
|
+ prv->fd = -1;
|
||||||
@ -603,10 +606,10 @@ Index: xen-4.2.0-testing/tools/blktap/drivers/block-cdrom.c
|
|||||||
+ .td_get_parent_id = tdcdrom_get_parent_id,
|
+ .td_get_parent_id = tdcdrom_get_parent_id,
|
||||||
+ .td_validate_parent = tdcdrom_validate_parent
|
+ .td_validate_parent = tdcdrom_validate_parent
|
||||||
+};
|
+};
|
||||||
Index: xen-4.2.0-testing/tools/blktap/drivers/tapdisk.c
|
Index: xen-4.2.1-testing/tools/blktap/drivers/tapdisk.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/blktap/drivers/tapdisk.c
|
--- xen-4.2.1-testing.orig/tools/blktap/drivers/tapdisk.c
|
||||||
+++ xen-4.2.0-testing/tools/blktap/drivers/tapdisk.c
|
+++ xen-4.2.1-testing/tools/blktap/drivers/tapdisk.c
|
||||||
@@ -735,6 +735,22 @@ static void get_io_request(struct td_sta
|
@@ -735,6 +735,22 @@ static void get_io_request(struct td_sta
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -630,10 +633,10 @@ Index: xen-4.2.0-testing/tools/blktap/drivers/tapdisk.c
|
|||||||
default:
|
default:
|
||||||
DPRINTF("Unknown block operation\n");
|
DPRINTF("Unknown block operation\n");
|
||||||
break;
|
break;
|
||||||
Index: xen-4.2.0-testing/tools/blktap/drivers/tapdisk.h
|
Index: xen-4.2.1-testing/tools/blktap/drivers/tapdisk.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/blktap/drivers/tapdisk.h
|
--- xen-4.2.1-testing.orig/tools/blktap/drivers/tapdisk.h
|
||||||
+++ xen-4.2.0-testing/tools/blktap/drivers/tapdisk.h
|
+++ xen-4.2.1-testing/tools/blktap/drivers/tapdisk.h
|
||||||
@@ -137,6 +137,9 @@ struct tap_disk {
|
@@ -137,6 +137,9 @@ struct tap_disk {
|
||||||
int (*td_get_parent_id) (struct disk_driver *dd, struct disk_id *id);
|
int (*td_get_parent_id) (struct disk_driver *dd, struct disk_id *id);
|
||||||
int (*td_validate_parent)(struct disk_driver *dd,
|
int (*td_validate_parent)(struct disk_driver *dd,
|
||||||
@ -678,10 +681,10 @@ Index: xen-4.2.0-testing/tools/blktap/drivers/tapdisk.h
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef struct driver_list_entry {
|
typedef struct driver_list_entry {
|
||||||
Index: xen-4.2.0-testing/tools/blktap/lib/blktaplib.h
|
Index: xen-4.2.1-testing/tools/blktap/lib/blktaplib.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/blktap/lib/blktaplib.h
|
--- xen-4.2.1-testing.orig/tools/blktap/lib/blktaplib.h
|
||||||
+++ xen-4.2.0-testing/tools/blktap/lib/blktaplib.h
|
+++ xen-4.2.1-testing/tools/blktap/lib/blktaplib.h
|
||||||
@@ -219,6 +219,7 @@ typedef struct msg_pid {
|
@@ -219,6 +219,7 @@ typedef struct msg_pid {
|
||||||
#define DISK_TYPE_RAM 3
|
#define DISK_TYPE_RAM 3
|
||||||
#define DISK_TYPE_QCOW 4
|
#define DISK_TYPE_QCOW 4
|
||||||
@ -690,10 +693,10 @@ Index: xen-4.2.0-testing/tools/blktap/lib/blktaplib.h
|
|||||||
|
|
||||||
/* xenstore/xenbus: */
|
/* xenstore/xenbus: */
|
||||||
#define DOMNAME "Domain-0"
|
#define DOMNAME "Domain-0"
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/server/BlktapController.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/server/BlktapController.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/server/BlktapController.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/server/BlktapController.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/server/BlktapController.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/server/BlktapController.py
|
||||||
@@ -15,6 +15,7 @@ blktap1_disk_types = [
|
@@ -15,6 +15,7 @@ blktap1_disk_types = [
|
||||||
'ram',
|
'ram',
|
||||||
'qcow',
|
'qcow',
|
||||||
@ -702,10 +705,10 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/server/BlktapController.py
|
|||||||
'ioemu',
|
'ioemu',
|
||||||
]
|
]
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/xen/include/public/io/blkif.h
|
Index: xen-4.2.1-testing/xen/include/public/io/blkif.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/xen/include/public/io/blkif.h
|
--- xen-4.2.1-testing.orig/xen/include/public/io/blkif.h
|
||||||
+++ xen-4.2.0-testing/xen/include/public/io/blkif.h
|
+++ xen-4.2.1-testing/xen/include/public/io/blkif.h
|
||||||
@@ -379,7 +379,7 @@
|
@@ -379,7 +379,7 @@
|
||||||
* Used in SLES sources for device specific command packet
|
* Used in SLES sources for device specific command packet
|
||||||
* contained within the request. Reserved for that purpose.
|
* contained within the request. Reserved for that purpose.
|
||||||
@ -715,10 +718,10 @@ Index: xen-4.2.0-testing/xen/include/public/io/blkif.h
|
|||||||
/*
|
/*
|
||||||
* Indicate to the backend device that a region of storage is no longer in
|
* Indicate to the backend device that a region of storage is no longer in
|
||||||
* use, and may be discarded at any time without impact to the client. If
|
* use, and may be discarded at any time without impact to the client. If
|
||||||
Index: xen-4.2.0-testing/xen/include/public/io/cdromif.h
|
Index: xen-4.2.1-testing/xen/include/public/io/cdromif.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ xen-4.2.0-testing/xen/include/public/io/cdromif.h
|
+++ xen-4.2.1-testing/xen/include/public/io/cdromif.h
|
||||||
@@ -0,0 +1,122 @@
|
@@ -0,0 +1,122 @@
|
||||||
+/******************************************************************************
|
+/******************************************************************************
|
||||||
+ * cdromif.h
|
+ * cdromif.h
|
||||||
|
14
blktap.patch
14
blktap.patch
@ -1,11 +1,11 @@
|
|||||||
bug #239173
|
bug #239173
|
||||||
bug #242953
|
bug #242953
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -3301,7 +3301,7 @@ class XendDomainInfo:
|
@@ -3315,7 +3315,7 @@ class XendDomainInfo:
|
||||||
(fn, BOOTLOADER_LOOPBACK_DEVICE))
|
(fn, BOOTLOADER_LOOPBACK_DEVICE))
|
||||||
|
|
||||||
vbd = {
|
vbd = {
|
||||||
@ -14,10 +14,10 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
'device': BOOTLOADER_LOOPBACK_DEVICE,
|
'device': BOOTLOADER_LOOPBACK_DEVICE,
|
||||||
}
|
}
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
Index: xen-4.2.1-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
--- xen-4.2.1-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||||
+++ xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
+++ xen-4.2.1-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||||
@@ -447,9 +447,9 @@ void xenstore_parse_domain_config(int hv
|
@@ -447,9 +447,9 @@ void xenstore_parse_domain_config(int hv
|
||||||
{
|
{
|
||||||
char **e_danger = NULL;
|
char **e_danger = NULL;
|
||||||
|
@ -2,10 +2,10 @@ Add support of change-vnc-password while vm is running.
|
|||||||
|
|
||||||
Signed-off-by: Chunyan Liu <cyliu@novell.com>
|
Signed-off-by: Chunyan Liu <cyliu@novell.com>
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
Index: xen-4.2.1-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/qemu-xen-traditional-dir-remote/vl.c
|
--- xen-4.2.1-testing.orig/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||||
+++ xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
+++ xen-4.2.1-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
||||||
@@ -200,7 +200,7 @@ DriveInfo drives_table[MAX_DRIVES+1];
|
@@ -200,7 +200,7 @@ DriveInfo drives_table[MAX_DRIVES+1];
|
||||||
int nb_drives;
|
int nb_drives;
|
||||||
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
|
enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
|
||||||
@ -15,10 +15,10 @@ Index: xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/vl.c
|
|||||||
int nographic;
|
int nographic;
|
||||||
static int curses;
|
static int curses;
|
||||||
static int sdl;
|
static int sdl;
|
||||||
Index: xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
Index: xen-4.2.1-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/qemu-xen-traditional-dir-remote/vnc.c
|
--- xen-4.2.1-testing.orig/tools/qemu-xen-traditional-dir-remote/vnc.c
|
||||||
+++ xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
+++ xen-4.2.1-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
||||||
@@ -2627,6 +2627,7 @@ int vnc_display_password(DisplayState *d
|
@@ -2627,6 +2627,7 @@ int vnc_display_password(DisplayState *d
|
||||||
if (password && password[0]) {
|
if (password && password[0]) {
|
||||||
if (!(vs->password = qemu_strdup(password)))
|
if (!(vs->password = qemu_strdup(password)))
|
||||||
@ -27,10 +27,10 @@ Index: xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
|||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
Index: xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
Index: xen-4.2.1-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
--- xen-4.2.1-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||||
+++ xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
+++ xen-4.2.1-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
||||||
@@ -24,6 +24,7 @@
|
@@ -24,6 +24,7 @@
|
||||||
#include "qemu-timer.h"
|
#include "qemu-timer.h"
|
||||||
#include "qemu-xen.h"
|
#include "qemu-xen.h"
|
||||||
@ -59,11 +59,11 @@ Index: xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
|
|||||||
} else if (!strncmp(command, "usb-add", len)) {
|
} else if (!strncmp(command, "usb-add", len)) {
|
||||||
fprintf(logfile, "dm-command: usb-add a usb device\n");
|
fprintf(logfile, "dm-command: usb-add a usb device\n");
|
||||||
if (pasprintf(&path,
|
if (pasprintf(&path,
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -1490,6 +1490,20 @@ class XendDomainInfo:
|
@@ -1504,6 +1504,20 @@ class XendDomainInfo:
|
||||||
target = max_target
|
target = max_target
|
||||||
self.setMemoryTarget(target)
|
self.setMemoryTarget(target)
|
||||||
|
|
||||||
@ -84,10 +84,10 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
def setMemoryTarget(self, target):
|
def setMemoryTarget(self, target):
|
||||||
"""Set the memory target of this domain.
|
"""Set the memory target of this domain.
|
||||||
@param target: In MiB.
|
@param target: In MiB.
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/server/XMLRPCServer.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/server/XMLRPCServer.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/server/XMLRPCServer.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/server/XMLRPCServer.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/server/XMLRPCServer.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/server/XMLRPCServer.py
|
||||||
@@ -95,7 +95,7 @@ methods = ['device_create', 'device_conf
|
@@ -95,7 +95,7 @@ methods = ['device_create', 'device_conf
|
||||||
'destroyDevice','getDeviceSxprs',
|
'destroyDevice','getDeviceSxprs',
|
||||||
'setMemoryTarget', 'setName', 'setVCpuCount', 'shutdown',
|
'setMemoryTarget', 'setName', 'setVCpuCount', 'shutdown',
|
||||||
@ -97,10 +97,10 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/server/XMLRPCServer.py
|
|||||||
|
|
||||||
exclude = ['domain_create', 'domain_restore']
|
exclude = ['domain_create', 'domain_restore']
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xm/main.py
|
Index: xen-4.2.1-testing/tools/python/xen/xm/main.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xm/main.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xm/main.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xm/main.py
|
+++ xen-4.2.1-testing/tools/python/xen/xm/main.py
|
||||||
@@ -21,6 +21,7 @@
|
@@ -21,6 +21,7 @@
|
||||||
|
|
||||||
"""Grand unified management application for Xen.
|
"""Grand unified management application for Xen.
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -3139,6 +3139,11 @@ class XendDomainInfo:
|
@@ -3153,6 +3153,11 @@ class XendDomainInfo:
|
||||||
self._cleanup_phantom_devs(paths)
|
self._cleanup_phantom_devs(paths)
|
||||||
self._cleanupVm()
|
self._cleanupVm()
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
@@ -172,7 +172,7 @@ def save(fd, dominfo, network, live, dst
|
@@ -185,7 +185,7 @@ def save(fd, dominfo, network, live, dst
|
||||||
dominfo.destroy()
|
dominfo.destroy()
|
||||||
dominfo.testDeviceComplete()
|
dominfo.testDeviceComplete()
|
||||||
try:
|
try:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendConfig.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendConfig.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendConfig.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendConfig.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendConfig.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendConfig.py
|
||||||
@@ -159,6 +159,7 @@ XENAPI_PLATFORM_CFG_TYPES = {
|
@@ -161,6 +161,7 @@ XENAPI_PLATFORM_CFG_TYPES = {
|
||||||
'nographic': int,
|
'nographic': int,
|
||||||
'nomigrate': int,
|
'nomigrate': int,
|
||||||
'pae' : int,
|
'pae' : int,
|
||||||
@ -10,8 +10,8 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendConfig.py
|
|||||||
'rtc_timeoffset': int,
|
'rtc_timeoffset': int,
|
||||||
'parallel': str,
|
'parallel': str,
|
||||||
'serial': str,
|
'serial': str,
|
||||||
@@ -517,6 +518,8 @@ class XendConfig(dict):
|
@@ -523,6 +524,8 @@ class XendConfig(dict):
|
||||||
if self.is_hvm():
|
self['platform']['acpi_firmware'] = ""
|
||||||
if 'timer_mode' not in self['platform']:
|
if 'timer_mode' not in self['platform']:
|
||||||
self['platform']['timer_mode'] = 1
|
self['platform']['timer_mode'] = 1
|
||||||
+ if 'extid' in self['platform'] and int(self['platform']['extid']) == 1:
|
+ if 'extid' in self['platform'] and int(self['platform']['extid']) == 1:
|
||||||
@ -19,11 +19,11 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendConfig.py
|
|||||||
if 'viridian' not in self['platform']:
|
if 'viridian' not in self['platform']:
|
||||||
self['platform']['viridian'] = 0
|
self['platform']['viridian'] = 0
|
||||||
if 'rtc_timeoffset' not in self['platform']:
|
if 'rtc_timeoffset' not in self['platform']:
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/image.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/image.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/image.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/image.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/image.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/image.py
|
||||||
@@ -828,6 +828,7 @@ class HVMImageHandler(ImageHandler):
|
@@ -830,6 +830,7 @@ class HVMImageHandler(ImageHandler):
|
||||||
|
|
||||||
self.apic = int(vmConfig['platform'].get('apic', 0))
|
self.apic = int(vmConfig['platform'].get('apic', 0))
|
||||||
self.acpi = int(vmConfig['platform'].get('acpi', 0))
|
self.acpi = int(vmConfig['platform'].get('acpi', 0))
|
||||||
@ -31,10 +31,10 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/image.py
|
|||||||
self.guest_os_type = vmConfig['platform'].get('guest_os_type')
|
self.guest_os_type = vmConfig['platform'].get('guest_os_type')
|
||||||
self.memory_sharing = int(vmConfig['memory_sharing'])
|
self.memory_sharing = int(vmConfig['memory_sharing'])
|
||||||
try:
|
try:
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xm/create.py
|
Index: xen-4.2.1-testing/tools/python/xen/xm/create.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xm/create.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xm/create.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xm/create.py
|
+++ xen-4.2.1-testing/tools/python/xen/xm/create.py
|
||||||
@@ -242,6 +242,10 @@ gopts.var('viridian', val='VIRIDIAN',
|
@@ -242,6 +242,10 @@ gopts.var('viridian', val='VIRIDIAN',
|
||||||
use="""Expose Viridian interface to x86 HVM guest?
|
use="""Expose Viridian interface to x86 HVM guest?
|
||||||
(Default is 0).""")
|
(Default is 0).""")
|
||||||
@ -46,7 +46,7 @@ Index: xen-4.2.0-testing/tools/python/xen/xm/create.py
|
|||||||
gopts.var('acpi', val='ACPI',
|
gopts.var('acpi', val='ACPI',
|
||||||
fn=set_int, default=1,
|
fn=set_int, default=1,
|
||||||
use="Disable or enable ACPI of HVM domain.")
|
use="Disable or enable ACPI of HVM domain.")
|
||||||
@@ -1111,7 +1115,7 @@ def configure_hvm(config_image, vals):
|
@@ -1120,7 +1124,7 @@ def configure_hvm(config_image, vals):
|
||||||
'timer_mode',
|
'timer_mode',
|
||||||
'usb', 'usbdevice',
|
'usb', 'usbdevice',
|
||||||
'vcpus', 'vnc', 'vncconsole', 'vncdisplay', 'vnclisten',
|
'vcpus', 'vnc', 'vncconsole', 'vncdisplay', 'vnclisten',
|
||||||
@ -55,7 +55,7 @@ Index: xen-4.2.0-testing/tools/python/xen/xm/create.py
|
|||||||
'watchdog', 'watchdog_action',
|
'watchdog', 'watchdog_action',
|
||||||
'xauthority', 'xen_extended_power_mgmt', 'xen_platform_pci',
|
'xauthority', 'xen_extended_power_mgmt', 'xen_platform_pci',
|
||||||
'memory_sharing' ]
|
'memory_sharing' ]
|
||||||
@@ -1121,6 +1125,10 @@ def configure_hvm(config_image, vals):
|
@@ -1130,6 +1134,10 @@ def configure_hvm(config_image, vals):
|
||||||
config_image.append([a, vals.__dict__[a]])
|
config_image.append([a, vals.__dict__[a]])
|
||||||
if vals.vncpasswd is not None:
|
if vals.vncpasswd is not None:
|
||||||
config_image.append(['vncpasswd', vals.vncpasswd])
|
config_image.append(['vncpasswd', vals.vncpasswd])
|
||||||
|
@ -5,10 +5,10 @@ bootloader loopback device. This patch creates a list of bootloader
|
|||||||
loopback devices so more than one instance of bootloader can be run
|
loopback devices so more than one instance of bootloader can be run
|
||||||
concurrently.
|
concurrently.
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -74,7 +74,7 @@ from xen.xend.XendPSCSI import XendPSCSI
|
@@ -74,7 +74,7 @@ from xen.xend.XendPSCSI import XendPSCSI
|
||||||
from xen.xend.XendDSCSI import XendDSCSI, XendDSCSI_HBA
|
from xen.xend.XendDSCSI import XendDSCSI, XendDSCSI_HBA
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
|
|
||||||
xc = xen.lowlevel.xc.xc()
|
xc = xen.lowlevel.xc.xc()
|
||||||
xoptions = XendOptions.instance()
|
xoptions = XendOptions.instance()
|
||||||
@@ -3308,33 +3308,38 @@ class XendDomainInfo:
|
@@ -3322,33 +3322,38 @@ class XendDomainInfo:
|
||||||
# This is a file, not a device. pygrub can cope with a
|
# This is a file, not a device. pygrub can cope with a
|
||||||
# file if it's raw, but if it's QCOW or other such formats
|
# file if it's raw, but if it's QCOW or other such formats
|
||||||
# used through blktap, then we need to mount it first.
|
# used through blktap, then we need to mount it first.
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.2.0-testing/tools/hotplug/Linux/init.d/xencommons
|
Index: xen-4.2.1-testing/tools/hotplug/Linux/init.d/xencommons
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/hotplug/Linux/init.d/xencommons
|
--- xen-4.2.1-testing.orig/tools/hotplug/Linux/init.d/xencommons
|
||||||
+++ xen-4.2.0-testing/tools/hotplug/Linux/init.d/xencommons
|
+++ xen-4.2.1-testing/tools/hotplug/Linux/init.d/xencommons
|
||||||
@@ -54,21 +54,26 @@ do_start () {
|
@@ -54,21 +54,27 @@ do_start () {
|
||||||
local time=0
|
local time=0
|
||||||
local timeout=30
|
local timeout=30
|
||||||
|
|
||||||
@ -36,7 +36,8 @@ Index: xen-4.2.0-testing/tools/hotplug/Linux/init.d/xencommons
|
|||||||
+ modprobe usbbk 2>/dev/null || true
|
+ modprobe usbbk 2>/dev/null || true
|
||||||
+ modprobe pciback 2>/dev/null || true
|
+ modprobe pciback 2>/dev/null || true
|
||||||
+ modprobe xen-acpi-processor 2>/dev/null || true
|
+ modprobe xen-acpi-processor 2>/dev/null || true
|
||||||
+ modprobe blktap2 2>/dev/null || modprobe blktap 2>/dev/null || true
|
+ modprobe blktap2 2>/dev/null || true
|
||||||
|
+ modprobe blktap 2>/dev/null || true
|
||||||
+ # xenblk (frontend module) is needed in dom0, allowing it to use vbds
|
+ # xenblk (frontend module) is needed in dom0, allowing it to use vbds
|
||||||
+ modprobe xenblk 2>/dev/null || true
|
+ modprobe xenblk 2>/dev/null || true
|
||||||
+ # support xl create pv guest with qcow/qcow2 disk image
|
+ # support xl create pv guest with qcow/qcow2 disk image
|
||||||
|
@ -1,6 +1,19 @@
|
|||||||
|
--- a/xen/arch/x86/x86_32/entry.S
|
||||||
|
+++ b/xen/arch/x86/x86_32/entry.S
|
||||||
|
@@ -410,8 +410,10 @@ UNLIKELY_END(bounce_vm86_3)
|
||||||
|
_ASM_EXTABLE(.Lft24, domain_crash_synchronous)
|
||||||
|
_ASM_EXTABLE(.Lft25, domain_crash_synchronous)
|
||||||
|
|
||||||
|
+.section .rodata, "a", @progbits
|
||||||
|
domain_crash_synchronous_string:
|
||||||
|
.asciz "domain_crash_sync called from entry.S (%lx)\n"
|
||||||
|
+.previous
|
||||||
|
|
||||||
|
domain_crash_synchronous:
|
||||||
|
pushl $domain_crash_synchronous_string
|
||||||
--- a/xen/arch/x86/x86_64/entry.S
|
--- a/xen/arch/x86/x86_64/entry.S
|
||||||
+++ b/xen/arch/x86/x86_64/entry.S
|
+++ b/xen/arch/x86/x86_64/entry.S
|
||||||
@@ -427,22 +427,35 @@ UNLIKELY_END(bounce_failsafe)
|
@@ -428,22 +428,35 @@ UNLIKELY_END(bounce_failsafe)
|
||||||
jz domain_crash_synchronous
|
jz domain_crash_synchronous
|
||||||
movq %rax,UREGS_rip+8(%rsp)
|
movq %rax,UREGS_rip+8(%rsp)
|
||||||
ret
|
ret
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/server/DevController.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/server/DevController.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/server/DevController.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/server/DevController.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/server/DevController.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/server/DevController.py
|
||||||
@@ -592,6 +592,31 @@ class DevController:
|
@@ -592,6 +592,31 @@ class DevController:
|
||||||
return (Missing, None)
|
return (Missing, None)
|
||||||
|
|
||||||
@ -34,10 +34,10 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/server/DevController.py
|
|||||||
def backendPath(self, backdom, devid):
|
def backendPath(self, backdom, devid):
|
||||||
"""Construct backend path given the backend domain and device id.
|
"""Construct backend path given the backend domain and device id.
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendBootloader.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendBootloader.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendBootloader.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendBootloader.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendBootloader.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendBootloader.py
|
||||||
@@ -12,7 +12,7 @@
|
@@ -12,7 +12,7 @@
|
||||||
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
#
|
#
|
||||||
@ -75,11 +75,11 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendBootloader.py
|
|||||||
log.error(msg)
|
log.error(msg)
|
||||||
raise VmError(msg)
|
raise VmError(msg)
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -2333,6 +2333,10 @@ class XendDomainInfo:
|
@@ -2347,6 +2347,10 @@ class XendDomainInfo:
|
||||||
deviceClass, config = self.info['devices'].get(dev_uuid)
|
deviceClass, config = self.info['devices'].get(dev_uuid)
|
||||||
self._waitForDevice(deviceClass, config['devid'])
|
self._waitForDevice(deviceClass, config['devid'])
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
def _waitForDevice_destroy(self, deviceClass, devid, backpath):
|
def _waitForDevice_destroy(self, deviceClass, devid, backpath):
|
||||||
return self.getDeviceController(deviceClass).waitForDevice_destroy(
|
return self.getDeviceController(deviceClass).waitForDevice_destroy(
|
||||||
devid, backpath)
|
devid, backpath)
|
||||||
@@ -3283,7 +3287,8 @@ class XendDomainInfo:
|
@@ -3297,7 +3301,8 @@ class XendDomainInfo:
|
||||||
from xen.xend import XendDomain
|
from xen.xend import XendDomain
|
||||||
dom0 = XendDomain.instance().privilegedDomain()
|
dom0 = XendDomain.instance().privilegedDomain()
|
||||||
mounted_vbd_uuid = dom0.create_vbd(vbd, disk);
|
mounted_vbd_uuid = dom0.create_vbd(vbd, disk);
|
||||||
@ -100,7 +100,7 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
fn = BOOTLOADER_LOOPBACK_DEVICE
|
fn = BOOTLOADER_LOOPBACK_DEVICE
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -3293,10 +3298,10 @@ class XendDomainInfo:
|
@@ -3307,10 +3312,10 @@ class XendDomainInfo:
|
||||||
if mounted:
|
if mounted:
|
||||||
log.info("Unmounting %s from %s." %
|
log.info("Unmounting %s from %s." %
|
||||||
(fn, BOOTLOADER_LOOPBACK_DEVICE))
|
(fn, BOOTLOADER_LOOPBACK_DEVICE))
|
||||||
|
@ -225,7 +225,16 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
self._constructDomain()
|
self._constructDomain()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -851,6 +868,9 @@ class XendDomainInfo:
|
@@ -712,6 +729,8 @@ class XendDomainInfo:
|
||||||
|
the device.
|
||||||
|
"""
|
||||||
|
|
||||||
|
+ if self.domid is None:
|
||||||
|
+ return
|
||||||
|
self.iommu_check_pod_mode()
|
||||||
|
|
||||||
|
# Test whether the devices can be assigned
|
||||||
|
@@ -851,6 +870,9 @@ class XendDomainInfo:
|
||||||
|
|
||||||
if self.domid is not None:
|
if self.domid is not None:
|
||||||
try:
|
try:
|
||||||
@ -235,7 +244,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
dev_config_dict['devid'] = devid = \
|
dev_config_dict['devid'] = devid = \
|
||||||
self._createDevice(dev_type, dev_config_dict)
|
self._createDevice(dev_type, dev_config_dict)
|
||||||
if dev_type == 'tap2':
|
if dev_type == 'tap2':
|
||||||
@@ -864,6 +884,7 @@ class XendDomainInfo:
|
@@ -864,6 +886,7 @@ class XendDomainInfo:
|
||||||
if dev_type == 'pci':
|
if dev_type == 'pci':
|
||||||
for dev in dev_config_dict['devs']:
|
for dev in dev_config_dict['devs']:
|
||||||
XendAPIStore.deregister(dev['uuid'], 'DPCI')
|
XendAPIStore.deregister(dev['uuid'], 'DPCI')
|
||||||
@ -243,7 +252,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
elif dev_type == 'vscsi':
|
elif dev_type == 'vscsi':
|
||||||
for dev in dev_config_dict['devs']:
|
for dev in dev_config_dict['devs']:
|
||||||
XendAPIStore.deregister(dev['uuid'], 'DSCSI')
|
XendAPIStore.deregister(dev['uuid'], 'DSCSI')
|
||||||
@@ -908,6 +929,9 @@ class XendDomainInfo:
|
@@ -908,6 +931,9 @@ class XendDomainInfo:
|
||||||
dev_config = pci_convert_sxp_to_dict(dev_sxp)
|
dev_config = pci_convert_sxp_to_dict(dev_sxp)
|
||||||
dev = dev_config['devs'][0]
|
dev = dev_config['devs'][0]
|
||||||
|
|
||||||
@ -253,7 +262,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
stubdomid = self.getStubdomDomid()
|
stubdomid = self.getStubdomDomid()
|
||||||
# Do HVM specific processing
|
# Do HVM specific processing
|
||||||
if self.info.is_hvm():
|
if self.info.is_hvm():
|
||||||
@@ -984,6 +1008,9 @@ class XendDomainInfo:
|
@@ -984,6 +1010,9 @@ class XendDomainInfo:
|
||||||
new_dev_sxp = dev_control.configuration(devid)
|
new_dev_sxp = dev_control.configuration(devid)
|
||||||
self.info.device_update(dev_uuid, new_dev_sxp)
|
self.info.device_update(dev_uuid, new_dev_sxp)
|
||||||
|
|
||||||
@ -263,7 +272,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
# If there is no device left, destroy pci and remove config.
|
# If there is no device left, destroy pci and remove config.
|
||||||
if num_devs == 0:
|
if num_devs == 0:
|
||||||
if self.info.is_hvm():
|
if self.info.is_hvm():
|
||||||
@@ -3154,6 +3181,7 @@ class XendDomainInfo:
|
@@ -3168,6 +3197,7 @@ class XendDomainInfo:
|
||||||
log.debug("%s KiB need to add to Memory pool" %self.alloc_mem)
|
log.debug("%s KiB need to add to Memory pool" %self.alloc_mem)
|
||||||
MemoryPool.instance().increase_memory(self.alloc_mem)
|
MemoryPool.instance().increase_memory(self.alloc_mem)
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendNode.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendNode.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendNode.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendNode.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendNode.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendNode.py
|
||||||
@@ -949,11 +949,35 @@ class XendNode:
|
@@ -949,11 +949,35 @@ class XendNode:
|
||||||
|
|
||||||
info['cpu_mhz'] = info['cpu_khz'] / 1000
|
info['cpu_mhz'] = info['cpu_khz'] / 1000
|
||||||
@ -51,10 +51,10 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendNode.py
|
|||||||
]
|
]
|
||||||
|
|
||||||
if show_numa != 0:
|
if show_numa != 0:
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/balloon.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/balloon.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/balloon.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/balloon.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/balloon.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/balloon.py
|
||||||
@@ -43,6 +43,8 @@ SLEEP_TIME_GROWTH = 0.1
|
@@ -43,6 +43,8 @@ SLEEP_TIME_GROWTH = 0.1
|
||||||
# label actually shown in the PROC_XEN_BALLOON file.
|
# label actually shown in the PROC_XEN_BALLOON file.
|
||||||
#labels = { 'current' : 'Current allocation',
|
#labels = { 'current' : 'Current allocation',
|
||||||
@ -88,13 +88,13 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/balloon.py
|
|||||||
def free(need_mem, dominfo):
|
def free(need_mem, dominfo):
|
||||||
"""Balloon out memory from the privileged domain so that there is the
|
"""Balloon out memory from the privileged domain so that there is the
|
||||||
specified required amount (in KiB) free.
|
specified required amount (in KiB) free.
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -1459,6 +1459,27 @@ class XendDomainInfo:
|
@@ -1473,6 +1473,27 @@ class XendDomainInfo:
|
||||||
pci_conf = self.info['devices'][dev_uuid][1]
|
self.info['abort_if_busy'] = str(abort_if_busy)
|
||||||
return map(pci_dict_to_bdf_str, pci_conf['devs'])
|
self.info['log_save_progress'] = str(log_save_progress)
|
||||||
|
|
||||||
+ def capAndSetMemoryTarget(self, target):
|
+ def capAndSetMemoryTarget(self, target):
|
||||||
+ """Potentially lowers the requested target to the largest possible
|
+ """Potentially lowers the requested target to the largest possible
|
||||||
@ -120,10 +120,10 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
def setMemoryTarget(self, target):
|
def setMemoryTarget(self, target):
|
||||||
"""Set the memory target of this domain.
|
"""Set the memory target of this domain.
|
||||||
@param target: In MiB.
|
@param target: In MiB.
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/server/SrvDomain.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/server/SrvDomain.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/server/SrvDomain.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/server/SrvDomain.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/server/SrvDomain.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/server/SrvDomain.py
|
||||||
@@ -187,7 +187,7 @@ class SrvDomain(SrvDir):
|
@@ -187,7 +187,7 @@ class SrvDomain(SrvDir):
|
||||||
|
|
||||||
|
|
||||||
@ -133,10 +133,10 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/server/SrvDomain.py
|
|||||||
[['target', 'int']],
|
[['target', 'int']],
|
||||||
req)
|
req)
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/osdep.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/osdep.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/osdep.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/osdep.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/osdep.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/osdep.py
|
||||||
@@ -42,6 +42,8 @@ def _linux_balloon_stat_proc(label):
|
@@ -42,6 +42,8 @@ def _linux_balloon_stat_proc(label):
|
||||||
|
|
||||||
xend2linux_labels = { 'current' : 'Current allocation',
|
xend2linux_labels = { 'current' : 'Current allocation',
|
||||||
|
91
xen.changes
91
xen.changes
@ -1,3 +1,94 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Mar 14 09:58:38 MDT 2013 - jfehlig@suse.com
|
||||||
|
|
||||||
|
- Load blktap module in xencommons init script. blktap2 doesn't
|
||||||
|
support qcow2, so blktap is needed to support domains with
|
||||||
|
'tap:qcow2' disk configurations.
|
||||||
|
modified tmp-initscript-modprobe.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Mar 14 07:32:17 MDT 2013 - carnold@suse.com
|
||||||
|
|
||||||
|
- bnc#809203 - xen.efi isn't signed with SUSE Secure Boot key
|
||||||
|
xen.spec
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Mar 11 21:07:21 MDT 2013 - jfehlig@suse.com
|
||||||
|
|
||||||
|
- Fix adding managed PCI device to an inactive domain
|
||||||
|
modified xen-managed-pci-device.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Mar 11 11:45:22 MDT 2013 - jfehlig@suse.com
|
||||||
|
|
||||||
|
- bnc#805094 - xen hot plug attach/detach fails
|
||||||
|
modified blktap-pv-cdrom.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Mar 11 11:17:57 MDT 2013 - jfehlig@suse.com
|
||||||
|
|
||||||
|
- bnc# 802690 - domain locking can prevent a live migration from
|
||||||
|
completing
|
||||||
|
modified xend-domain-lock.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Mar 8 15:01:15 CET 2013 - ohering@suse.de
|
||||||
|
|
||||||
|
- bnc#797014 - no way to control live migrations
|
||||||
|
26675-tools-xentoollog_update_tty_detection_in_stdiostream_progress.patch
|
||||||
|
xen.migrate.tools-xc_print_messages_from_xc_save_with_xc_report.patch
|
||||||
|
xen.migrate.tools-xc_document_printf_calls_in_xc_restore.patch
|
||||||
|
xen.migrate.tools-xc_rework_xc_save.cswitch_qemu_logdirty.patch
|
||||||
|
xen.migrate.tools_set_migration_constraints_from_cmdline.patch
|
||||||
|
xen.migrate.tools_add_xm_migrate_--log_progress_option.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Mar 7 14:39:57 MST 2013 - carnold@suse.com
|
||||||
|
|
||||||
|
- Upstream patches from Jan
|
||||||
|
26585-x86-mm-Take-the-p2m-lock-even-in-shadow-mode.patch
|
||||||
|
26595-x86-nhvm-properly-clean-up-after-failure-to-set-up-all-vCPU-s.patch
|
||||||
|
26601-honor-ACPI-v4-FADT-flags.patch
|
||||||
|
26656-x86-fix-null-pointer-dereference-in-intel_get_extended_msrs.patch
|
||||||
|
26659-AMD-IOMMU-erratum-746-workaround.patch
|
||||||
|
26660-x86-fix-CMCI-injection.patch
|
||||||
|
26672-vmx-fix-handling-of-NMI-VMEXIT.patch
|
||||||
|
26673-Avoid-stale-pointer-when-moving-domain-to-another-cpupool.patch
|
||||||
|
26676-fix-compat-memory-exchange-op-splitting.patch
|
||||||
|
26677-x86-make-certain-memory-sub-ops-return-valid-values.patch
|
||||||
|
26678-SEDF-avoid-gathering-vCPU-s-on-pCPU0.patch
|
||||||
|
26679-x86-defer-processing-events-on-the-NMI-exit-path.patch
|
||||||
|
26683-credit1-Use-atomic-bit-operations-for-the-flags-structure.patch
|
||||||
|
26689-fix-domain-unlocking-in-some-xsm-error-paths.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Mar 5 13:35:40 MST 2013 - carnold@suse.com
|
||||||
|
|
||||||
|
- fate#313584: pass bios information to XEN HVM guest
|
||||||
|
xend-hvm-firmware-passthrough.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Mar 4 20:28:29 CET 2013 - ohering@suse.de
|
||||||
|
|
||||||
|
- bnc#806736: enabling xentrace crashes hypervisor
|
||||||
|
26686-xentrace_fix_off-by-one_in_calculate_tbuf_size.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Feb 28 11:12:04 CET 2013 - ohering@suse.de
|
||||||
|
|
||||||
|
- update xenalyze to revision 149
|
||||||
|
Make eip_list output more useful
|
||||||
|
Use correct length when copying record into buffer
|
||||||
|
decode PV_HYPERCALL_SUBCALL events
|
||||||
|
decode PV_HYPERCALL_V2 records
|
||||||
|
Analyze populate-on-demand reclamation patterns
|
||||||
|
Handle 64-bit MMIO
|
||||||
|
Also strip write bit when processing a generic event
|
||||||
|
Make the warnigns in hvm_generic_postprocess more informative
|
||||||
|
Don't warn about switching paging levels unless verbosity>=6
|
||||||
|
Process NPFs as generic for summary purposes
|
||||||
|
Add HVM_EVENT_VLAPIC
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Feb 20 15:00:13 MST 2013 - jfehlig@suse.com
|
Wed Feb 20 15:00:13 MST 2013 - jfehlig@suse.com
|
||||||
|
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
user: Olaf Hering <olaf@aepfle.de>
|
||||||
|
date: Wed Mar 06 16:42:02 2013 +0100
|
||||||
|
files: tools/xcutils/xc_restore.c
|
||||||
|
description:
|
||||||
|
tools/xc: document printf calls in xc_restore
|
||||||
|
|
||||||
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||||
|
|
||||||
|
|
||||||
|
diff -r e5ae0e680b5c -r 49b90990442a tools/xcutils/xc_restore.c
|
||||||
|
--- a/tools/xcutils/xc_restore.c
|
||||||
|
+++ b/tools/xcutils/xc_restore.c
|
||||||
|
@@ -56,6 +56,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
|
if ( ret == 0 )
|
||||||
|
{
|
||||||
|
+ /* xend expects this output, part of protocol */
|
||||||
|
printf("store-mfn %li\n", store_mfn);
|
||||||
|
if ( !hvm )
|
||||||
|
printf("console-mfn %li\n", console_mfn);
|
@ -0,0 +1,178 @@
|
|||||||
|
user: Olaf Hering <olaf@aepfle.de>
|
||||||
|
date: Wed Mar 06 16:32:08 2013 +0100
|
||||||
|
files: tools/libxc/xc_private.h tools/xcutils/xc_save.c
|
||||||
|
description:
|
||||||
|
tools/xc: print messages from xc_save with xc_report
|
||||||
|
|
||||||
|
Make use of xc_report in xc_save to log also pid if some error occoured.
|
||||||
|
|
||||||
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||||
|
|
||||||
|
|
||||||
|
diff -r 7af4246a6e1c -r e5ae0e680b5c tools/libxc/xc_private.h
|
||||||
|
--- a/tools/libxc/xc_private.h
|
||||||
|
+++ b/tools/libxc/xc_private.h
|
||||||
|
@@ -119,6 +119,7 @@ void xc_report_progress_step(xc_interfac
|
||||||
|
|
||||||
|
/* anamorphic macros: struct xc_interface *xch must be in scope */
|
||||||
|
|
||||||
|
+#define WPRINTF(_f, _a...) xc_report(xch, xch->error_handler, XTL_WARN,0, _f , ## _a)
|
||||||
|
#define IPRINTF(_f, _a...) xc_report(xch, xch->error_handler, XTL_INFO,0, _f , ## _a)
|
||||||
|
#define DPRINTF(_f, _a...) xc_report(xch, xch->error_handler, XTL_DETAIL,0, _f , ## _a)
|
||||||
|
#define DBGPRINTF(_f, _a...) xc_report(xch, xch->error_handler, XTL_DEBUG,0, _f , ## _a)
|
||||||
|
diff -r 7af4246a6e1c -r e5ae0e680b5c tools/xcutils/xc_save.c
|
||||||
|
--- a/tools/xcutils/xc_save.c
|
||||||
|
+++ b/tools/xcutils/xc_save.c
|
||||||
|
@@ -7,6 +7,7 @@
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#include <unistd.h>
|
||||||
|
#include <err.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
@@ -19,6 +20,7 @@
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <err.h>
|
||||||
|
|
||||||
|
+#include <xc_private.h>
|
||||||
|
#include <xenstore.h>
|
||||||
|
#include <xenctrl.h>
|
||||||
|
#include <xenguest.h>
|
||||||
|
@@ -51,16 +53,17 @@ static int compat_suspend(void)
|
||||||
|
* receive the acknowledgement from the subscribe event channel. */
|
||||||
|
static int evtchn_suspend(void)
|
||||||
|
{
|
||||||
|
+ xc_interface *xch = si.xch;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = xc_evtchn_notify(si.xce, si.suspend_evtchn);
|
||||||
|
if (rc < 0) {
|
||||||
|
- warnx("failed to notify suspend request channel: %d", rc);
|
||||||
|
+ WPRINTF("failed to notify suspend request channel: %d", rc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (xc_await_suspend(si.xch, si.xce, si.suspend_evtchn) < 0) {
|
||||||
|
- warnx("suspend failed");
|
||||||
|
+ if (xc_await_suspend(xch, si.xce, si.suspend_evtchn) < 0) {
|
||||||
|
+ WPRINTF("suspend failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -104,20 +107,27 @@ static int suspend(void* data)
|
||||||
|
|
||||||
|
static int switch_qemu_logdirty(int domid, unsigned int enable, void *data)
|
||||||
|
{
|
||||||
|
+ xc_interface *xch = si.xch;
|
||||||
|
struct xs_handle *xs;
|
||||||
|
char *path, *p, *ret_str, *cmd_str, **watch;
|
||||||
|
unsigned int len;
|
||||||
|
struct timeval tv;
|
||||||
|
fd_set fdset;
|
||||||
|
|
||||||
|
- if ((xs = xs_daemon_open()) == NULL)
|
||||||
|
- errx(1, "Couldn't contact xenstore");
|
||||||
|
- if (!(path = strdup("/local/domain/0/device-model/")))
|
||||||
|
- errx(1, "can't get domain path in store");
|
||||||
|
+ if ((xs = xs_daemon_open()) == NULL) {
|
||||||
|
+ PERROR("Couldn't contact xenstore");
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+ if (!(path = strdup("/local/domain/0/device-model/"))) {
|
||||||
|
+ PERROR("can't get domain path in store");
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
if (!(path = realloc(path, strlen(path)
|
||||||
|
+ 10
|
||||||
|
- + strlen("/logdirty/cmd") + 1)))
|
||||||
|
- errx(1, "no memory for constructing xenstore path");
|
||||||
|
+ + strlen("/logdirty/cmd") + 1))) {
|
||||||
|
+ PERROR("no memory for constructing xenstore path");
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
snprintf(path + strlen(path), 11, "%i", domid);
|
||||||
|
strcat(path, "/logdirty/");
|
||||||
|
p = path + strlen(path);
|
||||||
|
@@ -126,16 +136,22 @@ static int switch_qemu_logdirty(int domi
|
||||||
|
/* Watch for qemu's return value */
|
||||||
|
strcpy(p, "ret");
|
||||||
|
if (!xs_watch(xs, path, "qemu-logdirty-ret"))
|
||||||
|
- errx(1, "can't set watch in store (%s)\n", path);
|
||||||
|
+ {
|
||||||
|
+ ERROR("can't set watch in store (%s)\n", path);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (!(cmd_str = strdup( enable == 0 ? "disable" : "enable")))
|
||||||
|
- errx(1, "can't get logdirty cmd path in store");
|
||||||
|
+ if (!(cmd_str = strdup( enable == 0 ? "disable" : "enable"))) {
|
||||||
|
+ PERROR("can't get logdirty cmd path in store");
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* Tell qemu that we want it to start logging dirty page to Xen */
|
||||||
|
strcpy(p, "cmd");
|
||||||
|
- if (!xs_write(xs, XBT_NULL, path, cmd_str, strlen(cmd_str)))
|
||||||
|
- errx(1, "can't write to store path (%s)\n",
|
||||||
|
- path);
|
||||||
|
+ if (!xs_write(xs, XBT_NULL, path, cmd_str, strlen(cmd_str))) {
|
||||||
|
+ PERROR("can't write to store path (%s)\n", path);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* Wait a while for qemu to signal that it has service logdirty command */
|
||||||
|
read_again:
|
||||||
|
@@ -144,8 +160,10 @@ static int switch_qemu_logdirty(int domi
|
||||||
|
FD_ZERO(&fdset);
|
||||||
|
FD_SET(xs_fileno(xs), &fdset);
|
||||||
|
|
||||||
|
- if ((select(xs_fileno(xs) + 1, &fdset, NULL, NULL, &tv)) != 1)
|
||||||
|
- errx(1, "timed out waiting for qemu logdirty response.\n");
|
||||||
|
+ if ((select(xs_fileno(xs) + 1, &fdset, NULL, NULL, &tv)) != 1) {
|
||||||
|
+ PERROR("timed out waiting for qemu logdirty response.\n");
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
watch = xs_read_watch(xs, &len);
|
||||||
|
free(watch);
|
||||||
|
@@ -166,6 +184,7 @@ static int switch_qemu_logdirty(int domi
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
+ xc_interface *xch;
|
||||||
|
unsigned int maxit, max_f, lflags;
|
||||||
|
int io_fd, ret, port;
|
||||||
|
struct save_callbacks callbacks;
|
||||||
|
@@ -186,26 +205,26 @@ main(int argc, char **argv)
|
||||||
|
lvl = si.flags & XCFLAGS_DEBUG ? XTL_DEBUG: XTL_DETAIL;
|
||||||
|
lflags = XTL_STDIOSTREAM_SHOW_PID | XTL_STDIOSTREAM_HIDE_PROGRESS;
|
||||||
|
l = (xentoollog_logger *)xtl_createlogger_stdiostream(stderr, lvl, lflags);
|
||||||
|
- si.xch = xc_interface_open(l, 0, 0);
|
||||||
|
+ xch = si.xch = xc_interface_open(l, 0, 0);
|
||||||
|
if (!si.xch)
|
||||||
|
- errx(1, "failed to open control interface");
|
||||||
|
+ errx(1, "[%lu] failed to open control interface", (unsigned long)getpid());
|
||||||
|
|
||||||
|
si.xce = xc_evtchn_open(NULL, 0);
|
||||||
|
if (si.xce == NULL)
|
||||||
|
- warnx("failed to open event channel handle");
|
||||||
|
+ WPRINTF("failed to open event channel handle");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
port = xs_suspend_evtchn_port(si.domid);
|
||||||
|
|
||||||
|
if (port < 0)
|
||||||
|
- warnx("failed to get the suspend evtchn port\n");
|
||||||
|
+ WPRINTF("failed to get the suspend evtchn port\n");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
si.suspend_evtchn =
|
||||||
|
xc_suspend_evtchn_init(si.xch, si.xce, si.domid, port);
|
||||||
|
|
||||||
|
if (si.suspend_evtchn < 0)
|
||||||
|
- warnx("suspend event channel initialization failed, "
|
||||||
|
+ WPRINTF("suspend event channel initialization failed, "
|
||||||
|
"using slow path");
|
||||||
|
}
|
||||||
|
}
|
136
xen.migrate.tools-xc_rework_xc_save.cswitch_qemu_logdirty.patch
Normal file
136
xen.migrate.tools-xc_rework_xc_save.cswitch_qemu_logdirty.patch
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
user: Olaf Hering <olaf@aepfle.de>
|
||||||
|
date: Wed Mar 06 17:05:10 2013 +0100
|
||||||
|
files: tools/xcutils/xc_save.c
|
||||||
|
description:
|
||||||
|
tools/xc: rework xc_save.c:switch_qemu_logdirty
|
||||||
|
|
||||||
|
Rework code in switch_qemu_logdirty, fix also memleak.
|
||||||
|
|
||||||
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||||
|
|
||||||
|
|
||||||
|
diff -r 49b90990442a -r 1ea501d60264 tools/xcutils/xc_save.c
|
||||||
|
--- a/tools/xcutils/xc_save.c
|
||||||
|
+++ b/tools/xcutils/xc_save.c
|
||||||
|
@@ -7,6 +7,7 @@
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#define _GNU_SOURCE
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <err.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
@@ -109,8 +110,10 @@ static int switch_qemu_logdirty(int domi
|
||||||
|
{
|
||||||
|
xc_interface *xch = si.xch;
|
||||||
|
struct xs_handle *xs;
|
||||||
|
- char *path, *p, *ret_str, *cmd_str, **watch;
|
||||||
|
+ char *path, *dir_p, *ret_str, **watch;
|
||||||
|
+ const char *cmd_str;
|
||||||
|
unsigned int len;
|
||||||
|
+ int ret, again;
|
||||||
|
struct timeval tv;
|
||||||
|
fd_set fdset;
|
||||||
|
|
||||||
|
@@ -118,65 +121,56 @@ static int switch_qemu_logdirty(int domi
|
||||||
|
PERROR("Couldn't contact xenstore");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
- if (!(path = strdup("/local/domain/0/device-model/"))) {
|
||||||
|
- PERROR("can't get domain path in store");
|
||||||
|
+
|
||||||
|
+ ret = asprintf(&path, "/local/domain/0/device-model/%i/logdirty/ret", domid);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ ERROR("Couldn't construct xenstore path");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
- if (!(path = realloc(path, strlen(path)
|
||||||
|
- + 10
|
||||||
|
- + strlen("/logdirty/cmd") + 1))) {
|
||||||
|
- PERROR("no memory for constructing xenstore path");
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
- snprintf(path + strlen(path), 11, "%i", domid);
|
||||||
|
- strcat(path, "/logdirty/");
|
||||||
|
- p = path + strlen(path);
|
||||||
|
-
|
||||||
|
+ /* Pointer to directory */
|
||||||
|
+ dir_p = path + ret - 3;
|
||||||
|
|
||||||
|
/* Watch for qemu's return value */
|
||||||
|
- strcpy(p, "ret");
|
||||||
|
- if (!xs_watch(xs, path, "qemu-logdirty-ret"))
|
||||||
|
- {
|
||||||
|
- ERROR("can't set watch in store (%s)\n", path);
|
||||||
|
+ if (!xs_watch(xs, path, "qemu-logdirty-ret")) {
|
||||||
|
+ PERROR("can't set watch in store (%s)", path);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!(cmd_str = strdup( enable == 0 ? "disable" : "enable"))) {
|
||||||
|
- PERROR("can't get logdirty cmd path in store");
|
||||||
|
+ cmd_str = enable ? "enable" : "disable";
|
||||||
|
+
|
||||||
|
+ /* Tell qemu that we want it to start logging dirty pages to Xen */
|
||||||
|
+ strcpy(dir_p, "cmd");
|
||||||
|
+ if (!xs_write(xs, XBT_NULL, path, cmd_str, strlen(cmd_str))) {
|
||||||
|
+ PERROR("can't write to store path (%s)", path);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Tell qemu that we want it to start logging dirty page to Xen */
|
||||||
|
- strcpy(p, "cmd");
|
||||||
|
- if (!xs_write(xs, XBT_NULL, path, cmd_str, strlen(cmd_str))) {
|
||||||
|
- PERROR("can't write to store path (%s)\n", path);
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
+ /* Restore initial path */
|
||||||
|
+ strcpy(dir_p, "ret");
|
||||||
|
+ /* Wait a while for qemu to signal that it has serviced logdirty command */
|
||||||
|
+ do {
|
||||||
|
+ tv.tv_sec = 5;
|
||||||
|
+ tv.tv_usec = 0;
|
||||||
|
+ FD_ZERO(&fdset);
|
||||||
|
+ FD_SET(xs_fileno(xs), &fdset);
|
||||||
|
+ errno = 0;
|
||||||
|
|
||||||
|
- /* Wait a while for qemu to signal that it has service logdirty command */
|
||||||
|
- read_again:
|
||||||
|
- tv.tv_sec = 5;
|
||||||
|
- tv.tv_usec = 0;
|
||||||
|
- FD_ZERO(&fdset);
|
||||||
|
- FD_SET(xs_fileno(xs), &fdset);
|
||||||
|
-
|
||||||
|
- if ((select(xs_fileno(xs) + 1, &fdset, NULL, NULL, &tv)) != 1) {
|
||||||
|
- PERROR("timed out waiting for qemu logdirty response.\n");
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- watch = xs_read_watch(xs, &len);
|
||||||
|
- free(watch);
|
||||||
|
-
|
||||||
|
- strcpy(p, "ret");
|
||||||
|
- ret_str = xs_read(xs, XBT_NULL, path, &len);
|
||||||
|
- if (ret_str == NULL || strcmp(ret_str, cmd_str))
|
||||||
|
+ if ((select(xs_fileno(xs) + 1, &fdset, NULL, NULL, &tv)) != 1) {
|
||||||
|
+ PERROR("timed out waiting for qemu logdirty response.");
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ watch = xs_read_watch(xs, &len);
|
||||||
|
+ free(watch);
|
||||||
|
+
|
||||||
|
+ ret_str = xs_read(xs, XBT_NULL, path, &len);
|
||||||
|
+ again = ret_str == NULL || strcmp(ret_str, cmd_str);
|
||||||
|
+ WPRINTF("Got '%s' from logdirty%s.\n", ret_str, again ? ", retrying" : "");
|
||||||
|
+ free(ret_str);
|
||||||
|
/* Watch fired but value is not yet right */
|
||||||
|
- goto read_again;
|
||||||
|
+ } while (again);
|
||||||
|
|
||||||
|
free(path);
|
||||||
|
- free(cmd_str);
|
||||||
|
- free(ret_str);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
138
xen.migrate.tools_add_xm_migrate_--log_progress_option.patch
Normal file
138
xen.migrate.tools_add_xm_migrate_--log_progress_option.patch
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
user: Olaf Hering <olaf@aepfle.de>
|
||||||
|
date: Wed Mar 06 17:05:15 2013 +0100
|
||||||
|
files: tools/libxc/xenguest.h tools/python/xen/xend/XendCheckpoint.py tools/python/xen/xend/XendDomain.py tools/python/xen/xend/XendDomainInfo.py tools/python/xen/xm/migrate.py tools/xcutils/xc_save.c
|
||||||
|
description:
|
||||||
|
tools: add xm migrate --log_progress option
|
||||||
|
|
||||||
|
xc_domain_save does print progress messages. These verbose messages are
|
||||||
|
disabled per default to avoid flood in xend.log. Sometimes it is helpful
|
||||||
|
to see progress when migrating large and busy guests. So add a new
|
||||||
|
option to xm migrate to actually enable the printing of progress
|
||||||
|
messsages.
|
||||||
|
|
||||||
|
xl migrate is not modified with this change because it does not use the
|
||||||
|
stdio logger.
|
||||||
|
|
||||||
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||||
|
|
||||||
|
|
||||||
|
diff -r 29c66a248f5b -r d8ef4a83760f tools/libxc/xenguest.h
|
||||||
|
--- a/tools/libxc/xenguest.h
|
||||||
|
+++ b/tools/libxc/xenguest.h
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
#define XCFLAGS_STDVGA (1 << 3)
|
||||||
|
#define XCFLAGS_CHECKPOINT_COMPRESS (1 << 4)
|
||||||
|
#define XCFLAGS_DOMSAVE_ABORT_IF_BUSY (1 << 5)
|
||||||
|
+#define XCFLAGS_PROGRESS (1 << 6)
|
||||||
|
|
||||||
|
#define X86_64_B_SIZE 64
|
||||||
|
#define X86_32_B_SIZE 32
|
||||||
|
diff -r 29c66a248f5b -r d8ef4a83760f tools/python/xen/xend/XendCheckpoint.py
|
||||||
|
--- a/tools/python/xen/xend/XendCheckpoint.py
|
||||||
|
+++ b/tools/python/xen/xend/XendCheckpoint.py
|
||||||
|
@@ -121,16 +121,19 @@ def save(fd, dominfo, network, live, dst
|
||||||
|
max_iters = dominfo.info.get('max_iters', "0")
|
||||||
|
max_factor = dominfo.info.get('max_factor', "0")
|
||||||
|
abort_if_busy = dominfo.info.get('abort_if_busy', "0")
|
||||||
|
+ log_save_progress = dominfo.info.get('log_save_progress', "0")
|
||||||
|
if max_iters == "None":
|
||||||
|
max_iters = "0"
|
||||||
|
if max_factor == "None":
|
||||||
|
max_factor = "0"
|
||||||
|
if abort_if_busy == "None":
|
||||||
|
abort_if_busy = "0"
|
||||||
|
+ if log_save_progress == "None":
|
||||||
|
+ log_save_progress = "0"
|
||||||
|
cmd = [xen.util.auxbin.pathTo(XC_SAVE), str(fd),
|
||||||
|
str(dominfo.getDomid()),
|
||||||
|
max_iters, max_factor,
|
||||||
|
- str( int(live) | (int(hvm) << 2) | (int(abort_if_busy) << 5) ) ]
|
||||||
|
+ str( int(live) | (int(hvm) << 2) | (int(abort_if_busy) << 5) | (int(log_save_progress) << 6) ) ]
|
||||||
|
log.debug("[xc_save]: %s", string.join(cmd))
|
||||||
|
|
||||||
|
def saveInputHandler(line, tochild):
|
||||||
|
diff -r 29c66a248f5b -r d8ef4a83760f tools/python/xen/xend/XendDomain.py
|
||||||
|
--- a/tools/python/xen/xend/XendDomain.py
|
||||||
|
+++ b/tools/python/xen/xend/XendDomain.py
|
||||||
|
@@ -1832,17 +1832,18 @@ class XendDomain:
|
||||||
|
log.exception(ex)
|
||||||
|
raise XendError(str(ex))
|
||||||
|
|
||||||
|
- def domain_migrate_constraints_set(self, domid, max_iters, max_factor, abort_if_busy):
|
||||||
|
+ def domain_migrate_constraints_set(self, domid, max_iters, max_factor, abort_if_busy, log_save_progress):
|
||||||
|
"""Set the Migrate Constraints of this domain.
|
||||||
|
@param domid: Domain ID or Name
|
||||||
|
@param max_iters: Number of iterations before final suspend
|
||||||
|
@param max_factor: Max amount of memory to transfer before final suspend
|
||||||
|
@param abort_if_busy: Abort migration instead of doing final suspend
|
||||||
|
+ @param log_save_progress: Log progress of migrate to xend.log
|
||||||
|
"""
|
||||||
|
dominfo = self.domain_lookup_nr(domid)
|
||||||
|
if not dominfo:
|
||||||
|
raise XendInvalidDomain(str(domid))
|
||||||
|
- dominfo.setMigrateConstraints(max_iters, max_factor, abort_if_busy)
|
||||||
|
+ dominfo.setMigrateConstraints(max_iters, max_factor, abort_if_busy, log_save_progress)
|
||||||
|
|
||||||
|
def domain_maxmem_set(self, domid, mem):
|
||||||
|
"""Set the memory limit for a domain.
|
||||||
|
diff -r 29c66a248f5b -r d8ef4a83760f tools/python/xen/xend/XendDomainInfo.py
|
||||||
|
--- a/tools/python/xen/xend/XendDomainInfo.py
|
||||||
|
+++ b/tools/python/xen/xend/XendDomainInfo.py
|
||||||
|
@@ -1459,17 +1459,19 @@ class XendDomainInfo:
|
||||||
|
pci_conf = self.info['devices'][dev_uuid][1]
|
||||||
|
return map(pci_dict_to_bdf_str, pci_conf['devs'])
|
||||||
|
|
||||||
|
- def setMigrateConstraints(self, max_iters, max_factor, abort_if_busy):
|
||||||
|
+ def setMigrateConstraints(self, max_iters, max_factor, abort_if_busy, log_save_progress):
|
||||||
|
"""Set the Migrate Constraints of this domain.
|
||||||
|
@param max_iters: Number of iterations before final suspend
|
||||||
|
@param max_factor: Max amount of memory to transfer before final suspend
|
||||||
|
@param abort_if_busy: Abort migration instead of doing final suspend
|
||||||
|
+ @param log_save_progress: Log progress of migrate to xend.log
|
||||||
|
"""
|
||||||
|
log.debug("Setting migration constraints of domain %s (%s) to '%s' '%s' '%s'.",
|
||||||
|
self.info['name_label'], str(self.domid), max_iters, max_factor, abort_if_busy)
|
||||||
|
self.info['max_iters'] = str(max_iters)
|
||||||
|
self.info['max_factor'] = str(max_factor)
|
||||||
|
self.info['abort_if_busy'] = str(abort_if_busy)
|
||||||
|
+ self.info['log_save_progress'] = str(log_save_progress)
|
||||||
|
|
||||||
|
def setMemoryTarget(self, target):
|
||||||
|
"""Set the memory target of this domain.
|
||||||
|
diff -r 29c66a248f5b -r d8ef4a83760f tools/python/xen/xm/migrate.py
|
||||||
|
--- a/tools/python/xen/xm/migrate.py
|
||||||
|
+++ b/tools/python/xen/xm/migrate.py
|
||||||
|
@@ -67,6 +67,10 @@ gopts.opt('abort_if_busy', short='A',
|
||||||
|
fn=set_true, default=0,
|
||||||
|
use="Abort migration instead of doing final suspend.")
|
||||||
|
|
||||||
|
+gopts.opt('log_progress',
|
||||||
|
+ fn=set_true, default=0,
|
||||||
|
+ use="Log progress of migration to xend.log")
|
||||||
|
+
|
||||||
|
def help():
|
||||||
|
return str(gopts)
|
||||||
|
|
||||||
|
@@ -95,7 +99,8 @@ def main(argv):
|
||||||
|
server.xend.domain.migrate_constraints_set(dom,
|
||||||
|
opts.vals.max_iters,
|
||||||
|
opts.vals.max_factor,
|
||||||
|
- opts.vals.abort_if_busy)
|
||||||
|
+ opts.vals.abort_if_busy,
|
||||||
|
+ opts.vals.log_progress)
|
||||||
|
server.xend.domain.migrate(dom, dst, opts.vals.live,
|
||||||
|
opts.vals.port,
|
||||||
|
opts.vals.node,
|
||||||
|
diff -r 29c66a248f5b -r d8ef4a83760f tools/xcutils/xc_save.c
|
||||||
|
--- a/tools/xcutils/xc_save.c
|
||||||
|
+++ b/tools/xcutils/xc_save.c
|
||||||
|
@@ -197,7 +197,8 @@ main(int argc, char **argv)
|
||||||
|
si.suspend_evtchn = -1;
|
||||||
|
|
||||||
|
lvl = si.flags & XCFLAGS_DEBUG ? XTL_DEBUG: XTL_DETAIL;
|
||||||
|
- lflags = XTL_STDIOSTREAM_SHOW_PID | XTL_STDIOSTREAM_HIDE_PROGRESS;
|
||||||
|
+ lflags = XTL_STDIOSTREAM_SHOW_PID;
|
||||||
|
+ lflags |= si.flags & XCFLAGS_PROGRESS ? 0 : XTL_STDIOSTREAM_HIDE_PROGRESS;
|
||||||
|
l = (xentoollog_logger *)xtl_createlogger_stdiostream(stderr, lvl, lflags);
|
||||||
|
xch = si.xch = xc_interface_open(l, 0, 0);
|
||||||
|
if (!si.xch)
|
223
xen.migrate.tools_set_migration_constraints_from_cmdline.patch
Normal file
223
xen.migrate.tools_set_migration_constraints_from_cmdline.patch
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
user: Olaf Hering <olaf@aepfle.de>
|
||||||
|
date: Wed Mar 06 17:05:14 2013 +0100
|
||||||
|
files: docs/man/xl.pod.1 tools/libxc/xc_domain_save.c tools/libxc/xenguest.h tools/libxl/Makefile tools/libxl/libxl.c tools/libxl/libxl.h tools/libxl/libxl_dom.c tools/libxl/libxl_internal.h tools/libxl/libxl_save_callout.c tools/libxl/xl_cmdimpl.c tools/libxl/xl_cmdtable.c tools/python/xen/xend/XendCheckpoint.py tools/python/xen/xend/XendDomain.py tools/python/xen/xend/XendDomainInfo.py tools/python/xen/xm/migrate.py
|
||||||
|
description:
|
||||||
|
tools: set migration constraints from cmdline
|
||||||
|
|
||||||
|
Add new options to xm/xl migrate to control the process of migration.
|
||||||
|
The intention is to optionally abort the migration if it takes too long
|
||||||
|
to migrate a busy guest due to the high number of dirty pages. Currently
|
||||||
|
the guest is suspended to transfer the remaining dirty pages. This
|
||||||
|
transfer can take too long, which can confuse the guest if its suspended
|
||||||
|
for too long.
|
||||||
|
|
||||||
|
-M <number> Number of iterations before final suspend (default: 30)
|
||||||
|
--max_iters <number>
|
||||||
|
|
||||||
|
-m <factor> Max amount of memory to transfer before final suspend (default: 3*RAM)
|
||||||
|
--max_factor <factor>
|
||||||
|
|
||||||
|
-A Abort migration instead of doing final suspend.
|
||||||
|
--abort_if_busy
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
The changes to libxl change the API, handle LIBXL_API_VERSION == 0x040200.
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
eventually add also --min_remaining (default value 50) in a seperate patch
|
||||||
|
|
||||||
|
v6:
|
||||||
|
- update the LIBXL_API_VERSION handling for libxl_domain_suspend
|
||||||
|
change it to an inline function if LIBXL_API_VERSION is defined to 4.2.0
|
||||||
|
- rename libxl_save_properties to libxl_domain_suspend_properties
|
||||||
|
- rename ->xlflags to ->flags within that struct
|
||||||
|
|
||||||
|
v5:
|
||||||
|
- adjust libxl_domain_suspend prototype, move flags, max_iters,
|
||||||
|
max_factor into a new, optional struct libxl_save_properties
|
||||||
|
- rename XCFLAGS_DOMSAVE_NOSUSPEND to XCFLAGS_DOMSAVE_ABORT_IF_BUSY
|
||||||
|
- rename LIBXL_SUSPEND_NO_FINAL_SUSPEND to LIBXL_SUSPEND_ABORT_IF_BUSY
|
||||||
|
- rename variables no_suspend to abort_if_busy
|
||||||
|
- rename option -N/--no_suspend to -A/--abort_if_busy
|
||||||
|
- update xl.1, extend description of -A option
|
||||||
|
|
||||||
|
v4:
|
||||||
|
- update default for no_suspend from None to 0 in XendCheckpoint.py:save
|
||||||
|
- update logoutput in setMigrateConstraints
|
||||||
|
- change xm migrate defaults from None to 0
|
||||||
|
- add new options to xl.1
|
||||||
|
- fix syntax error in XendDomain.py:domain_migrate_constraints_set
|
||||||
|
- fix xm migrate -N option name to match xl migrate
|
||||||
|
|
||||||
|
v3:
|
||||||
|
- move logic errors in libxl__domain_suspend and fixed help text in
|
||||||
|
cmd_table to separate patches
|
||||||
|
- fix syntax error in XendCheckpoint.py
|
||||||
|
- really pass max_iters and max_factor in libxl__xc_domain_save
|
||||||
|
- make libxl_domain_suspend_0x040200 declaration globally visible
|
||||||
|
- bump libxenlight.so SONAME from 2.0 to 2.1 due to changed
|
||||||
|
libxl_domain_suspend
|
||||||
|
|
||||||
|
v2:
|
||||||
|
- use LIBXL_API_VERSION and define libxl_domain_suspend_0x040200
|
||||||
|
- fix logic error in min_reached check in xc_domain_save
|
||||||
|
- add longopts
|
||||||
|
- update --help text
|
||||||
|
- correct description of migrate --help text
|
||||||
|
|
||||||
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||||
|
|
||||||
|
|
||||||
|
Index: xen-4.2.1-testing/tools/libxc/xc_domain_save.c
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/libxc/xc_domain_save.c
|
||||||
|
+++ xen-4.2.1-testing/tools/libxc/xc_domain_save.c
|
||||||
|
@@ -813,6 +813,7 @@ int xc_domain_save(xc_interface *xch, in
|
||||||
|
int rc = 1, frc, i, j, last_iter = 0, iter = 0;
|
||||||
|
int live = (flags & XCFLAGS_LIVE);
|
||||||
|
int debug = (flags & XCFLAGS_DEBUG);
|
||||||
|
+ int abort_if_busy = (flags & XCFLAGS_DOMSAVE_ABORT_IF_BUSY);
|
||||||
|
int superpages = !!hvm;
|
||||||
|
int race = 0, sent_last_iter, skip_this_iter = 0;
|
||||||
|
unsigned int sent_this_iter = 0;
|
||||||
|
@@ -1525,10 +1526,20 @@ int xc_domain_save(xc_interface *xch, in
|
||||||
|
|
||||||
|
if ( live )
|
||||||
|
{
|
||||||
|
+ int min_reached = sent_this_iter + skip_this_iter < 50;
|
||||||
|
if ( (iter >= max_iters) ||
|
||||||
|
- (sent_this_iter+skip_this_iter < 50) ||
|
||||||
|
+ min_reached ||
|
||||||
|
(total_sent > dinfo->p2m_size*max_factor) )
|
||||||
|
{
|
||||||
|
+ if ( !min_reached && abort_if_busy )
|
||||||
|
+ {
|
||||||
|
+ ERROR("Live migration aborted, as requested. (guest too busy?)"
|
||||||
|
+ " total_sent %lu iter %d, max_iters %u max_factor %u",
|
||||||
|
+ total_sent, iter, max_iters, max_factor);
|
||||||
|
+ rc = 1;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
DPRINTF("Start last iteration\n");
|
||||||
|
last_iter = 1;
|
||||||
|
|
||||||
|
Index: xen-4.2.1-testing/tools/libxc/xenguest.h
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/libxc/xenguest.h
|
||||||
|
+++ xen-4.2.1-testing/tools/libxc/xenguest.h
|
||||||
|
@@ -28,6 +28,7 @@
|
||||||
|
#define XCFLAGS_HVM (1 << 2)
|
||||||
|
#define XCFLAGS_STDVGA (1 << 3)
|
||||||
|
#define XCFLAGS_CHECKPOINT_COMPRESS (1 << 4)
|
||||||
|
+#define XCFLAGS_DOMSAVE_ABORT_IF_BUSY (1 << 5)
|
||||||
|
|
||||||
|
#define X86_64_B_SIZE 64
|
||||||
|
#define X86_32_B_SIZE 32
|
||||||
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
||||||
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
|
@@ -118,9 +118,19 @@ def save(fd, dominfo, network, live, dst
|
||||||
|
# enabled. Passing "0" simply uses the defaults compiled into
|
||||||
|
# libxenguest; see the comments and/or code in xc_linux_save() for
|
||||||
|
# more information.
|
||||||
|
+ max_iters = dominfo.info.get('max_iters', "0")
|
||||||
|
+ max_factor = dominfo.info.get('max_factor', "0")
|
||||||
|
+ abort_if_busy = dominfo.info.get('abort_if_busy', "0")
|
||||||
|
+ if max_iters == "None":
|
||||||
|
+ max_iters = "0"
|
||||||
|
+ if max_factor == "None":
|
||||||
|
+ max_factor = "0"
|
||||||
|
+ if abort_if_busy == "None":
|
||||||
|
+ abort_if_busy = "0"
|
||||||
|
cmd = [xen.util.auxbin.pathTo(XC_SAVE), str(fd),
|
||||||
|
- str(dominfo.getDomid()), "0", "0",
|
||||||
|
- str(int(live) | (int(hvm) << 2)) ]
|
||||||
|
+ str(dominfo.getDomid()),
|
||||||
|
+ max_iters, max_factor,
|
||||||
|
+ str( int(live) | (int(hvm) << 2) | (int(abort_if_busy) << 5) ) ]
|
||||||
|
log.debug("[xc_save]: %s", string.join(cmd))
|
||||||
|
|
||||||
|
def saveInputHandler(line, tochild):
|
||||||
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomain.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomain.py
|
||||||
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomain.py
|
||||||
|
@@ -1832,6 +1832,18 @@ class XendDomain:
|
||||||
|
log.exception(ex)
|
||||||
|
raise XendError(str(ex))
|
||||||
|
|
||||||
|
+ def domain_migrate_constraints_set(self, domid, max_iters, max_factor, abort_if_busy):
|
||||||
|
+ """Set the Migrate Constraints of this domain.
|
||||||
|
+ @param domid: Domain ID or Name
|
||||||
|
+ @param max_iters: Number of iterations before final suspend
|
||||||
|
+ @param max_factor: Max amount of memory to transfer before final suspend
|
||||||
|
+ @param abort_if_busy: Abort migration instead of doing final suspend
|
||||||
|
+ """
|
||||||
|
+ dominfo = self.domain_lookup_nr(domid)
|
||||||
|
+ if not dominfo:
|
||||||
|
+ raise XendInvalidDomain(str(domid))
|
||||||
|
+ dominfo.setMigrateConstraints(max_iters, max_factor, abort_if_busy)
|
||||||
|
+
|
||||||
|
def domain_maxmem_set(self, domid, mem):
|
||||||
|
"""Set the memory limit for a domain.
|
||||||
|
|
||||||
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
|
@@ -1459,6 +1459,18 @@ class XendDomainInfo:
|
||||||
|
pci_conf = self.info['devices'][dev_uuid][1]
|
||||||
|
return map(pci_dict_to_bdf_str, pci_conf['devs'])
|
||||||
|
|
||||||
|
+ def setMigrateConstraints(self, max_iters, max_factor, abort_if_busy):
|
||||||
|
+ """Set the Migrate Constraints of this domain.
|
||||||
|
+ @param max_iters: Number of iterations before final suspend
|
||||||
|
+ @param max_factor: Max amount of memory to transfer before final suspend
|
||||||
|
+ @param abort_if_busy: Abort migration instead of doing final suspend
|
||||||
|
+ """
|
||||||
|
+ log.debug("Setting migration constraints of domain %s (%s) to '%s' '%s' '%s'.",
|
||||||
|
+ self.info['name_label'], str(self.domid), max_iters, max_factor, abort_if_busy)
|
||||||
|
+ self.info['max_iters'] = str(max_iters)
|
||||||
|
+ self.info['max_factor'] = str(max_factor)
|
||||||
|
+ self.info['abort_if_busy'] = str(abort_if_busy)
|
||||||
|
+
|
||||||
|
def setMemoryTarget(self, target):
|
||||||
|
"""Set the memory target of this domain.
|
||||||
|
@param target: In MiB.
|
||||||
|
Index: xen-4.2.1-testing/tools/python/xen/xm/migrate.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/xen/xm/migrate.py
|
||||||
|
+++ xen-4.2.1-testing/tools/python/xen/xm/migrate.py
|
||||||
|
@@ -55,6 +55,18 @@ gopts.opt('change_home_server', short='c
|
||||||
|
fn=set_true, default=0,
|
||||||
|
use="Change home server for managed domains.")
|
||||||
|
|
||||||
|
+gopts.opt('max_iters', short='M', val='max_iters',
|
||||||
|
+ fn=set_int, default=0,
|
||||||
|
+ use="Number of iterations before final suspend (default: 30).")
|
||||||
|
+
|
||||||
|
+gopts.opt('max_factor', short='m', val='max_factor',
|
||||||
|
+ fn=set_int, default=0,
|
||||||
|
+ use="Max amount of memory to transfer before final suspend (default: 3*RAM).")
|
||||||
|
+
|
||||||
|
+gopts.opt('abort_if_busy', short='A',
|
||||||
|
+ fn=set_true, default=0,
|
||||||
|
+ use="Abort migration instead of doing final suspend.")
|
||||||
|
+
|
||||||
|
def help():
|
||||||
|
return str(gopts)
|
||||||
|
|
||||||
|
@@ -80,6 +92,10 @@ def main(argv):
|
||||||
|
server.xenapi.VM.migrate(vm_ref, dst, bool(opts.vals.live),
|
||||||
|
other_config)
|
||||||
|
else:
|
||||||
|
+ server.xend.domain.migrate_constraints_set(dom,
|
||||||
|
+ opts.vals.max_iters,
|
||||||
|
+ opts.vals.max_factor,
|
||||||
|
+ opts.vals.abort_if_busy)
|
||||||
|
server.xend.domain.migrate(dom, dst, opts.vals.live,
|
||||||
|
opts.vals.port,
|
||||||
|
opts.vals.node,
|
51
xen.spec
51
xen.spec
@ -15,6 +15,7 @@
|
|||||||
# Please submit bugfixes or comments via http://bugs.opensuse.org/
|
# Please submit bugfixes or comments via http://bugs.opensuse.org/
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
Name: xen
|
Name: xen
|
||||||
ExclusiveArch: %ix86 x86_64
|
ExclusiveArch: %ix86 x86_64
|
||||||
%define xvers 4.2
|
%define xvers 4.2
|
||||||
@ -114,7 +115,7 @@ BuildRequires: kernel-syms
|
|||||||
BuildRequires: module-init-tools
|
BuildRequires: module-init-tools
|
||||||
BuildRequires: xorg-x11
|
BuildRequires: xorg-x11
|
||||||
%endif
|
%endif
|
||||||
Version: 4.2.1_06
|
Version: 4.2.1_11
|
||||||
Release: 0
|
Release: 0
|
||||||
PreReq: %insserv_prereq %fillup_prereq
|
PreReq: %insserv_prereq %fillup_prereq
|
||||||
Summary: Xen Virtualization: Hypervisor (aka VMM aka Microkernel)
|
Summary: Xen Virtualization: Hypervisor (aka VMM aka Microkernel)
|
||||||
@ -250,7 +251,7 @@ Patch26532: 26532-AMD-IOMMU-phantom-MSI.patch
|
|||||||
Patch26536: 26536-xenoprof-div-by-0.patch
|
Patch26536: 26536-xenoprof-div-by-0.patch
|
||||||
Patch26547: 26547-tools-xc_fix_logic_error_in_stdiostream_progress.patch
|
Patch26547: 26547-tools-xc_fix_logic_error_in_stdiostream_progress.patch
|
||||||
Patch26548: 26548-tools-xc_handle_tty_output_differently_in_stdiostream_progress.patch
|
Patch26548: 26548-tools-xc_handle_tty_output_differently_in_stdiostream_progress.patch
|
||||||
Patch26549: 26549-tools-xc_turn_XCFLAGS_*_into_shifts.patch
|
Patch26549: 26549-tools-xc_turn_XCFLAGS__into_shifts.patch
|
||||||
Patch26550: 26550-tools-xc_restore_logging_in_xc_save.patch
|
Patch26550: 26550-tools-xc_restore_logging_in_xc_save.patch
|
||||||
Patch26551: 26551-tools-xc_log_pid_in_xc_save-xc_restore_output.patch
|
Patch26551: 26551-tools-xc_log_pid_in_xc_save-xc_restore_output.patch
|
||||||
Patch26554: 26554-hvm-firmware-passthrough.patch
|
Patch26554: 26554-hvm-firmware-passthrough.patch
|
||||||
@ -259,8 +260,29 @@ Patch26556: 26556-hvm-firmware-passthrough.patch
|
|||||||
Patch26576: 26576-x86-APICV-migration.patch
|
Patch26576: 26576-x86-APICV-migration.patch
|
||||||
Patch26577: 26577-x86-APICV-x2APIC.patch
|
Patch26577: 26577-x86-APICV-x2APIC.patch
|
||||||
Patch26578: 26578-AMD-IOMMU-replace-BUG_ON.patch
|
Patch26578: 26578-AMD-IOMMU-replace-BUG_ON.patch
|
||||||
|
Patch26585: 26585-x86-mm-Take-the-p2m-lock-even-in-shadow-mode.patch
|
||||||
|
Patch26595: 26595-x86-nhvm-properly-clean-up-after-failure-to-set-up-all-vCPU-s.patch
|
||||||
|
Patch26601: 26601-honor-ACPI-v4-FADT-flags.patch
|
||||||
|
Patch26656: 26656-x86-fix-null-pointer-dereference-in-intel_get_extended_msrs.patch
|
||||||
|
Patch26659: 26659-AMD-IOMMU-erratum-746-workaround.patch
|
||||||
|
Patch26660: 26660-x86-fix-CMCI-injection.patch
|
||||||
|
Patch26672: 26672-vmx-fix-handling-of-NMI-VMEXIT.patch
|
||||||
|
Patch26673: 26673-Avoid-stale-pointer-when-moving-domain-to-another-cpupool.patch
|
||||||
|
Patch26675: 26675-tools-xentoollog_update_tty_detection_in_stdiostream_progress.patch
|
||||||
|
Patch26676: 26676-fix-compat-memory-exchange-op-splitting.patch
|
||||||
|
Patch26677: 26677-x86-make-certain-memory-sub-ops-return-valid-values.patch
|
||||||
|
Patch26678: 26678-SEDF-avoid-gathering-vCPU-s-on-pCPU0.patch
|
||||||
|
Patch26679: 26679-x86-defer-processing-events-on-the-NMI-exit-path.patch
|
||||||
|
Patch26683: 26683-credit1-Use-atomic-bit-operations-for-the-flags-structure.patch
|
||||||
|
Patch26686: 26686-xentrace-fix-off-by-one-in-calculate_tbuf_size.patch
|
||||||
|
Patch26689: 26689-fix-domain-unlocking-in-some-xsm-error-paths.patch
|
||||||
Patch34: CVE-2013-0151-xsa34.patch
|
Patch34: CVE-2013-0151-xsa34.patch
|
||||||
Patch41: CVE-2012-6075-xsa41.patch
|
Patch41: CVE-2012-6075-xsa41.patch
|
||||||
|
Patch88: xen.migrate.tools-xc_print_messages_from_xc_save_with_xc_report.patch
|
||||||
|
Patch89: xen.migrate.tools-xc_document_printf_calls_in_xc_restore.patch
|
||||||
|
Patch90: xen.migrate.tools-xc_rework_xc_save.cswitch_qemu_logdirty.patch
|
||||||
|
Patch91: xen.migrate.tools_set_migration_constraints_from_cmdline.patch
|
||||||
|
Patch92: xen.migrate.tools_add_xm_migrate_--log_progress_option.patch
|
||||||
# Upstream qemu patches
|
# Upstream qemu patches
|
||||||
Patch100: VNC-Support-for-ExtendedKeyEvent-client-message.patch
|
Patch100: VNC-Support-for-ExtendedKeyEvent-client-message.patch
|
||||||
# Our patches
|
# Our patches
|
||||||
@ -357,6 +379,7 @@ Patch461: xen-glibc217.patch
|
|||||||
Patch462: xen-migration-bridge-check.patch
|
Patch462: xen-migration-bridge-check.patch
|
||||||
Patch463: pygrub-netware-xnloader.patch
|
Patch463: pygrub-netware-xnloader.patch
|
||||||
Patch464: xen-managed-pci-device.patch
|
Patch464: xen-managed-pci-device.patch
|
||||||
|
Patch465: xend-hvm-firmware-passthrough.patch
|
||||||
# Jim's domain lock patch
|
# Jim's domain lock patch
|
||||||
Patch480: xend-domain-lock.patch
|
Patch480: xend-domain-lock.patch
|
||||||
Patch481: xend-domain-lock-sfex.patch
|
Patch481: xend-domain-lock-sfex.patch
|
||||||
@ -812,7 +835,28 @@ tar xfj %{SOURCE6} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools
|
|||||||
%patch26576 -p1
|
%patch26576 -p1
|
||||||
%patch26577 -p1
|
%patch26577 -p1
|
||||||
%patch26578 -p1
|
%patch26578 -p1
|
||||||
|
%patch26585 -p1
|
||||||
|
%patch26595 -p1
|
||||||
|
%patch26601 -p1
|
||||||
|
%patch26656 -p1
|
||||||
|
%patch26659 -p1
|
||||||
|
%patch26660 -p1
|
||||||
|
%patch26672 -p1
|
||||||
|
%patch26673 -p1
|
||||||
|
%patch26675 -p1
|
||||||
|
%patch26676 -p1
|
||||||
|
%patch26677 -p1
|
||||||
|
%patch26678 -p1
|
||||||
|
%patch26679 -p1
|
||||||
|
%patch26683 -p1
|
||||||
|
%patch26686 -p1
|
||||||
|
%patch26689 -p1
|
||||||
%patch41 -p1
|
%patch41 -p1
|
||||||
|
%patch88 -p1
|
||||||
|
%patch89 -p1
|
||||||
|
%patch90 -p1
|
||||||
|
%patch91 -p1
|
||||||
|
%patch92 -p1
|
||||||
# Qemu
|
# Qemu
|
||||||
%patch100 -p1
|
%patch100 -p1
|
||||||
# Our patches
|
# Our patches
|
||||||
@ -906,6 +950,7 @@ tar xfj %{SOURCE6} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools
|
|||||||
%patch462 -p1
|
%patch462 -p1
|
||||||
%patch463 -p1
|
%patch463 -p1
|
||||||
%patch464 -p1
|
%patch464 -p1
|
||||||
|
%patch465 -p1
|
||||||
%patch480 -p1
|
%patch480 -p1
|
||||||
%patch481 -p1
|
%patch481 -p1
|
||||||
%patch500 -p1
|
%patch500 -p1
|
||||||
@ -982,6 +1027,7 @@ export EXTRA_CFLAGS_XEN_TOOLS="$RPM_OPT_FLAGS"
|
|||||||
export EXTRA_CFLAGS_QEMU_TRADITIONAL="$RPM_OPT_FLAGS"
|
export EXTRA_CFLAGS_QEMU_TRADITIONAL="$RPM_OPT_FLAGS"
|
||||||
export EXTRA_CFLAGS_QEMU_XEN="$RPM_OPT_FLAGS"
|
export EXTRA_CFLAGS_QEMU_XEN="$RPM_OPT_FLAGS"
|
||||||
%if %{?with_dom0_support}0
|
%if %{?with_dom0_support}0
|
||||||
|
export BRP_PESIGN_FILES="*.ko *.efi /lib/firmware"
|
||||||
# EFI
|
# EFI
|
||||||
%ifarch x86_64
|
%ifarch x86_64
|
||||||
make -C xen install \
|
make -C xen install \
|
||||||
@ -1045,7 +1091,6 @@ make -C tools/misc/serial-split install \
|
|||||||
%if %{?with_kmp}0
|
%if %{?with_kmp}0
|
||||||
export INSTALL_MOD_PATH=$RPM_BUILD_ROOT
|
export INSTALL_MOD_PATH=$RPM_BUILD_ROOT
|
||||||
export INSTALL_MOD_DIR=updates
|
export INSTALL_MOD_DIR=updates
|
||||||
#export BRP_PESIGN_FILES="*.ko /lib/firmware"
|
|
||||||
mkdir -p $RPM_BUILD_ROOT/etc/modprobe.d
|
mkdir -p $RPM_BUILD_ROOT/etc/modprobe.d
|
||||||
for flavor in %flavors_to_build; do
|
for flavor in %flavors_to_build; do
|
||||||
make -C /usr/src/linux-obj/%_target_cpu/$flavor modules_install \
|
make -C /usr/src/linux-obj/%_target_cpu/$flavor modules_install \
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:006b68099906f6f0846e8a7d7ded8bc8f3abfbcc1c4daac013a4eaa9aefb344f
|
oid sha256:36aabe13da4b7ca0e0f9b61fa1442823e437585ef56b604ab077af20bb93ef67
|
||||||
size 124265
|
size 126674
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -3940,6 +3940,14 @@ class XendDomainInfo:
|
@@ -3954,6 +3954,14 @@ class XendDomainInfo:
|
||||||
if not config.has_key('backend'):
|
if not config.has_key('backend'):
|
||||||
config['backend'] = "00000000-0000-0000-0000-000000000000"
|
config['backend'] = "00000000-0000-0000-0000-000000000000"
|
||||||
|
|
||||||
|
@ -3,11 +3,11 @@ xenstore. See bnc#706574
|
|||||||
|
|
||||||
From: Chunyan Liu <cyliu@novell.com>
|
From: Chunyan Liu <cyliu@novell.com>
|
||||||
|
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
@@ -329,8 +329,7 @@ def restore(xd, fd, dominfo = None, paus
|
@@ -342,8 +342,7 @@ def restore(xd, fd, dominfo = None, paus
|
||||||
restore_image.setCpuid()
|
restore_image.setCpuid()
|
||||||
|
|
||||||
# xc_restore will wait for source to close connection
|
# xc_restore will wait for source to close connection
|
||||||
@ -17,11 +17,11 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
|||||||
|
|
||||||
#
|
#
|
||||||
# We shouldn't hold the domains_lock over a waitForDevices
|
# We shouldn't hold the domains_lock over a waitForDevices
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -3062,7 +3062,7 @@ class XendDomainInfo:
|
@@ -3076,7 +3076,7 @@ class XendDomainInfo:
|
||||||
# TODO: recategorise - called from XendCheckpoint
|
# TODO: recategorise - called from XendCheckpoint
|
||||||
#
|
#
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
|
|
||||||
log.debug("XendDomainInfo.completeRestore")
|
log.debug("XendDomainInfo.completeRestore")
|
||||||
|
|
||||||
@@ -3073,6 +3073,7 @@ class XendDomainInfo:
|
@@ -3087,6 +3087,7 @@ class XendDomainInfo:
|
||||||
self.image = image.create(self, self.info)
|
self.image = image.create(self, self.info)
|
||||||
if self.image:
|
if self.image:
|
||||||
self.image.createDeviceModel(True)
|
self.image.createDeviceModel(True)
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -2304,7 +2304,7 @@ class XendDomainInfo:
|
@@ -2318,7 +2318,7 @@ class XendDomainInfo:
|
||||||
# To prohibit directory traversal
|
# To prohibit directory traversal
|
||||||
based_name = os.path.basename(self.info['name_label'])
|
based_name = os.path.basename(self.info['name_label'])
|
||||||
|
|
||||||
|
@ -223,7 +223,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -4554,8 +4554,14 @@ class XendDomainInfo:
|
@@ -4570,8 +4570,14 @@ class XendDomainInfo:
|
||||||
|
|
||||||
# Return name of host contained in lock file.
|
# Return name of host contained in lock file.
|
||||||
def get_lock_host(self, path):
|
def get_lock_host(self, path):
|
||||||
@ -240,7 +240,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
hostname = "unknown"
|
hostname = "unknown"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -4577,6 +4583,16 @@ class XendDomainInfo:
|
@@ -4593,6 +4599,16 @@ class XendDomainInfo:
|
||||||
path = xoptions.get_xend_domain_lock_path()
|
path = xoptions.get_xend_domain_lock_path()
|
||||||
path = os.path.join(path, self.get_uuid())
|
path = os.path.join(path, self.get_uuid())
|
||||||
|
|
||||||
@ -257,7 +257,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
try:
|
try:
|
||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
mkdir.parents(path, stat.S_IRWXU)
|
mkdir.parents(path, stat.S_IRWXU)
|
||||||
@@ -4584,12 +4600,7 @@ class XendDomainInfo:
|
@@ -4600,12 +4616,7 @@ class XendDomainInfo:
|
||||||
log.exception("%s could not be created." % path)
|
log.exception("%s could not be created." % path)
|
||||||
raise XendError("%s could not be created." % path)
|
raise XendError("%s could not be created." % path)
|
||||||
|
|
||||||
@ -271,7 +271,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
if status != 0:
|
if status != 0:
|
||||||
log.debug("Failed to aqcuire lock: status = %d" % status)
|
log.debug("Failed to aqcuire lock: status = %d" % status)
|
||||||
raise XendError("The VM is locked and appears to be running on host %s." % self.get_lock_host(path))
|
raise XendError("The VM is locked and appears to be running on host %s." % self.get_lock_host(path))
|
||||||
@@ -4606,12 +4617,18 @@ class XendDomainInfo:
|
@@ -4622,12 +4633,18 @@ class XendDomainInfo:
|
||||||
|
|
||||||
path = xoptions.get_xend_domain_lock_path()
|
path = xoptions.get_xend_domain_lock_path()
|
||||||
path = os.path.join(path, self.get_uuid())
|
path = os.path.join(path, self.get_uuid())
|
||||||
|
@ -17,8 +17,8 @@ Index: xen-4.2.1-testing/tools/examples/xend-config.sxp
|
|||||||
#(pci-passthrough-strict-check yes)
|
#(pci-passthrough-strict-check yes)
|
||||||
|
|
||||||
+# Domain Locking
|
+# Domain Locking
|
||||||
+# In a multihost environment, domain locking prevents simultaneously
|
+# In a multihost environment, domain locking provides a simple mechanism that
|
||||||
+# running a domain on more than one host.
|
+# prevents simultaneously running a domain on more than one host.
|
||||||
+#
|
+#
|
||||||
+# If enabled, xend will execute a external lock utility (defined below)
|
+# If enabled, xend will execute a external lock utility (defined below)
|
||||||
+# on each domain start and stop event. Disabled by default. Set to yes
|
+# on each domain start and stop event. Disabled by default. Set to yes
|
||||||
@ -71,7 +71,7 @@ Index: xen-4.2.1-testing/tools/examples/xend-config.sxp
|
|||||||
+# when HostA, running vm1, crashes. HostB could not acquire a
|
+# when HostA, running vm1, crashes. HostB could not acquire a
|
||||||
+# lock for vm1 since the NFS server holds an exclusive lock
|
+# lock for vm1 since the NFS server holds an exclusive lock
|
||||||
+# acquired by HostA. The lock file must be manually removed
|
+# acquired by HostA. The lock file must be manually removed
|
||||||
+# before starting vm1 on HostA.
|
+# before starting vm1 on HostB.
|
||||||
+#
|
+#
|
||||||
+#(xend-domain-lock-utility domain-lock)
|
+#(xend-domain-lock-utility domain-lock)
|
||||||
+
|
+
|
||||||
@ -228,16 +228,29 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
||||||
+++ xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
@@ -130,6 +130,8 @@ def save(fd, dominfo, network, live, dst
|
@@ -136,6 +136,11 @@ def save(fd, dominfo, network, live, dst
|
||||||
dominfo.shutdown('suspend')
|
str( int(live) | (int(hvm) << 2) | (int(abort_if_busy) << 5) | (int(log_save_progress) << 6) ) ]
|
||||||
dominfo.waitForSuspend()
|
log.debug("[xc_save]: %s", string.join(cmd))
|
||||||
if line in ('suspend', 'suspended'):
|
|
||||||
+ if checkpoint == False:
|
+ # It is safe to release the domain lock at this point if not
|
||||||
+ dominfo.release_running_lock(domain_name)
|
+ # checkpointing
|
||||||
dominfo.migrateDevices(network, dst, DEV_MIGRATE_STEP2,
|
+ if checkpoint == False:
|
||||||
domain_name)
|
+ dominfo.release_running_lock(domain_name)
|
||||||
log.info("Domain %d suspended.", dominfo.getDomid())
|
+
|
||||||
@@ -353,6 +355,7 @@ def restore(xd, fd, dominfo = None, paus
|
def saveInputHandler(line, tochild):
|
||||||
|
log.debug("In saveInputHandler %s", line)
|
||||||
|
if line == "suspend":
|
||||||
|
@@ -200,6 +205,9 @@ def save(fd, dominfo, network, live, dst
|
||||||
|
log.exception("Save failed on domain %s (%s) - resuming.", domain_name,
|
||||||
|
dominfo.getDomid())
|
||||||
|
dominfo.resumeDomain()
|
||||||
|
+ # Reacquire the domain lock
|
||||||
|
+ if checkpoint == False:
|
||||||
|
+ dominfo.acquire_running_lock()
|
||||||
|
|
||||||
|
try:
|
||||||
|
dominfo.setName(domain_name)
|
||||||
|
@@ -366,6 +374,7 @@ def restore(xd, fd, dominfo = None, paus
|
||||||
if not paused:
|
if not paused:
|
||||||
dominfo.unpause()
|
dominfo.unpause()
|
||||||
|
|
||||||
@ -257,7 +270,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
XendTask.log_progress(0, 30, self._constructDomain)
|
XendTask.log_progress(0, 30, self._constructDomain)
|
||||||
XendTask.log_progress(31, 60, self._initDomain)
|
XendTask.log_progress(31, 60, self._initDomain)
|
||||||
|
|
||||||
@@ -3037,6 +3038,11 @@ class XendDomainInfo:
|
@@ -3053,6 +3054,11 @@ class XendDomainInfo:
|
||||||
|
|
||||||
self._stateSet(DOM_STATE_HALTED)
|
self._stateSet(DOM_STATE_HALTED)
|
||||||
self.domid = None # Do not push into _stateSet()!
|
self.domid = None # Do not push into _stateSet()!
|
||||||
@ -269,7 +282,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
finally:
|
finally:
|
||||||
self.refresh_shutdown_lock.release()
|
self.refresh_shutdown_lock.release()
|
||||||
|
|
||||||
@@ -4546,6 +4552,74 @@ class XendDomainInfo:
|
@@ -4562,6 +4568,74 @@ class XendDomainInfo:
|
||||||
def has_device(self, dev_class, dev_uuid):
|
def has_device(self, dev_class, dev_uuid):
|
||||||
return (dev_uuid in self.info['%s_refs' % dev_class.lower()])
|
return (dev_uuid in self.info['%s_refs' % dev_class.lower()])
|
||||||
|
|
||||||
|
277
xend-hvm-firmware-passthrough.patch
Normal file
277
xend-hvm-firmware-passthrough.patch
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
fate#313584: pass bios information to XEN HVM guest
|
||||||
|
|
||||||
|
Index: xen-4.2.1-testing/tools/python/xen/xm/create.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/xen/xm/create.py
|
||||||
|
+++ xen-4.2.1-testing/tools/python/xen/xm/create.py
|
||||||
|
@@ -491,6 +491,14 @@ gopts.var('nfs_root', val="PATH",
|
||||||
|
fn=set_value, default=None,
|
||||||
|
use="Set the path of the root NFS directory.")
|
||||||
|
|
||||||
|
+gopts.var('smbios_firmware', val='FILE',
|
||||||
|
+ fn=set_value, default=None,
|
||||||
|
+ use="Path to a file that contains extra SMBIOS firmware structures.")
|
||||||
|
+
|
||||||
|
+gopts.var('acpi_firmware', val='FILE',
|
||||||
|
+ fn=set_value, default=None,
|
||||||
|
+ use="Path to a file that contains extra ACPI firmware tables.")
|
||||||
|
+
|
||||||
|
gopts.var('device_model', val='FILE',
|
||||||
|
fn=set_value, default=None,
|
||||||
|
use="Path to device model program.")
|
||||||
|
@@ -1097,6 +1105,7 @@ def configure_hvm(config_image, vals):
|
||||||
|
'boot',
|
||||||
|
'cpuid', 'cpuid_check',
|
||||||
|
'device_model', 'display',
|
||||||
|
+ 'smbios_firmware', 'acpi_firmware',
|
||||||
|
'fda', 'fdb',
|
||||||
|
'gfx_passthru', 'guest_os_type',
|
||||||
|
'hap', 'hpet',
|
||||||
|
Index: xen-4.2.1-testing/tools/python/xen/xm/xenapi_create.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/xen/xm/xenapi_create.py
|
||||||
|
+++ xen-4.2.1-testing/tools/python/xen/xm/xenapi_create.py
|
||||||
|
@@ -1086,6 +1086,8 @@ class sxp2xml:
|
||||||
|
'apic',
|
||||||
|
'boot',
|
||||||
|
'device_model',
|
||||||
|
+ 'smbios_firmware',
|
||||||
|
+ 'acpi_firmware',
|
||||||
|
'loader',
|
||||||
|
'fda',
|
||||||
|
'fdb',
|
||||||
|
Index: xen-4.2.1-testing/tools/python/xen/xend/image.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/image.py
|
||||||
|
+++ xen-4.2.1-testing/tools/python/xen/xend/image.py
|
||||||
|
@@ -17,7 +17,7 @@
|
||||||
|
#============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
-import os, os.path, string
|
||||||
|
+import os, os.path, string, struct, stat
|
||||||
|
import re
|
||||||
|
import math
|
||||||
|
import time
|
||||||
|
@@ -123,6 +123,8 @@ class ImageHandler:
|
||||||
|
|
||||||
|
self.device_model = vmConfig['platform'].get('device_model')
|
||||||
|
|
||||||
|
+ self.smbios_firmware =(str(vmConfig['platform'].get('smbios_firmware')))
|
||||||
|
+ self.acpi_firmware =(str(vmConfig['platform'].get('acpi_firmware')))
|
||||||
|
self.display = vmConfig['platform'].get('display')
|
||||||
|
self.xauthority = vmConfig['platform'].get('xauthority')
|
||||||
|
self.vncconsole = int(vmConfig['platform'].get('vncconsole', 0))
|
||||||
|
@@ -945,6 +947,38 @@ class HVMImageHandler(ImageHandler):
|
||||||
|
self.vm.getDomid() ])
|
||||||
|
return args
|
||||||
|
|
||||||
|
+ def _readFirmwareFile(self, filename):
|
||||||
|
+ # Sanity check
|
||||||
|
+ if filename is None or filename.strip() == "":
|
||||||
|
+ size = struct.pack('i', int(0))
|
||||||
|
+ return size + ""
|
||||||
|
+
|
||||||
|
+ log.debug("Reading firmware file %s", filename)
|
||||||
|
+ # Open
|
||||||
|
+ try:
|
||||||
|
+ fd = os.open(filename, os.O_RDONLY)
|
||||||
|
+ except Exception, e:
|
||||||
|
+ raise VmError('Unable to open firmware file %s' % filename)
|
||||||
|
+
|
||||||
|
+ # Validate file size
|
||||||
|
+ statinfo = os.fstat(fd)
|
||||||
|
+ if statinfo.st_size == 0 or statinfo.st_size > sys.maxint:
|
||||||
|
+ os.close(fd)
|
||||||
|
+ raise VmError('Firmware file %s is an invalid size' % filename)
|
||||||
|
+ if not stat.S_ISREG(statinfo.st_mode):
|
||||||
|
+ os.close(fd)
|
||||||
|
+ raise VmError('Firmware file %s is an invalid file type' % filename)
|
||||||
|
+ size = struct.pack('i', statinfo.st_size)
|
||||||
|
+
|
||||||
|
+ # Read entire file
|
||||||
|
+ try:
|
||||||
|
+ buf = os.read(fd, statinfo.st_size)
|
||||||
|
+ except Exception, e:
|
||||||
|
+ os.close(fd)
|
||||||
|
+ raise VmError('Failed reading firmware file %s' % filename)
|
||||||
|
+ os.close(fd)
|
||||||
|
+ return size+buf
|
||||||
|
+
|
||||||
|
def buildDomain(self):
|
||||||
|
store_evtchn = self.vm.getStorePort()
|
||||||
|
|
||||||
|
@@ -960,6 +994,8 @@ class HVMImageHandler(ImageHandler):
|
||||||
|
log.debug("vcpu_avail = %li", self.vm.getVCpuAvail())
|
||||||
|
log.debug("acpi = %d", self.acpi)
|
||||||
|
log.debug("apic = %d", self.apic)
|
||||||
|
+ log.debug("smbios_firmware= %s", self.smbios_firmware)
|
||||||
|
+ log.debug("acpi_firmware = %s", self.acpi_firmware)
|
||||||
|
|
||||||
|
rc = xc.hvm_build(domid = self.vm.getDomid(),
|
||||||
|
image = self.loader,
|
||||||
|
@@ -968,7 +1004,9 @@ class HVMImageHandler(ImageHandler):
|
||||||
|
vcpus = self.vm.getVCpuCount(),
|
||||||
|
vcpu_avail = self.vm.getVCpuAvail(),
|
||||||
|
acpi = self.acpi,
|
||||||
|
- apic = self.apic)
|
||||||
|
+ apic = self.apic,
|
||||||
|
+ smbios_firmware= self._readFirmwareFile(self.smbios_firmware),
|
||||||
|
+ acpi_firmware = self._readFirmwareFile(self.acpi_firmware))
|
||||||
|
rc['notes'] = { 'SUSPEND_CANCEL': 1 }
|
||||||
|
|
||||||
|
rc['store_mfn'] = xc.hvm_get_param(self.vm.getDomid(),
|
||||||
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendConfig.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendConfig.py
|
||||||
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendConfig.py
|
||||||
|
@@ -147,6 +147,8 @@ XENAPI_PLATFORM_CFG_TYPES = {
|
||||||
|
'apic': int,
|
||||||
|
'boot': str,
|
||||||
|
'device_model': str,
|
||||||
|
+ 'smbios_firmware': str,
|
||||||
|
+ 'acpi_firmware': str,
|
||||||
|
'loader': str,
|
||||||
|
'display' : str,
|
||||||
|
'fda': str,
|
||||||
|
@@ -515,6 +517,10 @@ class XendConfig(dict):
|
||||||
|
self['platform']['nomigrate'] = 0
|
||||||
|
|
||||||
|
if self.is_hvm():
|
||||||
|
+ if 'smbios_firmware' not in self['platform']:
|
||||||
|
+ self['platform']['smbios_firmware'] = ""
|
||||||
|
+ if 'acpi_firmware' not in self['platform']:
|
||||||
|
+ self['platform']['acpi_firmware'] = ""
|
||||||
|
if 'timer_mode' not in self['platform']:
|
||||||
|
self['platform']['timer_mode'] = 1
|
||||||
|
if 'viridian' not in self['platform']:
|
||||||
|
Index: xen-4.2.1-testing/tools/python/xen/lowlevel/xc/xc.c
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/xen/lowlevel/xc/xc.c
|
||||||
|
+++ xen-4.2.1-testing/tools/python/xen/lowlevel/xc/xc.c
|
||||||
|
@@ -942,18 +942,23 @@ static PyObject *pyxc_hvm_build(XcObject
|
||||||
|
struct hvm_info_table *va_hvm;
|
||||||
|
uint8_t *va_map, sum;
|
||||||
|
#endif
|
||||||
|
- int i;
|
||||||
|
- char *image;
|
||||||
|
+ int i, datalen;
|
||||||
|
+ char *image, *smbios_str, *acpi_str;
|
||||||
|
int memsize, target=-1, vcpus = 1, acpi = 0, apic = 1;
|
||||||
|
+ PyObject *acpi_firmware = NULL;
|
||||||
|
+ PyObject *smbios_firmware = NULL;
|
||||||
|
PyObject *vcpu_avail_handle = NULL;
|
||||||
|
uint8_t vcpu_avail[(HVM_MAX_VCPUS + 7)/8];
|
||||||
|
+ struct xc_hvm_build_args hvm_args = {};
|
||||||
|
|
||||||
|
static char *kwd_list[] = { "domid",
|
||||||
|
"memsize", "image", "target", "vcpus",
|
||||||
|
- "vcpu_avail", "acpi", "apic", NULL };
|
||||||
|
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iis|iiOii", kwd_list,
|
||||||
|
+ "vcpu_avail", "acpi", "apic",
|
||||||
|
+ "smbios_firmware", "acpi_firmware", NULL };
|
||||||
|
+ if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iis|iiOiiOO", kwd_list,
|
||||||
|
&dom, &memsize, &image, &target, &vcpus,
|
||||||
|
- &vcpu_avail_handle, &acpi, &apic) )
|
||||||
|
+ &vcpu_avail_handle, &acpi,
|
||||||
|
+ &apic, &smbios_firmware, &acpi_firmware) )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
memset(vcpu_avail, 0, sizeof(vcpu_avail));
|
||||||
|
@@ -984,8 +989,38 @@ static PyObject *pyxc_hvm_build(XcObject
|
||||||
|
if ( target == -1 )
|
||||||
|
target = memsize;
|
||||||
|
|
||||||
|
- if ( xc_hvm_build_target_mem(self->xc_handle, dom, memsize,
|
||||||
|
- target, image) != 0 )
|
||||||
|
+ memset(&hvm_args, 0, sizeof(struct xc_hvm_build_args));
|
||||||
|
+ hvm_args.mem_size = (uint64_t)memsize << 20;
|
||||||
|
+ hvm_args.mem_target = (uint64_t)target << 20;
|
||||||
|
+ hvm_args.image_file_name = image;
|
||||||
|
+
|
||||||
|
+ if ( PyString_Check(smbios_firmware ) )
|
||||||
|
+ {
|
||||||
|
+ smbios_str = PyString_AsString(smbios_firmware);
|
||||||
|
+ if ( smbios_str )
|
||||||
|
+ {
|
||||||
|
+ datalen = *(int *)smbios_str;
|
||||||
|
+ if ( datalen ) {
|
||||||
|
+ hvm_args.smbios_module.data = &((uint8_t *)smbios_str)[4];
|
||||||
|
+ hvm_args.smbios_module.length = (uint32_t)datalen;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if ( PyString_Check(acpi_firmware ) )
|
||||||
|
+ {
|
||||||
|
+ acpi_str = PyString_AsString(acpi_firmware);
|
||||||
|
+ if (acpi_str)
|
||||||
|
+ {
|
||||||
|
+ datalen = *(int *)acpi_str;
|
||||||
|
+ if ( datalen ) {
|
||||||
|
+ hvm_args.acpi_module.data = &((uint8_t *)acpi_str)[4];
|
||||||
|
+ hvm_args.acpi_module.length = (uint32_t)datalen;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if ( xc_hvm_build(self->xc_handle, dom, &hvm_args) != 0 )
|
||||||
|
return pyxc_error_to_exception(self->xc_handle);
|
||||||
|
|
||||||
|
#if !defined(__ia64__)
|
||||||
|
Index: xen-4.2.1-testing/docs/man/xmdomain.cfg.pod.5
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/docs/man/xmdomain.cfg.pod.5
|
||||||
|
+++ xen-4.2.1-testing/docs/man/xmdomain.cfg.pod.5
|
||||||
|
@@ -243,6 +243,25 @@ this the xen kernel must be compiled wit
|
||||||
|
|
||||||
|
This defaults to 1, meaning running the domain as a UP.
|
||||||
|
|
||||||
|
+=item B<acpi_firmware>
|
||||||
|
+
|
||||||
|
+Specify a path to a file that contains extra ACPI firmware tables to pass in to
|
||||||
|
+a guest. The file can contain several tables in their binary AML form
|
||||||
|
+concatenated together. Each table self describes its length so no additional
|
||||||
|
+information is needed. These tables will be added to the ACPI table set in the
|
||||||
|
+guest. Note that existing tables cannot be overridden by this feature. For
|
||||||
|
+example this cannot be used to override tables like DSDT, FADT, etc.
|
||||||
|
+
|
||||||
|
+=item B<smbios_firmware>
|
||||||
|
+
|
||||||
|
+Specify a path to a file that contains extra SMBIOS firmware structures to pass
|
||||||
|
+in to a guest. The file can contain a set DMTF predefined structures which will
|
||||||
|
+override the internal defaults. Not all predefined structures can be overridden,
|
||||||
|
+only the following types: 0, 1, 2, 3, 11, 22, 39. The file can also contain any
|
||||||
|
+number of vendor defined SMBIOS structures (type 128 - 255). Since SMBIOS
|
||||||
|
+structures do not present their overall size, each entry in the file must be
|
||||||
|
+preceded by a 32b integer indicating the size of the next structure.
|
||||||
|
+
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 DOMAIN SHUTDOWN OPTIONS
|
||||||
|
Index: xen-4.2.1-testing/tools/python/README.sxpcfg
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/README.sxpcfg
|
||||||
|
+++ xen-4.2.1-testing/tools/python/README.sxpcfg
|
||||||
|
@@ -51,6 +51,8 @@ image
|
||||||
|
- vncunused
|
||||||
|
(HVM)
|
||||||
|
- device_model
|
||||||
|
+ - smbios_firmware
|
||||||
|
+ - acpi_firmware
|
||||||
|
- display
|
||||||
|
- xauthority
|
||||||
|
- vncconsole
|
||||||
|
Index: xen-4.2.1-testing/tools/python/README.XendConfig
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.2.1-testing.orig/tools/python/README.XendConfig
|
||||||
|
+++ xen-4.2.1-testing/tools/python/README.XendConfig
|
||||||
|
@@ -120,6 +120,8 @@ otherConfig
|
||||||
|
image.vncdisplay
|
||||||
|
image.vncunused
|
||||||
|
image.hvm.device_model
|
||||||
|
+ image.hvm.smbios_firmware
|
||||||
|
+ image.hvm.apci_firmware
|
||||||
|
image.hvm.display
|
||||||
|
image.hvm.xauthority
|
||||||
|
image.hvm.vncconsole
|
@ -4,11 +4,11 @@ domname from xenstore (like 'virsh list') could get correct value.
|
|||||||
destroyed but there is still VM entry in xenstore.
|
destroyed but there is still VM entry in xenstore.
|
||||||
|
|
||||||
Signed-off-by: Chunyan Liu <cyliu@novell.com>
|
Signed-off-by: Chunyan Liu <cyliu@novell.com>
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -1947,6 +1947,8 @@ class XendDomainInfo:
|
@@ -1961,6 +1961,8 @@ class XendDomainInfo:
|
||||||
self.info['name_label'] = name
|
self.info['name_label'] = name
|
||||||
if to_store:
|
if to_store:
|
||||||
self.storeVm("name", name)
|
self.storeVm("name", name)
|
||||||
@ -17,11 +17,11 @@ Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
|
|
||||||
def getName(self):
|
def getName(self):
|
||||||
return self.info['name_label']
|
return self.info['name_label']
|
||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
@@ -172,7 +172,10 @@ def save(fd, dominfo, network, live, dst
|
@@ -185,7 +185,10 @@ def save(fd, dominfo, network, live, dst
|
||||||
dominfo.destroy()
|
dominfo.destroy()
|
||||||
dominfo.testDeviceComplete()
|
dominfo.testDeviceComplete()
|
||||||
try:
|
try:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -2785,7 +2785,10 @@ class XendDomainInfo:
|
@@ -2799,7 +2799,10 @@ class XendDomainInfo:
|
||||||
from xen.xend import XendDomain
|
from xen.xend import XendDomain
|
||||||
doms = XendDomain.instance().list('all')
|
doms = XendDomain.instance().list('all')
|
||||||
for dom in filter (lambda d: d.domid != self.domid, doms):
|
for dom in filter (lambda d: d.domid != self.domid, doms):
|
||||||
|
@ -76,9 +76,9 @@ Index: xen-4.2.1-testing/tools/python/README.XendConfig
|
|||||||
+ image.hvm.actmem
|
+ image.hvm.actmem
|
||||||
+ image.hvm.xenpaging_file
|
+ image.hvm.xenpaging_file
|
||||||
+ image.hvm.xenpaging_extra
|
+ image.hvm.xenpaging_extra
|
||||||
|
image.hvm.smbios_firmware
|
||||||
|
image.hvm.apci_firmware
|
||||||
image.hvm.display
|
image.hvm.display
|
||||||
image.hvm.xauthority
|
|
||||||
image.hvm.vncconsole
|
|
||||||
Index: xen-4.2.1-testing/tools/python/README.sxpcfg
|
Index: xen-4.2.1-testing/tools/python/README.sxpcfg
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.1-testing.orig/tools/python/README.sxpcfg
|
--- xen-4.2.1-testing.orig/tools/python/README.sxpcfg
|
||||||
@ -90,9 +90,9 @@ Index: xen-4.2.1-testing/tools/python/README.sxpcfg
|
|||||||
+ - actmem
|
+ - actmem
|
||||||
+ - xenpaging_file
|
+ - xenpaging_file
|
||||||
+ - xenpaging_extra
|
+ - xenpaging_extra
|
||||||
|
- smbios_firmware
|
||||||
|
- acpi_firmware
|
||||||
- display
|
- display
|
||||||
- xauthority
|
|
||||||
- vncconsole
|
|
||||||
Index: xen-4.2.1-testing/tools/python/xen/xend/XendConfig.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendConfig.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendConfig.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendConfig.py
|
||||||
@ -104,10 +104,10 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendConfig.py
|
|||||||
+ 'actmem': str,
|
+ 'actmem': str,
|
||||||
+ 'xenpaging_file': str,
|
+ 'xenpaging_file': str,
|
||||||
+ 'xenpaging_extra': str,
|
+ 'xenpaging_extra': str,
|
||||||
|
'smbios_firmware': str,
|
||||||
|
'acpi_firmware': str,
|
||||||
'loader': str,
|
'loader': str,
|
||||||
'display' : str,
|
@@ -518,6 +521,12 @@ class XendConfig(dict):
|
||||||
'fda': str,
|
|
||||||
@@ -516,6 +519,12 @@ class XendConfig(dict):
|
|
||||||
self['platform']['nomigrate'] = 0
|
self['platform']['nomigrate'] = 0
|
||||||
|
|
||||||
if self.is_hvm():
|
if self.is_hvm():
|
||||||
@ -117,16 +117,16 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendConfig.py
|
|||||||
+ self['platform']['xenpaging_file'] = ""
|
+ self['platform']['xenpaging_file'] = ""
|
||||||
+ if 'xenpaging_extra' not in self['platform']:
|
+ if 'xenpaging_extra' not in self['platform']:
|
||||||
+ self['platform']['xenpaging_extra'] = []
|
+ self['platform']['xenpaging_extra'] = []
|
||||||
if 'timer_mode' not in self['platform']:
|
if 'smbios_firmware' not in self['platform']:
|
||||||
self['platform']['timer_mode'] = 1
|
self['platform']['smbios_firmware'] = ""
|
||||||
if 'extid' in self['platform'] and int(self['platform']['extid']) == 1:
|
if 'acpi_firmware' not in self['platform']:
|
||||||
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomain.py
|
Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomain.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomain.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomain.py
|
||||||
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomain.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomain.py
|
||||||
@@ -1835,6 +1835,21 @@ class XendDomain:
|
@@ -1848,6 +1848,21 @@ class XendDomain:
|
||||||
log.exception(ex)
|
raise XendInvalidDomain(str(domid))
|
||||||
raise XendError(str(ex))
|
dominfo.setMigrateConstraints(max_iters, max_factor, abort_if_busy, log_save_progress)
|
||||||
|
|
||||||
+ def domain_swaptarget_set(self, domid, mem):
|
+ def domain_swaptarget_set(self, domid, mem):
|
||||||
+ """Set the memory limit for a domain.
|
+ """Set the memory limit for a domain.
|
||||||
@ -150,7 +150,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -1532,6 +1532,17 @@ class XendDomainInfo:
|
@@ -1548,6 +1548,17 @@ class XendDomainInfo:
|
||||||
break
|
break
|
||||||
xen.xend.XendDomain.instance().managed_config_save(self)
|
xen.xend.XendDomain.instance().managed_config_save(self)
|
||||||
|
|
||||||
@ -168,7 +168,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
def setMemoryTarget(self, target):
|
def setMemoryTarget(self, target):
|
||||||
"""Set the memory target of this domain.
|
"""Set the memory target of this domain.
|
||||||
@param target: In MiB.
|
@param target: In MiB.
|
||||||
@@ -2322,6 +2333,8 @@ class XendDomainInfo:
|
@@ -2338,6 +2349,8 @@ class XendDomainInfo:
|
||||||
self.info['name_label'], self.domid, self.info['uuid'],
|
self.info['name_label'], self.domid, self.info['uuid'],
|
||||||
new_name, new_uuid)
|
new_name, new_uuid)
|
||||||
self._unwatchVm()
|
self._unwatchVm()
|
||||||
@ -177,7 +177,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
self._releaseDevices()
|
self._releaseDevices()
|
||||||
# Remove existing vm node in xenstore
|
# Remove existing vm node in xenstore
|
||||||
self._removeVm()
|
self._removeVm()
|
||||||
@@ -3001,6 +3014,9 @@ class XendDomainInfo:
|
@@ -3017,6 +3030,9 @@ class XendDomainInfo:
|
||||||
|
|
||||||
self._createDevices()
|
self._createDevices()
|
||||||
|
|
||||||
@ -187,7 +187,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
self.image.cleanupTmpImages()
|
self.image.cleanupTmpImages()
|
||||||
|
|
||||||
self.info['start_time'] = time.time()
|
self.info['start_time'] = time.time()
|
||||||
@@ -3025,6 +3041,8 @@ class XendDomainInfo:
|
@@ -3041,6 +3057,8 @@ class XendDomainInfo:
|
||||||
self.refresh_shutdown_lock.acquire()
|
self.refresh_shutdown_lock.acquire()
|
||||||
try:
|
try:
|
||||||
self.unwatchShutdown()
|
self.unwatchShutdown()
|
||||||
@ -196,7 +196,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
self._releaseDevices()
|
self._releaseDevices()
|
||||||
bootloader_tidy(self)
|
bootloader_tidy(self)
|
||||||
|
|
||||||
@@ -3109,6 +3127,7 @@ class XendDomainInfo:
|
@@ -3125,6 +3143,7 @@ class XendDomainInfo:
|
||||||
self.image = image.create(self, self.info)
|
self.image = image.create(self, self.info)
|
||||||
if self.image:
|
if self.image:
|
||||||
self.image.createDeviceModel(True)
|
self.image.createDeviceModel(True)
|
||||||
@ -204,7 +204,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
self.console_port = console_port
|
self.console_port = console_port
|
||||||
self._storeDomDetails()
|
self._storeDomDetails()
|
||||||
self._registerWatches()
|
self._registerWatches()
|
||||||
@@ -3251,6 +3270,8 @@ class XendDomainInfo:
|
@@ -3267,6 +3286,8 @@ class XendDomainInfo:
|
||||||
# could also fetch a parsed note from xenstore
|
# could also fetch a parsed note from xenstore
|
||||||
fast = self.info.get_notes().get('SUSPEND_CANCEL') and 1 or 0
|
fast = self.info.get_notes().get('SUSPEND_CANCEL') and 1 or 0
|
||||||
if not fast:
|
if not fast:
|
||||||
@ -213,7 +213,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
self._releaseDevices()
|
self._releaseDevices()
|
||||||
self.testDeviceComplete()
|
self.testDeviceComplete()
|
||||||
self.testvifsComplete()
|
self.testvifsComplete()
|
||||||
@@ -3266,6 +3287,8 @@ class XendDomainInfo:
|
@@ -3282,6 +3303,8 @@ class XendDomainInfo:
|
||||||
self._storeDomDetails()
|
self._storeDomDetails()
|
||||||
|
|
||||||
self._createDevices()
|
self._createDevices()
|
||||||
@ -235,9 +235,9 @@ Index: xen-4.2.1-testing/tools/python/xen/xend/image.py
|
|||||||
+ self.xenpaging_extra = vmConfig['platform'].get('xenpaging_extra')
|
+ self.xenpaging_extra = vmConfig['platform'].get('xenpaging_extra')
|
||||||
+ self.xenpaging_pid = None
|
+ self.xenpaging_pid = None
|
||||||
|
|
||||||
self.display = vmConfig['platform'].get('display')
|
self.smbios_firmware =(str(vmConfig['platform'].get('smbios_firmware')))
|
||||||
self.xauthority = vmConfig['platform'].get('xauthority')
|
self.acpi_firmware =(str(vmConfig['platform'].get('acpi_firmware')))
|
||||||
@@ -392,6 +396,87 @@ class ImageHandler:
|
@@ -394,6 +398,87 @@ class ImageHandler:
|
||||||
sentinel_fifos_inuse[sentinel_path_fifo] = 1
|
sentinel_fifos_inuse[sentinel_path_fifo] = 1
|
||||||
self.sentinel_path_fifo = sentinel_path_fifo
|
self.sentinel_path_fifo = sentinel_path_fifo
|
||||||
|
|
||||||
@ -329,9 +329,9 @@ Index: xen-4.2.1-testing/tools/python/xen/xm/create.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.1-testing.orig/tools/python/xen/xm/create.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xm/create.py
|
||||||
+++ xen-4.2.1-testing/tools/python/xen/xm/create.py
|
+++ xen-4.2.1-testing/tools/python/xen/xm/create.py
|
||||||
@@ -495,6 +495,18 @@ gopts.var('nfs_root', val="PATH",
|
@@ -503,6 +503,18 @@ gopts.var('acpi_firmware', val='FILE',
|
||||||
fn=set_value, default=None,
|
fn=set_value, default=None,
|
||||||
use="Set the path of the root NFS directory.")
|
use="Path to a file that contains extra ACPI firmware tables.")
|
||||||
|
|
||||||
+gopts.var('actmem', val='NUM',
|
+gopts.var('actmem', val='NUM',
|
||||||
+ fn=set_value, default='0',
|
+ fn=set_value, default='0',
|
||||||
@ -348,7 +348,7 @@ Index: xen-4.2.1-testing/tools/python/xen/xm/create.py
|
|||||||
gopts.var('device_model', val='FILE',
|
gopts.var('device_model', val='FILE',
|
||||||
fn=set_value, default=None,
|
fn=set_value, default=None,
|
||||||
use="Path to device model program.")
|
use="Path to device model program.")
|
||||||
@@ -1100,6 +1112,9 @@ def configure_hvm(config_image, vals):
|
@@ -1108,6 +1120,9 @@ def configure_hvm(config_image, vals):
|
||||||
args = [ 'acpi', 'apic',
|
args = [ 'acpi', 'apic',
|
||||||
'boot',
|
'boot',
|
||||||
'cpuid', 'cpuid_check',
|
'cpuid', 'cpuid_check',
|
||||||
@ -356,8 +356,8 @@ Index: xen-4.2.1-testing/tools/python/xen/xm/create.py
|
|||||||
+ 'xenpaging_file',
|
+ 'xenpaging_file',
|
||||||
+ 'xenpaging_extra',
|
+ 'xenpaging_extra',
|
||||||
'device_model', 'display',
|
'device_model', 'display',
|
||||||
|
'smbios_firmware', 'acpi_firmware',
|
||||||
'fda', 'fdb',
|
'fda', 'fdb',
|
||||||
'gfx_passthru', 'guest_os_type',
|
|
||||||
Index: xen-4.2.1-testing/tools/python/xen/xm/main.py
|
Index: xen-4.2.1-testing/tools/python/xen/xm/main.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.2.1-testing.orig/tools/python/xen/xm/main.py
|
--- xen-4.2.1-testing.orig/tools/python/xen/xm/main.py
|
||||||
@ -409,5 +409,5 @@ Index: xen-4.2.1-testing/tools/python/xen/xm/xenapi_create.py
|
|||||||
+ 'xenpaging_file',
|
+ 'xenpaging_file',
|
||||||
+ 'xenpaging_extra',
|
+ 'xenpaging_extra',
|
||||||
'device_model',
|
'device_model',
|
||||||
'loader',
|
'smbios_firmware',
|
||||||
'fda',
|
'acpi_firmware',
|
||||||
|
Loading…
Reference in New Issue
Block a user