Accepting request 64908 from Virtualization
Accepted submit request 64908 from user coolo OBS-URL: https://build.opensuse.org/request/show/64908 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/xen?expand=0&rev=123
This commit is contained in:
commit
c4c918dcf2
@ -1,55 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User jfehlig@localhost
|
|
||||||
# Date 1293498049 25200
|
|
||||||
# Node ID 7584dc7bc3de64340f193a0cab188e85bd50d594
|
|
||||||
# Parent f9ce5858f7eae84bec34aa10d3585c7e6f6ca6c9
|
|
||||||
Revert 20158:f9ce5858f7ea xend: Support "bootloader" mode for "drbd:" devices
|
|
||||||
|
|
||||||
block-drbd (provided by drbd project) handles all the details that
|
|
||||||
c/s 20158 introduces within xend. Subtleties of configuring storage
|
|
||||||
subsystems should not be handled by xend, but instead delegated to the block
|
|
||||||
script mechansim provided by the xen toool stack.
|
|
||||||
|
|
||||||
Note: Patch submitted upstream but not (yet) accepted since xend is on
|
|
||||||
the way out.
|
|
||||||
|
|
||||||
http://lists.xensource.com/archives/html/xen-devel/2010-12/msg01160.html
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/util/blkif.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/util/blkif.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/util/blkif.py
|
|
||||||
@@ -79,13 +79,6 @@ def parse_uname(uname):
|
|
||||||
if typ == "phy" and not fn.startswith("/"):
|
|
||||||
fn = "/dev/%s" %(fn,)
|
|
||||||
|
|
||||||
- if typ == "drbd":
|
|
||||||
- if not fn.startswith("drbd"):
|
|
||||||
- (drbdadmstdin, drbdadmstdout) = os.popen2("/sbin/drbdadm "+"sh-dev "+fn)
|
|
||||||
- fn = drbdadmstdout.readline().strip()
|
|
||||||
- else:
|
|
||||||
- fn = "/dev/%s" %(fn,)
|
|
||||||
-
|
|
||||||
if typ in ("tap", "tap2"):
|
|
||||||
(taptype, fn) = fn.split(":", 1)
|
|
||||||
if taptype in ("tapdisk", "ioemu"):
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
@@ -3283,15 +3283,6 @@ class XendDomainInfo:
|
|
||||||
|
|
||||||
(fn, types) = parse_uname(disk)
|
|
||||||
|
|
||||||
- # If this is a drbd volume, check if we need to activate it
|
|
||||||
- if disk.find(":") != -1:
|
|
||||||
- (disktype, diskname) = disk.split(':', 1)
|
|
||||||
- if disktype == 'drbd':
|
|
||||||
- (drbdadmstdin, drbdadmstdout) = os.popen2(["/sbin/drbdadm", "state", diskname])
|
|
||||||
- (state, junk) = drbdadmstdout.readline().split('/', 1)
|
|
||||||
- if state == 'Secondary':
|
|
||||||
- os.system('/sbin/drbdadm primary ' + diskname)
|
|
||||||
-
|
|
||||||
mounted_vbd_uuid = 0
|
|
||||||
def _shouldMount(types):
|
|
||||||
if types[0] in ('file', 'phy'):
|
|
@ -1,110 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1270026749 -3600
|
|
||||||
# Node ID 4f796e29987c0db1579787fe0b7d3d5af00963ea
|
|
||||||
# Parent 589d075ba2953123c1b39ecdbc190689ac6f443c
|
|
||||||
x86: start PCI IRQs Xen uses from Dom0-invoked io_apic_set_pci_routing()
|
|
||||||
|
|
||||||
When using a serial port from an add-in PCI card, and that IRQ is (as
|
|
||||||
usual) outside of the legacy range (0...15), Xen would never really
|
|
||||||
enable the IRQ, as at the time setup_irq() runs the handler for the
|
|
||||||
IRQ still is &no_irq_type. Consequently, once the trigger mode and
|
|
||||||
polarity of the interrupt become known to Xen, it should start such
|
|
||||||
IRQ(s) it uses for itself.
|
|
||||||
|
|
||||||
The question is whether the same should also be done in
|
|
||||||
ioapic_guest_write(): Legacy kernels don't use PHYSDEVOP_setup_gsi
|
|
||||||
(and hence don't trigger the code path modified).
|
|
||||||
|
|
||||||
Note however that even when a kernel is using PHYSDEVOP_setup_gsi in
|
|
||||||
the way the pv-ops kernel currently does, there's still no guarantee
|
|
||||||
that the call would ever be issued for IRQs Xen may be using, since
|
|
||||||
this happens only when devices get enabled. For Xen's purposes, this
|
|
||||||
function should be called for *all* device IRQs, regardless of
|
|
||||||
whether those would actually be (attempted to be) used by the kernel,
|
|
||||||
i.e. in a subsys_initcall() from drivers/acpi/pci_irq.c iterating
|
|
||||||
over all PCI devices and doing mostly what acpi_pci_irq_enable() does
|
|
||||||
except for calling this function in place of acpi_register_gsi(). The
|
|
||||||
downside of this approach is that without extra filtering in Xen
|
|
||||||
(based on a hint from Dom0), vectors will then get up even for IRQs
|
|
||||||
that are unused by both hypervisor and kernel.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1271090214 -3600
|
|
||||||
# Node ID 7eeb131880b20a33e7675cc1726ae312a489be2d
|
|
||||||
# Parent b65a41dc6c6a2e2341ae778d8386a08d502bbfa4
|
|
||||||
Fix bug in 21089:4f796e29987c
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1271169507 -3600
|
|
||||||
# Node ID 0bebb5fa4f051df9b4fed4d11a723fae91bc7523
|
|
||||||
# Parent 859a372efa66e6bcba8e1fd968e521cb16da12ea
|
|
||||||
Make c/s 21089 work again with c/s 21092
|
|
||||||
|
|
||||||
Unfortunately the latter c/s' change to mpparse.c yielded the former
|
|
||||||
patch non-functional - Xen's serial port IRQ is not in IQR_DISABLED
|
|
||||||
state, yet must be allowed to get its trigger mode and polarity set
|
|
||||||
up in order for it to be usable.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/io_apic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/io_apic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/io_apic.c
|
|
||||||
@@ -2232,6 +2232,7 @@ int __init io_apic_get_redir_entries (in
|
|
||||||
|
|
||||||
int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low)
|
|
||||||
{
|
|
||||||
+ struct irq_desc *desc = irq_to_desc(irq);
|
|
||||||
struct IO_APIC_route_entry entry;
|
|
||||||
unsigned long flags;
|
|
||||||
int vector;
|
|
||||||
@@ -2283,7 +2284,12 @@ int io_apic_set_pci_routing (int ioapic,
|
|
||||||
io_apic_write(ioapic, 0x11+2*pin, *(((int *)&entry)+1));
|
|
||||||
io_apic_write(ioapic, 0x10+2*pin, *(((int *)&entry)+0));
|
|
||||||
set_native_irq_info(irq, TARGET_CPUS);
|
|
||||||
- spin_unlock_irqrestore(&ioapic_lock, flags);
|
|
||||||
+ spin_unlock(&ioapic_lock);
|
|
||||||
+
|
|
||||||
+ spin_lock(&desc->lock);
|
|
||||||
+ if (!(desc->status & (IRQ_DISABLED | IRQ_GUEST)))
|
|
||||||
+ desc->handler->startup(irq);
|
|
||||||
+ spin_unlock_irqrestore(&desc->lock, flags);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/mpparse.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/mpparse.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/mpparse.c
|
|
||||||
@@ -1102,6 +1102,8 @@ int mp_register_gsi (u32 gsi, int trigge
|
|
||||||
int ioapic = -1;
|
|
||||||
int ioapic_pin = 0;
|
|
||||||
int idx, bit = 0;
|
|
||||||
+ struct irq_desc * desc;
|
|
||||||
+ unsigned long flags;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Mapping between Global System Interrups, which
|
|
||||||
@@ -1123,8 +1125,13 @@ int mp_register_gsi (u32 gsi, int trigge
|
|
||||||
|
|
||||||
ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
|
|
||||||
|
|
||||||
- if (!(irq_to_desc(gsi)->status & IRQ_DISABLED))
|
|
||||||
+ desc = irq_to_desc(gsi);
|
|
||||||
+ spin_lock_irqsave(&desc->lock, flags);
|
|
||||||
+ if (!(desc->status & IRQ_DISABLED) && desc->handler != &no_irq_type) {
|
|
||||||
+ spin_unlock_irqrestore(&desc->lock, flags);
|
|
||||||
return -EEXIST;
|
|
||||||
+ }
|
|
||||||
+ spin_unlock_irqrestore(&desc->lock, flags);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Avoid pin reprogramming. PRTs typically include entries
|
|
@ -1,181 +0,0 @@
|
|||||||
References: bnc#585371
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1272280332 -3600
|
|
||||||
# Node ID 3ce824963dc41827bdf1617b37a40e5e5e9dce29
|
|
||||||
# Parent d01ea51fc929c57c7d5f427e1aafa0de7a436473
|
|
||||||
Support Linux's advanced crashkernel= syntax
|
|
||||||
|
|
||||||
Quoting the original Linux patch's description:
|
|
||||||
|
|
||||||
"This patch adds a extended crashkernel syntax that makes the value of
|
|
||||||
reserved system RAM dependent on the system RAM itself:
|
|
||||||
|
|
||||||
crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset]
|
|
||||||
range=start-[end]
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
crashkernel=512M-2G:64M,2G-:128M
|
|
||||||
|
|
||||||
The motivation comes from distributors that configure their
|
|
||||||
crashkernel command line automatically with some configuration tool
|
|
||||||
(YaST, you know ;)). Of course that tool knows the value of System
|
|
||||||
RAM, but if the user removes RAM, then the system becomes unbootable
|
|
||||||
or at least unusable and error handling is very difficult."
|
|
||||||
|
|
||||||
For x86, other than Linux we pass the actual amount of RAM rather than
|
|
||||||
the highest page's address (to cope with sparse physical address
|
|
||||||
maps).
|
|
||||||
|
|
||||||
This still needs to be hooked up for ia64.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/setup.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/setup.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/setup.c
|
|
||||||
@@ -664,6 +664,11 @@ void __init __start_xen(unsigned long mb
|
|
||||||
memcpy(&boot_e820, &e820, sizeof(e820));
|
|
||||||
|
|
||||||
/* Early kexec reservation (explicit static start address). */
|
|
||||||
+ nr_pages = 0;
|
|
||||||
+ for ( i = 0; i < e820.nr_map; i++ )
|
|
||||||
+ if ( e820.map[i].type == E820_RAM )
|
|
||||||
+ nr_pages += e820.map[i].size >> PAGE_SHIFT;
|
|
||||||
+ set_kexec_crash_area_size((u64)nr_pages << PAGE_SHIFT);
|
|
||||||
kexec_reserve_area(&boot_e820);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Index: xen-4.0.2-testing/xen/common/kexec.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/common/kexec.c
|
|
||||||
+++ xen-4.0.2-testing/xen/common/kexec.c
|
|
||||||
@@ -49,15 +49,109 @@ static unsigned char vmcoreinfo_data[VMC
|
|
||||||
static size_t vmcoreinfo_size = 0;
|
|
||||||
|
|
||||||
xen_kexec_reserve_t kexec_crash_area;
|
|
||||||
+static struct {
|
|
||||||
+ u64 start, end;
|
|
||||||
+ unsigned long size;
|
|
||||||
+} ranges[16] __initdata;
|
|
||||||
|
|
||||||
+/*
|
|
||||||
+ * Parse command lines in the format
|
|
||||||
+ *
|
|
||||||
+ * crashkernel=<ramsize-range>:<size>[,...][@<offset>]
|
|
||||||
+ *
|
|
||||||
+ * with <ramsize-range> being of form
|
|
||||||
+ *
|
|
||||||
+ * <start>-[<end>]
|
|
||||||
+ *
|
|
||||||
+ * as well as the legacy ones in the format
|
|
||||||
+ *
|
|
||||||
+ * crashkernel=<size>[@<offset>]
|
|
||||||
+ */
|
|
||||||
static void __init parse_crashkernel(const char *str)
|
|
||||||
{
|
|
||||||
- kexec_crash_area.size = parse_size_and_unit(str, &str);
|
|
||||||
- if ( *str == '@' )
|
|
||||||
- kexec_crash_area.start = parse_size_and_unit(str+1, NULL);
|
|
||||||
+ const char *cur;
|
|
||||||
+
|
|
||||||
+ if ( strchr(str, ':' ) )
|
|
||||||
+ {
|
|
||||||
+ unsigned int idx = 0;
|
|
||||||
+
|
|
||||||
+ do {
|
|
||||||
+ if ( idx >= ARRAY_SIZE(ranges) )
|
|
||||||
+ {
|
|
||||||
+ printk(XENLOG_WARNING "crashkernel: too many ranges\n");
|
|
||||||
+ cur = NULL;
|
|
||||||
+ str = strchr(str, '@');
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ranges[idx].start = parse_size_and_unit(cur = str + !!idx, &str);
|
|
||||||
+ if ( cur == str )
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ if ( *str != '-' )
|
|
||||||
+ {
|
|
||||||
+ printk(XENLOG_WARNING "crashkernel: '-' expected\n");
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ( *++str != ':' )
|
|
||||||
+ {
|
|
||||||
+ ranges[idx].end = parse_size_and_unit(cur = str, &str);
|
|
||||||
+ if ( cur == str )
|
|
||||||
+ break;
|
|
||||||
+ if ( ranges[idx].end <= ranges[idx].start )
|
|
||||||
+ {
|
|
||||||
+ printk(XENLOG_WARNING "crashkernel: end <= start\n");
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ ranges[idx].end = -1;
|
|
||||||
+
|
|
||||||
+ if ( *str != ':' )
|
|
||||||
+ {
|
|
||||||
+ printk(XENLOG_WARNING "crashkernel: ':' expected\n");
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ranges[idx].size = parse_size_and_unit(cur = str + 1, &str);
|
|
||||||
+ if ( cur == str )
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ ++idx;
|
|
||||||
+ } while ( *str == ',' );
|
|
||||||
+ if ( idx < ARRAY_SIZE(ranges) )
|
|
||||||
+ ranges[idx].size = 0;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ kexec_crash_area.size = parse_size_and_unit(cur = str, &str);
|
|
||||||
+ if ( cur != str && *str == '@' )
|
|
||||||
+ kexec_crash_area.start = parse_size_and_unit(cur = str + 1, &str);
|
|
||||||
+ if ( cur == str )
|
|
||||||
+ printk(XENLOG_WARNING "crashkernel: memory value expected\n");
|
|
||||||
}
|
|
||||||
custom_param("crashkernel", parse_crashkernel);
|
|
||||||
|
|
||||||
+void __init set_kexec_crash_area_size(u64 system_ram)
|
|
||||||
+{
|
|
||||||
+ unsigned int idx;
|
|
||||||
+
|
|
||||||
+ for ( idx = 0; idx < ARRAY_SIZE(ranges) && !kexec_crash_area.size; ++idx )
|
|
||||||
+ {
|
|
||||||
+ if ( !ranges[idx].size )
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ if ( ranges[idx].size >= system_ram )
|
|
||||||
+ {
|
|
||||||
+ printk(XENLOG_WARNING "crashkernel: invalid size\n");
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ( ranges[idx].start <= system_ram && ranges[idx].end > system_ram )
|
|
||||||
+ kexec_crash_area.size = ranges[idx].size;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void one_cpu_only(void)
|
|
||||||
{
|
|
||||||
/* Only allow the first cpu to continue - force other cpus to spin */
|
|
||||||
Index: xen-4.0.2-testing/xen/include/xen/kexec.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/xen/kexec.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/xen/kexec.h
|
|
||||||
@@ -12,6 +12,8 @@ typedef struct xen_kexec_reserve {
|
|
||||||
|
|
||||||
extern xen_kexec_reserve_t kexec_crash_area;
|
|
||||||
|
|
||||||
+void set_kexec_crash_area_size(u64 system_ram);
|
|
||||||
+
|
|
||||||
/* We have space for 4 images to support atomic update
|
|
||||||
* of images. This is important for CRASH images since
|
|
||||||
* a panic can happen at any time...
|
|
@ -1,69 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1272973271 -3600
|
|
||||||
# Node ID 6c7b905b03ff1cf171187bafe7129e3e213e5787
|
|
||||||
# Parent bd52f2e040e5a5ca58e956b3d0780a86934a429e
|
|
||||||
x86: add support for domain-initiated global cache flush
|
|
||||||
|
|
||||||
Newer Linux' AGP code wants to flush caches on all CPUs under certain
|
|
||||||
circumstances. Since doing this on all vCPU-s of the domain in
|
|
||||||
question doesn't yield the intended effect, this needs to be done in
|
|
||||||
the hypervisor. Add a new MMUEXT operation for this.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/mm.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/mm.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/mm.c
|
|
||||||
@@ -2889,6 +2889,27 @@ int do_mmuext_op(
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
+ case MMUEXT_FLUSH_CACHE_GLOBAL:
|
|
||||||
+ if ( unlikely(foreigndom != DOMID_SELF) )
|
|
||||||
+ okay = 0;
|
|
||||||
+ else if ( likely(cache_flush_permitted(d)) )
|
|
||||||
+ {
|
|
||||||
+ unsigned int cpu;
|
|
||||||
+ cpumask_t mask = CPU_MASK_NONE;
|
|
||||||
+
|
|
||||||
+ for_each_online_cpu(cpu)
|
|
||||||
+ if ( !cpus_intersects(mask,
|
|
||||||
+ per_cpu(cpu_sibling_map, cpu)) )
|
|
||||||
+ cpu_set(cpu, mask);
|
|
||||||
+ flush_mask(&mask, FLUSH_CACHE);
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ MEM_LOG("Non-physdev domain tried to FLUSH_CACHE_GLOBAL");
|
|
||||||
+ okay = 0;
|
|
||||||
+ }
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
case MMUEXT_SET_LDT:
|
|
||||||
{
|
|
||||||
unsigned long ptr = op.arg1.linear_addr;
|
|
||||||
Index: xen-4.0.2-testing/xen/include/public/xen.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/public/xen.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/public/xen.h
|
|
||||||
@@ -239,6 +239,10 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
|
|
||||||
*
|
|
||||||
* cmd: MMUEXT_FLUSH_CACHE
|
|
||||||
* No additional arguments. Writes back and flushes cache contents.
|
|
||||||
+ *
|
|
||||||
+ * cmd: MMUEXT_FLUSH_CACHE_GLOBAL
|
|
||||||
+ * No additional arguments. Writes back and flushes cache contents
|
|
||||||
+ * on all CPUs in the system.
|
|
||||||
*
|
|
||||||
* cmd: MMUEXT_SET_LDT
|
|
||||||
* linear_addr: Linear address of LDT base (NB. must be page-aligned).
|
|
||||||
@@ -268,6 +272,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
|
|
||||||
#define MMUEXT_NEW_USER_BASEPTR 15
|
|
||||||
#define MMUEXT_CLEAR_PAGE 16
|
|
||||||
#define MMUEXT_COPY_PAGE 17
|
|
||||||
+#define MMUEXT_FLUSH_CACHE_GLOBAL 18
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
struct mmuext_op {
|
|
@ -1,100 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1273142634 -3600
|
|
||||||
# Node ID 69c85f5b0a07e7a95945d117ea478a80d21c6b9e
|
|
||||||
# Parent 26da9bb87405c64c02def8d5f11c66f15847bd02
|
|
||||||
svm: support EFER.LMSLE for guests
|
|
||||||
|
|
||||||
Now that the feature is officially documented (see
|
|
||||||
http://support.amd.com/us/Processor_TechDocs/24593.pdf), I think it
|
|
||||||
makes sense to also allow HVM guests to make use of it.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/hvm/hvm.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/hvm/hvm.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/hvm/hvm.c
|
|
||||||
@@ -603,11 +603,12 @@ static int hvm_load_cpu_ctxt(struct doma
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if ( (ctxt.msr_efer & ~(EFER_FFXSE | EFER_LME | EFER_LMA |
|
|
||||||
+ if ( (ctxt.msr_efer & ~(EFER_FFXSE | EFER_LMSLE | EFER_LME | EFER_LMA |
|
|
||||||
EFER_NX | EFER_SCE)) ||
|
|
||||||
((sizeof(long) != 8) && (ctxt.msr_efer & EFER_LME)) ||
|
|
||||||
(!cpu_has_nx && (ctxt.msr_efer & EFER_NX)) ||
|
|
||||||
(!cpu_has_syscall && (ctxt.msr_efer & EFER_SCE)) ||
|
|
||||||
+ (!cpu_has_lmsl && (ctxt.msr_efer & EFER_LMSLE)) ||
|
|
||||||
(!cpu_has_ffxsr && (ctxt.msr_efer & EFER_FFXSE)) ||
|
|
||||||
((ctxt.msr_efer & (EFER_LME|EFER_LMA)) == EFER_LMA) )
|
|
||||||
{
|
|
||||||
@@ -960,10 +961,11 @@ int hvm_set_efer(uint64_t value)
|
|
||||||
|
|
||||||
value &= ~EFER_LMA;
|
|
||||||
|
|
||||||
- if ( (value & ~(EFER_FFXSE | EFER_LME | EFER_NX | EFER_SCE)) ||
|
|
||||||
+ if ( (value & ~(EFER_FFXSE | EFER_LMSLE | EFER_LME | EFER_NX | EFER_SCE)) ||
|
|
||||||
((sizeof(long) != 8) && (value & EFER_LME)) ||
|
|
||||||
(!cpu_has_nx && (value & EFER_NX)) ||
|
|
||||||
(!cpu_has_syscall && (value & EFER_SCE)) ||
|
|
||||||
+ (!cpu_has_lmsl && (value & EFER_LMSLE)) ||
|
|
||||||
(!cpu_has_ffxsr && (value & EFER_FFXSE)) )
|
|
||||||
{
|
|
||||||
gdprintk(XENLOG_WARNING, "Trying to set reserved bit in "
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/hvm/svm/svm.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/hvm/svm/svm.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/hvm/svm/svm.c
|
|
||||||
@@ -57,6 +57,9 @@
|
|
||||||
|
|
||||||
u32 svm_feature_flags;
|
|
||||||
|
|
||||||
+/* Indicates whether guests may use EFER.LMSLE. */
|
|
||||||
+bool_t cpu_has_lmsl;
|
|
||||||
+
|
|
||||||
#define set_segment_register(name, value) \
|
|
||||||
asm volatile ( "movw %%ax ,%%" STR(name) "" : : "a" (value) )
|
|
||||||
|
|
||||||
@@ -864,6 +867,29 @@ static int svm_cpu_up(struct cpuinfo_x86
|
|
||||||
/* Initialize core's ASID handling. */
|
|
||||||
svm_asid_init(c);
|
|
||||||
|
|
||||||
+#ifdef __x86_64__
|
|
||||||
+ /*
|
|
||||||
+ * Check whether EFER.LMSLE can be written.
|
|
||||||
+ * Unfortunately there's no feature bit defined for this.
|
|
||||||
+ */
|
|
||||||
+ eax = read_efer();
|
|
||||||
+ edx = read_efer() >> 32;
|
|
||||||
+ if ( wrmsr_safe(MSR_EFER, eax | EFER_LMSLE, edx) == 0 )
|
|
||||||
+ rdmsr(MSR_EFER, eax, edx);
|
|
||||||
+ if ( eax & EFER_LMSLE )
|
|
||||||
+ {
|
|
||||||
+ if ( c == &boot_cpu_data )
|
|
||||||
+ cpu_has_lmsl = 1;
|
|
||||||
+ wrmsr(MSR_EFER, eax ^ EFER_LMSLE, edx);
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ if ( cpu_has_lmsl )
|
|
||||||
+ printk(XENLOG_WARNING "Inconsistent LMLSE support across CPUs!\n");
|
|
||||||
+ cpu_has_lmsl = 0;
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/hvm/hvm.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/hvm/hvm.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/hvm/hvm.h
|
|
||||||
@@ -143,6 +143,7 @@ struct hvm_function_table {
|
|
||||||
|
|
||||||
extern struct hvm_function_table hvm_funcs;
|
|
||||||
extern int hvm_enabled;
|
|
||||||
+extern bool_t cpu_has_lmsl;
|
|
||||||
|
|
||||||
int hvm_domain_initialise(struct domain *d);
|
|
||||||
void hvm_domain_relinquish_resources(struct domain *d);
|
|
@ -1,99 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1273143595 -3600
|
|
||||||
# Node ID ccae861f52f7f25aa2ab404a6110831402845dac
|
|
||||||
# Parent 924f54145fda26df64bf6f57010793893b29866f
|
|
||||||
Reduce '0' debug key's global impact
|
|
||||||
|
|
||||||
On large systems, dumping state may cause time management to get
|
|
||||||
stalled for so long a period that it wouldn't recover. Therefore add
|
|
||||||
a tasklet-based alternative mechanism to handle Dom0 state dumps.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/common/keyhandler.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/common/keyhandler.c
|
|
||||||
+++ xen-4.0.2-testing/xen/common/keyhandler.c
|
|
||||||
@@ -19,6 +19,7 @@
|
|
||||||
|
|
||||||
static struct keyhandler *key_table[256];
|
|
||||||
static unsigned char keypress_key;
|
|
||||||
+static bool_t alt_key_handling;
|
|
||||||
|
|
||||||
char keyhandler_scratch[1024];
|
|
||||||
|
|
||||||
@@ -115,6 +116,26 @@ static struct keyhandler dump_registers_
|
|
||||||
.desc = "dump registers"
|
|
||||||
};
|
|
||||||
|
|
||||||
+static DECLARE_TASKLET(dump_dom0_tasklet, NULL, 0);
|
|
||||||
+
|
|
||||||
+static void dump_dom0_action(unsigned long arg)
|
|
||||||
+{
|
|
||||||
+ struct vcpu *v = (void *)arg;
|
|
||||||
+
|
|
||||||
+ for ( ; ; )
|
|
||||||
+ {
|
|
||||||
+ vcpu_show_execution_state(v);
|
|
||||||
+ if ( (v = v->next_in_list) == NULL )
|
|
||||||
+ break;
|
|
||||||
+ if ( softirq_pending(smp_processor_id()) )
|
|
||||||
+ {
|
|
||||||
+ dump_dom0_tasklet.data = (unsigned long)v;
|
|
||||||
+ tasklet_schedule_on_cpu(&dump_dom0_tasklet, v->processor);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void dump_dom0_registers(unsigned char key)
|
|
||||||
{
|
|
||||||
struct vcpu *v;
|
|
||||||
@@ -125,7 +146,17 @@ static void dump_dom0_registers(unsigned
|
|
||||||
printk("'%c' pressed -> dumping Dom0's registers\n", key);
|
|
||||||
|
|
||||||
for_each_vcpu ( dom0, v )
|
|
||||||
+ {
|
|
||||||
+ if ( alt_key_handling && softirq_pending(smp_processor_id()) )
|
|
||||||
+ {
|
|
||||||
+ tasklet_kill(&dump_dom0_tasklet);
|
|
||||||
+ tasklet_init(&dump_dom0_tasklet, dump_dom0_action,
|
|
||||||
+ (unsigned long)v);
|
|
||||||
+ tasklet_schedule_on_cpu(&dump_dom0_tasklet, v->processor);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
vcpu_show_execution_state(v);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct keyhandler dump_dom0_registers_keyhandler = {
|
|
||||||
@@ -439,8 +470,28 @@ static struct keyhandler do_debug_key_ke
|
|
||||||
.desc = "trap to xendbg"
|
|
||||||
};
|
|
||||||
|
|
||||||
+static void do_toggle_alt_key(unsigned char key, struct cpu_user_regs *regs)
|
|
||||||
+{
|
|
||||||
+ alt_key_handling = !alt_key_handling;
|
|
||||||
+ printk("'%c' pressed -> using %s key handling\n", key,
|
|
||||||
+ alt_key_handling ? "alternative" : "normal");
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static struct keyhandler toggle_alt_keyhandler = {
|
|
||||||
+ .irq_callback = 1,
|
|
||||||
+ .u.irq_fn = do_toggle_alt_key,
|
|
||||||
+ .desc = "toggle alternative key handling"
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
void __init initialize_keytable(void)
|
|
||||||
{
|
|
||||||
+ if ( num_present_cpus() > 16 )
|
|
||||||
+ {
|
|
||||||
+ alt_key_handling = 1;
|
|
||||||
+ printk(XENLOG_INFO "Defaulting to alternative key handling; "
|
|
||||||
+ "send 'A' to switch to normal mode.\n");
|
|
||||||
+ }
|
|
||||||
+ register_keyhandler('A', &toggle_alt_keyhandler);
|
|
||||||
register_keyhandler('d', &dump_registers_keyhandler);
|
|
||||||
register_keyhandler('h', &show_handlers_keyhandler);
|
|
||||||
register_keyhandler('q', &dump_domains_keyhandler);
|
|
@ -1,27 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1274118689 -3600
|
|
||||||
# Node ID 2a16128f17d884b87124eb159d4c4a0c34339d4e
|
|
||||||
# Parent 89a2f9ad02f23c24a06274a1217991181f19930b
|
|
||||||
x86: Quieten microcode.c during CPU hotplug
|
|
||||||
|
|
||||||
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/microcode.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/microcode.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/microcode.c
|
|
||||||
@@ -66,12 +66,10 @@ static void microcode_fini_cpu(int cpu)
|
|
||||||
|
|
||||||
int microcode_resume_cpu(int cpu)
|
|
||||||
{
|
|
||||||
- int err = 0;
|
|
||||||
+ int err;
|
|
||||||
struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
|
|
||||||
struct cpu_signature nsig;
|
|
||||||
|
|
||||||
- gdprintk(XENLOG_INFO, "microcode: CPU%d resumed\n", cpu);
|
|
||||||
-
|
|
||||||
if ( !uci->mc.mc_valid )
|
|
||||||
return -EIO;
|
|
||||||
|
|
@ -1,144 +0,0 @@
|
|||||||
References: bnc#573413
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1274253726 -3600
|
|
||||||
# Node ID f67ae6f9d4107f091d062fc1501a96f873671d10
|
|
||||||
# Parent eb4ecc037b7a53647f0ac89c7067d11ea622ab00
|
|
||||||
VT-d: Fix ATS enabling for device assignment
|
|
||||||
|
|
||||||
Currently, Xen only enables ATS in Xen booting. When an ATS capable
|
|
||||||
device is assigned to guest, ATS is actually not enabled because FLR
|
|
||||||
before assignment causes it to be disabled. Thus ATS cannot be used in
|
|
||||||
guest. This patch enables ATS in domain_context_mapping. This ensures
|
|
||||||
ATS is enabled in assignment because FLR is earlier than
|
|
||||||
domain_context_mapping call. Therefore ATS can be used in guest. This
|
|
||||||
patch also implements disable_ats_device to disable ATS when the
|
|
||||||
device is deassigned from a domain.
|
|
||||||
|
|
||||||
Signed-off-by: Weidong Han <weidong.han@intel.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/passthrough/vtd/ia64/ats.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/passthrough/vtd/ia64/ats.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/passthrough/vtd/ia64/ats.c
|
|
||||||
@@ -47,6 +47,11 @@ int enable_ats_device(int seg, int bus,
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+int disable_ats_device(int seg, int bus, int devfn)
|
|
||||||
+{
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
|
|
||||||
u64 addr, unsigned int size_order, u64 type)
|
|
||||||
{
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/passthrough/vtd/iommu.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/passthrough/vtd/iommu.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/passthrough/vtd/iommu.c
|
|
||||||
@@ -1354,6 +1354,9 @@ static int domain_context_mapping(struct
|
|
||||||
dprintk(VTDPREFIX, "d%d:PCIe: map bdf = %x:%x.%x\n",
|
|
||||||
domain->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
|
|
||||||
ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn);
|
|
||||||
+ if ( !ret && ats_device(0, bus, devfn) )
|
|
||||||
+ enable_ats_device(0, bus, devfn);
|
|
||||||
+
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DEV_TYPE_PCI:
|
|
||||||
@@ -1476,6 +1479,9 @@ static int domain_context_unmap(struct d
|
|
||||||
dprintk(VTDPREFIX, "d%d:PCIe: unmap bdf = %x:%x.%x\n",
|
|
||||||
domain->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
|
|
||||||
ret = domain_context_unmap_one(domain, iommu, bus, devfn);
|
|
||||||
+ if ( !ret && ats_device(0, bus, devfn) )
|
|
||||||
+ disable_ats_device(0, bus, devfn);
|
|
||||||
+
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DEV_TYPE_PCI:
|
|
||||||
@@ -1805,8 +1811,6 @@ static void setup_dom0_devices(struct do
|
|
||||||
list_add(&pdev->domain_list, &d->arch.pdev_list);
|
|
||||||
domain_context_mapping(d, pdev->bus, pdev->devfn);
|
|
||||||
pci_enable_acs(pdev);
|
|
||||||
- if ( ats_device(0, pdev->bus, pdev->devfn) )
|
|
||||||
- enable_ats_device(0, pdev->bus, pdev->devfn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spin_unlock(&pcidevs_lock);
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/passthrough/vtd/x86/ats.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/passthrough/vtd/x86/ats.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/passthrough/vtd/x86/ats.c
|
|
||||||
@@ -92,6 +92,9 @@ int ats_device(int seg, int bus, int dev
|
|
||||||
|
|
||||||
pdev = pci_get_pdev(bus, devfn);
|
|
||||||
drhd = acpi_find_matched_drhd_unit(pdev);
|
|
||||||
+ if ( !drhd )
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
if ( !ecap_queued_inval(drhd->iommu->ecap) ||
|
|
||||||
!ecap_dev_iotlb(drhd->iommu->ecap) )
|
|
||||||
return 0;
|
|
||||||
@@ -144,6 +147,9 @@ int enable_ats_device(int seg, int bus,
|
|
||||||
|
|
||||||
value = pci_conf_read16(bus, PCI_SLOT(devfn),
|
|
||||||
PCI_FUNC(devfn), pos + ATS_REG_CTL);
|
|
||||||
+ if ( value & ATS_ENABLE )
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
value |= ATS_ENABLE;
|
|
||||||
pci_conf_write16(bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
|
|
||||||
pos + ATS_REG_CTL, value);
|
|
||||||
@@ -153,10 +159,50 @@ int enable_ats_device(int seg, int bus,
|
|
||||||
pdev->devfn = devfn;
|
|
||||||
pdev->ats_queue_depth = queue_depth;
|
|
||||||
list_add(&(pdev->list), &ats_devices);
|
|
||||||
+ if ( iommu_verbose )
|
|
||||||
+ dprintk(XENLOG_INFO VTDPREFIX, "%x:%x.%x: ATS is enabled\n",
|
|
||||||
+ bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
+int disable_ats_device(int seg, int bus, int devfn)
|
|
||||||
+{
|
|
||||||
+ struct list_head *pdev_list, *tmp;
|
|
||||||
+ struct pci_ats_dev *pdev;
|
|
||||||
+ u32 value;
|
|
||||||
+ int pos;
|
|
||||||
+
|
|
||||||
+ pos = pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
|
|
||||||
+ if ( !pos )
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ /* BUGBUG: add back seg when multi-seg platform support is enabled */
|
|
||||||
+ value = pci_conf_read16(bus, PCI_SLOT(devfn),
|
|
||||||
+ PCI_FUNC(devfn), pos + ATS_REG_CTL);
|
|
||||||
+ value &= ~ATS_ENABLE;
|
|
||||||
+ pci_conf_write16(bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
|
|
||||||
+ pos + ATS_REG_CTL, value);
|
|
||||||
+
|
|
||||||
+ list_for_each_safe( pdev_list, tmp, &ats_devices )
|
|
||||||
+ {
|
|
||||||
+ pdev = list_entry(pdev_list, struct pci_ats_dev, list);
|
|
||||||
+ if ( pdev->bus == bus && pdev->devfn == devfn )
|
|
||||||
+ {
|
|
||||||
+ list_del(&pdev->list);
|
|
||||||
+ xfree(pdev);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ( iommu_verbose )
|
|
||||||
+ dprintk(XENLOG_INFO VTDPREFIX, "%x:%x.%x: ATS is disabled\n",
|
|
||||||
+ bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
static int device_in_domain(struct iommu *iommu, struct pci_ats_dev *pdev, u16 did)
|
|
||||||
{
|
|
||||||
struct root_entry *root_entry = NULL;
|
|
@ -1,230 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1275643111 -3600
|
|
||||||
# Node ID 48e2b07cf01c044bf483bd7fa5408a6f9801416b
|
|
||||||
# Parent f2b1924f20281bc42fa3532c7d82b3ee0700aff4
|
|
||||||
Intel: Add CPUID feature mask support for NHM processors.
|
|
||||||
|
|
||||||
Signed-off-by: Jun Nakajima <jun.nakajima@intel.com>
|
|
||||||
Signed-off-by: Liping Ke <liping.ke@intel.com>
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1276604335 -3600
|
|
||||||
# Node ID 2501732e291b001711a0dc1c474bb89ce77f3110
|
|
||||||
# Parent a2cc1db1af9c8f9b148c80f8b2c3f64bde7542f9
|
|
||||||
x86: fix pv cpuid masking
|
|
||||||
|
|
||||||
Invert initial values of the variables parsed into from the command
|
|
||||||
line, so that completely clearing out one or more of the four bit
|
|
||||||
fields is possible.
|
|
||||||
|
|
||||||
Further, consolidate the command line parameter specifications into
|
|
||||||
a single place.
|
|
||||||
|
|
||||||
Finally, as per "Intel Virtualization Technology FlexMigration
|
|
||||||
Application Note" (http://www.intel.com/Assets/PDF/manual/323850.pdf),
|
|
||||||
also handle family 6 model 0x1f.
|
|
||||||
|
|
||||||
What remains open is the question whether pv_cpuid() shouldn't also
|
|
||||||
consume these masks.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/cpu/amd.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/cpu/amd.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/cpu/amd.c
|
|
||||||
@@ -33,14 +33,6 @@ void start_svm(struct cpuinfo_x86 *c);
|
|
||||||
static char opt_famrev[14];
|
|
||||||
string_param("cpuid_mask_cpu", opt_famrev);
|
|
||||||
|
|
||||||
-/* Finer-grained CPUID feature control. */
|
|
||||||
-static unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx;
|
|
||||||
-integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx);
|
|
||||||
-integer_param("cpuid_mask_edx", opt_cpuid_mask_edx);
|
|
||||||
-static unsigned int opt_cpuid_mask_ext_ecx, opt_cpuid_mask_ext_edx;
|
|
||||||
-integer_param("cpuid_mask_ext_ecx", opt_cpuid_mask_ext_ecx);
|
|
||||||
-integer_param("cpuid_mask_ext_edx", opt_cpuid_mask_ext_edx);
|
|
||||||
-
|
|
||||||
static inline void wrmsr_amd(unsigned int index, unsigned int lo,
|
|
||||||
unsigned int hi)
|
|
||||||
{
|
|
||||||
@@ -102,7 +94,7 @@ static inline int wrmsr_amd_safe(unsigne
|
|
||||||
*
|
|
||||||
* The processor revision string parameter has precedene.
|
|
||||||
*/
|
|
||||||
-static void __devinit set_cpuidmask(struct cpuinfo_x86 *c)
|
|
||||||
+static void __devinit set_cpuidmask(const struct cpuinfo_x86 *c)
|
|
||||||
{
|
|
||||||
static unsigned int feat_ecx, feat_edx;
|
|
||||||
static unsigned int extfeat_ecx, extfeat_edx;
|
|
||||||
@@ -117,12 +109,12 @@ static void __devinit set_cpuidmask(stru
|
|
||||||
ASSERT((status == not_parsed) && (smp_processor_id() == 0));
|
|
||||||
status = no_mask;
|
|
||||||
|
|
||||||
- if (opt_cpuid_mask_ecx | opt_cpuid_mask_edx |
|
|
||||||
- opt_cpuid_mask_ext_ecx | opt_cpuid_mask_ext_edx) {
|
|
||||||
- feat_ecx = opt_cpuid_mask_ecx ? : ~0U;
|
|
||||||
- feat_edx = opt_cpuid_mask_edx ? : ~0U;
|
|
||||||
- extfeat_ecx = opt_cpuid_mask_ext_ecx ? : ~0U;
|
|
||||||
- extfeat_edx = opt_cpuid_mask_ext_edx ? : ~0U;
|
|
||||||
+ if (~(opt_cpuid_mask_ecx & opt_cpuid_mask_edx &
|
|
||||||
+ opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx)) {
|
|
||||||
+ feat_ecx = opt_cpuid_mask_ecx;
|
|
||||||
+ feat_edx = opt_cpuid_mask_edx;
|
|
||||||
+ extfeat_ecx = opt_cpuid_mask_ext_ecx;
|
|
||||||
+ extfeat_edx = opt_cpuid_mask_ext_edx;
|
|
||||||
} else if (*opt_famrev == '\0') {
|
|
||||||
return;
|
|
||||||
} else if (!strcmp(opt_famrev, "fam_0f_rev_c")) {
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/cpu/common.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/cpu/common.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/cpu/common.c
|
|
||||||
@@ -22,6 +22,15 @@ static int cachesize_override __cpuinitd
|
|
||||||
static int disable_x86_fxsr __cpuinitdata;
|
|
||||||
static int disable_x86_serial_nr __cpuinitdata;
|
|
||||||
|
|
||||||
+unsigned int __devinitdata opt_cpuid_mask_ecx = ~0u;
|
|
||||||
+integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx);
|
|
||||||
+unsigned int __devinitdata opt_cpuid_mask_edx = ~0u;
|
|
||||||
+integer_param("cpuid_mask_edx", opt_cpuid_mask_edx);
|
|
||||||
+unsigned int __devinitdata opt_cpuid_mask_ext_ecx = ~0u;
|
|
||||||
+integer_param("cpuid_mask_ext_ecx", opt_cpuid_mask_ext_ecx);
|
|
||||||
+unsigned int __devinitdata opt_cpuid_mask_ext_edx = ~0u;
|
|
||||||
+integer_param("cpuid_mask_ext_edx", opt_cpuid_mask_ext_edx);
|
|
||||||
+
|
|
||||||
struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {};
|
|
||||||
|
|
||||||
/*
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/cpu/cpu.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/cpu/cpu.h
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/cpu/cpu.h
|
|
||||||
@@ -21,6 +21,9 @@ struct cpu_dev {
|
|
||||||
|
|
||||||
extern struct cpu_dev * cpu_devs [X86_VENDOR_NUM];
|
|
||||||
|
|
||||||
+extern unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx;
|
|
||||||
+extern unsigned int opt_cpuid_mask_ext_ecx, opt_cpuid_mask_ext_edx;
|
|
||||||
+
|
|
||||||
extern int get_model_name(struct cpuinfo_x86 *c);
|
|
||||||
extern void display_cacheinfo(struct cpuinfo_x86 *c);
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/cpu/intel.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/cpu/intel.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/cpu/intel.c
|
|
||||||
@@ -20,16 +20,6 @@
|
|
||||||
|
|
||||||
extern int trap_init_f00f_bug(void);
|
|
||||||
|
|
||||||
-/*
|
|
||||||
- * opt_cpuid_mask_ecx/edx: cpuid.1[ecx, edx] feature mask.
|
|
||||||
- * For example, E8400[Intel Core 2 Duo Processor series] ecx = 0x0008E3FD,
|
|
||||||
- * edx = 0xBFEBFBFF when executing CPUID.EAX = 1 normally. If you want to
|
|
||||||
- * 'rev down' to E8400, you can set these values in these Xen boot parameters.
|
|
||||||
- */
|
|
||||||
-static unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx;
|
|
||||||
-integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx);
|
|
||||||
-integer_param("cpuid_mask_edx", opt_cpuid_mask_edx);
|
|
||||||
-
|
|
||||||
static int use_xsave;
|
|
||||||
boolean_param("xsave", use_xsave);
|
|
||||||
|
|
||||||
@@ -40,24 +30,57 @@ boolean_param("xsave", use_xsave);
|
|
||||||
struct movsl_mask movsl_mask __read_mostly;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-static void __devinit set_cpuidmask(void)
|
|
||||||
+/*
|
|
||||||
+ * opt_cpuid_mask_ecx/edx: cpuid.1[ecx, edx] feature mask.
|
|
||||||
+ * For example, E8400[Intel Core 2 Duo Processor series] ecx = 0x0008E3FD,
|
|
||||||
+ * edx = 0xBFEBFBFF when executing CPUID.EAX = 1 normally. If you want to
|
|
||||||
+ * 'rev down' to E8400, you can set these values in these Xen boot parameters.
|
|
||||||
+ */
|
|
||||||
+static void __devinit set_cpuidmask(const struct cpuinfo_x86 *c)
|
|
||||||
{
|
|
||||||
- unsigned int eax, ebx, ecx, edx, model;
|
|
||||||
+ const char *extra = "";
|
|
||||||
|
|
||||||
- if (!(opt_cpuid_mask_ecx | opt_cpuid_mask_edx))
|
|
||||||
+ if (!~(opt_cpuid_mask_ecx & opt_cpuid_mask_edx &
|
|
||||||
+ opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx))
|
|
||||||
return;
|
|
||||||
|
|
||||||
- cpuid(0x00000001, &eax, &ebx, &ecx, &edx);
|
|
||||||
- model = ((eax & 0xf0000) >> 12) | ((eax & 0xf0) >> 4);
|
|
||||||
- if (!((model == 0x1d) || ((model == 0x17) && ((eax & 0xf) >= 4)))) {
|
|
||||||
- printk(XENLOG_ERR "Cannot set CPU feature mask on CPU#%d\n",
|
|
||||||
- smp_processor_id());
|
|
||||||
+ /* Only family 6 supports this feature */
|
|
||||||
+ switch ((c->x86 == 6) * c->x86_model) {
|
|
||||||
+ case 0x17:
|
|
||||||
+ if ((c->x86_mask & 0x0f) < 4)
|
|
||||||
+ break;
|
|
||||||
+ /* fall through */
|
|
||||||
+ case 0x1d:
|
|
||||||
+ wrmsr(MSR_INTEL_CPUID_FEATURE_MASK,
|
|
||||||
+ opt_cpuid_mask_ecx,
|
|
||||||
+ opt_cpuid_mask_edx);
|
|
||||||
+ if (!~(opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx))
|
|
||||||
+ return;
|
|
||||||
+ extra = "extended ";
|
|
||||||
+ break;
|
|
||||||
+/*
|
|
||||||
+ * CPU supports this feature if the processor signature meets the following:
|
|
||||||
+ * (CPUID.(EAX=01h):EAX) > 000106A2h, or
|
|
||||||
+ * (CPUID.(EAX=01h):EAX) == 000106Exh, 0002065xh, 000206Cxh, 000206Exh, or 000206Fxh
|
|
||||||
+ *
|
|
||||||
+ */
|
|
||||||
+ case 0x1a:
|
|
||||||
+ if ((c->x86_mask & 0x0f) <= 2)
|
|
||||||
+ break;
|
|
||||||
+ /* fall through */
|
|
||||||
+ case 0x1e: case 0x1f:
|
|
||||||
+ case 0x25: case 0x2c: case 0x2e: case 0x2f:
|
|
||||||
+ wrmsr(MSR_INTEL_CPUID1_FEATURE_MASK,
|
|
||||||
+ opt_cpuid_mask_ecx,
|
|
||||||
+ opt_cpuid_mask_edx);
|
|
||||||
+ wrmsr(MSR_INTEL_CPUID80000001_FEATURE_MASK,
|
|
||||||
+ opt_cpuid_mask_ext_ecx,
|
|
||||||
+ opt_cpuid_mask_ext_edx);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- wrmsr(MSR_IA32_CPUID_FEATURE_MASK1,
|
|
||||||
- opt_cpuid_mask_ecx ? : ~0u,
|
|
||||||
- opt_cpuid_mask_edx ? : ~0u);
|
|
||||||
+ printk(XENLOG_ERR "Cannot set CPU feature mask on CPU#%d\n",
|
|
||||||
+ smp_processor_id());
|
|
||||||
}
|
|
||||||
|
|
||||||
void __devinit early_intel_workaround(struct cpuinfo_x86 *c)
|
|
||||||
@@ -179,7 +202,7 @@ static void __devinit init_intel(struct
|
|
||||||
|
|
||||||
detect_ht(c);
|
|
||||||
|
|
||||||
- set_cpuidmask();
|
|
||||||
+ set_cpuidmask(c);
|
|
||||||
|
|
||||||
/* Work around errata */
|
|
||||||
Intel_errata_workarounds(c);
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/msr-index.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/msr-index.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/msr-index.h
|
|
||||||
@@ -156,8 +156,10 @@
|
|
||||||
#define MSR_P6_EVNTSEL0 0x00000186
|
|
||||||
#define MSR_P6_EVNTSEL1 0x00000187
|
|
||||||
|
|
||||||
-/* MSR for cpuid feature mask */
|
|
||||||
-#define MSR_IA32_CPUID_FEATURE_MASK1 0x00000478
|
|
||||||
+/* MSRs for Intel cpuid feature mask */
|
|
||||||
+#define MSR_INTEL_CPUID_FEATURE_MASK 0x00000478
|
|
||||||
+#define MSR_INTEL_CPUID1_FEATURE_MASK 0x00000130
|
|
||||||
+#define MSR_INTEL_CPUID80000001_FEATURE_MASK 0x00000131
|
|
||||||
|
|
||||||
/* MSRs & bits used for VMX enabling */
|
|
||||||
#define MSR_IA32_VMX_BASIC 0x480
|
|
@ -1,51 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1275892689 -3600
|
|
||||||
# Node ID 0251bbc0a9a879126bce65e47e4410575cfa73de
|
|
||||||
# Parent 7ff0e885b5c30cc8573b52144b274509e04759fd
|
|
||||||
AMD: Workaround for erratum 411
|
|
||||||
|
|
||||||
Clear APIC TMICT when we mask APIC LVTT.
|
|
||||||
|
|
||||||
Signed-off-by: Wei Wang <wei.wang2@amd.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/apic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
@@ -198,6 +198,9 @@ void clear_local_APIC(void)
|
|
||||||
|
|
||||||
maxlvt = get_maxlvt();
|
|
||||||
|
|
||||||
+ /* Work around AMD Erratum 411. This is a nice thing to do anyway. */
|
|
||||||
+ apic_write_around(APIC_TMICT, 0);
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* Masking an LVT entry on a P6 can trigger a local APIC error
|
|
||||||
* if the vector is zero. Mask LVTERR first to prevent this.
|
|
||||||
@@ -1327,7 +1330,10 @@ void disable_APIC_timer(void)
|
|
||||||
{
|
|
||||||
if (using_apic_timer) {
|
|
||||||
unsigned long v;
|
|
||||||
-
|
|
||||||
+
|
|
||||||
+ /* Work around AMD Erratum 411. This is a nice thing to do anyway. */
|
|
||||||
+ apic_write_around(APIC_TMICT, 0);
|
|
||||||
+
|
|
||||||
v = apic_read(APIC_LVTT);
|
|
||||||
apic_write_around(APIC_LVTT, v | APIC_LVT_MASKED);
|
|
||||||
}
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/hpet.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/hpet.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/hpet.c
|
|
||||||
@@ -659,8 +659,7 @@ void hpet_broadcast_enter(void)
|
|
||||||
if ( hpet_attach_channel )
|
|
||||||
hpet_attach_channel(cpu, ch);
|
|
||||||
|
|
||||||
- /* Cancel any outstanding LAPIC timer event and disable interrupts. */
|
|
||||||
- reprogram_timer(0);
|
|
||||||
+ /* Disable LAPIC timer interrupts. */
|
|
||||||
disable_APIC_timer();
|
|
||||||
|
|
||||||
cpu_set(cpu, ch->cpumask);
|
|
@ -1,163 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1276604289 -3600
|
|
||||||
# Node ID a2cc1db1af9c8f9b148c80f8b2c3f64bde7542f9
|
|
||||||
# Parent 094b826a2b8e2c17fe7004923352d459e0c23f13
|
|
||||||
Don't save Xen heap pages during domain save
|
|
||||||
References: bnc#609153
|
|
||||||
|
|
||||||
As discussed in the thread starting at
|
|
||||||
http://lists.xensource.com/archives/html/xen-devel/2010-05/msg01383.html,
|
|
||||||
don't save Xen heap pages in order to avoid overallocation when the
|
|
||||||
domain gets restored, as those pages would get (temporarily) backed
|
|
||||||
with normal RAM pages by the restore code.
|
|
||||||
|
|
||||||
This requires making DOMCTL_getpageframeinfo{2,3} usable for HVM
|
|
||||||
guests, meaning that the input to these must be treated as GMFNs.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/libxc/xc_domain_save.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/libxc/xc_domain_save.c
|
|
||||||
+++ xen-4.0.2-testing/tools/libxc/xc_domain_save.c
|
|
||||||
@@ -1282,58 +1282,64 @@ int xc_domain_save(int xc_handle, int io
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if ( hvm )
|
|
||||||
+ /* Get page types */
|
|
||||||
+ if ( xc_get_pfn_type_batch(xc_handle, dom, batch, pfn_type) )
|
|
||||||
{
|
|
||||||
- /* Look for and skip completely empty batches. */
|
|
||||||
- for ( j = 0; j < batch; j++ )
|
|
||||||
- {
|
|
||||||
- if ( !pfn_err[j] )
|
|
||||||
- break;
|
|
||||||
- pfn_type[j] |= XEN_DOMCTL_PFINFO_XTAB;
|
|
||||||
- }
|
|
||||||
- if ( j == batch )
|
|
||||||
- {
|
|
||||||
- munmap(region_base, batch*PAGE_SIZE);
|
|
||||||
- continue; /* bail on this batch: no valid pages */
|
|
||||||
- }
|
|
||||||
- for ( ; j < batch; j++ )
|
|
||||||
- if ( pfn_err[j] )
|
|
||||||
- pfn_type[j] |= XEN_DOMCTL_PFINFO_XTAB;
|
|
||||||
+ ERROR("get_pfn_type_batch failed");
|
|
||||||
+ goto out;
|
|
||||||
}
|
|
||||||
- else
|
|
||||||
+
|
|
||||||
+ for ( run = j = 0; j < batch; j++ )
|
|
||||||
{
|
|
||||||
- /* Get page types */
|
|
||||||
- if ( xc_get_pfn_type_batch(xc_handle, dom, batch, pfn_type) )
|
|
||||||
- {
|
|
||||||
- ERROR("get_pfn_type_batch failed");
|
|
||||||
- goto out;
|
|
||||||
- }
|
|
||||||
+ unsigned long gmfn = pfn_batch[j];
|
|
||||||
+
|
|
||||||
+ if ( !hvm )
|
|
||||||
+ gmfn = pfn_to_mfn(gmfn);
|
|
||||||
|
|
||||||
- for ( j = 0; j < batch; j++ )
|
|
||||||
+ if ( pfn_err[j] )
|
|
||||||
{
|
|
||||||
- unsigned long mfn = pfn_to_mfn(pfn_batch[j]);
|
|
||||||
-
|
|
||||||
if ( pfn_type[j] == XEN_DOMCTL_PFINFO_XTAB )
|
|
||||||
- {
|
|
||||||
- DPRINTF("type fail: page %i mfn %08lx\n",
|
|
||||||
- j, mfn);
|
|
||||||
continue;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- if ( debug )
|
|
||||||
+ DPRINTF("map fail: page %i mfn %08lx err %d\n",
|
|
||||||
+ j, gmfn, pfn_err[j]);
|
|
||||||
+ pfn_type[j] = XEN_DOMCTL_PFINFO_XTAB;
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ( pfn_type[j] == XEN_DOMCTL_PFINFO_XTAB )
|
|
||||||
+ {
|
|
||||||
+ DPRINTF("type fail: page %i mfn %08lx\n", j, gmfn);
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* canonicalise mfn->pfn */
|
|
||||||
+ pfn_type[j] |= pfn_batch[j];
|
|
||||||
+ ++run;
|
|
||||||
+
|
|
||||||
+ if ( debug )
|
|
||||||
+ {
|
|
||||||
+ if ( hvm )
|
|
||||||
+ DPRINTF("%d pfn=%08lx sum=%08lx\n",
|
|
||||||
+ iter,
|
|
||||||
+ pfn_type[j],
|
|
||||||
+ csum_page(region_base + (PAGE_SIZE*j)));
|
|
||||||
+ else
|
|
||||||
DPRINTF("%d pfn= %08lx mfn= %08lx [mfn]= %08lx"
|
|
||||||
" sum= %08lx\n",
|
|
||||||
iter,
|
|
||||||
- pfn_type[j] | pfn_batch[j],
|
|
||||||
- mfn,
|
|
||||||
- mfn_to_pfn(mfn),
|
|
||||||
+ pfn_type[j],
|
|
||||||
+ gmfn,
|
|
||||||
+ mfn_to_pfn(gmfn),
|
|
||||||
csum_page(region_base + (PAGE_SIZE*j)));
|
|
||||||
-
|
|
||||||
- /* canonicalise mfn->pfn */
|
|
||||||
- pfn_type[j] |= pfn_batch[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if ( !run )
|
|
||||||
+ {
|
|
||||||
+ munmap(region_base, batch*PAGE_SIZE);
|
|
||||||
+ continue; /* bail on this batch: no valid pages */
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if ( write_exact(io_fd, &batch, sizeof(unsigned int)) )
|
|
||||||
{
|
|
||||||
PERROR("Error when writing to state file (2)");
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/domctl.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/domctl.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/domctl.c
|
|
||||||
@@ -206,11 +206,12 @@ long arch_do_domctl(
|
|
||||||
|
|
||||||
for ( j = 0; j < k; j++ )
|
|
||||||
{
|
|
||||||
- unsigned long type = 0, mfn = arr[j];
|
|
||||||
+ unsigned long type = 0, mfn = gmfn_to_mfn(d, arr[j]);
|
|
||||||
|
|
||||||
page = mfn_to_page(mfn);
|
|
||||||
|
|
||||||
- if ( unlikely(!mfn_valid(mfn)) )
|
|
||||||
+ if ( unlikely(!mfn_valid(mfn)) ||
|
|
||||||
+ unlikely(is_xen_heap_mfn(mfn)) )
|
|
||||||
type = XEN_DOMCTL_PFINFO_XTAB;
|
|
||||||
else if ( xsm_getpageframeinfo(page) != 0 )
|
|
||||||
;
|
|
||||||
@@ -305,14 +306,15 @@ long arch_do_domctl(
|
|
||||||
for ( j = 0; j < k; j++ )
|
|
||||||
{
|
|
||||||
struct page_info *page;
|
|
||||||
- unsigned long mfn = arr32[j];
|
|
||||||
+ unsigned long mfn = gmfn_to_mfn(d, arr32[j]);
|
|
||||||
|
|
||||||
page = mfn_to_page(mfn);
|
|
||||||
|
|
||||||
if ( domctl->cmd == XEN_DOMCTL_getpageframeinfo3)
|
|
||||||
arr32[j] = 0;
|
|
||||||
|
|
||||||
- if ( unlikely(!mfn_valid(mfn)) )
|
|
||||||
+ if ( unlikely(!mfn_valid(mfn)) ||
|
|
||||||
+ unlikely(is_xen_heap_mfn(mfn)) )
|
|
||||||
arr32[j] |= XEN_DOMCTL_PFINFO_XTAB;
|
|
||||||
else if ( xsm_getpageframeinfo(page) != 0 )
|
|
||||||
continue;
|
|
@ -1,25 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1276761018 -3600
|
|
||||||
# Node ID 7a00c0bd4fc131fb4de5df9f3fdc4e48a29dd5f9
|
|
||||||
# Parent dab8676e97ce7a95c0777e58eee4b1b03bfc5322
|
|
||||||
cpuidle: fix wrapped ticks calculation for pm timer.
|
|
||||||
|
|
||||||
Signed-off-by: Wei Gang <gang.wei@intel.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/acpi/cpu_idle.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/acpi/cpu_idle.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/acpi/cpu_idle.c
|
|
||||||
@@ -127,9 +127,9 @@ static inline u32 ticks_elapsed(u32 t1,
|
|
||||||
if ( t2 >= t1 )
|
|
||||||
return (t2 - t1);
|
|
||||||
else if ( !(acpi_gbl_FADT.flags & ACPI_FADT_32BIT_TIMER) )
|
|
||||||
- return (((0x00FFFFFF - t1) + t2) & 0x00FFFFFF);
|
|
||||||
+ return (((0x00FFFFFF - t1) + t2 + 1) & 0x00FFFFFF);
|
|
||||||
else
|
|
||||||
- return ((0xFFFFFFFF - t1) + t2);
|
|
||||||
+ return ((0xFFFFFFFF - t1) + t2 +1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void acpi_safe_halt(void)
|
|
@ -1,46 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Ian Jackson <Ian.Jackson@eu.citrix.com>
|
|
||||||
# Date 1277219220 -3600
|
|
||||||
# Node ID 9da3abe88c90bd8ec48963a9ec537a8871e266db
|
|
||||||
# Parent 2ad890d46cb8a11fc6ea329126d398021307e627
|
|
||||||
Check "mac" address sooner in device_create function, before doing device_add.
|
|
||||||
|
|
||||||
In XendDomainInfo.py device_create function, when device type is
|
|
||||||
"vif", it has a paragraph to check the validity of "mac"
|
|
||||||
address. Before checking validity, device_add has been done. But after
|
|
||||||
checking validity, if the mac address is invlid, it raises VmError and
|
|
||||||
exits directly without doing clean work like removing the device item
|
|
||||||
from config info. This will cause that the incorrect mac address is
|
|
||||||
saved into VM Config file and VM fails to restart. If check "mac"
|
|
||||||
validity before doing device_add, there will be no problem.
|
|
||||||
|
|
||||||
Signed-off-by Chunyan Liu <CYLiu@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
@@ -847,11 +847,6 @@ class XendDomainInfo:
|
|
||||||
@type dev_config: SXP object (parsed config)
|
|
||||||
"""
|
|
||||||
log.debug("XendDomainInfo.device_create: %s" % scrub_password(dev_config))
|
|
||||||
- dev_type = sxp.name(dev_config)
|
|
||||||
- dev_uuid = self.info.device_add(dev_type, cfg_sxp = dev_config)
|
|
||||||
- dev_config_dict = self.info['devices'][dev_uuid][1]
|
|
||||||
- log.debug("XendDomainInfo.device_create: %s" % scrub_password(dev_config_dict))
|
|
||||||
-
|
|
||||||
if dev_type == 'vif':
|
|
||||||
for x in dev_config:
|
|
||||||
if x != 'vif' and x[0] == 'mac':
|
|
||||||
@@ -859,6 +854,11 @@ class XendDomainInfo:
|
|
||||||
log.error("Virtual network interface creation error - invalid MAC Address entered: %s", x[1])
|
|
||||||
raise VmError("Cannot create a new virtual network interface - MAC address is not valid!");
|
|
||||||
|
|
||||||
+ dev_type = sxp.name(dev_config)
|
|
||||||
+ dev_uuid = self.info.device_add(dev_type, cfg_sxp = dev_config)
|
|
||||||
+ dev_config_dict = self.info['devices'][dev_uuid][1]
|
|
||||||
+ log.debug("XendDomainInfo.device_create: %s" % scrub_password(dev_config_dict))
|
|
||||||
+
|
|
||||||
if self.domid is not None:
|
|
||||||
try:
|
|
||||||
dev_config_dict['devid'] = devid = \
|
|
@ -1,39 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Ian Jackson <Ian.Jackson@eu.citrix.com>
|
|
||||||
# Date 1277475191 -3600
|
|
||||||
# Node ID e307aa11ed27ea91cf175461b3a715fe3f7253bc
|
|
||||||
# Parent e7b55cc5533aed48a47cf70e20aa9fb991bf2de4
|
|
||||||
xend: Fix up check "mac" address sooner change
|
|
||||||
|
|
||||||
In changeset 21653,
|
|
||||||
dev_type = sxp.name(dev_config)
|
|
||||||
should not have been moved, otherwise, the checking "mac"
|
|
||||||
paragraph is of no use.
|
|
||||||
|
|
||||||
(The original patch as submitted was correct but I had to make the
|
|
||||||
change manually as it had been mangled.)
|
|
||||||
|
|
||||||
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
||||||
Signed-off-by Chunyan Liu <CYLiu@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
@@ -847,6 +847,8 @@ class XendDomainInfo:
|
|
||||||
@type dev_config: SXP object (parsed config)
|
|
||||||
"""
|
|
||||||
log.debug("XendDomainInfo.device_create: %s" % scrub_password(dev_config))
|
|
||||||
+ dev_type = sxp.name(dev_config)
|
|
||||||
+
|
|
||||||
if dev_type == 'vif':
|
|
||||||
for x in dev_config:
|
|
||||||
if x != 'vif' and x[0] == 'mac':
|
|
||||||
@@ -854,7 +856,6 @@ class XendDomainInfo:
|
|
||||||
log.error("Virtual network interface creation error - invalid MAC Address entered: %s", x[1])
|
|
||||||
raise VmError("Cannot create a new virtual network interface - MAC address is not valid!");
|
|
||||||
|
|
||||||
- dev_type = sxp.name(dev_config)
|
|
||||||
dev_uuid = self.info.device_add(dev_type, cfg_sxp = dev_config)
|
|
||||||
dev_config_dict = self.info['devices'][dev_uuid][1]
|
|
||||||
log.debug("XendDomainInfo.device_create: %s" % scrub_password(dev_config_dict))
|
|
@ -1,49 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1277739919 -3600
|
|
||||||
# Node ID 059a12afce52a213db56bd8e9442d9eeadfdd34c
|
|
||||||
# Parent 7e46fdbe8a1187cee2ab609256300d7967f37f06
|
|
||||||
vtd: Only kill_timer() an init_timer()'ed timer.
|
|
||||||
|
|
||||||
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/passthrough/io.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/passthrough/io.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/passthrough/io.c
|
|
||||||
@@ -27,7 +27,7 @@
|
|
||||||
|
|
||||||
static void hvm_dirq_assist(unsigned long _d);
|
|
||||||
|
|
||||||
-static int pt_irq_need_timer(uint32_t flags)
|
|
||||||
+bool_t pt_irq_need_timer(uint32_t flags)
|
|
||||||
{
|
|
||||||
return !(flags & (HVM_IRQ_DPCI_GUEST_MSI | HVM_IRQ_DPCI_TRANSLATE));
|
|
||||||
}
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/passthrough/pci.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/passthrough/pci.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/passthrough/pci.c
|
|
||||||
@@ -257,7 +257,9 @@ static void pci_clean_dpci_irqs(struct d
|
|
||||||
i = find_next_bit(hvm_irq_dpci->mapping, d->nr_pirqs, i + 1) )
|
|
||||||
{
|
|
||||||
pirq_guest_unbind(d, i);
|
|
||||||
- kill_timer(&hvm_irq_dpci->hvm_timer[domain_pirq_to_irq(d, i)]);
|
|
||||||
+
|
|
||||||
+ if ( pt_irq_need_timer(hvm_irq_dpci->mirq[i].flags) )
|
|
||||||
+ kill_timer(&hvm_irq_dpci->hvm_timer[domain_pirq_to_irq(d, i)]);
|
|
||||||
|
|
||||||
list_for_each_safe ( digl_list, tmp,
|
|
||||||
&hvm_irq_dpci->mirq[i].digl_list )
|
|
||||||
Index: xen-4.0.2-testing/xen/include/xen/iommu.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/xen/iommu.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/xen/iommu.h
|
|
||||||
@@ -106,6 +106,7 @@ void hvm_dpci_isairq_eoi(struct domain *
|
|
||||||
struct hvm_irq_dpci *domain_get_irq_dpci(struct domain *domain);
|
|
||||||
int domain_set_irq_dpci(struct domain *domain, struct hvm_irq_dpci *dpci);
|
|
||||||
void free_hvm_irq_dpci(struct hvm_irq_dpci *dpci);
|
|
||||||
+bool_t pt_irq_need_timer(uint32_t flags);
|
|
||||||
|
|
||||||
#define PT_IRQ_TIME_OUT MILLISECS(8)
|
|
||||||
#define VTDPREFIX "[VT-D]"
|
|
@ -1,188 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Ian Jackson <Ian.Jackson@eu.citrix.com>
|
|
||||||
# Date 1277819571 -3600
|
|
||||||
# Node ID a60c604b5829db6285ff89d8163478330ac12ee2
|
|
||||||
# Parent 7b00193bd0334606b6f6779c3f14a1667a952fe4
|
|
||||||
tools/xend, xm: add a command to get the state of VMs
|
|
||||||
|
|
||||||
add a command "domstate" to get the state of Vms, which may have one state of
|
|
||||||
{'shutoff', 'idle','shutdown','running','crashed','paused' or 'paused by
|
|
||||||
admin"}.
|
|
||||||
|
|
||||||
For case of pause, I distinguish it into two conditions. One is "paused" the
|
|
||||||
other is "paused by admin".
|
|
||||||
"pasued by admin" means that users pause a domain voluntary by "xm paused
|
|
||||||
VM" or " API"
|
|
||||||
|
|
||||||
Signed-off-by James (Song Wei) <jsong@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomain.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomain.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomain.py
|
|
||||||
@@ -250,6 +250,18 @@ class XendDomain:
|
|
||||||
@return: path to config file.
|
|
||||||
"""
|
|
||||||
return os.path.join(self._managed_path(domuuid), CACHED_CONFIG_FILE)
|
|
||||||
+ def domain_setpauseflag(self, dom, flag=False):
|
|
||||||
+ try:
|
|
||||||
+ dominfo = self.domain_lookup_nr(dom)
|
|
||||||
+ dominfo.paused_by_admin = flag
|
|
||||||
+ except Exception, err:
|
|
||||||
+ log.debug("error in in setpauseflag")
|
|
||||||
+ def domain_getpauseflag(self, dom):
|
|
||||||
+ try:
|
|
||||||
+ dominfo = self.domain_lookup_nr(dom)
|
|
||||||
+ return dominfo.paused_by_admin
|
|
||||||
+ except Exception, err:
|
|
||||||
+ log.debug("error in in getpauseflag")
|
|
||||||
|
|
||||||
def _managed_check_point_path(self, domuuid):
|
|
||||||
"""Returns absolute path to check point file for managed domain.
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
@@ -327,6 +327,8 @@ class XendDomainInfo:
|
|
||||||
@type info: dictionary
|
|
||||||
@ivar domid: Domain ID (if VM has started)
|
|
||||||
@type domid: int or None
|
|
||||||
+ @ivar paused_by_admin: Is this Domain paused by command or API
|
|
||||||
+ @type paused_by_admin: bool
|
|
||||||
@ivar guest_bitsize: the bitsize of guest
|
|
||||||
@type guest_bitsize: int or None
|
|
||||||
@ivar alloc_mem: the memory domain allocated when booting
|
|
||||||
@@ -390,6 +392,7 @@ class XendDomainInfo:
|
|
||||||
self.domid = domid
|
|
||||||
self.guest_bitsize = None
|
|
||||||
self.alloc_mem = None
|
|
||||||
+ self.paused_by_admin = False
|
|
||||||
|
|
||||||
maxmem = self.info.get('memory_static_max', 0)
|
|
||||||
memory = self.info.get('memory_dynamic_max', 0)
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/server/SrvDomain.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/server/SrvDomain.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/server/SrvDomain.py
|
|
||||||
@@ -225,6 +225,20 @@ class SrvDomain(SrvDir):
|
|
||||||
self.acceptCommand(req)
|
|
||||||
return self.xd.domain_reset(self.dom.getName())
|
|
||||||
|
|
||||||
+ def op_do_get_pauseflag(self, op, req):
|
|
||||||
+ self.acceptCommand(req)
|
|
||||||
+ return req.threadRequest(self.do_get_pauseflag, op, req)
|
|
||||||
+
|
|
||||||
+ def do_get_pauseflag(self, _, req):
|
|
||||||
+ return self.xd.domain_getpauseflag(self.dom.getName(), req)
|
|
||||||
+
|
|
||||||
+ def op_do_set_pauseflag(self, op, req):
|
|
||||||
+ self.acceptCommand(req)
|
|
||||||
+ return req.threadRequest(self.do_set_pauseflag, op, req)
|
|
||||||
+
|
|
||||||
+ def do_set_pauseflag(self, _, req):
|
|
||||||
+ return self.xd.domain_setpauseflag(self.dom.getName(), req)
|
|
||||||
+
|
|
||||||
def op_usb_add(self, op, req):
|
|
||||||
self.acceptCommand(req)
|
|
||||||
return req.threadRequest(self.do_usb_add, op, req)
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xm/main.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xm/main.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xm/main.py
|
|
||||||
@@ -165,6 +165,8 @@ SUBCOMMAND_HELP = {
|
|
||||||
#usb
|
|
||||||
'usb-add' : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Add the usb device to FV VM.'),
|
|
||||||
'usb-del' : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Delete the usb device to FV VM.'),
|
|
||||||
+ #domstate
|
|
||||||
+ 'domstate' : ('<domain> ', 'get the state of a domain'),
|
|
||||||
|
|
||||||
# device commands
|
|
||||||
|
|
||||||
@@ -370,6 +372,7 @@ common_commands = [
|
|
||||||
"uptime",
|
|
||||||
"usb-add",
|
|
||||||
"usb-del",
|
|
||||||
+ "domstate",
|
|
||||||
"vcpu-set",
|
|
||||||
]
|
|
||||||
|
|
||||||
@@ -404,6 +407,7 @@ domain_commands = [
|
|
||||||
"uptime",
|
|
||||||
"usb-add",
|
|
||||||
"usb-del",
|
|
||||||
+ "domstate",
|
|
||||||
"vcpu-list",
|
|
||||||
"vcpu-pin",
|
|
||||||
"vcpu-set",
|
|
||||||
@@ -901,7 +905,6 @@ def getDomains(domain_names, state, full
|
|
||||||
return "-"
|
|
||||||
state_str = "".join([state_on_off(state)
|
|
||||||
for state in states])
|
|
||||||
-
|
|
||||||
dom_rec.update({'name': dom_rec['name_label'],
|
|
||||||
'memory_actual': int(dom_metrics_rec['memory_actual'])/1024,
|
|
||||||
'vcpus': dom_metrics_rec['VCPUs_number'],
|
|
||||||
@@ -1395,8 +1398,10 @@ def xm_pause(args):
|
|
||||||
|
|
||||||
if serverType == SERVER_XEN_API:
|
|
||||||
server.xenapi.VM.pause(get_single_vm(dom))
|
|
||||||
+ server.xenapi.VM.set_pauseflag(get_single_vm(dom), True)
|
|
||||||
else:
|
|
||||||
server.xend.domain.pause(dom)
|
|
||||||
+ server.xend.domain.setpauseflag(dom, True)
|
|
||||||
|
|
||||||
def xm_unpause(args):
|
|
||||||
arg_check(args, "unpause", 1)
|
|
||||||
@@ -1404,8 +1409,10 @@ def xm_unpause(args):
|
|
||||||
|
|
||||||
if serverType == SERVER_XEN_API:
|
|
||||||
server.xenapi.VM.unpause(get_single_vm(dom))
|
|
||||||
+ server.xenapi.VM.set_pauseflag(get_single_vm(dom), False)
|
|
||||||
else:
|
|
||||||
server.xend.domain.unpause(dom)
|
|
||||||
+ server.xend.domain.setpauseflag(dom, False)
|
|
||||||
|
|
||||||
def xm_dump_core(args):
|
|
||||||
live = False
|
|
||||||
@@ -1517,6 +1524,32 @@ def xm_usb_add(args):
|
|
||||||
arg_check(args, "usb-add", 2)
|
|
||||||
server.xend.domain.usb_add(args[0],args[1])
|
|
||||||
|
|
||||||
+def xm_domstate(args):
|
|
||||||
+ arg_check(args, "domstate", 1)
|
|
||||||
+ (opitons, params) = getopt.gnu_getopt(args, 's', ['domname='])
|
|
||||||
+ doms = getDomains(params, 'all')
|
|
||||||
+ d = parse_doms_info(doms[0])
|
|
||||||
+ state = d['state']
|
|
||||||
+ if state:
|
|
||||||
+ if state.find('s') > 0:
|
|
||||||
+ print 'shutoff'
|
|
||||||
+ elif state.find('b') > 0:
|
|
||||||
+ print 'idle'
|
|
||||||
+ elif state.find('d') > 0:
|
|
||||||
+ print 'shutdown'
|
|
||||||
+ elif state.find('r') > 0:
|
|
||||||
+ print 'running'
|
|
||||||
+ elif state.find('c') > 0:
|
|
||||||
+ print 'crashed'
|
|
||||||
+ elif state.find('p') > 0:
|
|
||||||
+ if server.xend.domain.getpauseflag(args[0]):
|
|
||||||
+ print 'paused by admin'
|
|
||||||
+ else:
|
|
||||||
+ print 'paused'
|
|
||||||
+ else:
|
|
||||||
+ print 'shutoff'
|
|
||||||
+ return
|
|
||||||
+
|
|
||||||
def xm_usb_del(args):
|
|
||||||
arg_check(args, "usb-del", 2)
|
|
||||||
server.xend.domain.usb_del(args[0],args[1])
|
|
||||||
@@ -3542,6 +3575,8 @@ commands = {
|
|
||||||
#usb
|
|
||||||
"usb-add": xm_usb_add,
|
|
||||||
"usb-del": xm_usb_del,
|
|
||||||
+ #domstate
|
|
||||||
+ "domstate": xm_domstate,
|
|
||||||
}
|
|
||||||
|
|
||||||
## The commands supported by a separate argument parser in xend.xm.
|
|
@ -1,483 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1279284738 -3600
|
|
||||||
# Node ID fedab6367c9a0141d49853c77a23d6642ba70ff6
|
|
||||||
# Parent 1f7c2418e58c7d1d5650ea211016b30114de48f2
|
|
||||||
ACPI: add support for x2APIC ACPI extensions
|
|
||||||
References: bnc#656369, bnc#658704
|
|
||||||
|
|
||||||
All logical processors with APIC ID values of 255 and greater will
|
|
||||||
have their APIC reported through Processor X2APIC structure (type-9
|
|
||||||
entry type) and all logical processors with APIC ID less than 255 will
|
|
||||||
have their APIC reported through legacy Processor Local APIC (type-0
|
|
||||||
entry type) only. This is the same case even for NMI structure
|
|
||||||
reporting.
|
|
||||||
|
|
||||||
The Processor X2APIC Affinity structure provides the association
|
|
||||||
between the X2APIC ID of a logical processor and the proximity domain
|
|
||||||
to which the logical processor belongs.
|
|
||||||
|
|
||||||
This patch adds 2 new subtables to MADT and one new subtable to SRAT.
|
|
||||||
|
|
||||||
This patch also changes x86_acpiid_to_apicid from u8 to u32 for x2APIC
|
|
||||||
ID, and changes mp_register_lapic to accept 32-bit id. But there are
|
|
||||||
still some 8-bit apic id hardcode and assumptions in Xen code, it
|
|
||||||
needs to be fixed in future.
|
|
||||||
|
|
||||||
Signed-off-by: Weidong Han <weidong.han@intel.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/acpi/boot.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/acpi/boot.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/acpi/boot.c
|
|
||||||
@@ -81,7 +81,7 @@ u8 acpi_enable_value, acpi_disable_value
|
|
||||||
#warning ACPI uses CMPXCHG, i486 and later hardware
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-u8 x86_acpiid_to_apicid[MAX_MADT_ENTRIES] =
|
|
||||||
+u32 x86_acpiid_to_apicid[MAX_MADT_ENTRIES] =
|
|
||||||
{[0 ... MAX_MADT_ENTRIES - 1] = 0xff };
|
|
||||||
EXPORT_SYMBOL(x86_acpiid_to_apicid);
|
|
||||||
|
|
||||||
@@ -156,6 +156,35 @@ static int __init acpi_parse_madt(struct
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __init
|
|
||||||
+acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)
|
|
||||||
+{
|
|
||||||
+ struct acpi_table_x2apic *processor = NULL;
|
|
||||||
+
|
|
||||||
+ processor = (struct acpi_table_x2apic *)header;
|
|
||||||
+
|
|
||||||
+ if (BAD_MADT_ENTRY(processor, end))
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ acpi_table_print_madt_entry(header);
|
|
||||||
+
|
|
||||||
+ /* Record local apic id only when enabled */
|
|
||||||
+ if (processor->flags.enabled)
|
|
||||||
+ x86_acpiid_to_apicid[processor->acpi_uid] = processor->id;
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * We need to register disabled CPU as well to permit
|
|
||||||
+ * counting disabled CPUs. This allows us to size
|
|
||||||
+ * cpus_possible_map more accurately, to permit
|
|
||||||
+ * to not preallocating memory for all NR_CPUS
|
|
||||||
+ * when we use CPU hotplug.
|
|
||||||
+ */
|
|
||||||
+ mp_register_lapic(processor->id, /* X2APIC ID */
|
|
||||||
+ processor->flags.enabled); /* Enabled? */
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int __init
|
|
||||||
acpi_parse_lapic(struct acpi_subtable_header * header, const unsigned long end)
|
|
||||||
{
|
|
||||||
struct acpi_table_lapic *processor = NULL;
|
|
||||||
@@ -201,6 +230,25 @@ acpi_parse_lapic_addr_ovr(struct acpi_su
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __init
|
|
||||||
+acpi_parse_x2apic_nmi(struct acpi_subtable_header *header,
|
|
||||||
+ const unsigned long end)
|
|
||||||
+{
|
|
||||||
+ struct acpi_table_x2apic_nmi *x2apic_nmi = NULL;
|
|
||||||
+
|
|
||||||
+ x2apic_nmi = (struct acpi_table_x2apic_nmi *)header;
|
|
||||||
+
|
|
||||||
+ if (BAD_MADT_ENTRY(x2apic_nmi, end))
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ acpi_table_print_madt_entry(header);
|
|
||||||
+
|
|
||||||
+ if (x2apic_nmi->lint != 1)
|
|
||||||
+ printk(KERN_WARNING PREFIX "NMI not connected to LINT 1!\n");
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int __init
|
|
||||||
acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long end)
|
|
||||||
{
|
|
||||||
struct acpi_table_lapic_nmi *lapic_nmi = NULL;
|
|
||||||
@@ -465,7 +513,7 @@ static int __init acpi_parse_fadt(struct
|
|
||||||
*/
|
|
||||||
static int __init acpi_parse_madt_lapic_entries(void)
|
|
||||||
{
|
|
||||||
- int count;
|
|
||||||
+ int count, x2count;
|
|
||||||
|
|
||||||
if (!cpu_has_apic)
|
|
||||||
return -ENODEV;
|
|
||||||
@@ -488,11 +536,13 @@ static int __init acpi_parse_madt_lapic_
|
|
||||||
|
|
||||||
count = acpi_table_parse_madt(ACPI_MADT_LAPIC, acpi_parse_lapic,
|
|
||||||
MAX_APICS);
|
|
||||||
- if (!count) {
|
|
||||||
+ x2count = acpi_table_parse_madt(ACPI_MADT_X2APIC, acpi_parse_x2apic,
|
|
||||||
+ MAX_APICS);
|
|
||||||
+ if (!count && !x2count) {
|
|
||||||
printk(KERN_ERR PREFIX "No LAPIC entries present\n");
|
|
||||||
/* TBD: Cleanup to allow fallback to MPS */
|
|
||||||
return -ENODEV;
|
|
||||||
- } else if (count < 0) {
|
|
||||||
+ } else if (count < 0 || x2count < 0) {
|
|
||||||
printk(KERN_ERR PREFIX "Error parsing LAPIC entry\n");
|
|
||||||
/* TBD: Cleanup to allow fallback to MPS */
|
|
||||||
return count;
|
|
||||||
@@ -500,7 +550,10 @@ static int __init acpi_parse_madt_lapic_
|
|
||||||
|
|
||||||
count =
|
|
||||||
acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi, 0);
|
|
||||||
- if (count < 0) {
|
|
||||||
+ x2count =
|
|
||||||
+ acpi_table_parse_madt(ACPI_MADT_X2APIC_NMI,
|
|
||||||
+ acpi_parse_x2apic_nmi, 0);
|
|
||||||
+ if (count < 0 || x2count < 0) {
|
|
||||||
printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
|
|
||||||
/* TBD: Cleanup to allow fallback to MPS */
|
|
||||||
return count;
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/mpparse.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/mpparse.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/mpparse.c
|
|
||||||
@@ -838,7 +838,7 @@ void __init mp_register_lapic_address (
|
|
||||||
|
|
||||||
|
|
||||||
int __devinit mp_register_lapic (
|
|
||||||
- u8 id,
|
|
||||||
+ u32 id,
|
|
||||||
u8 enabled)
|
|
||||||
{
|
|
||||||
struct mpc_config_processor processor;
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/srat.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/srat.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/srat.c
|
|
||||||
@@ -164,6 +164,36 @@ void __init acpi_numa_slit_init(struct a
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+/* Callback for Proximity Domain -> x2APIC mapping */
|
|
||||||
+void __init
|
|
||||||
+acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
|
|
||||||
+{
|
|
||||||
+ int pxm, node;
|
|
||||||
+ int apic_id;
|
|
||||||
+
|
|
||||||
+ if (srat_disabled())
|
|
||||||
+ return;
|
|
||||||
+ if (pa->header.length < sizeof(struct acpi_srat_x2apic_cpu_affinity)) {
|
|
||||||
+ bad_srat();
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ if ((pa->flags & ACPI_SRAT_CPU_ENABLED) == 0)
|
|
||||||
+ return;
|
|
||||||
+ pxm = pa->proximity_domain;
|
|
||||||
+ node = setup_node(pxm);
|
|
||||||
+ if (node < 0) {
|
|
||||||
+ printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm);
|
|
||||||
+ bad_srat();
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ apic_id = pa->apic_id;
|
|
||||||
+ apicid_to_node[apic_id] = node;
|
|
||||||
+ acpi_numa = 1;
|
|
||||||
+ printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> Node %u\n",
|
|
||||||
+ pxm, apic_id, node);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* Callback for Proximity Domain -> LAPIC mapping */
|
|
||||||
void __init
|
|
||||||
acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/acpi/numa.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/acpi/numa.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/acpi/numa.c
|
|
||||||
@@ -90,6 +90,21 @@ void __init acpi_table_print_srat_entry(
|
|
||||||
#endif /* ACPI_DEBUG_OUTPUT */
|
|
||||||
break;
|
|
||||||
|
|
||||||
+ case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
|
|
||||||
+#ifdef ACPI_DEBUG_OUTPUT
|
|
||||||
+ {
|
|
||||||
+ struct acpi_srat_x2apic_cpu_affinity *p =
|
|
||||||
+ (struct acpi_srat_x2apic_cpu_affinity *)header;
|
|
||||||
+ ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
||||||
+ "SRAT Processor (x2apicid[0x%08x]) in"
|
|
||||||
+ " proximity domain %d %s\n",
|
|
||||||
+ p->apic_id,
|
|
||||||
+ p->proximity_domain,
|
|
||||||
+ (p->flags & ACPI_SRAT_CPU_ENABLED) ?
|
|
||||||
+ "enabled" : "disabled"));
|
|
||||||
+ }
|
|
||||||
+#endif /* ACPI_DEBUG_OUTPUT */
|
|
||||||
+ break;
|
|
||||||
default:
|
|
||||||
printk(KERN_WARNING PREFIX
|
|
||||||
"Found unsupported SRAT entry (type = 0x%x)\n",
|
|
||||||
@@ -105,6 +120,33 @@ static int __init acpi_parse_slit(struct
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+void __init __attribute__ ((weak))
|
|
||||||
+acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
|
|
||||||
+{
|
|
||||||
+ printk(KERN_WARNING PREFIX
|
|
||||||
+ "Found unsupported x2apic [0x%08x] SRAT entry\n", pa->apic_id);
|
|
||||||
+ return;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+static int __init
|
|
||||||
+acpi_parse_x2apic_affinity(struct acpi_subtable_header *header,
|
|
||||||
+ const unsigned long end)
|
|
||||||
+{
|
|
||||||
+ struct acpi_srat_x2apic_cpu_affinity *processor_affinity;
|
|
||||||
+
|
|
||||||
+ processor_affinity = (struct acpi_srat_x2apic_cpu_affinity *)header;
|
|
||||||
+ if (!processor_affinity)
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ acpi_table_print_srat_entry(header);
|
|
||||||
+
|
|
||||||
+ /* let architecture-dependent part to do it */
|
|
||||||
+ acpi_numa_x2apic_affinity_init(processor_affinity);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static int __init
|
|
||||||
acpi_parse_processor_affinity(struct acpi_subtable_header * header,
|
|
||||||
const unsigned long end)
|
|
||||||
@@ -164,6 +206,8 @@ int __init acpi_numa_init(void)
|
|
||||||
{
|
|
||||||
/* SRAT: Static Resource Affinity Table */
|
|
||||||
if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) {
|
|
||||||
+ acpi_table_parse_srat(ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY,
|
|
||||||
+ acpi_parse_x2apic_affinity, NR_CPUS);
|
|
||||||
acpi_table_parse_srat(ACPI_SRAT_PROCESSOR_AFFINITY,
|
|
||||||
acpi_parse_processor_affinity,
|
|
||||||
NR_CPUS);
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/acpi/tables.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/acpi/tables.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/acpi/tables.c
|
|
||||||
@@ -63,6 +63,18 @@ void __init acpi_table_print_madt_entry(
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
+ case ACPI_MADT_TYPE_LOCAL_X2APIC:
|
|
||||||
+ {
|
|
||||||
+ struct acpi_madt_local_x2apic *p =
|
|
||||||
+ (struct acpi_madt_local_x2apic *)header;
|
|
||||||
+ printk(KERN_INFO PREFIX
|
|
||||||
+ "X2APIC (apic_id[0x%02x] uid[0x%02x] %s)\n",
|
|
||||||
+ p->local_apic_id, p->uid,
|
|
||||||
+ (p->lapic_flags & ACPI_MADT_ENABLED) ?
|
|
||||||
+ "enabled" : "disabled");
|
|
||||||
+ }
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
case ACPI_MADT_TYPE_IO_APIC:
|
|
||||||
{
|
|
||||||
struct acpi_madt_io_apic *p =
|
|
||||||
@@ -116,6 +128,24 @@ void __init acpi_table_print_madt_entry(
|
|
||||||
p->lint);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
+
|
|
||||||
+ case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
|
|
||||||
+ {
|
|
||||||
+ u16 polarity, trigger;
|
|
||||||
+ struct acpi_madt_local_x2apic_nmi *p =
|
|
||||||
+ (struct acpi_madt_local_x2apic_nmi *)header;
|
|
||||||
+
|
|
||||||
+ polarity = p->inti_flags & ACPI_MADT_POLARITY_MASK;
|
|
||||||
+ trigger = (p->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2;
|
|
||||||
+
|
|
||||||
+ printk(KERN_INFO PREFIX
|
|
||||||
+ "X2APIC_NMI (uid[0x%02x] %s %s lint[0x%x])\n",
|
|
||||||
+ p->uid,
|
|
||||||
+ mps_inti_flags_polarity[polarity],
|
|
||||||
+ mps_inti_flags_trigger[trigger],
|
|
||||||
+ p->lint);
|
|
||||||
+ }
|
|
||||||
+ break;
|
|
||||||
|
|
||||||
case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
|
|
||||||
{
|
|
||||||
Index: xen-4.0.2-testing/xen/include/acpi/actbl1.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/acpi/actbl1.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/acpi/actbl1.h
|
|
||||||
@@ -404,7 +404,9 @@ enum acpi_madt_type {
|
|
||||||
ACPI_MADT_TYPE_IO_SAPIC = 6,
|
|
||||||
ACPI_MADT_TYPE_LOCAL_SAPIC = 7,
|
|
||||||
ACPI_MADT_TYPE_INTERRUPT_SOURCE = 8,
|
|
||||||
- ACPI_MADT_TYPE_RESERVED = 9 /* 9 and greater are reserved */
|
|
||||||
+ ACPI_MADT_TYPE_LOCAL_X2APIC = 9,
|
|
||||||
+ ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10,
|
|
||||||
+ ACPI_MADT_TYPE_RESERVED = 11 /* 11 and greater are reserved */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -505,6 +507,26 @@ struct acpi_madt_interrupt_source {
|
|
||||||
|
|
||||||
#define ACPI_MADT_CPEI_OVERRIDE (1)
|
|
||||||
|
|
||||||
+/* 9: Processor Local X2APIC (ACPI 4.0) */
|
|
||||||
+
|
|
||||||
+struct acpi_madt_local_x2apic {
|
|
||||||
+ struct acpi_subtable_header header;
|
|
||||||
+ u16 reserved; /* Reserved - must be zero */
|
|
||||||
+ u32 local_apic_id; /* Processor X2_APIC ID */
|
|
||||||
+ u32 lapic_flags;
|
|
||||||
+ u32 uid; /* Extended X2_APIC processor ID */
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/* 10: Local X2APIC NMI (ACPI 4.0) */
|
|
||||||
+
|
|
||||||
+struct acpi_madt_local_x2apic_nmi {
|
|
||||||
+ struct acpi_subtable_header header;
|
|
||||||
+ u16 inti_flags;
|
|
||||||
+ u32 uid; /* Processor X2_APIC ID */
|
|
||||||
+ u8 lint; /* LINTn to which NMI is connected */
|
|
||||||
+ u8 reserved[3];
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* Common flags fields for MADT subtables
|
|
||||||
*/
|
|
||||||
@@ -646,11 +668,14 @@ struct acpi_table_srat {
|
|
||||||
enum acpi_srat_type {
|
|
||||||
ACPI_SRAT_TYPE_CPU_AFFINITY = 0,
|
|
||||||
ACPI_SRAT_TYPE_MEMORY_AFFINITY = 1,
|
|
||||||
- ACPI_SRAT_TYPE_RESERVED = 2
|
|
||||||
+ ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY = 2,
|
|
||||||
+ ACPI_SRAT_TYPE_RESERVED = 3 /* 3 and greater are reserved */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* SRAT sub-tables */
|
|
||||||
|
|
||||||
+/* 0: Processor Local APIC/SAPIC Affinity */
|
|
||||||
+
|
|
||||||
struct acpi_srat_cpu_affinity {
|
|
||||||
struct acpi_subtable_header header;
|
|
||||||
u8 proximity_domain_lo;
|
|
||||||
@@ -661,9 +686,7 @@ struct acpi_srat_cpu_affinity {
|
|
||||||
u32 reserved; /* Reserved, must be zero */
|
|
||||||
};
|
|
||||||
|
|
||||||
-/* Flags */
|
|
||||||
-
|
|
||||||
-#define ACPI_SRAT_CPU_ENABLED (1) /* 00: Use affinity structure */
|
|
||||||
+/* 1: Memory Affinity */
|
|
||||||
|
|
||||||
struct acpi_srat_mem_affinity {
|
|
||||||
struct acpi_subtable_header header;
|
|
||||||
@@ -682,6 +705,22 @@ struct acpi_srat_mem_affinity {
|
|
||||||
#define ACPI_SRAT_MEM_HOT_PLUGGABLE (1<<1) /* 01: Memory region is hot pluggable */
|
|
||||||
#define ACPI_SRAT_MEM_NON_VOLATILE (1<<2) /* 02: Memory region is non-volatile */
|
|
||||||
|
|
||||||
+/* 2: Processor Local X2_APIC Affinity (ACPI 4.0) */
|
|
||||||
+
|
|
||||||
+struct acpi_srat_x2apic_cpu_affinity {
|
|
||||||
+ struct acpi_subtable_header header;
|
|
||||||
+ u16 reserved; /* Reserved, must be zero */
|
|
||||||
+ u32 proximity_domain;
|
|
||||||
+ u32 apic_id;
|
|
||||||
+ u32 flags;
|
|
||||||
+ u32 clock_domain;
|
|
||||||
+ u32 reserved2;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/* Flags for struct acpi_srat_cpu_affinity and struct acpi_srat_x2apic_cpu_affinity */
|
|
||||||
+
|
|
||||||
+#define ACPI_SRAT_CPU_ENABLED (1) /* 00: Use affinity structure */
|
|
||||||
+
|
|
||||||
/*******************************************************************************
|
|
||||||
*
|
|
||||||
* TCPA - Trusted Computing Platform Alliance table
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/acpi.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/acpi.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/acpi.h
|
|
||||||
@@ -151,7 +151,7 @@ struct acpi_sleep_info {
|
|
||||||
#endif /* CONFIG_ACPI_SLEEP */
|
|
||||||
|
|
||||||
#define MAX_MADT_ENTRIES 256
|
|
||||||
-extern u8 x86_acpiid_to_apicid[];
|
|
||||||
+extern u32 x86_acpiid_to_apicid[];
|
|
||||||
#define MAX_LOCAL_APIC 256
|
|
||||||
|
|
||||||
extern u32 pmtmr_ioport;
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/mpspec.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/mpspec.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/mpspec.h
|
|
||||||
@@ -24,7 +24,7 @@ extern int pic_mode;
|
|
||||||
extern int using_apic_timer;
|
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
|
||||||
-extern int mp_register_lapic (u8 id, u8 enabled);
|
|
||||||
+extern int mp_register_lapic (u32 id, u8 enabled);
|
|
||||||
extern void mp_unregister_lapic(uint32_t apic_id, uint32_t cpu);
|
|
||||||
extern void mp_register_lapic_address (u64 address);
|
|
||||||
extern void mp_register_ioapic (u8 id, u32 address, u32 gsi_base);
|
|
||||||
Index: xen-4.0.2-testing/xen/include/xen/acpi.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/xen/acpi.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/xen/acpi.h
|
|
||||||
@@ -57,6 +57,8 @@ enum acpi_madt_entry_id {
|
|
||||||
ACPI_MADT_IOSAPIC,
|
|
||||||
ACPI_MADT_LSAPIC,
|
|
||||||
ACPI_MADT_PLAT_INT_SRC,
|
|
||||||
+ ACPI_MADT_X2APIC,
|
|
||||||
+ ACPI_MADT_X2APIC_NMI,
|
|
||||||
ACPI_MADT_ENTRY_COUNT
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -76,6 +78,17 @@ struct acpi_table_lapic {
|
|
||||||
} flags;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
+struct acpi_table_x2apic {
|
|
||||||
+ struct acpi_subtable_header header;
|
|
||||||
+ u16 reserved;
|
|
||||||
+ u32 id;
|
|
||||||
+ struct {
|
|
||||||
+ u32 enabled:1;
|
|
||||||
+ u32 reserved:31;
|
|
||||||
+ } flags;
|
|
||||||
+ u32 acpi_uid;
|
|
||||||
+} __attribute__ ((packed));
|
|
||||||
+
|
|
||||||
struct acpi_table_ioapic {
|
|
||||||
struct acpi_subtable_header header;
|
|
||||||
u8 id;
|
|
||||||
@@ -105,6 +118,14 @@ struct acpi_table_lapic_nmi {
|
|
||||||
u8 lint;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
+struct acpi_table_x2apic_nmi {
|
|
||||||
+ struct acpi_subtable_header header;
|
|
||||||
+ acpi_interrupt_flags flags;
|
|
||||||
+ u32 acpi_uid;
|
|
||||||
+ u8 lint;
|
|
||||||
+ u8 reserved[3];
|
|
||||||
+} __attribute__ ((packed));
|
|
||||||
+
|
|
||||||
struct acpi_table_lapic_addr_ovr {
|
|
||||||
struct acpi_subtable_header header;
|
|
||||||
u8 reserved[2];
|
|
||||||
@@ -280,6 +301,7 @@ void acpi_table_print_srat_entry (struct
|
|
||||||
/* the following four functions are architecture-dependent */
|
|
||||||
void acpi_numa_slit_init (struct acpi_table_slit *slit);
|
|
||||||
void acpi_numa_processor_affinity_init (struct acpi_srat_cpu_affinity *pa);
|
|
||||||
+void acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa);
|
|
||||||
void acpi_numa_memory_affinity_init (struct acpi_srat_mem_affinity *ma);
|
|
||||||
void acpi_numa_arch_fixup(void);
|
|
||||||
|
|
@ -1,130 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User "Dube, Lutz" <lutz.dube@ts.fujitsu.com>
|
|
||||||
# Date 1279902875 -3600
|
|
||||||
# Node ID 4814e16ea4105502332407e3379c49da92018899
|
|
||||||
# Parent e23302fcb83c72f93ec01285bd7f4f1641eb67e4
|
|
||||||
tools/xend: Fix performance of xend with more than 10000 FC device paths
|
|
||||||
|
|
||||||
On server startup xend start or a later xend restart needs approx. 30 min to
|
|
||||||
start/restart. Without attached FC devices xend start/restart needs only some
|
|
||||||
seconds.
|
|
||||||
|
|
||||||
server type: Fujitsu Primergy RX600-S5
|
|
||||||
|
|
||||||
The time gets lost in xen/xend/XendNode.py line 329 while calling
|
|
||||||
vscsi_util.get_all_scsi_device().
|
|
||||||
|
|
||||||
329 for pscsi_record in vscsi_util.get_all_scsi_devices():
|
|
||||||
330 scsi_id = pscsi_record['scsi_id']
|
|
||||||
331 if scsi_id:
|
|
||||||
332 saved_HBA_uuid = None
|
|
||||||
|
|
||||||
I think, in most cases we don't need all the PSCSI devices registered in
|
|
||||||
xend, but only a few of it.
|
|
||||||
So a good solution for this perforamce issue is to scan only the SCSI device
|
|
||||||
paths we need, controlled by a new option in xend-config.sxp.
|
|
||||||
|
|
||||||
I have made a patch to allow specification of scsi devices we need in xend
|
|
||||||
in the config file xend-config.sxp.
|
|
||||||
The new options pscsi-device-mask expects a list of device ids oder partial
|
|
||||||
device ids like the option of lsscsi, e.g.
|
|
||||||
(pscsi-device-mask ('<partial-dev-id1' 'partial-dev-id2' ...))
|
|
||||||
|
|
||||||
Without this option set in xend-config.sxp or if lsscsi is not support, all
|
|
||||||
device paths are process like today.
|
|
||||||
|
|
||||||
Signed-off-by: Lutz Dube Lutz.Dube@ts.fujitsu.com
|
|
||||||
Comment from Masaki Kanno <kanno.masaki@jp.fujitsu.com>: "Well done"
|
|
||||||
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/examples/xend-config.sxp
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/examples/xend-config.sxp
|
|
||||||
+++ xen-4.0.2-testing/tools/examples/xend-config.sxp
|
|
||||||
@@ -277,3 +277,11 @@
|
|
||||||
# we have to realize this may incur security issue and we can't make sure the
|
|
||||||
# device assignment could really work properly even after we do this.
|
|
||||||
#(pci-passthrough-strict-check yes)
|
|
||||||
+
|
|
||||||
+# If we have a very big scsi device configuration, start of xend is slow,
|
|
||||||
+# because xend scans all the device paths to build its internal PSCSI device
|
|
||||||
+# list. If we need only a few devices for assigning to a guest, we can reduce
|
|
||||||
+# the scan to this device. Set list list of device paths in same syntax like in
|
|
||||||
+# command lsscsi, e.g. ('16:0:0:0' '15:0')
|
|
||||||
+# (pscsi-device-mask ('*'))
|
|
||||||
+
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/util/vscsi_util.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/util/vscsi_util.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/util/vscsi_util.py
|
|
||||||
@@ -148,11 +148,12 @@ def _vscsi_get_scsidevices_by_sysfs():
|
|
||||||
return devices
|
|
||||||
|
|
||||||
|
|
||||||
-def vscsi_get_scsidevices():
|
|
||||||
+def vscsi_get_scsidevices(mask=""):
|
|
||||||
""" get all scsi devices information """
|
|
||||||
|
|
||||||
- devices = _vscsi_get_scsidevices_by_lsscsi("")
|
|
||||||
- if devices:
|
|
||||||
+ devices = _vscsi_get_scsidevices_by_lsscsi("[%s]" % mask)
|
|
||||||
+ if devices or (len(mask) and mask[0] != "*"):
|
|
||||||
+ # devices found or partial device scan
|
|
||||||
return devices
|
|
||||||
return _vscsi_get_scsidevices_by_sysfs()
|
|
||||||
|
|
||||||
@@ -274,9 +275,9 @@ def get_scsi_device(pHCTL):
|
|
||||||
return _make_scsi_record(scsi_info)
|
|
||||||
return None
|
|
||||||
|
|
||||||
-def get_all_scsi_devices():
|
|
||||||
+def get_all_scsi_devices(mask=""):
|
|
||||||
scsi_records = []
|
|
||||||
- for scsi_info in vscsi_get_scsidevices():
|
|
||||||
+ for scsi_info in vscsi_get_scsidevices(mask):
|
|
||||||
scsi_record = _make_scsi_record(scsi_info)
|
|
||||||
scsi_records.append(scsi_record)
|
|
||||||
return scsi_records
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendNode.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendNode.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendNode.py
|
|
||||||
@@ -323,7 +323,12 @@ class XendNode:
|
|
||||||
pscsi_table = {}
|
|
||||||
pscsi_HBA_table = {}
|
|
||||||
|
|
||||||
- for pscsi_record in vscsi_util.get_all_scsi_devices():
|
|
||||||
+ pscsi_records = []
|
|
||||||
+ for pscsi_mask in xendoptions().get_pscsi_device_mask():
|
|
||||||
+ pscsi_records += vscsi_util.get_all_scsi_devices(pscsi_mask)
|
|
||||||
+ log.debug("pscsi record count: %s" % len(pscsi_records))
|
|
||||||
+
|
|
||||||
+ for pscsi_record in pscsi_records:
|
|
||||||
scsi_id = pscsi_record['scsi_id']
|
|
||||||
if scsi_id:
|
|
||||||
saved_HBA_uuid = None
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendOptions.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendOptions.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendOptions.py
|
|
||||||
@@ -164,6 +164,9 @@ class XendOptions:
|
|
||||||
"""
|
|
||||||
print >>sys.stderr, "xend [ERROR]", fmt % args
|
|
||||||
|
|
||||||
+ """Default mask for pscsi device scan."""
|
|
||||||
+ xend_pscsi_device_mask = ['*']
|
|
||||||
+
|
|
||||||
|
|
||||||
def configure(self):
|
|
||||||
self.set_config()
|
|
||||||
@@ -430,6 +433,10 @@ class XendOptions:
|
|
||||||
return self.get_config_bool("pci-passthrough-strict-check",
|
|
||||||
self.pci_dev_assign_strict_check_default)
|
|
||||||
|
|
||||||
+ def get_pscsi_device_mask(self):
|
|
||||||
+ return self.get_config_value("pscsi-device-mask",
|
|
||||||
+ self.xend_pscsi_device_mask)
|
|
||||||
+
|
|
||||||
class XendOptionsFile(XendOptions):
|
|
||||||
|
|
||||||
"""Default path to the config file."""
|
|
@ -1,90 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Lutz Dube <lutz.dube@ts.fujitsu.com>
|
|
||||||
# Date 1280245980 -3600
|
|
||||||
# Node ID e017930af272c888f2a562f842af4e142a973d5f
|
|
||||||
# Parent 5078f2c1e3d6a3a06ecf352a068eb496f09a2a98
|
|
||||||
xend (XenAPI): Error in Xend-API method VM_set_actions_after_crash
|
|
||||||
|
|
||||||
Xend-API defines the method VM_set_actions_after_crash with valid
|
|
||||||
action names coredump_and_destroy, coredump_and_restart,... . These
|
|
||||||
values have to be converted into internal representation
|
|
||||||
"coredump-destroy", "coredump-restart", ... otherwise start of the
|
|
||||||
domain is rejected. Same error occurs, if I try to create a VM using
|
|
||||||
the Xend-API with actions_after_crash set to coredump_and_destroy.
|
|
||||||
|
|
||||||
Could you please apply my patch to xen-4-0-testing, too.
|
|
||||||
|
|
||||||
Signed-off-by: Lutz Dube Lutz.Dube@ts.fujitsu.com
|
|
||||||
Acked-by: Jim Fehlig <jfehlig@novell.com>
|
|
||||||
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendAPI.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendAPI.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendAPI.py
|
|
||||||
@@ -1667,7 +1667,8 @@ class XendAPI(object):
|
|
||||||
def VM_set_actions_after_crash(self, session, vm_ref, action):
|
|
||||||
if action not in XEN_API_ON_CRASH_BEHAVIOUR:
|
|
||||||
return xen_api_error(['VM_ON_CRASH_BEHAVIOUR_INVALID', vm_ref])
|
|
||||||
- return self.VM_set('actions_after_crash', session, vm_ref, action)
|
|
||||||
+ return self.VM_set('actions_after_crash', session, vm_ref,
|
|
||||||
+ XEN_API_ON_CRASH_BEHAVIOUR_LEGACY[action])
|
|
||||||
|
|
||||||
def VM_set_HVM_boot_policy(self, session, vm_ref, value):
|
|
||||||
if value != "" and value != "BIOS order":
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendAPIConstants.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendAPIConstants.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendAPIConstants.py
|
|
||||||
@@ -63,6 +63,18 @@ XEN_API_ON_CRASH_BEHAVIOUR_FILTER = {
|
|
||||||
'rename_restart' : 'rename_restart',
|
|
||||||
}
|
|
||||||
|
|
||||||
+XEN_API_ON_CRASH_BEHAVIOUR_LEGACY = {
|
|
||||||
+ 'destroy' : 'destroy',
|
|
||||||
+ 'coredump-destroy' : 'coredump-destroy',
|
|
||||||
+ 'coredump_and_destroy' : 'coredump-destroy',
|
|
||||||
+ 'restart' : 'restart',
|
|
||||||
+ 'coredump-restart' : 'coredump-restart',
|
|
||||||
+ 'coredump_and_restart' : 'coredump-restart',
|
|
||||||
+ 'preserve' : 'preserve',
|
|
||||||
+ 'rename-restart' : 'rename-restart',
|
|
||||||
+ 'rename_restart' : 'rename-restart',
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
XEN_API_VBD_MODE = ['RO', 'RW']
|
|
||||||
XEN_API_VDI_TYPE = ['system', 'user', 'ephemeral']
|
|
||||||
XEN_API_VBD_TYPE = ['CD', 'Disk']
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendConfig.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendConfig.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendConfig.py
|
|
||||||
@@ -41,6 +41,7 @@ from xen.util.pci import pci_opts_list_f
|
|
||||||
from xen.xend.XendSXPDev import dev_dict_to_sxp
|
|
||||||
from xen.util import xsconstants
|
|
||||||
from xen.util import auxbin
|
|
||||||
+from xen.xend.XendAPIConstants import *
|
|
||||||
import xen.util.fileuri
|
|
||||||
|
|
||||||
log = logging.getLogger("xend.XendConfig")
|
|
||||||
@@ -62,6 +63,11 @@ def reverse_dict(adict):
|
|
||||||
def bool0(v):
|
|
||||||
return v != '0' and v != 'False' and bool(v)
|
|
||||||
|
|
||||||
+def convert_on_crash(v):
|
|
||||||
+ v = str(v)
|
|
||||||
+ return XEN_API_ON_CRASH_BEHAVIOUR_LEGACY[v] \
|
|
||||||
+ if v in XEN_API_ON_CRASH_BEHAVIOUR else v
|
|
||||||
+
|
|
||||||
# Recursively copy a data struct, scrubbing out VNC passwords.
|
|
||||||
# Will scrub any dict entry with a key of 'vncpasswd' or any
|
|
||||||
# 2-element list whose first member is 'vncpasswd'. It will
|
|
||||||
@@ -211,7 +217,7 @@ XENAPI_CFG_TYPES = {
|
|
||||||
'VCPUs_live': int,
|
|
||||||
'actions_after_shutdown': str,
|
|
||||||
'actions_after_reboot': str,
|
|
||||||
- 'actions_after_crash': str,
|
|
||||||
+ 'actions_after_crash': convert_on_crash,
|
|
||||||
'PV_bootloader': str,
|
|
||||||
'PV_kernel': str,
|
|
||||||
'PV_ramdisk': str,
|
|
@ -1,52 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1280486194 -3600
|
|
||||||
# Node ID c9e7850ec9a18d7085c7468407e175bb64513846
|
|
||||||
# Parent 754877be695ba3050f140002dbd185a27a437fcc
|
|
||||||
x86: unmask CPUID levels on Intel CPUs
|
|
||||||
References: bnc#640773
|
|
||||||
|
|
||||||
If the CPUID limit bit in MSR_IA32_MISC_ENABLE is set, clear it to
|
|
||||||
make all CPUID information available. This is required for some
|
|
||||||
features to work, such as MWAIT in cpuidle, get cpu topology, XSAVE,
|
|
||||||
etc.
|
|
||||||
|
|
||||||
Signed-off-by: Wei Gang <gang.wei@intel.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/cpu/intel.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/cpu/intel.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/cpu/intel.c
|
|
||||||
@@ -90,6 +90,20 @@ void __devinit early_intel_workaround(st
|
|
||||||
/* Netburst reports 64 bytes clflush size, but does IO in 128 bytes */
|
|
||||||
if (c->x86 == 15 && c->x86_cache_alignment == 64)
|
|
||||||
c->x86_cache_alignment = 128;
|
|
||||||
+
|
|
||||||
+ /* Unmask CPUID levels if masked: */
|
|
||||||
+ if (c->x86 > 6 || (c->x86 == 6 && c->x86_model >= 0xd)) {
|
|
||||||
+ u64 misc_enable;
|
|
||||||
+
|
|
||||||
+ rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
|
|
||||||
+
|
|
||||||
+ if (misc_enable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID) {
|
|
||||||
+ misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID;
|
|
||||||
+ wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
|
|
||||||
+ c->cpuid_level = cpuid_eax(0);
|
|
||||||
+ printk("revised cpuid_level = %d\n", c->cpuid_level);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/msr-index.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/msr-index.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/msr-index.h
|
|
||||||
@@ -324,6 +324,7 @@
|
|
||||||
#define MSR_IA32_MISC_ENABLE_BTS_UNAVAIL (1<<11)
|
|
||||||
#define MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL (1<<12)
|
|
||||||
#define MSR_IA32_MISC_ENABLE_MONITOR_ENABLE (1<<18)
|
|
||||||
+#define MSR_IA32_MISC_ENABLE_LIMIT_CPUID (1<<22)
|
|
||||||
#define MSR_IA32_MISC_ENABLE_XTPR_DISABLE (1<<23)
|
|
||||||
|
|
||||||
/* Intel Model 6 */
|
|
@ -1,32 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir.fraser@citrix.com>
|
|
||||||
# Date 1282069957 -3600
|
|
||||||
# Node ID 5218db847b58a151d8f320b7141efc984f759b35
|
|
||||||
# Parent 542e8cd16a6cf036e89b597ba6343245fcaafa25
|
|
||||||
x86 cpuidle: check whether cpu is online in cpu idle control
|
|
||||||
|
|
||||||
We observed a 2.6.18.8 dom0 kernel crash when Xen has maxcpus < num
|
|
||||||
of physical cores (maxcpus=3D4 for a 12-core system). It appeared that
|
|
||||||
hypervisor doesn't check whether CPU is online or not. This small
|
|
||||||
patch fixed the issue.
|
|
||||||
|
|
||||||
Signed-off-by: Uwe Dannowski <uwe.dannowski@amd.com>
|
|
||||||
Acked-by: Wei Huang <wei.huang2@amd.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/acpi/cpuidle_menu.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/acpi/cpuidle_menu.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/acpi/cpuidle_menu.c
|
|
||||||
@@ -270,9 +270,10 @@ static void menu_reflect(struct acpi_pro
|
|
||||||
|
|
||||||
static int menu_enable_device(struct acpi_processor_power *power)
|
|
||||||
{
|
|
||||||
- struct menu_device *data = &per_cpu(menu_devices, power->cpu);
|
|
||||||
+ if (!cpu_online(power->cpu))
|
|
||||||
+ return -1;
|
|
||||||
|
|
||||||
- memset(data, 0, sizeof(struct menu_device));
|
|
||||||
+ memset(&per_cpu(menu_devices, power->cpu), 0, sizeof(struct menu_device));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,87 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1285340079 -3600
|
|
||||||
# Node ID 71f836615ea211ac4e6f3b9793f58c6f6934c030
|
|
||||||
# Parent eb247ea9db8c8b541a7f8c9cdc51c064c4c9e41c
|
|
||||||
x86: adjust MSR_IA32_MISC_ENABLE handling
|
|
||||||
|
|
||||||
In the warning message issued on writes, the Xen-modified value should
|
|
||||||
be printed (and used to determine whether anything needs to be printed
|
|
||||||
at all), as the guest kernel will usually do a read-modify-write
|
|
||||||
cycle.
|
|
||||||
|
|
||||||
A question is whether Dom0 shouldn't be allowed control over some
|
|
||||||
bits, or whether some bits shouldn't be fully virtualized. I'm
|
|
||||||
particularly thinking of MSR_IA32_MISC_ENABLE_FAST_STRING, which
|
|
||||||
recent Linux kernels want to disable for CONFIG_KMEMCHECK.
|
|
||||||
|
|
||||||
While putting this together I also noticed that rdmsr_safe() failed to
|
|
||||||
initialize its output registers in the failure path, thus leading to
|
|
||||||
printing of uninitialized data in the guest WRMSR warning message.
|
|
||||||
|
|
||||||
Further, the default case value-changed check can be simplified.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/traps.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/traps.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/traps.c
|
|
||||||
@@ -1679,6 +1679,16 @@ unsigned long guest_to_host_gpr_switch(u
|
|
||||||
|
|
||||||
void (*pv_post_outb_hook)(unsigned int port, u8 value);
|
|
||||||
|
|
||||||
+static inline uint32_t guest_misc_enable(uint32_t eax)
|
|
||||||
+{
|
|
||||||
+ eax &= ~(MSR_IA32_MISC_ENABLE_PERF_AVAIL |
|
|
||||||
+ MSR_IA32_MISC_ENABLE_MONITOR_ENABLE);
|
|
||||||
+ eax |= MSR_IA32_MISC_ENABLE_BTS_UNAVAIL |
|
|
||||||
+ MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL |
|
|
||||||
+ MSR_IA32_MISC_ENABLE_XTPR_DISABLE;
|
|
||||||
+ return eax;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* Instruction fetch with error handling. */
|
|
||||||
#define insn_fetch(type, base, eip, limit) \
|
|
||||||
({ unsigned long _rc, _ptr = (base) + (eip); \
|
|
||||||
@@ -2276,6 +2286,13 @@ static int emulate_privileged_op(struct
|
|
||||||
if ( wrmsr_safe(MSR_FAM10H_MMIO_CONF_BASE, eax, edx) != 0 )
|
|
||||||
goto fail;
|
|
||||||
break;
|
|
||||||
+ case MSR_IA32_MISC_ENABLE:
|
|
||||||
+ if ( rdmsr_safe(regs->ecx, l, h) )
|
|
||||||
+ goto invalid;
|
|
||||||
+ l = guest_misc_enable(l);
|
|
||||||
+ if ( eax != l || edx != h )
|
|
||||||
+ goto invalid;
|
|
||||||
+ break;
|
|
||||||
case MSR_IA32_MPERF:
|
|
||||||
case MSR_IA32_APERF:
|
|
||||||
if (( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ) &&
|
|
||||||
@@ -2382,11 +2399,7 @@ static int emulate_privileged_op(struct
|
|
||||||
case MSR_IA32_MISC_ENABLE:
|
|
||||||
if ( rdmsr_safe(regs->ecx, regs->eax, regs->edx) )
|
|
||||||
goto fail;
|
|
||||||
- regs->eax &= ~(MSR_IA32_MISC_ENABLE_PERF_AVAIL |
|
|
||||||
- MSR_IA32_MISC_ENABLE_MONITOR_ENABLE);
|
|
||||||
- regs->eax |= MSR_IA32_MISC_ENABLE_BTS_UNAVAIL |
|
|
||||||
- MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL |
|
|
||||||
- MSR_IA32_MISC_ENABLE_XTPR_DISABLE;
|
|
||||||
+ regs->eax = guest_misc_enable(regs->eax);
|
|
||||||
break;
|
|
||||||
case MSR_EFER:
|
|
||||||
case MSR_AMD_PATCHLEVEL:
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/msr.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/msr.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/msr.h
|
|
||||||
@@ -39,7 +39,8 @@ static inline void wrmsrl(unsigned int m
|
|
||||||
__asm__ __volatile__( \
|
|
||||||
"1: rdmsr\n2:\n" \
|
|
||||||
".section .fixup,\"ax\"\n" \
|
|
||||||
- "3: movl %5,%2\n; jmp 2b\n" \
|
|
||||||
+ "3: xor %0,%0\n; xor %1,%1\n" \
|
|
||||||
+ " movl %5,%2\n; jmp 2b\n" \
|
|
||||||
".previous\n" \
|
|
||||||
".section __ex_table,\"a\"\n" \
|
|
||||||
" "__FIXUP_ALIGN"\n" \
|
|
@ -1,70 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1286784105 -3600
|
|
||||||
# Node ID a1405385db77c7c81aac27bd88d6c4b2d90b1389
|
|
||||||
# Parent a33886146b45da46a5161a7ebed4d2f607642aee
|
|
||||||
x86: emulate MSR_IA32_UCODE_REV Intel access protocol
|
|
||||||
|
|
||||||
Intel requires a write of zeros (hence such writes now get silently
|
|
||||||
ignored) followed by a cpuid(1) followed by the actual read.
|
|
||||||
|
|
||||||
Includes some code redundancy elimination possible after the actual
|
|
||||||
change.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/traps.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/traps.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/traps.c
|
|
||||||
@@ -2286,6 +2286,14 @@ static int emulate_privileged_op(struct
|
|
||||||
if ( wrmsr_safe(MSR_FAM10H_MMIO_CONF_BASE, eax, edx) != 0 )
|
|
||||||
goto fail;
|
|
||||||
break;
|
|
||||||
+ case MSR_IA32_UCODE_REV:
|
|
||||||
+ if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
|
|
||||||
+ goto fail;
|
|
||||||
+ if ( rdmsr_safe(regs->ecx, l, h) )
|
|
||||||
+ goto fail;
|
|
||||||
+ if ( l | h )
|
|
||||||
+ goto invalid;
|
|
||||||
+ break;
|
|
||||||
case MSR_IA32_MISC_ENABLE:
|
|
||||||
if ( rdmsr_safe(regs->ecx, l, h) )
|
|
||||||
goto invalid;
|
|
||||||
@@ -2393,16 +2401,21 @@ static int emulate_privileged_op(struct
|
|
||||||
regs->eax = regs->edx = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
- if ( rdmsr_safe(regs->ecx, regs->eax, regs->edx) != 0 )
|
|
||||||
- goto fail;
|
|
||||||
- break;
|
|
||||||
+ goto rdmsr_normal;
|
|
||||||
+ case MSR_IA32_UCODE_REV:
|
|
||||||
+ BUILD_BUG_ON(MSR_IA32_UCODE_REV != MSR_AMD_PATCHLEVEL);
|
|
||||||
+ if ( boot_cpu_data.x86_vendor == X86_VENDOR_INTEL )
|
|
||||||
+ {
|
|
||||||
+ if ( wrmsr_safe(MSR_IA32_UCODE_REV, 0, 0) )
|
|
||||||
+ goto fail;
|
|
||||||
+ sync_core();
|
|
||||||
+ }
|
|
||||||
+ goto rdmsr_normal;
|
|
||||||
case MSR_IA32_MISC_ENABLE:
|
|
||||||
if ( rdmsr_safe(regs->ecx, regs->eax, regs->edx) )
|
|
||||||
goto fail;
|
|
||||||
regs->eax = guest_misc_enable(regs->eax);
|
|
||||||
break;
|
|
||||||
- case MSR_EFER:
|
|
||||||
- case MSR_AMD_PATCHLEVEL:
|
|
||||||
default:
|
|
||||||
if ( rdmsr_hypervisor_regs(regs->ecx, &val) )
|
|
||||||
{
|
|
||||||
@@ -2418,6 +2431,8 @@ static int emulate_privileged_op(struct
|
|
||||||
if ( rc )
|
|
||||||
goto rdmsr_writeback;
|
|
||||||
|
|
||||||
+ case MSR_EFER:
|
|
||||||
+ rdmsr_normal:
|
|
||||||
/* Everyone can read the MSR space. */
|
|
||||||
/* gdprintk(XENLOG_WARNING,"Domain attempted RDMSR %p.\n",
|
|
||||||
_p(regs->ecx));*/
|
|
@ -1,186 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Stephan Peijnik <spe@anexia.at>
|
|
||||||
# Date 1286816093 -3600
|
|
||||||
# Node ID b8cc53d22545706b28c7a26dffd24f192a76541a
|
|
||||||
# Parent fbce8e403470db8c9e580a5efd9d717cd2260c1f
|
|
||||||
Replace pyxml/xmlproc-based XML validator with lxml based one
|
|
||||||
|
|
||||||
Pyxml/xmlproc is being used in tools/xen/xm/xenapi_create.py but is
|
|
||||||
unmaintained for several years now. xmlproc is used only for validating
|
|
||||||
XML documents against a DTD file.
|
|
||||||
|
|
||||||
This patch replaces the pyxml/xmlproc based XML validation with code
|
|
||||||
based on lxml, which is actively maintained.
|
|
||||||
|
|
||||||
Signed-off-by: Stephan Peijnik <spe@anexia.at>
|
|
||||||
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
|
||||||
committer: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/README
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/README
|
|
||||||
+++ xen-4.0.2-testing/README
|
|
||||||
@@ -137,12 +137,15 @@ Python Runtime Libraries
|
|
||||||
Xend (the Xen daemon) has the following runtime dependencies:
|
|
||||||
|
|
||||||
* Python 2.3 or later.
|
|
||||||
- In many distros, the XML-aspects to the standard library
|
|
||||||
+ In some distros, the XML-aspects to the standard library
|
|
||||||
(xml.dom.minidom etc) are broken out into a separate python-xml package.
|
|
||||||
This is also required.
|
|
||||||
+ In more recent versions of Debian and Ubuntu the XML-aspects are included
|
|
||||||
+ in the base python package however (python-xml has been removed
|
|
||||||
+ from Debian in squeeze and from Ubuntu in intrepid).
|
|
||||||
|
|
||||||
URL: http://www.python.org/
|
|
||||||
- Debian: python, python-xml
|
|
||||||
+ Debian: python
|
|
||||||
|
|
||||||
* For optional SSL support, pyOpenSSL:
|
|
||||||
URL: http://pyopenssl.sourceforge.net/
|
|
||||||
@@ -153,8 +156,9 @@ Xend (the Xen daemon) has the following
|
|
||||||
Debian: python-pam
|
|
||||||
|
|
||||||
* For optional XenAPI support in XM, PyXML:
|
|
||||||
- URL: http://pyxml.sourceforge.net
|
|
||||||
- YUM: PyXML
|
|
||||||
+ URL: http://codespeak.net/lxml/
|
|
||||||
+ Debian: python-lxml
|
|
||||||
+ YUM: python-lxml
|
|
||||||
|
|
||||||
|
|
||||||
Intel(R) Trusted Execution Technology Support
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xm/xenapi_create.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xm/xenapi_create.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xm/xenapi_create.py
|
|
||||||
@@ -14,13 +14,15 @@
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
#============================================================================
|
|
||||||
# Copyright (C) 2007 Tom Wilkie <tom.wilkie@gmail.com>
|
|
||||||
+# Copyright (C) 2010 ANEXIA Internetdienstleistungs GmbH
|
|
||||||
+# Author: Stephan Peijnik <spe@anexia.at>
|
|
||||||
#============================================================================
|
|
||||||
"""Domain creation using new XenAPI
|
|
||||||
"""
|
|
||||||
|
|
||||||
from xen.xm.main import server, get_default_SR
|
|
||||||
from xml.dom.minidom import parse, getDOMImplementation
|
|
||||||
-from xml.parsers.xmlproc import xmlproc, xmlval, xmldtd
|
|
||||||
+from lxml import etree
|
|
||||||
from xen.xend import sxp
|
|
||||||
from xen.xend.XendAPIConstants import XEN_API_ON_NORMAL_EXIT, \
|
|
||||||
XEN_API_ON_CRASH_BEHAVIOUR
|
|
||||||
@@ -35,6 +37,7 @@ import os
|
|
||||||
from os.path import join
|
|
||||||
import traceback
|
|
||||||
import re
|
|
||||||
+import warnings # Used by lxml-based validator
|
|
||||||
|
|
||||||
def log(_, msg):
|
|
||||||
#print "> " + msg
|
|
||||||
@@ -118,12 +121,21 @@ class xenapi_create:
|
|
||||||
Use this if possible as it gives nice
|
|
||||||
error messages
|
|
||||||
"""
|
|
||||||
- dtd = xmldtd.load_dtd(self.dtd)
|
|
||||||
- parser = xmlproc.XMLProcessor()
|
|
||||||
- parser.set_application(xmlval.ValidatingApp(dtd, parser))
|
|
||||||
- parser.dtd = dtd
|
|
||||||
- parser.ent = dtd
|
|
||||||
- parser.parse_resource(file)
|
|
||||||
+ try:
|
|
||||||
+ dtd = etree.DTD(open(self.dtd, 'r'))
|
|
||||||
+ except IOError:
|
|
||||||
+ # The old code did neither raise an exception here, nor
|
|
||||||
+ # did it report an error. For now we issue a warning.
|
|
||||||
+ # TODO: How to handle a missing dtd file?
|
|
||||||
+ # --sp
|
|
||||||
+ warnings.warn('DTD file %s not found.' % (self.dtd),
|
|
||||||
+ UserWarning)
|
|
||||||
+ return
|
|
||||||
+
|
|
||||||
+ tree = etree.parse(file)
|
|
||||||
+ root = tree.getroot()
|
|
||||||
+ if not dtd.validate(root):
|
|
||||||
+ self.handle_dtd_errors(dtd)
|
|
||||||
|
|
||||||
def check_dom_against_dtd(self, dom):
|
|
||||||
"""
|
|
||||||
@@ -131,49 +143,36 @@ class xenapi_create:
|
|
||||||
Doesn't give as nice error messages.
|
|
||||||
(no location info)
|
|
||||||
"""
|
|
||||||
- dtd = xmldtd.load_dtd(self.dtd)
|
|
||||||
- app = xmlval.ValidatingApp(dtd, self)
|
|
||||||
- app.set_locator(self)
|
|
||||||
- self.dom2sax(dom, app)
|
|
||||||
-
|
|
||||||
- # Get errors back from ValidatingApp
|
|
||||||
- def report_error(self, number, args=None):
|
|
||||||
- self.errors = xmlproc.errors.english
|
|
||||||
try:
|
|
||||||
- msg = self.errors[number]
|
|
||||||
- if args != None:
|
|
||||||
- msg = msg % args
|
|
||||||
- except KeyError:
|
|
||||||
- msg = self.errors[4002] % number # Unknown err msg :-)
|
|
||||||
- print msg
|
|
||||||
+ dtd = etree.DTD(open(self.dtd, 'r'))
|
|
||||||
+ except IOError:
|
|
||||||
+ # The old code did neither raise an exception here, nor
|
|
||||||
+ # did it report an error. For now we issue a warning.
|
|
||||||
+ # TODO: How to handle a missing dtd file?
|
|
||||||
+ # --sp
|
|
||||||
+ warnings.warn('DTD file %s not found.' % (self.dtd),
|
|
||||||
+ UserWarning)
|
|
||||||
+ return
|
|
||||||
+
|
|
||||||
+ # XXX: This may be a bit slow. Maybe we should use another way
|
|
||||||
+ # of getting an etree root element from the minidom DOM tree...
|
|
||||||
+ # -- sp
|
|
||||||
+ root = etree.XML(dom.toxml())
|
|
||||||
+ if not dtd.validate(root):
|
|
||||||
+ self.handle_dtd_errors(dtd)
|
|
||||||
+
|
|
||||||
+ # Do the same that was done in report_error before. This is directly
|
|
||||||
+ # called by check_dtd and check_dom_against_dtd.
|
|
||||||
+ # We are using sys.stderr instead of print though (python3k clean).
|
|
||||||
+ def handle_dtd_errors(self, dtd):
|
|
||||||
+ # XXX: Do we really want to bail out here?
|
|
||||||
+ # -- sp
|
|
||||||
+ for err in dtd.error_log:
|
|
||||||
+ err_str = 'ERROR: %s\n' % (str(err),)
|
|
||||||
+ sys.stderr.write(err_str)
|
|
||||||
+ sys.stderr.flush()
|
|
||||||
sys.exit(-1)
|
|
||||||
|
|
||||||
- # Here for compatibility with ValidatingApp
|
|
||||||
- def get_line(self):
|
|
||||||
- return -1
|
|
||||||
-
|
|
||||||
- def get_column(self):
|
|
||||||
- return -1
|
|
||||||
-
|
|
||||||
- def dom2sax(self, dom, app):
|
|
||||||
- """
|
|
||||||
- Take a dom tree and tarverse it,
|
|
||||||
- issuing SAX calls to app.
|
|
||||||
- """
|
|
||||||
- for child in dom.childNodes:
|
|
||||||
- if child.nodeType == child.TEXT_NODE:
|
|
||||||
- data = child.nodeValue
|
|
||||||
- app.handle_data(data, 0, len(data))
|
|
||||||
- else:
|
|
||||||
- app.handle_start_tag(
|
|
||||||
- child.nodeName,
|
|
||||||
- self.attrs_to_dict(child.attributes))
|
|
||||||
- self.dom2sax(child, app)
|
|
||||||
- app.handle_end_tag(child.nodeName)
|
|
||||||
-
|
|
||||||
- def attrs_to_dict(self, attrs):
|
|
||||||
- return dict(attrs.items())
|
|
||||||
-
|
|
||||||
#
|
|
||||||
# Checks which cannot be done with dtd
|
|
||||||
#
|
|
@ -1,43 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Juergen Gross <juergen.gross@ts.fujitsu.com>
|
|
||||||
# Date 1288264929 -3600
|
|
||||||
# Node ID dc66c13a29f9af67e0258f688bcd6330cf515383
|
|
||||||
# Parent 4ac03710fc320e8f76014ca27849da03b85dff9d
|
|
||||||
avoid numa placement of cpus with active cpupools
|
|
||||||
|
|
||||||
When using cpupools don't pin vcpus to numa nodes as this might
|
|
||||||
conflict with the cpupool definition.
|
|
||||||
numa placement should be handled by cpupool configuration instead.
|
|
||||||
|
|
||||||
Signed-off-by: Juergen Gross <juergen.gross@ts.fujitsu.com>
|
|
||||||
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendCPUPool.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendCPUPool.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendCPUPool.py
|
|
||||||
@@ -881,6 +881,11 @@ class XendCPUPool(XendBase):
|
|
||||||
lookup_pool = classmethod(lookup_pool)
|
|
||||||
|
|
||||||
|
|
||||||
+ def number_of_pools(cls):
|
|
||||||
+ return len(xc.cpupool_getinfo())
|
|
||||||
+
|
|
||||||
+ number_of_pools = classmethod(number_of_pools)
|
|
||||||
+
|
|
||||||
def _cpu_number_to_ref(cls, number):
|
|
||||||
node = XendNode.instance()
|
|
||||||
for cpu_ref in node.get_host_cpu_refs():
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
@@ -2790,7 +2790,7 @@ class XendDomainInfo:
|
|
||||||
return map(lambda x: x[0], sorted(enumerate(nodeload), key=lambda x:x[1]))
|
|
||||||
|
|
||||||
info = xc.physinfo()
|
|
||||||
- if info['nr_nodes'] > 1:
|
|
||||||
+ if info['nr_nodes'] > 1 and XendCPUPool.number_of_pools() < 2:
|
|
||||||
node_memory_list = info['node_to_memory']
|
|
||||||
needmem = self.image.getRequiredAvailableMemory(self.info['memory_dynamic_max']) / 1024
|
|
||||||
candidate_node_list = []
|
|
@ -1,750 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1288344554 -3600
|
|
||||||
# Node ID b48d8f27fca251c2df0222d195ffcb772d6a1128
|
|
||||||
# Parent 2d5e8f4ac43a120bbb5d4c52d08f6980848f0166
|
|
||||||
vtd: consolidate VT-d quirks into a single file quirks.c
|
|
||||||
|
|
||||||
Consolidate VT-d quirks into a single file - quirks.c. This includes
|
|
||||||
quirks to workaround OEM BIOS issue with VT-d enabling in IGD, Cantiga
|
|
||||||
VT-d buffer flush issue, Cantiga IGD Vt-d low power related errata,
|
|
||||||
and a quirk to workaround issues related to wifi direct assignment.
|
|
||||||
|
|
||||||
Signed-off-by: Allen Kay <allen.m.kay@intel.com>
|
|
||||||
Reviewed-by: Jan Beulich <JBeulich@novell.com>
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1288888517 0
|
|
||||||
# Node ID fedcd4cbcc1eb3e210628bdf95766ca0c400fc18
|
|
||||||
# Parent d508b18a68447f91cd879b79a498f06536d89f8e
|
|
||||||
[VTD] fix a typo and some minor cleanup of quirks.c
|
|
||||||
|
|
||||||
Fixed a typo for IGD_DEV define and some minor cleanup to ease future
|
|
||||||
enhancement.
|
|
||||||
|
|
||||||
Signed-off-by: Allen Kay <allen.m.kay@intel.com>
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1294221021 0
|
|
||||||
# Node ID e635e6641c07ee2da66b16f46f45442c9a46821d
|
|
||||||
# Parent 76d897a06b316bf2278220b006d578faf31ce3fb
|
|
||||||
[VTD] added WLAN device ID on Fujitsu's platform in quirks.c
|
|
||||||
|
|
||||||
Added WLAN device ID 0x422C that was found on Fujitsu's Calpella
|
|
||||||
system to WLAN quirk.
|
|
||||||
|
|
||||||
Signed-off-by: Allen Kay <allen.m.kay@intel.com>
|
|
||||||
|
|
||||||
--- a/xen/drivers/passthrough/vtd/Makefile
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/Makefile
|
|
||||||
@@ -6,3 +6,4 @@ obj-y += dmar.o
|
|
||||||
obj-y += utils.o
|
|
||||||
obj-y += qinval.o
|
|
||||||
obj-y += intremap.o
|
|
||||||
+obj-y += quirks.o
|
|
||||||
--- a/xen/drivers/passthrough/vtd/dmar.c
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/dmar.c
|
|
||||||
@@ -242,7 +242,7 @@ struct acpi_rhsa_unit * drhd_to_rhsa(str
|
|
||||||
|
|
||||||
int is_igd_drhd(struct acpi_drhd_unit *drhd)
|
|
||||||
{
|
|
||||||
- return ( drhd->address == igd_drhd_address ? 1 : 0);
|
|
||||||
+ return drhd && (drhd->address == igd_drhd_address);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -278,8 +278,7 @@ static int scope_device_count(void *star
|
|
||||||
|
|
||||||
|
|
||||||
static int __init acpi_parse_dev_scope(void *start, void *end,
|
|
||||||
- void *acpi_entry, int type,
|
|
||||||
- int *igd)
|
|
||||||
+ void *acpi_entry, int type)
|
|
||||||
{
|
|
||||||
struct dmar_scope *scope = acpi_entry;
|
|
||||||
struct acpi_ioapic_unit *acpi_ioapic_unit;
|
|
||||||
@@ -340,8 +339,15 @@ static int __init acpi_parse_dev_scope(v
|
|
||||||
if ( iommu_verbose )
|
|
||||||
dprintk(VTDPREFIX, " endpoint: %x:%x.%x\n",
|
|
||||||
bus, path->dev, path->fn);
|
|
||||||
- if ( (bus == 0) && (path->dev == 2) && (path->fn == 0) )
|
|
||||||
- *igd = 1;
|
|
||||||
+
|
|
||||||
+ if ( type == DMAR_TYPE )
|
|
||||||
+ {
|
|
||||||
+ struct acpi_drhd_unit *drhd = acpi_entry;
|
|
||||||
+
|
|
||||||
+ if ( (bus == 0) && (path->dev == 2) && (path->fn == 0) )
|
|
||||||
+ igd_drhd_address = drhd->address;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ACPI_DEV_IOAPIC:
|
|
||||||
@@ -388,7 +394,7 @@ acpi_parse_one_drhd(struct acpi_dmar_ent
|
|
||||||
struct acpi_table_drhd * drhd = (struct acpi_table_drhd *)header;
|
|
||||||
void *dev_scope_start, *dev_scope_end;
|
|
||||||
struct acpi_drhd_unit *dmaru;
|
|
||||||
- int ret, igd = 0;
|
|
||||||
+ int ret;
|
|
||||||
static int include_all = 0;
|
|
||||||
|
|
||||||
if ( (ret = acpi_dmar_check_length(header, sizeof(*drhd))) != 0 )
|
|
||||||
@@ -413,10 +419,7 @@ acpi_parse_one_drhd(struct acpi_dmar_ent
|
|
||||||
dev_scope_start = (void *)(drhd + 1);
|
|
||||||
dev_scope_end = ((void *)drhd) + header->length;
|
|
||||||
ret = acpi_parse_dev_scope(dev_scope_start, dev_scope_end,
|
|
||||||
- dmaru, DMAR_TYPE, &igd);
|
|
||||||
-
|
|
||||||
- if ( igd )
|
|
||||||
- igd_drhd_address = dmaru->address;
|
|
||||||
+ dmaru, DMAR_TYPE);
|
|
||||||
|
|
||||||
if ( dmaru->include_all )
|
|
||||||
{
|
|
||||||
@@ -504,7 +507,7 @@ acpi_parse_one_rmrr(struct acpi_dmar_ent
|
|
||||||
struct acpi_rmrr_unit *rmrru;
|
|
||||||
void *dev_scope_start, *dev_scope_end;
|
|
||||||
u64 base_addr = rmrr->base_address, end_addr = rmrr->end_address;
|
|
||||||
- int ret, igd = 0;
|
|
||||||
+ int ret;
|
|
||||||
|
|
||||||
if ( (ret = acpi_dmar_check_length(header, sizeof(*rmrr))) != 0 )
|
|
||||||
return ret;
|
|
||||||
@@ -536,7 +539,7 @@ acpi_parse_one_rmrr(struct acpi_dmar_ent
|
|
||||||
dev_scope_start = (void *)(rmrr + 1);
|
|
||||||
dev_scope_end = ((void *)rmrr) + header->length;
|
|
||||||
ret = acpi_parse_dev_scope(dev_scope_start, dev_scope_end,
|
|
||||||
- rmrru, RMRR_TYPE, &igd);
|
|
||||||
+ rmrru, RMRR_TYPE);
|
|
||||||
|
|
||||||
if ( ret || (rmrru->scope.devices_cnt == 0) )
|
|
||||||
xfree(rmrru);
|
|
||||||
@@ -601,7 +604,7 @@ acpi_parse_one_atsr(struct acpi_dmar_ent
|
|
||||||
{
|
|
||||||
struct acpi_table_atsr *atsr = (struct acpi_table_atsr *)header;
|
|
||||||
struct acpi_atsr_unit *atsru;
|
|
||||||
- int ret, igd = 0;
|
|
||||||
+ int ret;
|
|
||||||
static int all_ports;
|
|
||||||
void *dev_scope_start, *dev_scope_end;
|
|
||||||
|
|
||||||
@@ -622,7 +625,7 @@ acpi_parse_one_atsr(struct acpi_dmar_ent
|
|
||||||
dev_scope_start = (void *)(atsr + 1);
|
|
||||||
dev_scope_end = ((void *)atsr) + header->length;
|
|
||||||
ret = acpi_parse_dev_scope(dev_scope_start, dev_scope_end,
|
|
||||||
- atsru, ATSR_TYPE, &igd);
|
|
||||||
+ atsru, ATSR_TYPE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
--- a/xen/drivers/passthrough/vtd/extern.h
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/extern.h
|
|
||||||
@@ -26,6 +26,7 @@
|
|
||||||
|
|
||||||
extern int qinval_enabled;
|
|
||||||
extern int ats_enabled;
|
|
||||||
+extern bool_t rwbf_quirk;
|
|
||||||
|
|
||||||
void print_iommu_regs(struct acpi_drhd_unit *drhd);
|
|
||||||
void print_vtd_entries(struct iommu *iommu, int bus, int devfn, u64 gmfn);
|
|
||||||
@@ -35,6 +36,12 @@ int enable_qinval(struct iommu *iommu);
|
|
||||||
void disable_qinval(struct iommu *iommu);
|
|
||||||
int enable_intremap(struct iommu *iommu, int eim);
|
|
||||||
void disable_intremap(struct iommu *iommu);
|
|
||||||
+
|
|
||||||
+void iommu_flush_cache_entry(void *addr, unsigned int size);
|
|
||||||
+void iommu_flush_cache_page(void *addr, unsigned long npages);
|
|
||||||
+int iommu_alloc(struct acpi_drhd_unit *drhd);
|
|
||||||
+void iommu_free(struct acpi_drhd_unit *drhd);
|
|
||||||
+
|
|
||||||
int queue_invalidate_context(struct iommu *iommu,
|
|
||||||
u16 did, u16 source_id, u8 function_mask, u8 granu);
|
|
||||||
int queue_invalidate_iotlb(struct iommu *iommu,
|
|
||||||
@@ -44,19 +51,41 @@ int queue_invalidate_iec(struct iommu *i
|
|
||||||
int invalidate_sync(struct iommu *iommu);
|
|
||||||
int iommu_flush_iec_global(struct iommu *iommu);
|
|
||||||
int iommu_flush_iec_index(struct iommu *iommu, u8 im, u16 iidx);
|
|
||||||
+void clear_fault_bits(struct iommu *iommu);
|
|
||||||
+
|
|
||||||
struct iommu * ioapic_to_iommu(unsigned int apic_id);
|
|
||||||
struct acpi_drhd_unit * ioapic_to_drhd(unsigned int apic_id);
|
|
||||||
struct acpi_drhd_unit * iommu_to_drhd(struct iommu *iommu);
|
|
||||||
struct acpi_rhsa_unit * drhd_to_rhsa(struct acpi_drhd_unit *drhd);
|
|
||||||
-void clear_fault_bits(struct iommu *iommu);
|
|
||||||
+struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
|
|
||||||
+
|
|
||||||
int ats_device(int seg, int bus, int devfn);
|
|
||||||
int enable_ats_device(int seg, int bus, int devfn);
|
|
||||||
int disable_ats_device(int seg, int bus, int devfn);
|
|
||||||
int invalidate_ats_tcs(struct iommu *iommu);
|
|
||||||
+
|
|
||||||
int qinval_device_iotlb(struct iommu *iommu,
|
|
||||||
u32 max_invs_pend, u16 sid, u16 size, u64 addr);
|
|
||||||
int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
|
|
||||||
u64 addr, unsigned int size_order, u64 type);
|
|
||||||
-struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
|
|
||||||
+
|
|
||||||
+unsigned int get_cache_line_size(void);
|
|
||||||
+void cacheline_flush(char *);
|
|
||||||
+void flush_all_cache(void);
|
|
||||||
+
|
|
||||||
+u64 alloc_pgtable_maddr(struct acpi_drhd_unit *drhd, unsigned long npages);
|
|
||||||
+void free_pgtable_maddr(u64 maddr);
|
|
||||||
+void *map_vtd_domain_page(u64 maddr);
|
|
||||||
+void unmap_vtd_domain_page(void *va);
|
|
||||||
+int domain_context_mapping_one(struct domain *domain, struct iommu *iommu,
|
|
||||||
+ u8 bus, u8 devfn);
|
|
||||||
+int domain_context_unmap_one(struct domain *domain, struct iommu *iommu,
|
|
||||||
+ u8 bus, u8 devfn);
|
|
||||||
+
|
|
||||||
+int is_igd_vt_enabled_quirk(void);
|
|
||||||
+void __init platform_quirks_init(void);
|
|
||||||
+void vtd_ops_preamble_quirk(struct iommu* iommu);
|
|
||||||
+void vtd_ops_postamble_quirk(struct iommu* iommu);
|
|
||||||
+void me_wifi_quirk(struct domain *domain, u8 bus, u8 devfn, int map);
|
|
||||||
|
|
||||||
#endif // _VTD_EXTERN_H_
|
|
||||||
--- a/xen/drivers/passthrough/vtd/iommu.c
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/iommu.c
|
|
||||||
@@ -43,7 +43,6 @@
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int nr_iommus;
|
|
||||||
-static bool_t rwbf_quirk;
|
|
||||||
|
|
||||||
static void setup_dom0_devices(struct domain *d);
|
|
||||||
static void setup_dom0_rmrr(struct domain *d);
|
|
||||||
@@ -481,16 +480,36 @@ static int inline iommu_flush_iotlb_glob
|
|
||||||
int flush_non_present_entry, int flush_dev_iotlb)
|
|
||||||
{
|
|
||||||
struct iommu_flush *flush = iommu_get_flush(iommu);
|
|
||||||
- return flush->iotlb(iommu, 0, 0, 0, DMA_TLB_GLOBAL_FLUSH,
|
|
||||||
+ int status;
|
|
||||||
+
|
|
||||||
+ /* apply platform specific errata workarounds */
|
|
||||||
+ vtd_ops_preamble_quirk(iommu);
|
|
||||||
+
|
|
||||||
+ status = flush->iotlb(iommu, 0, 0, 0, DMA_TLB_GLOBAL_FLUSH,
|
|
||||||
flush_non_present_entry, flush_dev_iotlb);
|
|
||||||
+
|
|
||||||
+ /* undo platform specific errata workarounds */
|
|
||||||
+ vtd_ops_postamble_quirk(iommu);
|
|
||||||
+
|
|
||||||
+ return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int inline iommu_flush_iotlb_dsi(struct iommu *iommu, u16 did,
|
|
||||||
int flush_non_present_entry, int flush_dev_iotlb)
|
|
||||||
{
|
|
||||||
struct iommu_flush *flush = iommu_get_flush(iommu);
|
|
||||||
- return flush->iotlb(iommu, did, 0, 0, DMA_TLB_DSI_FLUSH,
|
|
||||||
+ int status;
|
|
||||||
+
|
|
||||||
+ /* apply platform specific errata workarounds */
|
|
||||||
+ vtd_ops_preamble_quirk(iommu);
|
|
||||||
+
|
|
||||||
+ status = flush->iotlb(iommu, did, 0, 0, DMA_TLB_DSI_FLUSH,
|
|
||||||
flush_non_present_entry, flush_dev_iotlb);
|
|
||||||
+
|
|
||||||
+ /* undo platform specific errata workarounds */
|
|
||||||
+ vtd_ops_postamble_quirk(iommu);
|
|
||||||
+
|
|
||||||
+ return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int inline get_alignment(u64 base, unsigned int size)
|
|
||||||
@@ -514,6 +533,7 @@ static int inline iommu_flush_iotlb_psi(
|
|
||||||
{
|
|
||||||
unsigned int align;
|
|
||||||
struct iommu_flush *flush = iommu_get_flush(iommu);
|
|
||||||
+ int status;
|
|
||||||
|
|
||||||
ASSERT(!(addr & (~PAGE_MASK_4K)));
|
|
||||||
ASSERT(pages > 0);
|
|
||||||
@@ -534,8 +554,16 @@ static int inline iommu_flush_iotlb_psi(
|
|
||||||
addr >>= PAGE_SHIFT_4K + align;
|
|
||||||
addr <<= PAGE_SHIFT_4K + align;
|
|
||||||
|
|
||||||
- return flush->iotlb(iommu, did, addr, align, DMA_TLB_PSI_FLUSH,
|
|
||||||
+ /* apply platform specific errata workarounds */
|
|
||||||
+ vtd_ops_preamble_quirk(iommu);
|
|
||||||
+
|
|
||||||
+ status = flush->iotlb(iommu, did, addr, align, DMA_TLB_PSI_FLUSH,
|
|
||||||
flush_non_present_entry, flush_dev_iotlb);
|
|
||||||
+
|
|
||||||
+ /* undo platform specific errata workarounds */
|
|
||||||
+ vtd_ops_postamble_quirk(iommu);
|
|
||||||
+
|
|
||||||
+ return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void iommu_flush_all(void)
|
|
||||||
@@ -688,24 +716,13 @@ static int iommu_set_root_entry(struct i
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#define GGC 0x52
|
|
||||||
-#define GGC_MEMORY_VT_ENABLED (0x8 << 8)
|
|
||||||
-static int is_igd_vt_enabled(void)
|
|
||||||
-{
|
|
||||||
- unsigned short ggc;
|
|
||||||
-
|
|
||||||
- /* integrated graphics on Intel platforms is located at 0:2.0 */
|
|
||||||
- ggc = pci_conf_read16(0, 2, 0, GGC);
|
|
||||||
- return ( ggc & GGC_MEMORY_VT_ENABLED ? 1 : 0 );
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
static void iommu_enable_translation(struct acpi_drhd_unit *drhd)
|
|
||||||
{
|
|
||||||
u32 sts;
|
|
||||||
unsigned long flags;
|
|
||||||
struct iommu *iommu = drhd->iommu;
|
|
||||||
|
|
||||||
- if ( !is_igd_vt_enabled() && is_igd_drhd(drhd) )
|
|
||||||
+ if ( is_igd_drhd(drhd) && !is_igd_vt_enabled_quirk() )
|
|
||||||
{
|
|
||||||
if ( force_iommu )
|
|
||||||
panic("BIOS did not enable IGD for VT properly, crash Xen for security purpose!\n");
|
|
||||||
@@ -717,6 +734,9 @@ static void iommu_enable_translation(str
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* apply platform specific errata workarounds */
|
|
||||||
+ vtd_ops_preamble_quirk(iommu);
|
|
||||||
+
|
|
||||||
if ( iommu_verbose )
|
|
||||||
dprintk(VTDPREFIX,
|
|
||||||
"iommu_enable_translation: iommu->reg = %p\n", iommu->reg);
|
|
||||||
@@ -729,6 +749,9 @@ static void iommu_enable_translation(str
|
|
||||||
(sts & DMA_GSTS_TES), sts);
|
|
||||||
spin_unlock_irqrestore(&iommu->register_lock, flags);
|
|
||||||
|
|
||||||
+ /* undo platform specific errata workarounds */
|
|
||||||
+ vtd_ops_postamble_quirk(iommu);
|
|
||||||
+
|
|
||||||
/* Disable PMRs when VT-d engine takes effect per spec definition */
|
|
||||||
disable_pmr(iommu);
|
|
||||||
}
|
|
||||||
@@ -738,6 +761,9 @@ static void iommu_disable_translation(st
|
|
||||||
u32 sts;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
+ /* apply platform specific errata workarounds */
|
|
||||||
+ vtd_ops_preamble_quirk(iommu);
|
|
||||||
+
|
|
||||||
spin_lock_irqsave(&iommu->register_lock, flags);
|
|
||||||
sts = dmar_readl(iommu->reg, DMAR_GSTS_REG);
|
|
||||||
dmar_writel(iommu->reg, DMAR_GCMD_REG, sts & (~DMA_GCMD_TE));
|
|
||||||
@@ -746,6 +772,9 @@ static void iommu_disable_translation(st
|
|
||||||
IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, dmar_readl,
|
|
||||||
!(sts & DMA_GSTS_TES), sts);
|
|
||||||
spin_unlock_irqrestore(&iommu->register_lock, flags);
|
|
||||||
+
|
|
||||||
+ /* undo platform specific errata workarounds */
|
|
||||||
+ vtd_ops_postamble_quirk(iommu);
|
|
||||||
}
|
|
||||||
|
|
||||||
enum faulttype {
|
|
||||||
@@ -1089,6 +1118,7 @@ int __init iommu_alloc(struct acpi_drhd_
|
|
||||||
xfree(iommu);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
+ iommu->intel->drhd = drhd;
|
|
||||||
|
|
||||||
iommu->reg = map_to_nocache_virt(nr_iommus, drhd->address);
|
|
||||||
iommu->index = nr_iommus++;
|
|
||||||
@@ -1221,7 +1251,7 @@ static void intel_iommu_dom0_init(struct
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int domain_context_mapping_one(
|
|
||||||
+int domain_context_mapping_one(
|
|
||||||
struct domain *domain,
|
|
||||||
struct iommu *iommu,
|
|
||||||
u8 bus, u8 devfn)
|
|
||||||
@@ -1324,6 +1354,8 @@ static int domain_context_mapping_one(
|
|
||||||
|
|
||||||
unmap_vtd_domain_page(context_entries);
|
|
||||||
|
|
||||||
+ me_wifi_quirk(domain, bus, devfn, MAP_ME_PHANTOM_FUNC);
|
|
||||||
+
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1398,7 +1430,7 @@ static int domain_context_mapping(struct
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int domain_context_unmap_one(
|
|
||||||
+int domain_context_unmap_one(
|
|
||||||
struct domain *domain,
|
|
||||||
struct iommu *iommu,
|
|
||||||
u8 bus, u8 devfn)
|
|
||||||
@@ -1446,6 +1478,8 @@ static int domain_context_unmap_one(
|
|
||||||
spin_unlock(&iommu->lock);
|
|
||||||
unmap_vtd_domain_page(context_entries);
|
|
||||||
|
|
||||||
+ me_wifi_quirk(domain, bus, devfn, UNMAP_ME_PHANTOM_FUNC);
|
|
||||||
+
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1945,19 +1979,6 @@ static void setup_dom0_rmrr(struct domai
|
|
||||||
spin_unlock(&pcidevs_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void platform_quirks(void)
|
|
||||||
-{
|
|
||||||
- u32 id;
|
|
||||||
-
|
|
||||||
- /* Mobile 4 Series Chipset neglects to set RWBF capability. */
|
|
||||||
- id = pci_conf_read32(0, 0, 0, 0);
|
|
||||||
- if ( id == 0x2a408086 )
|
|
||||||
- {
|
|
||||||
- dprintk(XENLOG_INFO VTDPREFIX, "DMAR: Forcing write-buffer flush\n");
|
|
||||||
- rwbf_quirk = 1;
|
|
||||||
- }
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
int intel_vtd_setup(void)
|
|
||||||
{
|
|
||||||
struct acpi_drhd_unit *drhd;
|
|
||||||
@@ -1966,7 +1987,7 @@ int intel_vtd_setup(void)
|
|
||||||
if ( list_empty(&acpi_drhd_units) )
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
- platform_quirks();
|
|
||||||
+ platform_quirks_init();
|
|
||||||
|
|
||||||
irq_to_iommu = xmalloc_array(struct iommu*, nr_irqs);
|
|
||||||
BUG_ON(!irq_to_iommu);
|
|
||||||
--- a/xen/drivers/passthrough/vtd/iommu.h
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/iommu.h
|
|
||||||
@@ -501,6 +501,7 @@ struct intel_iommu {
|
|
||||||
struct qi_ctrl qi_ctrl;
|
|
||||||
struct ir_ctrl ir_ctrl;
|
|
||||||
struct iommu_flush flush;
|
|
||||||
+ struct acpi_drhd_unit *drhd;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/quirks.c
|
|
||||||
@@ -0,0 +1,263 @@
|
|
||||||
+/*
|
|
||||||
+ * Copyright (c) 2010, Intel Corporation.
|
|
||||||
+ *
|
|
||||||
+ * This program is free software; you can redistribute it and/or modify it
|
|
||||||
+ * under the terms and conditions of the GNU General Public License,
|
|
||||||
+ * version 2, as published by the Free Software Foundation.
|
|
||||||
+ *
|
|
||||||
+ * This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
+ * more details.
|
|
||||||
+ *
|
|
||||||
+ * You should have received a copy of the GNU General Public License along with
|
|
||||||
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
||||||
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
+ *
|
|
||||||
+ * Author: Allen Kay <allen.m.kay@intel.com>
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#include <xen/irq.h>
|
|
||||||
+#include <xen/sched.h>
|
|
||||||
+#include <xen/xmalloc.h>
|
|
||||||
+#include <xen/domain_page.h>
|
|
||||||
+#include <xen/iommu.h>
|
|
||||||
+#include <asm/hvm/iommu.h>
|
|
||||||
+#include <xen/numa.h>
|
|
||||||
+#include <xen/softirq.h>
|
|
||||||
+#include <xen/time.h>
|
|
||||||
+#include <xen/pci.h>
|
|
||||||
+#include <xen/pci_regs.h>
|
|
||||||
+#include <xen/keyhandler.h>
|
|
||||||
+#include <asm/msi.h>
|
|
||||||
+#include <asm/irq.h>
|
|
||||||
+#include <mach_apic.h>
|
|
||||||
+#include "iommu.h"
|
|
||||||
+#include "dmar.h"
|
|
||||||
+#include "extern.h"
|
|
||||||
+#include "vtd.h"
|
|
||||||
+
|
|
||||||
+#define IOH_DEV 0
|
|
||||||
+#define IGD_DEV 2
|
|
||||||
+
|
|
||||||
+#define IGD_BAR_MASK 0xFFFFFFFFFFFF0000
|
|
||||||
+#define GGC 0x52
|
|
||||||
+#define GGC_MEMORY_VT_ENABLED (0x8 << 8)
|
|
||||||
+
|
|
||||||
+#define IS_CTG(id) (id == 0x2a408086)
|
|
||||||
+#define IS_ILK(id) (id == 0x00408086 || id == 0x00448086 || id== 0x00628086 || id == 0x006A8086)
|
|
||||||
+#define IS_CPT(id) (id == 0x01008086 || id == 0x01048086)
|
|
||||||
+
|
|
||||||
+u32 ioh_id;
|
|
||||||
+u32 igd_id;
|
|
||||||
+bool_t rwbf_quirk;
|
|
||||||
+static int is_cantiga_b3;
|
|
||||||
+static u8 *igd_reg_va;
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * QUIRK to workaround Xen boot issue on Calpella/Ironlake OEM BIOS
|
|
||||||
+ * not enabling VT-d properly in IGD. The workaround is to not enabling
|
|
||||||
+ * IGD VT-d translation if VT is not enabled in IGD.
|
|
||||||
+ */
|
|
||||||
+int is_igd_vt_enabled_quirk(void)
|
|
||||||
+{
|
|
||||||
+ u16 ggc;
|
|
||||||
+
|
|
||||||
+ if ( !IS_ILK(ioh_id) )
|
|
||||||
+ return 1;
|
|
||||||
+
|
|
||||||
+ /* integrated graphics on Intel platforms is located at 0:2.0 */
|
|
||||||
+ ggc = pci_conf_read16(0, IGD_DEV, 0, GGC);
|
|
||||||
+ return ( ggc & GGC_MEMORY_VT_ENABLED ? 1 : 0 );
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * QUIRK to workaround cantiga VT-d buffer flush issue.
|
|
||||||
+ * The workaround is to force write buffer flush even if
|
|
||||||
+ * VT-d capability indicates it is not required.
|
|
||||||
+ */
|
|
||||||
+static void cantiga_b3_errata_init(void)
|
|
||||||
+{
|
|
||||||
+ u16 vid;
|
|
||||||
+ u8 did_hi, rid;
|
|
||||||
+
|
|
||||||
+ vid = pci_conf_read16(0, IGD_DEV, 0, 0);
|
|
||||||
+ if ( vid != 0x8086 )
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ did_hi = pci_conf_read8(0, IGD_DEV, 0, 3);
|
|
||||||
+ rid = pci_conf_read8(0, IGD_DEV, 0, 8);
|
|
||||||
+
|
|
||||||
+ if ( (did_hi == 0x2A) && (rid == 0x7) )
|
|
||||||
+ is_cantiga_b3 = 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * QUIRK to workaround Cantiga IGD VT-d low power errata.
|
|
||||||
+ * This errata impacts IGD assignment on Cantiga systems
|
|
||||||
+ * and can potentially cause VT-d operations to hang.
|
|
||||||
+ * The workaround is to access an IGD PCI config register
|
|
||||||
+ * to get IGD out of low power state before VT-d translation
|
|
||||||
+ * enable/disable and IOTLB flushes.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * map IGD MMIO+0x2000 page to allow Xen access to IGD 3D register.
|
|
||||||
+ */
|
|
||||||
+static void map_igd_reg(void)
|
|
||||||
+{
|
|
||||||
+ u64 igd_mmio, igd_reg;
|
|
||||||
+
|
|
||||||
+ if ( !is_cantiga_b3 || igd_reg_va != NULL )
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ /* get IGD mmio address in PCI BAR */
|
|
||||||
+ igd_mmio = ((u64)pci_conf_read32(0, IGD_DEV, 0, 0x14) << 32) +
|
|
||||||
+ pci_conf_read32(0, IGD_DEV, 0, 0x10);
|
|
||||||
+
|
|
||||||
+ /* offset of IGD regster we want to access is in 0x2000 range */
|
|
||||||
+ igd_reg = (igd_mmio & IGD_BAR_MASK) + 0x2000;
|
|
||||||
+
|
|
||||||
+ /* ioremap this physical page */
|
|
||||||
+ set_fixmap_nocache(FIX_IGD_MMIO, igd_reg);
|
|
||||||
+ igd_reg_va = (u8 *)fix_to_virt(FIX_IGD_MMIO);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * force IGD to exit low power mode by accessing a IGD 3D regsiter.
|
|
||||||
+ */
|
|
||||||
+static int cantiga_vtd_ops_preamble(struct iommu* iommu)
|
|
||||||
+{
|
|
||||||
+ struct intel_iommu *intel = iommu->intel;
|
|
||||||
+ struct acpi_drhd_unit *drhd = intel ? intel->drhd : NULL;
|
|
||||||
+
|
|
||||||
+ if ( !is_igd_drhd(drhd) || !is_cantiga_b3 )
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * read IGD register at IGD MMIO + 0x20A4 to force IGD
|
|
||||||
+ * to exit low power state. Since map_igd_reg()
|
|
||||||
+ * already mapped page starting 0x2000, we just need to
|
|
||||||
+ * add page offset 0x0A4 to virtual address base.
|
|
||||||
+ */
|
|
||||||
+ return ( *((volatile int *)(igd_reg_va + 0x0A4)) );
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * call before VT-d translation enable and IOTLB flush operations.
|
|
||||||
+ */
|
|
||||||
+void vtd_ops_preamble_quirk(struct iommu* iommu)
|
|
||||||
+{
|
|
||||||
+ cantiga_vtd_ops_preamble(iommu);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * call after VT-d translation enable and IOTLB flush operations.
|
|
||||||
+ */
|
|
||||||
+void vtd_ops_postamble_quirk(struct iommu* iommu)
|
|
||||||
+{
|
|
||||||
+ return;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* initialize platform identification flags */
|
|
||||||
+void __init platform_quirks_init(void)
|
|
||||||
+{
|
|
||||||
+ ioh_id = pci_conf_read32(0, IOH_DEV, 0, 0);
|
|
||||||
+ igd_id = pci_conf_read32(0, IGD_DEV, 0, 0);
|
|
||||||
+
|
|
||||||
+ /* Mobile 4 Series Chipset neglects to set RWBF capability. */
|
|
||||||
+ if ( ioh_id == 0x2a408086 )
|
|
||||||
+ {
|
|
||||||
+ dprintk(XENLOG_INFO VTDPREFIX, "DMAR: Forcing write-buffer flush\n");
|
|
||||||
+ rwbf_quirk = 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* initialize cantiga B3 identification */
|
|
||||||
+ cantiga_b3_errata_init();
|
|
||||||
+
|
|
||||||
+ /* ioremap IGD MMIO+0x2000 page */
|
|
||||||
+ map_igd_reg();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * QUIRK to workaround wifi direct assignment issue. This issue
|
|
||||||
+ * impacts only cases where Intel integrated wifi device is directly
|
|
||||||
+ * is directly assigned to a guest.
|
|
||||||
+ *
|
|
||||||
+ * The workaround is to map ME phantom device 0:3.7 or 0:22.7
|
|
||||||
+ * to the ME vt-d engine if detect the user is trying to directly
|
|
||||||
+ * assigning Intel integrated wifi device to a guest.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+static void map_me_phantom_function(struct domain *domain, u32 dev, int map)
|
|
||||||
+{
|
|
||||||
+ struct acpi_drhd_unit *drhd;
|
|
||||||
+ struct pci_dev *pdev;
|
|
||||||
+
|
|
||||||
+ /* find ME VT-d engine base on a real ME device */
|
|
||||||
+ pdev = pci_get_pdev(0, PCI_DEVFN(dev, 0));
|
|
||||||
+ drhd = acpi_find_matched_drhd_unit(pdev);
|
|
||||||
+
|
|
||||||
+ /* map or unmap ME phantom function */
|
|
||||||
+ if ( map )
|
|
||||||
+ domain_context_mapping_one(domain, drhd->iommu, 0,
|
|
||||||
+ PCI_DEVFN(dev, 7));
|
|
||||||
+ else
|
|
||||||
+ domain_context_unmap_one(domain, drhd->iommu, 0,
|
|
||||||
+ PCI_DEVFN(dev, 7));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void me_wifi_quirk(struct domain *domain, u8 bus, u8 devfn, int map)
|
|
||||||
+{
|
|
||||||
+ u32 id;
|
|
||||||
+
|
|
||||||
+ id = pci_conf_read32(0, 0, 0, 0);
|
|
||||||
+ if ( IS_CTG(id) )
|
|
||||||
+ {
|
|
||||||
+ /* quit if ME does not exist */
|
|
||||||
+ if ( pci_conf_read32(0, 3, 0, 0) == 0xffffffff )
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ /* if device is WLAN device, map ME phantom device 0:3.7 */
|
|
||||||
+ id = pci_conf_read32(bus, PCI_SLOT(devfn), PCI_FUNC(devfn), 0);
|
|
||||||
+ switch (id)
|
|
||||||
+ {
|
|
||||||
+ case 0x42328086:
|
|
||||||
+ case 0x42358086:
|
|
||||||
+ case 0x42368086:
|
|
||||||
+ case 0x42378086:
|
|
||||||
+ case 0x423a8086:
|
|
||||||
+ case 0x423b8086:
|
|
||||||
+ case 0x423c8086:
|
|
||||||
+ case 0x423d8086:
|
|
||||||
+ map_me_phantom_function(domain, 3, map);
|
|
||||||
+ break;
|
|
||||||
+ default:
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else if ( IS_ILK(id) || IS_CPT(id) )
|
|
||||||
+ {
|
|
||||||
+ /* quit if ME does not exist */
|
|
||||||
+ if ( pci_conf_read32(0, 22, 0, 0) == 0xffffffff )
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ /* if device is WLAN device, map ME phantom device 0:22.7 */
|
|
||||||
+ id = pci_conf_read32(bus, PCI_SLOT(devfn), PCI_FUNC(devfn), 0);
|
|
||||||
+ switch (id)
|
|
||||||
+ {
|
|
||||||
+ case 0x00878086:
|
|
||||||
+ case 0x00898086:
|
|
||||||
+ case 0x00828086:
|
|
||||||
+ case 0x00858086:
|
|
||||||
+ case 0x42388086:
|
|
||||||
+ case 0x422b8086:
|
|
||||||
+ case 0x422c8086:
|
|
||||||
+ map_me_phantom_function(domain, 22, map);
|
|
||||||
+ break;
|
|
||||||
+ default:
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
--- a/xen/drivers/passthrough/vtd/vtd.h
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/vtd.h
|
|
||||||
@@ -23,6 +23,9 @@
|
|
||||||
|
|
||||||
#include <xen/iommu.h>
|
|
||||||
|
|
||||||
+#define MAP_ME_PHANTOM_FUNC 1
|
|
||||||
+#define UNMAP_ME_PHANTOM_FUNC 0
|
|
||||||
+
|
|
||||||
/* Accomodate both IOAPIC and IOSAPIC. */
|
|
||||||
struct IO_xAPIC_route_entry {
|
|
||||||
__u32 vector : 8,
|
|
||||||
@@ -97,18 +100,4 @@ struct msi_msg_remap_entry {
|
|
||||||
u32 data; /* msi message data */
|
|
||||||
};
|
|
||||||
|
|
||||||
-unsigned int get_cache_line_size(void);
|
|
||||||
-void cacheline_flush(char *);
|
|
||||||
-void flush_all_cache(void);
|
|
||||||
-u64 alloc_pgtable_maddr(struct acpi_drhd_unit *drhd, unsigned long npages);
|
|
||||||
-void free_pgtable_maddr(u64 maddr);
|
|
||||||
-void *map_vtd_domain_page(u64 maddr);
|
|
||||||
-void unmap_vtd_domain_page(void *va);
|
|
||||||
-
|
|
||||||
-void iommu_flush_cache_entry(void *addr, unsigned int size);
|
|
||||||
-void iommu_flush_cache_page(void *addr, unsigned long npages);
|
|
||||||
-
|
|
||||||
-int iommu_alloc(struct acpi_drhd_unit *drhd);
|
|
||||||
-void iommu_free(struct acpi_drhd_unit *drhd);
|
|
||||||
-
|
|
||||||
#endif // _VTD_H_
|
|
||||||
--- a/xen/drivers/passthrough/vtd/x86/vtd.c
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/x86/vtd.c
|
|
||||||
@@ -27,6 +27,7 @@
|
|
||||||
#include "../iommu.h"
|
|
||||||
#include "../dmar.h"
|
|
||||||
#include "../vtd.h"
|
|
||||||
+#include "../extern.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* iommu_inclusive_mapping: when set, all memory below 4GB is included in dom0
|
|
||||||
--- a/xen/include/asm-x86/fixmap.h
|
|
||||||
+++ b/xen/include/asm-x86/fixmap.h
|
|
||||||
@@ -52,6 +52,7 @@ enum fixed_addresses {
|
|
||||||
FIX_MSIX_IO_RESERV_BASE,
|
|
||||||
FIX_MSIX_IO_RESERV_END = FIX_MSIX_IO_RESERV_BASE + FIX_MSIX_MAX_PAGES -1,
|
|
||||||
FIX_TBOOT_MAP_ADDRESS,
|
|
||||||
+ FIX_IGD_MMIO,
|
|
||||||
__end_of_fixed_addresses
|
|
||||||
};
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Jim Fehlig <jfehlig@novell.com>
|
|
||||||
# Date 1288301229 21600
|
|
||||||
# Branch xend-pci
|
|
||||||
# Node ID 461b9d3a643a2c67c961d9fc468a804891f3770d
|
|
||||||
# Parent 28a16074681582f1209c9077f870ccf44927133e
|
|
||||||
Fix pci passthru in xend interface used by libvirt
|
|
||||||
|
|
||||||
Attempting to define or create a domain whose XML config contains a
|
|
||||||
passthru PCI device fails with libvirt
|
|
||||||
|
|
||||||
xen84: # cat win2k8r2.xml
|
|
||||||
...
|
|
||||||
<hostdev mode='subsystem' type='pci' managed='no'>
|
|
||||||
<source>
|
|
||||||
<address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
|
|
||||||
</source>
|
|
||||||
</hostdev>
|
|
||||||
...
|
|
||||||
|
|
||||||
xen84: # virsh create ./win2k8r2.xml
|
|
||||||
error: Failed to create domain from ./win2k8r2.xml
|
|
||||||
error: POST operation failed: xend_post: error from xen daemon:
|
|
||||||
(xend.err "Error creating domain: 'key'")
|
|
||||||
|
|
||||||
The PCI device config maintained by xend includes a 'key' field, which is
|
|
||||||
initialized by xm client when using that tool and traditional xen config
|
|
||||||
file. libvirt, which uses xend's sexpr-over-http interface (is that the
|
|
||||||
proper name for that interface??), does not initialize this field - and
|
|
||||||
shouldn't be expected to do so IMO. Clients should not be bothered with
|
|
||||||
xend's internal representation of a PCI device.
|
|
||||||
|
|
||||||
This patch populates the 'key' field within xend if it is uninitialized,
|
|
||||||
similar to current initialization of 'uuid' field. The 'vdevfn' field
|
|
||||||
suffers a similar problem if not (optionally) specified by user.
|
|
||||||
AFAICT, the xm client initializes 'vdevfn' to 0x100 if not specified so
|
|
||||||
I've done the same here.
|
|
||||||
|
|
||||||
Signed-off-by: Jim Fehlig <jfehlig@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/util/pci.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/util/pci.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/util/pci.py
|
|
||||||
@@ -240,10 +240,16 @@ def pci_convert_sxp_to_dict(dev_sxp):
|
|
||||||
pci_dev_info = dict(pci_dev[1:])
|
|
||||||
if 'opts' in pci_dev_info:
|
|
||||||
pci_dev_info['opts'] = pci_opts_list_from_sxp(pci_dev)
|
|
||||||
- # append uuid to each pci device that does't already have one.
|
|
||||||
+ # If necessary, initialize uuid, key, and vdevfn for each pci device
|
|
||||||
if not pci_dev_info.has_key('uuid'):
|
|
||||||
- dpci_uuid = pci_dev_info.get('uuid', uuid.createString())
|
|
||||||
- pci_dev_info['uuid'] = dpci_uuid
|
|
||||||
+ pci_dev_info['uuid'] = uuid.createString()
|
|
||||||
+ if not pci_dev_info.has_key('key'):
|
|
||||||
+ pci_dev_info['key'] = "%02x:%02x.%x" % \
|
|
||||||
+ (int(pci_dev_info['bus'], 16),
|
|
||||||
+ int(pci_dev_info['slot'], 16),
|
|
||||||
+ int(pci_dev_info['func'], 16))
|
|
||||||
+ if not pci_dev_info.has_key('vdevfn'):
|
|
||||||
+ pci_dev_info['vdevfn'] = "0x%02x" % AUTO_PHP_SLOT
|
|
||||||
pci_devs.append(pci_dev_info)
|
|
||||||
dev_config['devs'] = pci_devs
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1289813498 0
|
|
||||||
# Node ID 87f248de52304bc96a80dc093250fed0197f37e0
|
|
||||||
# Parent 8af10bd7f2d0e9300f1bc68f7e2fb137fa839365
|
|
||||||
x2apic: Remove a panic condition in enabling x2APIC
|
|
||||||
|
|
||||||
Currently Xen triggers a panic if user disables VT-d by command line
|
|
||||||
while not disable x2APIC. This requires users to specify both
|
|
||||||
"iommu=0" and "x2apic=0" to disable VT-d if the platform supports
|
|
||||||
x2APIC. It's not user friendly. This patch removes the panic
|
|
||||||
condition. That's to say, don't require user to specify "x2apic=0"
|
|
||||||
when specify "iommu=0". As long as VT-d is not enabled (disabled in
|
|
||||||
BIOS or in command line), x2APIC won't be enabled naturally (x2APIC
|
|
||||||
depends on VT-d Interrupt remapping).
|
|
||||||
|
|
||||||
Signed-off-by: Weidong Han <weidong.han@intel.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/apic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
@@ -1001,22 +1001,11 @@ static void enable_bsp_x2apic(void)
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- if ( !iommu_enabled || !iommu_intremap || !iommu_qinval )
|
|
||||||
- panic("Cannot enable x2APIC due to iommu or interrupt "
|
|
||||||
- "remapping or queued invalidation is disabled "
|
|
||||||
- "by command line!\n");
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- if ( x2apic_preenabled )
|
|
||||||
- panic("x2APIC: already enabled by BIOS, but "
|
|
||||||
- "iommu_supports_eim fails\n");
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- printk("Not enable x2APIC due to "
|
|
||||||
- "iommu_supports_eim fails!\n");
|
|
||||||
- return;
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
+ if ( x2apic_preenabled )
|
|
||||||
+ panic("x2APIC: already enabled by BIOS, but "
|
|
||||||
+ "iommu_supports_eim failed!\n");
|
|
||||||
+ printk("Not enabling x2APIC: depends oniommu_supports_eim\n");
|
|
||||||
+ return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
|||||||
References: bnc#655438
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1290173202 0
|
|
||||||
# Node ID b7ed352fa6100104374000cdbd845bbfc6478f08
|
|
||||||
# Parent 437576a0f2026ded6dcc4b11558714dad1d1d042
|
|
||||||
VPMU: Add the Intel CPU X7542 to the list of supported prcocessors
|
|
||||||
|
|
||||||
Signed-off-by: Dietmar Hahn <dietmar.hahn@ts.fujitsu.com>
|
|
||||||
|
|
||||||
--- a/xen/arch/x86/hvm/vmx/vpmu.c
|
|
||||||
+++ b/xen/arch/x86/hvm/vmx/vpmu.c
|
|
||||||
@@ -96,6 +96,7 @@ void vpmu_initialise(struct vcpu *v)
|
|
||||||
case 23:
|
|
||||||
case 26:
|
|
||||||
case 29:
|
|
||||||
+ case 46:
|
|
||||||
vpmu->arch_vpmu_ops = &core2_vpmu_ops;
|
|
||||||
break;
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Tim Deegan <Tim.Deegan@citrix.com>
|
|
||||||
# Date 1290594003 0
|
|
||||||
# Node ID 79b71c77907b80772ee8cba0c5bbf8e444e61226
|
|
||||||
# Parent e5c4e925e1bd15baeadc0817dcceb5fff54b8a74
|
|
||||||
x86/mm: remove incorrect BUG_ON.
|
|
||||||
This BUG_ON tests a property of an effectively random PFN in the guest,
|
|
||||||
and is explicitly _not_ seeing the MFN that's known to be owned.
|
|
||||||
|
|
||||||
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/mm/p2m.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/mm/p2m.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/mm/p2m.c
|
|
||||||
@@ -2186,9 +2186,6 @@ guest_physmap_add_entry(struct domain *d
|
|
||||||
P2M_DEBUG("aliased! mfn=%#lx, old gfn=%#lx, new gfn=%#lx\n",
|
|
||||||
mfn + i, ogfn, gfn + i);
|
|
||||||
omfn = gfn_to_mfn_query(d, ogfn, &ot);
|
|
||||||
- /* If we get here, we know the local domain owns the page,
|
|
||||||
- so it can't have been grant mapped in. */
|
|
||||||
- BUG_ON( p2m_is_grant(ot) );
|
|
||||||
if ( p2m_is_ram(ot) )
|
|
||||||
{
|
|
||||||
ASSERT(mfn_valid(omfn));
|
|
@ -1,496 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1291922374 0
|
|
||||||
# Node ID d9fc83a64a82624e24876250dd88b2cd9528d266
|
|
||||||
# Parent 49d2aa5cee4ecc2411d8d638e4ee32c10e9b2761
|
|
||||||
x86: x2apic: Large cleanup
|
|
||||||
References: bnc#656369, bnc#658704
|
|
||||||
|
|
||||||
Signed-off-by: Keir Fraser <keir@xen.org>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/apic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
@@ -67,12 +67,12 @@ static int enable_local_apic __initdata
|
|
||||||
*/
|
|
||||||
int apic_verbosity;
|
|
||||||
|
|
||||||
+static int opt_x2apic = 1;
|
|
||||||
+boolean_param("x2apic", opt_x2apic);
|
|
||||||
+
|
|
||||||
int x2apic_enabled __read_mostly = 0;
|
|
||||||
int directed_eoi_enabled __read_mostly = 0;
|
|
||||||
|
|
||||||
-/* x2APIC is enabled in BIOS */
|
|
||||||
-static int x2apic_preenabled;
|
|
||||||
-
|
|
||||||
/*
|
|
||||||
* The following vectors are part of the Linux architecture, there
|
|
||||||
* is no hardware IRQ pin equivalent for them, they are triggered
|
|
||||||
@@ -945,30 +945,24 @@ no_apic:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
-void check_x2apic_preenabled(void)
|
|
||||||
+void x2apic_setup(void)
|
|
||||||
{
|
|
||||||
+ struct IO_APIC_route_entry **ioapic_entries = NULL;
|
|
||||||
u32 lo, hi;
|
|
||||||
|
|
||||||
- if ( !x2apic_is_available() )
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
- rdmsr(MSR_IA32_APICBASE, lo, hi);
|
|
||||||
- if ( lo & MSR_IA32_APICBASE_EXTD )
|
|
||||||
+ if ( smp_processor_id() != 0 )
|
|
||||||
{
|
|
||||||
- printk("x2APIC mode is already enabled by BIOS.\n");
|
|
||||||
- x2apic_preenabled = 1;
|
|
||||||
- x2apic_enabled = 1;
|
|
||||||
+ if ( x2apic_enabled )
|
|
||||||
+ __enable_x2apic();
|
|
||||||
+ return;
|
|
||||||
}
|
|
||||||
-}
|
|
||||||
|
|
||||||
-static void enable_bsp_x2apic(void)
|
|
||||||
-{
|
|
||||||
- struct IO_APIC_route_entry **ioapic_entries = NULL;
|
|
||||||
- const struct genapic *x2apic_genapic = NULL;
|
|
||||||
-
|
|
||||||
- ASSERT(smp_processor_id() == 0);
|
|
||||||
+ if ( !cpu_has_x2apic )
|
|
||||||
+ return;
|
|
||||||
|
|
||||||
- if ( x2apic_preenabled )
|
|
||||||
+ /* Check whether x2apic mode was already enabled by the BIOS. */
|
|
||||||
+ rdmsr(MSR_IA32_APICBASE, lo, hi);
|
|
||||||
+ if ( lo & MSR_IA32_APICBASE_EXTD )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Interrupt remapping should be also enabled by BIOS when
|
|
||||||
@@ -978,39 +972,33 @@ static void enable_bsp_x2apic(void)
|
|
||||||
if ( !intremap_enabled() )
|
|
||||||
panic("Interrupt remapping is not enabled by BIOS while "
|
|
||||||
"x2APIC is already enabled by BIOS!\n");
|
|
||||||
+
|
|
||||||
+ printk("x2APIC mode is already enabled by BIOS.\n");
|
|
||||||
+ x2apic_enabled = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
- x2apic_genapic = apic_x2apic_probe();
|
|
||||||
- if ( x2apic_genapic )
|
|
||||||
- genapic = x2apic_genapic;
|
|
||||||
- else
|
|
||||||
+ if ( !opt_x2apic )
|
|
||||||
{
|
|
||||||
- if ( x2apic_cmdline_disable() )
|
|
||||||
+ if ( !x2apic_enabled )
|
|
||||||
{
|
|
||||||
- if ( x2apic_preenabled )
|
|
||||||
- {
|
|
||||||
- /* Ignore x2apic=0, and set default x2apic mode */
|
|
||||||
- genapic = &apic_x2apic_cluster;
|
|
||||||
- printk("x2APIC: already enabled by BIOS, ignore x2apic=0.\n");
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- printk("Not enable x2APIC due to x2apic=0 is set.\n");
|
|
||||||
- return;
|
|
||||||
- }
|
|
||||||
+ printk("Not enabling x2APIC: disabled by cmdline.\n");
|
|
||||||
+ return;
|
|
||||||
}
|
|
||||||
- else
|
|
||||||
+ printk("x2APIC: Already enabled by BIOS: Ignoring cmdline disable.\n");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ( !iommu_supports_eim() )
|
|
||||||
+ {
|
|
||||||
+ if ( !x2apic_enabled )
|
|
||||||
{
|
|
||||||
- if ( x2apic_preenabled )
|
|
||||||
- panic("x2APIC: already enabled by BIOS, but "
|
|
||||||
- "iommu_supports_eim failed!\n");
|
|
||||||
- printk("Not enabling x2APIC: depends oniommu_supports_eim\n");
|
|
||||||
+ printk("Not enabling x2APIC: depends on iommu_supports_eim.\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
+ panic("x2APIC: already enabled by BIOS, but "
|
|
||||||
+ "iommu_supports_eim failed!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
- ioapic_entries = alloc_ioapic_entries();
|
|
||||||
- if ( !ioapic_entries )
|
|
||||||
+ if ( (ioapic_entries = alloc_ioapic_entries()) == NULL )
|
|
||||||
{
|
|
||||||
printk("Allocate ioapic_entries failed\n");
|
|
||||||
goto out;
|
|
||||||
@@ -1032,13 +1020,13 @@ static void enable_bsp_x2apic(void)
|
|
||||||
goto restore_out;
|
|
||||||
}
|
|
||||||
|
|
||||||
- x2apic_enabled = 1;
|
|
||||||
+ genapic = apic_x2apic_probe();
|
|
||||||
printk("Switched to APIC driver %s.\n", genapic->name);
|
|
||||||
|
|
||||||
- if ( !x2apic_preenabled )
|
|
||||||
+ if ( !x2apic_enabled )
|
|
||||||
{
|
|
||||||
+ x2apic_enabled = 1;
|
|
||||||
__enable_x2apic();
|
|
||||||
- printk("x2APIC mode enabled.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
restore_out:
|
|
||||||
@@ -1050,24 +1038,6 @@ out:
|
|
||||||
free_ioapic_entries(ioapic_entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void enable_ap_x2apic(void)
|
|
||||||
-{
|
|
||||||
- ASSERT(smp_processor_id() != 0);
|
|
||||||
-
|
|
||||||
- /* APs only enable x2apic when BSP did so. */
|
|
||||||
- BUG_ON(!x2apic_enabled);
|
|
||||||
-
|
|
||||||
- __enable_x2apic();
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-void enable_x2apic(void)
|
|
||||||
-{
|
|
||||||
- if ( smp_processor_id() == 0 )
|
|
||||||
- enable_bsp_x2apic();
|
|
||||||
- else
|
|
||||||
- enable_ap_x2apic();
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
void __init init_apic_mappings(void)
|
|
||||||
{
|
|
||||||
unsigned long apic_phys;
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/cpu/common.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/cpu/common.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/cpu/common.c
|
|
||||||
@@ -250,8 +250,8 @@ static void __init early_cpu_detect(void
|
|
||||||
|
|
||||||
c->x86 = 4;
|
|
||||||
if (c->cpuid_level >= 0x00000001) {
|
|
||||||
- u32 junk, tfms, cap0, misc;
|
|
||||||
- cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
|
|
||||||
+ u32 cap4, tfms, cap0, misc;
|
|
||||||
+ cpuid(0x00000001, &tfms, &misc, &cap4, &cap0);
|
|
||||||
c->x86 = (tfms >> 8) & 15;
|
|
||||||
c->x86_model = (tfms >> 4) & 15;
|
|
||||||
if (c->x86 == 0xf)
|
|
||||||
@@ -260,9 +260,12 @@ static void __init early_cpu_detect(void
|
|
||||||
c->x86_model += ((tfms >> 16) & 0xF) << 4;
|
|
||||||
c->x86_mask = tfms & 15;
|
|
||||||
cap0 &= ~cleared_caps[0];
|
|
||||||
+ cap4 &= ~cleared_caps[4];
|
|
||||||
if (cap0 & (1<<19))
|
|
||||||
c->x86_cache_alignment = ((misc >> 8) & 0xff) * 8;
|
|
||||||
- c->x86_capability[0] = cap0; /* Added for Xen bootstrap */
|
|
||||||
+ /* Leaf 0x1 capabilities filled in early for Xen. */
|
|
||||||
+ c->x86_capability[0] = cap0;
|
|
||||||
+ c->x86_capability[4] = cap4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/genapic/x2apic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/genapic/x2apic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/genapic/x2apic.c
|
|
||||||
@@ -23,89 +23,44 @@
|
|
||||||
#include <xen/smp.h>
|
|
||||||
#include <asm/mach-default/mach_mpparse.h>
|
|
||||||
|
|
||||||
-static int x2apic = 1;
|
|
||||||
-boolean_param("x2apic", x2apic);
|
|
||||||
-
|
|
||||||
-static int x2apic_phys; /* By default we use logical cluster mode. */
|
|
||||||
+static int x2apic_phys; /* By default we use logical cluster mode. */
|
|
||||||
boolean_param("x2apic_phys", x2apic_phys);
|
|
||||||
|
|
||||||
-int x2apic_cmdline_disable(void)
|
|
||||||
-{
|
|
||||||
- return (x2apic == 0);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-static int probe_x2apic_phys(void)
|
|
||||||
+static void init_apic_ldr_x2apic_phys(void)
|
|
||||||
{
|
|
||||||
- return x2apic && x2apic_phys && x2apic_is_available() &&
|
|
||||||
- iommu_supports_eim();
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int probe_x2apic_cluster(void)
|
|
||||||
-{
|
|
||||||
- return x2apic && !x2apic_phys && x2apic_is_available() &&
|
|
||||||
- iommu_supports_eim();
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-const struct genapic apic_x2apic_phys = {
|
|
||||||
- APIC_INIT("x2apic_phys", probe_x2apic_phys),
|
|
||||||
- GENAPIC_X2APIC_PHYS
|
|
||||||
-};
|
|
||||||
-
|
|
||||||
-const struct genapic apic_x2apic_cluster = {
|
|
||||||
- APIC_INIT("x2apic_cluster", probe_x2apic_cluster),
|
|
||||||
- GENAPIC_X2APIC_CLUSTER
|
|
||||||
-};
|
|
||||||
-
|
|
||||||
-const struct genapic *apic_x2apic_probe(void)
|
|
||||||
-{
|
|
||||||
- if ( !x2apic || !x2apic_is_available() )
|
|
||||||
- return NULL;
|
|
||||||
-
|
|
||||||
- if ( !iommu_supports_eim() )
|
|
||||||
- return NULL;
|
|
||||||
-
|
|
||||||
- if ( x2apic_phys )
|
|
||||||
- return &apic_x2apic_phys;
|
|
||||||
- else
|
|
||||||
- return &apic_x2apic_cluster;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-void init_apic_ldr_x2apic_phys(void)
|
|
||||||
-{
|
|
||||||
- return;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-void init_apic_ldr_x2apic_cluster(void)
|
|
||||||
+static void init_apic_ldr_x2apic_cluster(void)
|
|
||||||
{
|
|
||||||
int cpu = smp_processor_id();
|
|
||||||
cpu_2_logical_apicid[cpu] = apic_read(APIC_LDR);
|
|
||||||
}
|
|
||||||
-void clustered_apic_check_x2apic(void)
|
|
||||||
+
|
|
||||||
+static void clustered_apic_check_x2apic(void)
|
|
||||||
{
|
|
||||||
- return;
|
|
||||||
}
|
|
||||||
|
|
||||||
-cpumask_t target_cpus_x2apic(void)
|
|
||||||
+static cpumask_t target_cpus_x2apic(void)
|
|
||||||
{
|
|
||||||
return cpu_online_map;
|
|
||||||
}
|
|
||||||
|
|
||||||
-cpumask_t vector_allocation_domain_x2apic(int cpu)
|
|
||||||
+static cpumask_t vector_allocation_domain_x2apic(int cpu)
|
|
||||||
{
|
|
||||||
return cpumask_of_cpu(cpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
-unsigned int cpu_mask_to_apicid_x2apic_phys(cpumask_t cpumask)
|
|
||||||
+static unsigned int cpu_mask_to_apicid_x2apic_phys(cpumask_t cpumask)
|
|
||||||
{
|
|
||||||
return cpu_physical_id(first_cpu(cpumask));
|
|
||||||
}
|
|
||||||
|
|
||||||
-unsigned int cpu_mask_to_apicid_x2apic_cluster(cpumask_t cpumask)
|
|
||||||
+static unsigned int cpu_mask_to_apicid_x2apic_cluster(cpumask_t cpumask)
|
|
||||||
{
|
|
||||||
return cpu_2_logical_apicid[first_cpu(cpumask)];
|
|
||||||
}
|
|
||||||
|
|
||||||
-void send_IPI_mask_x2apic_phys(const cpumask_t *cpumask, int vector)
|
|
||||||
+static void send_IPI_mask_x2apic_phys(const cpumask_t *cpumask, int vector)
|
|
||||||
{
|
|
||||||
unsigned int cpu, cfg;
|
|
||||||
unsigned long flags;
|
|
||||||
@@ -132,7 +87,7 @@ void send_IPI_mask_x2apic_phys(const cpu
|
|
||||||
local_irq_restore(flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
-void send_IPI_mask_x2apic_cluster(const cpumask_t *cpumask, int vector)
|
|
||||||
+static void send_IPI_mask_x2apic_cluster(const cpumask_t *cpumask, int vector)
|
|
||||||
{
|
|
||||||
unsigned int cpu, cfg;
|
|
||||||
unsigned long flags;
|
|
||||||
@@ -148,3 +103,34 @@ void send_IPI_mask_x2apic_cluster(const
|
|
||||||
|
|
||||||
local_irq_restore(flags);
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+static const struct genapic apic_x2apic_phys = {
|
|
||||||
+ APIC_INIT("x2apic_phys", NULL),
|
|
||||||
+ .int_delivery_mode = dest_Fixed,
|
|
||||||
+ .int_dest_mode = 0 /* physical delivery */,
|
|
||||||
+ .init_apic_ldr = init_apic_ldr_x2apic_phys,
|
|
||||||
+ .clustered_apic_check = clustered_apic_check_x2apic,
|
|
||||||
+ .target_cpus = target_cpus_x2apic,
|
|
||||||
+ .vector_allocation_domain = vector_allocation_domain_x2apic,
|
|
||||||
+ .cpu_mask_to_apicid = cpu_mask_to_apicid_x2apic_phys,
|
|
||||||
+ .send_IPI_mask = send_IPI_mask_x2apic_phys,
|
|
||||||
+ .send_IPI_self = send_IPI_self_x2apic
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static const struct genapic apic_x2apic_cluster = {
|
|
||||||
+ APIC_INIT("x2apic_cluster", NULL),
|
|
||||||
+ .int_delivery_mode = dest_LowestPrio,
|
|
||||||
+ .int_dest_mode = 1 /* logical delivery */,
|
|
||||||
+ .init_apic_ldr = init_apic_ldr_x2apic_cluster,
|
|
||||||
+ .clustered_apic_check = clustered_apic_check_x2apic,
|
|
||||||
+ .target_cpus = target_cpus_x2apic,
|
|
||||||
+ .vector_allocation_domain = vector_allocation_domain_x2apic,
|
|
||||||
+ .cpu_mask_to_apicid = cpu_mask_to_apicid_x2apic_cluster,
|
|
||||||
+ .send_IPI_mask = send_IPI_mask_x2apic_cluster,
|
|
||||||
+ .send_IPI_self = send_IPI_self_x2apic
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+const struct genapic *apic_x2apic_probe(void)
|
|
||||||
+{
|
|
||||||
+ return x2apic_phys ? &apic_x2apic_phys : &apic_x2apic_cluster;
|
|
||||||
+}
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/setup.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/setup.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/setup.c
|
|
||||||
@@ -1006,9 +1006,6 @@ void __init __start_xen(unsigned long mb
|
|
||||||
|
|
||||||
tboot_probe();
|
|
||||||
|
|
||||||
- /* Check if x2APIC is already enabled in BIOS */
|
|
||||||
- check_x2apic_preenabled();
|
|
||||||
-
|
|
||||||
/* Unmap the first page of CPU0's stack. */
|
|
||||||
memguard_guard_stack(cpu0_stack);
|
|
||||||
|
|
||||||
@@ -1039,8 +1036,7 @@ void __init __start_xen(unsigned long mb
|
|
||||||
|
|
||||||
init_apic_mappings();
|
|
||||||
|
|
||||||
- if ( x2apic_is_available() )
|
|
||||||
- enable_x2apic();
|
|
||||||
+ x2apic_setup();
|
|
||||||
|
|
||||||
percpu_free_unused_areas();
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/smpboot.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/smpboot.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/smpboot.c
|
|
||||||
@@ -325,8 +325,7 @@ void __devinit smp_callin(void)
|
|
||||||
*/
|
|
||||||
wait_for_init_deassert(&init_deasserted);
|
|
||||||
|
|
||||||
- if ( x2apic_enabled )
|
|
||||||
- enable_x2apic();
|
|
||||||
+ x2apic_setup();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (This works even if the APIC is not enabled.)
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/passthrough/vtd/intremap.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/passthrough/vtd/intremap.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/passthrough/vtd/intremap.c
|
|
||||||
@@ -129,15 +129,10 @@ int iommu_supports_eim(void)
|
|
||||||
struct acpi_drhd_unit *drhd;
|
|
||||||
int apic;
|
|
||||||
|
|
||||||
- if ( !iommu_enabled || !iommu_qinval || !iommu_intremap )
|
|
||||||
+ if ( !iommu_enabled || !iommu_qinval || !iommu_intremap ||
|
|
||||||
+ list_empty(&acpi_drhd_units) )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
- if ( list_empty(&acpi_drhd_units) )
|
|
||||||
- {
|
|
||||||
- dprintk(XENLOG_WARNING VTDPREFIX, "VT-d is not supported\n");
|
|
||||||
- return 0;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
/* We MUST have a DRHD unit for each IOAPIC. */
|
|
||||||
for ( apic = 0; apic < nr_ioapics; apic++ )
|
|
||||||
if ( !ioapic_to_drhd(IO_APIC_ID(apic)) )
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/apic.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/apic.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/apic.h
|
|
||||||
@@ -25,21 +25,8 @@ extern int apic_verbosity;
|
|
||||||
extern int x2apic_enabled;
|
|
||||||
extern int directed_eoi_enabled;
|
|
||||||
|
|
||||||
-extern void check_x2apic_preenabled(void);
|
|
||||||
-extern int x2apic_cmdline_disable(void);
|
|
||||||
-extern void enable_x2apic(void);
|
|
||||||
-
|
|
||||||
-static __inline int x2apic_is_available(void)
|
|
||||||
-{
|
|
||||||
- unsigned int op = 1, eax, ecx;
|
|
||||||
-
|
|
||||||
- asm ( "cpuid"
|
|
||||||
- : "=a" (eax), "=c" (ecx)
|
|
||||||
- : "0" (op)
|
|
||||||
- : "bx", "dx" );
|
|
||||||
-
|
|
||||||
- return (ecx & (1U << 21));
|
|
||||||
-}
|
|
||||||
+void x2apic_setup(void);
|
|
||||||
+const struct genapic *apic_x2apic_probe(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define the default level of output to be very little
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/genapic.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/genapic.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/genapic.h
|
|
||||||
@@ -49,8 +49,6 @@ struct genapic {
|
|
||||||
APICFUNC(acpi_madt_oem_check)
|
|
||||||
|
|
||||||
extern const struct genapic *genapic;
|
|
||||||
-extern const struct genapic apic_x2apic_phys;
|
|
||||||
-extern const struct genapic apic_x2apic_cluster;
|
|
||||||
|
|
||||||
void init_apic_ldr_flat(void);
|
|
||||||
void clustered_apic_check_flat(void);
|
|
||||||
@@ -70,39 +68,6 @@ cpumask_t vector_allocation_domain_flat(
|
|
||||||
.send_IPI_mask = send_IPI_mask_flat, \
|
|
||||||
.send_IPI_self = send_IPI_self_flat
|
|
||||||
|
|
||||||
-const struct genapic *apic_x2apic_probe(void);
|
|
||||||
-void init_apic_ldr_x2apic_phys(void);
|
|
||||||
-void init_apic_ldr_x2apic_cluster(void);
|
|
||||||
-void clustered_apic_check_x2apic(void);
|
|
||||||
-cpumask_t target_cpus_x2apic(void);
|
|
||||||
-unsigned int cpu_mask_to_apicid_x2apic_phys(cpumask_t cpumask);
|
|
||||||
-unsigned int cpu_mask_to_apicid_x2apic_cluster(cpumask_t cpumask);
|
|
||||||
-void send_IPI_mask_x2apic_phys(const cpumask_t *mask, int vector);
|
|
||||||
-void send_IPI_mask_x2apic_cluster(const cpumask_t *mask, int vector);
|
|
||||||
-void send_IPI_self_x2apic(int vector);
|
|
||||||
-cpumask_t vector_allocation_domain_x2apic(int cpu);
|
|
||||||
-#define GENAPIC_X2APIC_PHYS \
|
|
||||||
- .int_delivery_mode = dest_Fixed, \
|
|
||||||
- .int_dest_mode = 0 /* physical delivery */, \
|
|
||||||
- .init_apic_ldr = init_apic_ldr_x2apic_phys, \
|
|
||||||
- .clustered_apic_check = clustered_apic_check_x2apic, \
|
|
||||||
- .target_cpus = target_cpus_x2apic, \
|
|
||||||
- .vector_allocation_domain = vector_allocation_domain_x2apic, \
|
|
||||||
- .cpu_mask_to_apicid = cpu_mask_to_apicid_x2apic_phys, \
|
|
||||||
- .send_IPI_mask = send_IPI_mask_x2apic_phys, \
|
|
||||||
- .send_IPI_self = send_IPI_self_x2apic
|
|
||||||
-
|
|
||||||
-#define GENAPIC_X2APIC_CLUSTER \
|
|
||||||
- .int_delivery_mode = dest_LowestPrio, \
|
|
||||||
- .int_dest_mode = 1 /* logical delivery */, \
|
|
||||||
- .init_apic_ldr = init_apic_ldr_x2apic_cluster, \
|
|
||||||
- .clustered_apic_check = clustered_apic_check_x2apic, \
|
|
||||||
- .target_cpus = target_cpus_x2apic, \
|
|
||||||
- .vector_allocation_domain = vector_allocation_domain_x2apic, \
|
|
||||||
- .cpu_mask_to_apicid = cpu_mask_to_apicid_x2apic_cluster, \
|
|
||||||
- .send_IPI_mask = send_IPI_mask_x2apic_cluster, \
|
|
||||||
- .send_IPI_self = send_IPI_self_x2apic
|
|
||||||
-
|
|
||||||
void init_apic_ldr_phys(void);
|
|
||||||
void clustered_apic_check_phys(void);
|
|
||||||
cpumask_t target_cpus_phys(void);
|
|
||||||
@@ -121,4 +86,6 @@ cpumask_t vector_allocation_domain_phys(
|
|
||||||
.send_IPI_mask = send_IPI_mask_phys, \
|
|
||||||
.send_IPI_self = send_IPI_self_phys
|
|
||||||
|
|
||||||
+void send_IPI_self_x2apic(int vector);
|
|
||||||
+
|
|
||||||
#endif
|
|
@ -1,36 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1291999745 0
|
|
||||||
# Node ID 3b3fce9050b9b14f3a11123f6943998413ea7e7e
|
|
||||||
# Parent 901c118b363e978566775f9d118b4f2f15598212
|
|
||||||
hvm vlapic: Fix tmcct read logic when in periodic mode.
|
|
||||||
|
|
||||||
Signed-off-by: Keir Fraser <keir@xen.org>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/hvm/vlapic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/hvm/vlapic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/hvm/vlapic.c
|
|
||||||
@@ -428,12 +428,19 @@ int vlapic_ipi(
|
|
||||||
static uint32_t vlapic_get_tmcct(struct vlapic *vlapic)
|
|
||||||
{
|
|
||||||
struct vcpu *v = current;
|
|
||||||
- uint32_t tmcct, tmict = vlapic_get_reg(vlapic, APIC_TMICT);
|
|
||||||
+ uint32_t tmcct = 0, tmict = vlapic_get_reg(vlapic, APIC_TMICT);
|
|
||||||
uint64_t counter_passed;
|
|
||||||
|
|
||||||
counter_passed = ((hvm_get_guest_time(v) - vlapic->timer_last_update)
|
|
||||||
- / APIC_BUS_CYCLE_NS / vlapic->hw.timer_divisor);
|
|
||||||
- tmcct = tmict - counter_passed;
|
|
||||||
+ / (APIC_BUS_CYCLE_NS * vlapic->hw.timer_divisor));
|
|
||||||
+
|
|
||||||
+ if ( tmict != 0 )
|
|
||||||
+ {
|
|
||||||
+ if ( vlapic_lvtt_period(vlapic) )
|
|
||||||
+ counter_passed %= tmict;
|
|
||||||
+ if ( counter_passed < tmict )
|
|
||||||
+ tmcct = tmict - counter_passed;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
HVM_DBG_LOG(DBG_LEVEL_VLAPIC_TIMER,
|
|
||||||
"timer initial count %d, timer current count %d, "
|
|
@ -1,102 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1292320377 0
|
|
||||||
# Node ID fd4cbfbbd83e6091a343844eae1da1468f54b72b
|
|
||||||
# Parent ab785e37499c8cdadd1fd5e4ab1bfbbacebf358b
|
|
||||||
x86/iommu: don't map RAM holes above 4G
|
|
||||||
References: bnc#658163
|
|
||||||
|
|
||||||
Matching the comment in iommu_set_dom0_mapping(), map only actual RAM
|
|
||||||
from the address range starting at 4G. It's not clear though whether
|
|
||||||
that comment is actually correct (which is why I'm sending this as
|
|
||||||
RFC), but it is certain that on systems with sparse physical memory
|
|
||||||
map we're currently wasting a potentially significant amount of memory
|
|
||||||
for setting up IOMMU page tables that will never be used.
|
|
||||||
|
|
||||||
The main question is what happens for MMIO ranges living above 4G. Of
|
|
||||||
course, the same issue would currently exist for any such ranges
|
|
||||||
sitting beyond the end of RAM.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
--- a/xen/arch/x86/domain_build.c
|
|
||||||
+++ b/xen/arch/x86/domain_build.c
|
|
||||||
@@ -194,7 +194,7 @@ static unsigned long __init compute_dom0
|
|
||||||
unsigned int s;
|
|
||||||
|
|
||||||
for ( s = 9; s < BITS_PER_LONG; s += 9 )
|
|
||||||
- avail -= max_page >> s;
|
|
||||||
+ avail -= max_pdx >> s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
|
|
||||||
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
|
|
||||||
@@ -239,8 +239,16 @@ static void amd_iommu_dom0_init(struct d
|
|
||||||
if ( !iommu_passthrough && !need_iommu(d) )
|
|
||||||
{
|
|
||||||
/* Set up 1:1 page table for dom0 */
|
|
||||||
- for ( i = 0; i < max_page; i++ )
|
|
||||||
- amd_iommu_map_page(d, i, i, IOMMUF_readable|IOMMUF_writable);
|
|
||||||
+ for ( i = 0; i < max_pdx; i++ )
|
|
||||||
+ {
|
|
||||||
+ unsigned long pfn = pdx_to_pfn(i);
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * XXX Should we really map all non-RAM (above 4G)? Minimally
|
|
||||||
+ * a pfn_valid() check would seem desirable here.
|
|
||||||
+ */
|
|
||||||
+ amd_iommu_map_page(d, pfn, pfn, IOMMUF_readable|IOMMUF_writable);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
amd_iommu_setup_dom0_devices(d);
|
|
||||||
--- a/xen/drivers/passthrough/vtd/x86/vtd.c
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/x86/vtd.c
|
|
||||||
@@ -128,14 +128,14 @@ void hvm_dpci_isairq_eoi(struct domain *
|
|
||||||
|
|
||||||
void iommu_set_dom0_mapping(struct domain *d)
|
|
||||||
{
|
|
||||||
- u64 i, j, tmp, max_pfn;
|
|
||||||
+ unsigned long i, j, tmp, top;
|
|
||||||
extern int xen_in_range(unsigned long mfn);
|
|
||||||
|
|
||||||
BUG_ON(d->domain_id != 0);
|
|
||||||
|
|
||||||
- max_pfn = max_t(u64, max_page, 0x100000000ull >> PAGE_SHIFT);
|
|
||||||
+ top = max(max_pdx, pfn_to_pdx(0xffffffffUL >> PAGE_SHIFT) + 1);
|
|
||||||
|
|
||||||
- for ( i = 0; i < max_pfn; i++ )
|
|
||||||
+ for ( i = 0; i < top; i++ )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Set up 1:1 mapping for dom0. Default to use only conventional RAM
|
|
||||||
@@ -143,18 +143,23 @@ void iommu_set_dom0_mapping(struct domai
|
|
||||||
* inclusive mapping maps in everything below 4GB except unusable
|
|
||||||
* ranges.
|
|
||||||
*/
|
|
||||||
- if ( !page_is_ram_type(i, RAM_TYPE_CONVENTIONAL) &&
|
|
||||||
- (!iommu_inclusive_mapping ||
|
|
||||||
- page_is_ram_type(i, RAM_TYPE_UNUSABLE)) )
|
|
||||||
+ unsigned long pfn = pdx_to_pfn(i);
|
|
||||||
+
|
|
||||||
+ if ( pfn > (0xffffffffUL >> PAGE_SHIFT) ?
|
|
||||||
+ (!mfn_valid(pfn) ||
|
|
||||||
+ !page_is_ram_type(pfn, RAM_TYPE_CONVENTIONAL)) :
|
|
||||||
+ iommu_inclusive_mapping ?
|
|
||||||
+ page_is_ram_type(pfn, RAM_TYPE_UNUSABLE) :
|
|
||||||
+ !page_is_ram_type(pfn, RAM_TYPE_CONVENTIONAL) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Exclude Xen bits */
|
|
||||||
- if ( xen_in_range(i) )
|
|
||||||
+ if ( xen_in_range(pfn) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
tmp = 1 << (PAGE_SHIFT - PAGE_SHIFT_4K);
|
|
||||||
for ( j = 0; j < tmp; j++ )
|
|
||||||
- iommu_map_page(d, (i*tmp+j), (i*tmp+j),
|
|
||||||
+ iommu_map_page(d, pfn * tmp + j, pfn * tmp + j,
|
|
||||||
IOMMUF_readable|IOMMUF_writable);
|
|
||||||
|
|
||||||
if (!(i & (0xfffff >> (PAGE_SHIFT - PAGE_SHIFT_4K))))
|
|
@ -1,177 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1292413934 0
|
|
||||||
# Node ID 548c808be2a6f166657ce7cfb86df7a296a9526a
|
|
||||||
# Parent c0662cb08260d831ae8d211ba16fc7038cb889b6
|
|
||||||
x86: mpparse and cstate need to use 32bit apic id
|
|
||||||
References: bnc#656369, bnc#658704
|
|
||||||
|
|
||||||
Instead of going with mpc_config_processor struct.
|
|
||||||
that field ony have 8 bits.
|
|
||||||
|
|
||||||
We should not change that struct, because it is shared with mptable.
|
|
||||||
|
|
||||||
Also need to increase MAX_APICS.
|
|
||||||
|
|
||||||
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
|
|
||||||
|
|
||||||
Rather than using a fixed value of 512, make this scale with NR_CPUS
|
|
||||||
(which obviously still doesn't cover all theoretically possible
|
|
||||||
systems, but at least allows some build time control).
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/acpi/cpu_idle.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/acpi/cpu_idle.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/acpi/cpu_idle.c
|
|
||||||
@@ -742,7 +742,7 @@ static void set_cx(
|
|
||||||
int get_cpu_id(u8 acpi_id)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
- u8 apic_id;
|
|
||||||
+ u32 apic_id;
|
|
||||||
|
|
||||||
apic_id = x86_acpiid_to_apicid[acpi_id];
|
|
||||||
if ( apic_id == 0xff )
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/mpparse.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/mpparse.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/mpparse.c
|
|
||||||
@@ -99,7 +99,8 @@ static int mpc_record;
|
|
||||||
static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata;
|
|
||||||
|
|
||||||
/* Return xen's logical cpu_id of the new added cpu or <0 if error */
|
|
||||||
-static int __devinit MP_processor_info (struct mpc_config_processor *m)
|
|
||||||
+static int __devinit MP_processor_info_x(struct mpc_config_processor *m,
|
|
||||||
+ u32 apicidx)
|
|
||||||
{
|
|
||||||
int ver, apicid, cpu = 0;
|
|
||||||
physid_mask_t phys_cpu;
|
|
||||||
@@ -107,7 +108,7 @@ static int __devinit MP_processor_info (
|
|
||||||
if (!(m->mpc_cpuflag & CPU_ENABLED))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
- apicid = mpc_apic_id(m, translation_table[mpc_record]);
|
|
||||||
+ apicid = mpc_apic_id(m, apicidx, translation_table[mpc_record]);
|
|
||||||
|
|
||||||
if (m->mpc_featureflag&(1<<0))
|
|
||||||
Dprintk(" Floating point unit present.\n");
|
|
||||||
@@ -159,7 +160,7 @@ static int __devinit MP_processor_info (
|
|
||||||
|
|
||||||
if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
|
|
||||||
Dprintk(" Bootup CPU\n");
|
|
||||||
- boot_cpu_physical_apicid = m->mpc_apicid;
|
|
||||||
+ boot_cpu_physical_apicid = apicid;
|
|
||||||
}
|
|
||||||
|
|
||||||
ver = m->mpc_apicver;
|
|
||||||
@@ -170,10 +171,10 @@ static int __devinit MP_processor_info (
|
|
||||||
if (ver == 0x0) {
|
|
||||||
printk(KERN_WARNING "BIOS bug, APIC version is 0 for CPU#%d! "
|
|
||||||
"fixing up to 0x10. (tell your hw vendor)\n",
|
|
||||||
- m->mpc_apicid);
|
|
||||||
+ apicid);
|
|
||||||
ver = 0x10;
|
|
||||||
}
|
|
||||||
- apic_version[m->mpc_apicid] = ver;
|
|
||||||
+ apic_version[apicid] = ver;
|
|
||||||
|
|
||||||
phys_cpu = apicid_to_cpu_present(apicid);
|
|
||||||
physids_or(phys_cpu_present_map, phys_cpu_present_map, phys_cpu);
|
|
||||||
@@ -216,6 +217,11 @@ static int __devinit MP_processor_info (
|
|
||||||
return cpu;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int __devinit MP_processor_info(struct mpc_config_processor *m)
|
|
||||||
+{
|
|
||||||
+ return MP_processor_info_x(m, m->mpc_apicid);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void __init MP_bus_info (struct mpc_config_bus *m)
|
|
||||||
{
|
|
||||||
char str[7];
|
|
||||||
@@ -844,7 +850,7 @@ int __devinit mp_register_lapic (
|
|
||||||
struct mpc_config_processor processor;
|
|
||||||
int boot_cpu = 0;
|
|
||||||
|
|
||||||
- if (MAX_APICS - id <= 0) {
|
|
||||||
+ if (MAX_APICS <= id) {
|
|
||||||
printk(KERN_WARNING "Processor #%d invalid (max %d)\n",
|
|
||||||
id, MAX_APICS);
|
|
||||||
return -EINVAL;
|
|
||||||
@@ -864,7 +870,7 @@ int __devinit mp_register_lapic (
|
|
||||||
processor.mpc_reserved[0] = 0;
|
|
||||||
processor.mpc_reserved[1] = 0;
|
|
||||||
|
|
||||||
- return MP_processor_info(&processor);
|
|
||||||
+ return MP_processor_info_x(&processor, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mp_unregister_lapic(uint32_t apic_id, uint32_t cpu)
|
|
||||||
Index: xen-4.0.2-testing/xen/common/sched_sedf.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/common/sched_sedf.c
|
|
||||||
+++ xen-4.0.2-testing/xen/common/sched_sedf.c
|
|
||||||
@@ -124,7 +124,6 @@ struct sedf_cpu_info {
|
|
||||||
|
|
||||||
#define PERIOD_BEGIN(inf) ((inf)->deadl_abs - (inf)->period)
|
|
||||||
|
|
||||||
-#define MIN(x,y) (((x)<(y))?(x):(y))
|
|
||||||
#define DIV_UP(x,y) (((x) + (y) - 1) / y)
|
|
||||||
|
|
||||||
#define extra_runs(inf) ((inf->status) & 6)
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/mach-generic/mach_apic.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/mach-generic/mach_apic.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/mach-generic/mach_apic.h
|
|
||||||
@@ -26,15 +26,15 @@ static inline void enable_apic_mode(void
|
|
||||||
|
|
||||||
extern u32 bios_cpu_apicid[];
|
|
||||||
|
|
||||||
-static inline int mpc_apic_id(struct mpc_config_processor *m,
|
|
||||||
+static inline int mpc_apic_id(struct mpc_config_processor *m, u32 apicid,
|
|
||||||
struct mpc_config_translation *translation_record)
|
|
||||||
{
|
|
||||||
printk("Processor #%d %d:%d APIC version %d\n",
|
|
||||||
- m->mpc_apicid,
|
|
||||||
+ apicid,
|
|
||||||
(m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
|
|
||||||
(m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
|
|
||||||
m->mpc_apicver);
|
|
||||||
- return (m->mpc_apicid);
|
|
||||||
+ return apicid;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void setup_portio_remap(void)
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/mpspec_def.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/mpspec_def.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/mpspec_def.h
|
|
||||||
@@ -14,7 +14,7 @@
|
|
||||||
#define SMP_MAGIC_IDENT (('_'<<24)|('P'<<16)|('M'<<8)|'_')
|
|
||||||
|
|
||||||
#define MAX_MPC_ENTRY 1024
|
|
||||||
-#define MAX_APICS 256
|
|
||||||
+#define MAX_APICS MAX(256, 4 * NR_CPUS)
|
|
||||||
|
|
||||||
struct intel_mp_floating
|
|
||||||
{
|
|
||||||
Index: xen-4.0.2-testing/xen/include/xen/kernel.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/xen/kernel.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/xen/kernel.h
|
|
||||||
@@ -33,6 +33,13 @@
|
|
||||||
#define max_t(type,x,y) \
|
|
||||||
({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
|
|
||||||
|
|
||||||
+/*
|
|
||||||
+ * pre-processor, array size, and bit field width suitable variants;
|
|
||||||
+ * please don't use in "normal" expressions.
|
|
||||||
+ */
|
|
||||||
+#define MIN(x,y) ((x) < (y) ? (x) : (y))
|
|
||||||
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* container_of - cast a member of a structure out to the containing structure
|
|
||||||
*
|
|
@ -1,165 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1292414148 0
|
|
||||||
# Node ID d4b373ec948bed71b8683e09e41c6afc99f1edb6
|
|
||||||
# Parent 548c808be2a6f166657ce7cfb86df7a296a9526a
|
|
||||||
x86: increase MAX_LOCAL_APIC
|
|
||||||
References: bnc#656369, bnc#658704
|
|
||||||
|
|
||||||
otherwise apicid_to_node[MAX_LOCAL_APIC] will be overrun if apicid >
|
|
||||||
255. After patch, the mapping get right.
|
|
||||||
|
|
||||||
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
|
|
||||||
|
|
||||||
Make this and also MAX_MADT_ENTRIES loosely depend on NR_CPUS. Tie
|
|
||||||
MAX_APICS to MAX_LOCAL_APIC. Fix initializer of x86_acpiid_to_apicid[]
|
|
||||||
to match the array member type of u32, as well as all checks in
|
|
||||||
readers of this array and x86_cpu_to_apicid[].
|
|
||||||
|
|
||||||
While the adjustment to xen_vcpu_physid_to_x86_{acpi,apic}id() is not
|
|
||||||
backward compatible, I think it should still be done this way as the
|
|
||||||
former reserving of values beyond 0xff should never have been part of
|
|
||||||
the interface. If considered impossible, a second best solution would
|
|
||||||
appear to be to make the macros depend on __XEN_INTERFACE_VERSION__.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/acpi/boot.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/acpi/boot.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/acpi/boot.c
|
|
||||||
@@ -82,7 +82,7 @@ u8 acpi_enable_value, acpi_disable_value
|
|
||||||
#endif
|
|
||||||
|
|
||||||
u32 x86_acpiid_to_apicid[MAX_MADT_ENTRIES] =
|
|
||||||
- {[0 ... MAX_MADT_ENTRIES - 1] = 0xff };
|
|
||||||
+ {[0 ... MAX_MADT_ENTRIES - 1] = BAD_APICID };
|
|
||||||
EXPORT_SYMBOL(x86_acpiid_to_apicid);
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
|
||||||
@@ -534,6 +534,7 @@ static int __init acpi_parse_madt_lapic_
|
|
||||||
|
|
||||||
mp_register_lapic_address(acpi_lapic_addr);
|
|
||||||
|
|
||||||
+ BUILD_BUG_ON(MAX_APICS != MAX_LOCAL_APIC);
|
|
||||||
count = acpi_table_parse_madt(ACPI_MADT_LAPIC, acpi_parse_lapic,
|
|
||||||
MAX_APICS);
|
|
||||||
x2count = acpi_table_parse_madt(ACPI_MADT_X2APIC, acpi_parse_x2apic,
|
|
||||||
@@ -998,12 +999,12 @@ unsigned int acpi_get_processor_id(unsig
|
|
||||||
{
|
|
||||||
unsigned int acpiid, apicid;
|
|
||||||
|
|
||||||
- if ((apicid = x86_cpu_to_apicid[cpu]) == 0xff)
|
|
||||||
- return 0xff;
|
|
||||||
+ if ((apicid = x86_cpu_to_apicid[cpu]) == BAD_APICID)
|
|
||||||
+ return INVALID_ACPIID;
|
|
||||||
|
|
||||||
for (acpiid = 0; acpiid < ARRAY_SIZE(x86_acpiid_to_apicid); acpiid++)
|
|
||||||
if (x86_acpiid_to_apicid[acpiid] == apicid)
|
|
||||||
return acpiid;
|
|
||||||
|
|
||||||
- return 0xff;
|
|
||||||
+ return INVALID_ACPIID;
|
|
||||||
}
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/acpi/cpu_idle.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/acpi/cpu_idle.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/acpi/cpu_idle.c
|
|
||||||
@@ -745,7 +745,7 @@ int get_cpu_id(u8 acpi_id)
|
|
||||||
u32 apic_id;
|
|
||||||
|
|
||||||
apic_id = x86_acpiid_to_apicid[acpi_id];
|
|
||||||
- if ( apic_id == 0xff )
|
|
||||||
+ if ( apic_id == BAD_APICID )
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
for ( i = 0; i < NR_CPUS; i++ )
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/smpboot.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/smpboot.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/smpboot.c
|
|
||||||
@@ -96,7 +96,7 @@ struct cpuinfo_x86 cpu_data[NR_CPUS];
|
|
||||||
EXPORT_SYMBOL(cpu_data);
|
|
||||||
|
|
||||||
u32 x86_cpu_to_apicid[NR_CPUS] __read_mostly =
|
|
||||||
- { [0 ... NR_CPUS-1] = -1U };
|
|
||||||
+ { [0 ... NR_CPUS-1] = BAD_APICID };
|
|
||||||
EXPORT_SYMBOL(x86_cpu_to_apicid);
|
|
||||||
|
|
||||||
static void map_cpu_to_logical_apicid(void);
|
|
||||||
@@ -1479,7 +1479,7 @@ int cpu_add(uint32_t apic_id, uint32_t a
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* Detect if the cpu has been added before */
|
|
||||||
- if ( x86_acpiid_to_apicid[acpi_id] != 0xff)
|
|
||||||
+ if ( x86_acpiid_to_apicid[acpi_id] != BAD_APICID )
|
|
||||||
{
|
|
||||||
if (x86_acpiid_to_apicid[acpi_id] != apic_id)
|
|
||||||
return -EINVAL;
|
|
||||||
@@ -1513,7 +1513,7 @@ int cpu_add(uint32_t apic_id, uint32_t a
|
|
||||||
{
|
|
||||||
dprintk(XENLOG_WARNING,
|
|
||||||
"Setup node failed for pxm %x\n", pxm);
|
|
||||||
- x86_acpiid_to_apicid[acpi_id] = 0xff;
|
|
||||||
+ x86_acpiid_to_apicid[acpi_id] = BAD_APICID;
|
|
||||||
mp_unregister_lapic(apic_id, cpu);
|
|
||||||
spin_unlock(&cpu_add_remove_lock);
|
|
||||||
return node;
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/acpi.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/acpi.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/acpi.h
|
|
||||||
@@ -150,9 +150,11 @@ struct acpi_sleep_info {
|
|
||||||
|
|
||||||
#endif /* CONFIG_ACPI_SLEEP */
|
|
||||||
|
|
||||||
-#define MAX_MADT_ENTRIES 256
|
|
||||||
+#define MAX_MADT_ENTRIES MAX(256, 2 * NR_CPUS)
|
|
||||||
extern u32 x86_acpiid_to_apicid[];
|
|
||||||
-#define MAX_LOCAL_APIC 256
|
|
||||||
+#define MAX_LOCAL_APIC MAX(256, 4 * NR_CPUS)
|
|
||||||
+
|
|
||||||
+#define INVALID_ACPIID (-1U)
|
|
||||||
|
|
||||||
extern u32 pmtmr_ioport;
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/numa.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/numa.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/numa.h
|
|
||||||
@@ -39,7 +39,7 @@ extern int setup_node(int pxm);
|
|
||||||
extern void srat_detect_node(int cpu);
|
|
||||||
|
|
||||||
extern void setup_node_bootmem(int nodeid, u64 start, u64 end);
|
|
||||||
-extern unsigned char apicid_to_node[256];
|
|
||||||
+extern unsigned char apicid_to_node[];
|
|
||||||
#ifdef CONFIG_NUMA
|
|
||||||
extern void __init init_cpu_to_node(void);
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/include/public/vcpu.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/public/vcpu.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/public/vcpu.h
|
|
||||||
@@ -187,8 +187,7 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_register_vc
|
|
||||||
/*
|
|
||||||
* Get the physical ID information for a pinned vcpu's underlying physical
|
|
||||||
* processor. The physical ID informmation is architecture-specific.
|
|
||||||
- * On x86: id[31:0]=apic_id, id[63:32]=acpi_id, and all values 0xff and
|
|
||||||
- * greater are reserved.
|
|
||||||
+ * On x86: id[31:0]=apic_id, id[63:32]=acpi_id.
|
|
||||||
* This command returns -EINVAL if it is not a valid operation for this VCPU.
|
|
||||||
*/
|
|
||||||
#define VCPUOP_get_physid 12 /* arg == vcpu_get_physid_t */
|
|
||||||
@@ -197,10 +196,8 @@ struct vcpu_get_physid {
|
|
||||||
};
|
|
||||||
typedef struct vcpu_get_physid vcpu_get_physid_t;
|
|
||||||
DEFINE_XEN_GUEST_HANDLE(vcpu_get_physid_t);
|
|
||||||
-#define xen_vcpu_physid_to_x86_apicid(physid) \
|
|
||||||
- ((((uint32_t)(physid)) >= 0xff) ? 0xff : ((uint8_t)(physid)))
|
|
||||||
-#define xen_vcpu_physid_to_x86_acpiid(physid) \
|
|
||||||
- ((((uint32_t)((physid)>>32)) >= 0xff) ? 0xff : ((uint8_t)((physid)>>32)))
|
|
||||||
+#define xen_vcpu_physid_to_x86_apicid(physid) ((uint32_t)(physid))
|
|
||||||
+#define xen_vcpu_physid_to_x86_acpiid(physid) ((uint32_t)((physid) >> 32))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Register a memory location to get a secondary copy of the vcpu time
|
|
@ -1,88 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1292414185 0
|
|
||||||
# Node ID fcc91cb3efcb83823b7e9c74ee3c97c4a9c0b7d5
|
|
||||||
# Parent d4b373ec948bed71b8683e09e41c6afc99f1edb6
|
|
||||||
x86: x2apic pre-enabled but intr-remapping is not enabled
|
|
||||||
References: bnc#656369, bnc#658704
|
|
||||||
|
|
||||||
Make it aligned with Linux kernel.
|
|
||||||
|
|
||||||
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
|
|
||||||
|
|
||||||
Removed unnecessary bits from the original patch, and removed
|
|
||||||
intremap_enabled() with its only caller gone.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/apic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
@@ -964,15 +964,6 @@ void x2apic_setup(void)
|
|
||||||
rdmsr(MSR_IA32_APICBASE, lo, hi);
|
|
||||||
if ( lo & MSR_IA32_APICBASE_EXTD )
|
|
||||||
{
|
|
||||||
- /*
|
|
||||||
- * Interrupt remapping should be also enabled by BIOS when
|
|
||||||
- * x2APIC is already enabled by BIOS, otherwise it's a BIOS
|
|
||||||
- * bug
|
|
||||||
- */
|
|
||||||
- if ( !intremap_enabled() )
|
|
||||||
- panic("Interrupt remapping is not enabled by BIOS while "
|
|
||||||
- "x2APIC is already enabled by BIOS!\n");
|
|
||||||
-
|
|
||||||
printk("x2APIC mode is already enabled by BIOS.\n");
|
|
||||||
x2apic_enabled = 1;
|
|
||||||
}
|
|
||||||
@@ -1015,6 +1006,10 @@ void x2apic_setup(void)
|
|
||||||
|
|
||||||
if ( iommu_enable_IR() )
|
|
||||||
{
|
|
||||||
+ if ( x2apic_enabled )
|
|
||||||
+ panic("Interrupt remapping could not be enabled while "
|
|
||||||
+ "x2APIC is already enabled by BIOS!\n");
|
|
||||||
+
|
|
||||||
printk("Would not enable x2APIC due to interrupt remapping "
|
|
||||||
"cannot be enabled.\n");
|
|
||||||
goto restore_out;
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/passthrough/vtd/intremap.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/passthrough/vtd/intremap.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/passthrough/vtd/intremap.c
|
|
||||||
@@ -892,23 +892,3 @@ void iommu_disable_IR(void)
|
|
||||||
for_each_drhd_unit ( drhd )
|
|
||||||
disable_qinval(drhd->iommu);
|
|
||||||
}
|
|
||||||
-
|
|
||||||
-/*
|
|
||||||
- * Check if interrupt remapping is enabled or not
|
|
||||||
- * return 1: enabled
|
|
||||||
- * return 0: not enabled
|
|
||||||
- */
|
|
||||||
-int intremap_enabled(void)
|
|
||||||
-{
|
|
||||||
- struct acpi_drhd_unit *drhd;
|
|
||||||
- u32 sts;
|
|
||||||
-
|
|
||||||
- for_each_drhd_unit ( drhd )
|
|
||||||
- {
|
|
||||||
- sts = dmar_readl(drhd->iommu->reg, DMAR_GSTS_REG);
|
|
||||||
- if ( !(sts & DMA_GSTS_IRES) )
|
|
||||||
- return 0;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- return 1;
|
|
||||||
-}
|
|
||||||
Index: xen-4.0.2-testing/xen/include/xen/iommu.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/xen/iommu.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/xen/iommu.h
|
|
||||||
@@ -62,7 +62,6 @@ int iommu_setup(void);
|
|
||||||
int iommu_supports_eim(void);
|
|
||||||
int iommu_enable_IR(void);
|
|
||||||
void iommu_disable_IR(void);
|
|
||||||
-int intremap_enabled(void);
|
|
||||||
|
|
||||||
int iommu_add_device(struct pci_dev *pdev);
|
|
||||||
int iommu_remove_device(struct pci_dev *pdev);
|
|
@ -1,60 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1294220923 0
|
|
||||||
# Node ID 76d897a06b316bf2278220b006d578faf31ce3fb
|
|
||||||
# Parent fece73d4d30985ce40ef87dcd379ce6beb8aadf3
|
|
||||||
x86 amd: Revert 6382:b74c15e4dd4f (AMD flush filter configuration)
|
|
||||||
|
|
||||||
Flush filter is not reliably supported by any processor, we already
|
|
||||||
have code to unconditionally disable the filter, so we don't need the
|
|
||||||
command-line config option. Remove it.
|
|
||||||
|
|
||||||
Signed-off-by: Keir Fraser <keir@xen.org>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/cpu/amd.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/cpu/amd.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/cpu/amd.c
|
|
||||||
@@ -237,20 +237,6 @@ int cpu_has_amd_erratum(const struct cpu
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-/*
|
|
||||||
- * amd_flush_filter={on,off}. Forcibly Enable or disable the TLB flush
|
|
||||||
- * filter on AMD 64-bit processors.
|
|
||||||
- */
|
|
||||||
-static int flush_filter_force;
|
|
||||||
-static void flush_filter(char *s)
|
|
||||||
-{
|
|
||||||
- if (!strcmp(s, "off"))
|
|
||||||
- flush_filter_force = -1;
|
|
||||||
- if (!strcmp(s, "on"))
|
|
||||||
- flush_filter_force = 1;
|
|
||||||
-}
|
|
||||||
-custom_param("amd_flush_filter", flush_filter);
|
|
||||||
-
|
|
||||||
#define num_physpages 0
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -545,21 +531,6 @@ static void __devinit init_amd(struct cp
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (c->x86 == 15) {
|
|
||||||
- rdmsr(MSR_K7_HWCR, l, h);
|
|
||||||
- printk(KERN_INFO "CPU%d: AMD Flush Filter %sabled",
|
|
||||||
- smp_processor_id(), (l & (1<<6)) ? "dis" : "en");
|
|
||||||
- if ((flush_filter_force > 0) && (l & (1<<6))) {
|
|
||||||
- l &= ~(1<<6);
|
|
||||||
- printk(" -> Forcibly enabled");
|
|
||||||
- } else if ((flush_filter_force < 0) && !(l & (1<<6))) {
|
|
||||||
- l |= 1<<6;
|
|
||||||
- printk(" -> Forcibly disabled");
|
|
||||||
- }
|
|
||||||
- wrmsr(MSR_K7_HWCR, l, h);
|
|
||||||
- printk("\n");
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
display_cacheinfo(c);
|
|
||||||
|
|
||||||
if (cpuid_eax(0x80000000) >= 0x80000008) {
|
|
@ -1,77 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1294648952 0
|
|
||||||
# Node ID 08bb0eefe87107c30a9bdc6d72f26b20c55ae687
|
|
||||||
# Parent 66e8062894641e5622aa6adc54297d5700b1cea3
|
|
||||||
x86-64: don't allow wrmsr to MSR_FAM10H_MMIO_CONF_BASE when Xen itself is using it
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1294741846 0
|
|
||||||
# Node ID a2dcebb88bc4571d64b3f30c1fbb33cfe4f6e2c5
|
|
||||||
# Parent 1ae74f060a39ae1305b3a434d0faa1a19853fdab
|
|
||||||
x86-64: refine access permission check for wrmsr to MSR_FAM10H_MMIO_CONF_BASE
|
|
||||||
|
|
||||||
We really don't want the mmconf window to move/disappear whenever we
|
|
||||||
use is ourselves, not only when we enabled it.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/traps.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/traps.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/traps.c
|
|
||||||
@@ -1716,6 +1716,10 @@ static int is_cpufreq_controller(struct
|
|
||||||
(d->domain_id == 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
+#ifdef CONFIG_X86_64
|
|
||||||
+#include "x86_64/mmconfig.h"
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
static int emulate_privileged_op(struct cpu_user_regs *regs)
|
|
||||||
{
|
|
||||||
struct vcpu *v = current;
|
|
||||||
@@ -2275,7 +2279,13 @@ static int emulate_privileged_op(struct
|
|
||||||
goto fail;
|
|
||||||
if ( !IS_PRIV(v->domain) )
|
|
||||||
break;
|
|
||||||
- if ( (rdmsr_safe(MSR_FAM10H_MMIO_CONF_BASE, l, h) != 0) ||
|
|
||||||
+ if ( (rdmsr_safe(MSR_FAM10H_MMIO_CONF_BASE, l, h) != 0) )
|
|
||||||
+ goto fail;
|
|
||||||
+ if (
|
|
||||||
+#ifdef CONFIG_X86_64
|
|
||||||
+ (pci_probe & PCI_PROBE_MASK) == PCI_PROBE_MMCONF ?
|
|
||||||
+ eax != l || edx != h :
|
|
||||||
+#endif
|
|
||||||
(((((u64)h << 32) | l) ^ val) &
|
|
||||||
~( FAM10H_MMIO_CONF_ENABLE |
|
|
||||||
(FAM10H_MMIO_CONF_BUSRANGE_MASK <<
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/x86_64/mmconfig.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/x86_64/mmconfig.h
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/x86_64/mmconfig.h
|
|
||||||
@@ -34,6 +34,8 @@
|
|
||||||
|
|
||||||
#define PCI_VENDOR_ID_NVIDIA 0x10de
|
|
||||||
|
|
||||||
+extern unsigned int pci_probe;
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* AMD Fam10h CPUs are buggy, and cannot access MMIO config space
|
|
||||||
* on their northbrige except through the * %eax register. As such, you MUST
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/x86_64/mmconfig-shared.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/x86_64/mmconfig-shared.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/x86_64/mmconfig-shared.c
|
|
||||||
@@ -24,7 +24,7 @@
|
|
||||||
#include "mmconfig.h"
|
|
||||||
|
|
||||||
static int __initdata known_bridge;
|
|
||||||
-static unsigned int pci_probe = PCI_PROBE_CONF1 | PCI_PROBE_MMCONF;
|
|
||||||
+unsigned int pci_probe = PCI_PROBE_CONF1 | PCI_PROBE_MMCONF;
|
|
||||||
|
|
||||||
static void __init parse_mmcfg(char *s)
|
|
||||||
{
|
|
@ -1,46 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1294649119 0
|
|
||||||
# Node ID 9b5d121c8805b40a4338248c346303e1e18d0c4e
|
|
||||||
# Parent 08bb0eefe87107c30a9bdc6d72f26b20c55ae687
|
|
||||||
x86_64: don't use weak symbols on x86-64
|
|
||||||
References: bnc#656369, bnc#658704
|
|
||||||
|
|
||||||
Various gcc versions inline functions that are both weak and hidden,
|
|
||||||
without even giving a warning.
|
|
||||||
|
|
||||||
Certainly the risk exists that we'll see the problem again when
|
|
||||||
another weak function gets introduced, but I don't see a way to
|
|
||||||
protect us from that.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Just remove the weak attribute altogether. It's the only one in
|
|
||||||
non-ia64-specific code. We can get teh same effect with ifdefs which
|
|
||||||
although a bit unsightly is better than using compiler/linker features
|
|
||||||
we cannot trust.
|
|
||||||
|
|
||||||
Signed-off-by: Keir Fraser <keir@xen.org>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/acpi/numa.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/acpi/numa.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/acpi/numa.c
|
|
||||||
@@ -120,14 +120,15 @@ static int __init acpi_parse_slit(struct
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-void __init __attribute__ ((weak))
|
|
||||||
+#ifndef CONFIG_X86
|
|
||||||
+void __init
|
|
||||||
acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
|
|
||||||
{
|
|
||||||
printk(KERN_WARNING PREFIX
|
|
||||||
"Found unsupported x2apic [0x%08x] SRAT entry\n", pa->apic_id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
static int __init
|
|
||||||
acpi_parse_x2apic_affinity(struct acpi_subtable_header *header,
|
|
@ -1,109 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1294746050 0
|
|
||||||
# Node ID 2ff199e2842b7e4f08ea99558afc32536a77280c
|
|
||||||
# Parent ca10302ac2859b43a41afe425d79ae0df29f2a9c
|
|
||||||
x86: restore x2apic pre-enabled check logic
|
|
||||||
References: bnc#656369, bnc#658704
|
|
||||||
|
|
||||||
c/s 22475 removed the early checking without replacement, neglecting
|
|
||||||
the fact that x2apic_enabled must be set early for APIC register
|
|
||||||
accesses done during second stage ACPI table parsing (rooted at
|
|
||||||
acpi_boot_init()) to work correctly. Without this, particularly
|
|
||||||
determination of the boot CPU won't work, resulting in an attempt to
|
|
||||||
bring up that CPU again as a secondary one (which fails).
|
|
||||||
|
|
||||||
Restore the functionality, now calling it from generic_apic_probe().
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/apic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
@@ -948,7 +948,6 @@ no_apic:
|
|
||||||
void x2apic_setup(void)
|
|
||||||
{
|
|
||||||
struct IO_APIC_route_entry **ioapic_entries = NULL;
|
|
||||||
- u32 lo, hi;
|
|
||||||
|
|
||||||
if ( smp_processor_id() != 0 )
|
|
||||||
{
|
|
||||||
@@ -960,14 +959,6 @@ void x2apic_setup(void)
|
|
||||||
if ( !cpu_has_x2apic )
|
|
||||||
return;
|
|
||||||
|
|
||||||
- /* Check whether x2apic mode was already enabled by the BIOS. */
|
|
||||||
- rdmsr(MSR_IA32_APICBASE, lo, hi);
|
|
||||||
- if ( lo & MSR_IA32_APICBASE_EXTD )
|
|
||||||
- {
|
|
||||||
- printk("x2APIC mode is already enabled by BIOS.\n");
|
|
||||||
- x2apic_enabled = 1;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
if ( !opt_x2apic )
|
|
||||||
{
|
|
||||||
if ( !x2apic_enabled )
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/genapic/probe.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/genapic/probe.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/genapic/probe.c
|
|
||||||
@@ -59,8 +59,10 @@ custom_param("apic", genapic_apic_force)
|
|
||||||
|
|
||||||
void __init generic_apic_probe(void)
|
|
||||||
{
|
|
||||||
- int i;
|
|
||||||
- int changed = cmdline_apic = (genapic != NULL);
|
|
||||||
+ int i, changed;
|
|
||||||
+
|
|
||||||
+ check_x2apic_preenabled();
|
|
||||||
+ cmdline_apic = changed = (genapic != NULL);
|
|
||||||
|
|
||||||
for (i = 0; !changed && apic_probe[i]; i++) {
|
|
||||||
if (apic_probe[i]->probe()) {
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/genapic/x2apic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/genapic/x2apic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/genapic/x2apic.c
|
|
||||||
@@ -20,6 +20,8 @@
|
|
||||||
#include <xen/cpumask.h>
|
|
||||||
#include <asm/apicdef.h>
|
|
||||||
#include <asm/genapic.h>
|
|
||||||
+#include <asm/msr.h>
|
|
||||||
+#include <asm/processor.h>
|
|
||||||
#include <xen/smp.h>
|
|
||||||
#include <asm/mach-default/mach_mpparse.h>
|
|
||||||
|
|
||||||
@@ -134,3 +136,20 @@ const struct genapic *apic_x2apic_probe(
|
|
||||||
{
|
|
||||||
return x2apic_phys ? &apic_x2apic_phys : &apic_x2apic_cluster;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+void __init check_x2apic_preenabled(void)
|
|
||||||
+{
|
|
||||||
+ u32 lo, hi;
|
|
||||||
+
|
|
||||||
+ if ( !cpu_has_x2apic )
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ /* Check whether x2apic mode was already enabled by the BIOS. */
|
|
||||||
+ rdmsr(MSR_IA32_APICBASE, lo, hi);
|
|
||||||
+ if ( lo & MSR_IA32_APICBASE_EXTD )
|
|
||||||
+ {
|
|
||||||
+ printk("x2APIC mode is already enabled by BIOS.\n");
|
|
||||||
+ x2apic_enabled = 1;
|
|
||||||
+ genapic = apic_x2apic_probe();
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/apic.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/apic.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/apic.h
|
|
||||||
@@ -25,6 +25,7 @@ extern int apic_verbosity;
|
|
||||||
extern int x2apic_enabled;
|
|
||||||
extern int directed_eoi_enabled;
|
|
||||||
|
|
||||||
+void check_x2apic_preenabled(void);
|
|
||||||
void x2apic_setup(void);
|
|
||||||
const struct genapic *apic_x2apic_probe(void);
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1294746099 0
|
|
||||||
# Node ID 7926538a633297d65a5d6324bf9bd0eb158a6aff
|
|
||||||
# Parent 2ff199e2842b7e4f08ea99558afc32536a77280c
|
|
||||||
xenctx: misc adjustments
|
|
||||||
|
|
||||||
- fix off-by-one errors during symbol insertion and lookup
|
|
||||||
- don't store the symbol type, as it wasn't needed at all so far and
|
|
||||||
is only needed now at parsing time
|
|
||||||
- don't insert certain kinds of symbols
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/xentrace/xenctx.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/xentrace/xenctx.c
|
|
||||||
+++ xen-4.0.2-testing/tools/xentrace/xenctx.c
|
|
||||||
@@ -19,6 +19,7 @@
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
|
||||||
+#include <ctype.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
@@ -58,7 +59,6 @@ int disp_tlb;
|
|
||||||
|
|
||||||
struct symbol {
|
|
||||||
guest_word_t address;
|
|
||||||
- char type;
|
|
||||||
char *name;
|
|
||||||
struct symbol *next;
|
|
||||||
} *symbol_table = NULL;
|
|
||||||
@@ -112,12 +112,12 @@ static void insert_symbol(struct symbol
|
|
||||||
|
|
||||||
/* The System.map is usually already sorted... */
|
|
||||||
if (prev
|
|
||||||
- && prev->address < symbol->address
|
|
||||||
+ && prev->address <= symbol->address
|
|
||||||
&& (!prev->next || prev->next->address > symbol->address)) {
|
|
||||||
s = prev;
|
|
||||||
} else {
|
|
||||||
/* ... otherwise do crappy/slow search for the correct place */
|
|
||||||
- while(s && s->next && s->next->address < symbol->address)
|
|
||||||
+ while (s->next && s->next->address <= symbol->address)
|
|
||||||
s = s->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -130,13 +130,13 @@ static struct symbol *lookup_symbol(gues
|
|
||||||
{
|
|
||||||
struct symbol *s = symbol_table;
|
|
||||||
|
|
||||||
- while(s && s->next && s->next->address < address)
|
|
||||||
- s = s->next;
|
|
||||||
+ if (!s)
|
|
||||||
+ return NULL;
|
|
||||||
|
|
||||||
- if (s && s->address < address)
|
|
||||||
- return s;
|
|
||||||
+ while (s->next && s->next->address < address)
|
|
||||||
+ s = s->next;
|
|
||||||
|
|
||||||
- return NULL;
|
|
||||||
+ return s->next && s->next->address <= address ? s->next : s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_symbol(guest_word_t addr)
|
|
||||||
@@ -159,7 +159,7 @@ static void print_symbol(guest_word_t ad
|
|
||||||
|
|
||||||
static void read_symbol_table(const char *symtab)
|
|
||||||
{
|
|
||||||
- char line[256];
|
|
||||||
+ char type, line[256];
|
|
||||||
char *p;
|
|
||||||
struct symbol *symbol;
|
|
||||||
FILE *f;
|
|
||||||
@@ -178,9 +178,13 @@ static void read_symbol_table(const char
|
|
||||||
|
|
||||||
/* need more checks for syntax here... */
|
|
||||||
symbol->address = strtoull(line, &p, 16);
|
|
||||||
- p++;
|
|
||||||
- symbol->type = *p++;
|
|
||||||
- p++;
|
|
||||||
+ if (!isspace(*p++))
|
|
||||||
+ continue;
|
|
||||||
+ type = *p++;
|
|
||||||
+ if (!isalpha(type) && type != '?')
|
|
||||||
+ continue;
|
|
||||||
+ if (!isspace(*p++))
|
|
||||||
+ continue;
|
|
||||||
|
|
||||||
/* in the future we should handle the module name
|
|
||||||
* being appended here, this would allow us to use
|
|
||||||
@@ -190,7 +194,18 @@ static void read_symbol_table(const char
|
|
||||||
p[strlen(p)-1] = '\0';
|
|
||||||
symbol->name = strdup(p);
|
|
||||||
|
|
||||||
- insert_symbol(symbol);
|
|
||||||
+ switch (type) {
|
|
||||||
+ case 'A': /* global absolute */
|
|
||||||
+ case 'a': /* local absolute */
|
|
||||||
+ break;
|
|
||||||
+ case 'U': /* undefined */
|
|
||||||
+ case 'v': /* undefined weak object */
|
|
||||||
+ case 'w': /* undefined weak function */
|
|
||||||
+ continue;
|
|
||||||
+ default:
|
|
||||||
+ insert_symbol(symbol);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (strcmp(symbol->name, "_stext") == 0)
|
|
||||||
kernel_stext = symbol->address;
|
|
@ -1,47 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Tim Deegan <Tim.Deegan@citrix.com>
|
|
||||||
# Date 1294933573 0
|
|
||||||
# Node ID b01ef59c8c805df751a8f6ae63cdd5c6a4565255
|
|
||||||
# Parent 54e91dcae649e23fd267d7afe623fbd52b1b4283
|
|
||||||
x86/mm: fix EPT PoD locking to match the normal p2m case.
|
|
||||||
|
|
||||||
This recursive-locking bug was fixed in the main p2m code in
|
|
||||||
20269:fd3d5d66c446 (in October 2009) but has lurked unseen in
|
|
||||||
the EPT side since then. Copy the fix across.
|
|
||||||
|
|
||||||
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/mm/hap/p2m-ept.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/mm/hap/p2m-ept.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/mm/hap/p2m-ept.c
|
|
||||||
@@ -37,19 +37,26 @@ static int ept_pod_check_and_populate(st
|
|
||||||
ept_entry_t *entry, int order,
|
|
||||||
p2m_query_t q)
|
|
||||||
{
|
|
||||||
+ /* Only take the lock if we don't already have it. Otherwise it
|
|
||||||
+ * wouldn't be safe to do p2m lookups with the p2m lock held */
|
|
||||||
+ int do_locking = !p2m_locked_by_me(d->arch.p2m);
|
|
||||||
int r;
|
|
||||||
- p2m_lock(d->arch.p2m);
|
|
||||||
+
|
|
||||||
+ if ( do_locking )
|
|
||||||
+ p2m_lock(d->arch.p2m);
|
|
||||||
|
|
||||||
/* Check to make sure this is still PoD */
|
|
||||||
if ( entry->avail1 != p2m_populate_on_demand )
|
|
||||||
{
|
|
||||||
- p2m_unlock(d->arch.p2m);
|
|
||||||
+ if ( do_locking )
|
|
||||||
+ p2m_unlock(d->arch.p2m);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = p2m_pod_demand_populate(d, gfn, order, q);
|
|
||||||
|
|
||||||
- p2m_unlock(d->arch.p2m);
|
|
||||||
+ if ( do_locking )
|
|
||||||
+ p2m_unlock(d->arch.p2m);
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
@ -1,264 +0,0 @@
|
|||||||
References: bnc#633573
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Allen Kay <allen.m.kay@intel.com>
|
|
||||||
# Date 1294992706 0
|
|
||||||
# Node ID 93e7bf0e1845f1a82441fb740522a9b9cb32beda
|
|
||||||
# Parent 47713825a3f910fc7cf7571947e8b3b4eab23d5f
|
|
||||||
vt-d: quirks for Sandybridge errata workaround, WLAN, VT-d fault escalation
|
|
||||||
|
|
||||||
Adding errata workaround for newly released Sandybridge processor
|
|
||||||
graphics, additional WLAN device ID's for WLAN quirk, a quirk for
|
|
||||||
masking VT-d fault escalation to IOH HW that can cause system hangs on
|
|
||||||
some OEM hardware where the BIOS erroneously escalates VT-d faults to
|
|
||||||
the platform.
|
|
||||||
|
|
||||||
Signed-off-by: Allen Kay <allen.m.kay@intel.com>
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1295625672 0
|
|
||||||
# Node ID 1637fdbfc21e2c732eca29136943a568f8f341cd
|
|
||||||
# Parent 43592043cefc8357e6e6a0ab9ba85ca480968cb1
|
|
||||||
[VTD][QUIRK] turn off Sandybridge IGD quirk by default
|
|
||||||
|
|
||||||
Turn off Sandybridge IGD quirk by default until potential issues such
|
|
||||||
as MMIO register conflict with OS device driver and proper locking in
|
|
||||||
preamble and postamble functions are addressed.
|
|
||||||
|
|
||||||
Signed-off-by: Allen Kay <allen.m.kay@intel.com>
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Allen Kay <allen.m.kay@intel.com>
|
|
||||||
# Date 1296587456 0
|
|
||||||
# Node ID 3edd21ffe407ac0e853d51aa8302d9bdb4068749
|
|
||||||
# Parent 0e2c8b75f7d233f15f8bb49d9db0579e7a350964
|
|
||||||
passthrough/vtd: disable 64-bit MMCFG quirk on 32-bit Xen
|
|
||||||
|
|
||||||
Attached patch disables pci_vtd_quirk for 32-bit Xen since 32-bit xen
|
|
||||||
does not support MMCFG access.
|
|
||||||
|
|
||||||
Signed-off-by: Allen Kay <allen.m.kay@intel.com>
|
|
||||||
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
||||||
|
|
||||||
--- a/xen/drivers/passthrough/vtd/extern.h
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/extern.h
|
|
||||||
@@ -87,5 +87,6 @@ void __init platform_quirks_init(void);
|
|
||||||
void vtd_ops_preamble_quirk(struct iommu* iommu);
|
|
||||||
void vtd_ops_postamble_quirk(struct iommu* iommu);
|
|
||||||
void me_wifi_quirk(struct domain *domain, u8 bus, u8 devfn, int map);
|
|
||||||
+void pci_vtd_quirk(struct pci_dev *pdev);
|
|
||||||
|
|
||||||
#endif // _VTD_EXTERN_H_
|
|
||||||
--- a/xen/drivers/passthrough/vtd/iommu.c
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/iommu.c
|
|
||||||
@@ -1845,6 +1845,7 @@ static void setup_dom0_devices(struct do
|
|
||||||
list_add(&pdev->domain_list, &d->arch.pdev_list);
|
|
||||||
domain_context_mapping(d, pdev->bus, pdev->devfn);
|
|
||||||
pci_enable_acs(pdev);
|
|
||||||
+ pci_vtd_quirk(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spin_unlock(&pcidevs_lock);
|
|
||||||
--- a/xen/drivers/passthrough/vtd/quirks.c
|
|
||||||
+++ b/xen/drivers/passthrough/vtd/quirks.c
|
|
||||||
@@ -47,11 +47,13 @@
|
|
||||||
#define IS_CTG(id) (id == 0x2a408086)
|
|
||||||
#define IS_ILK(id) (id == 0x00408086 || id == 0x00448086 || id== 0x00628086 || id == 0x006A8086)
|
|
||||||
#define IS_CPT(id) (id == 0x01008086 || id == 0x01048086)
|
|
||||||
+#define IS_SNB_GFX(id) (id == 0x01068086 || id == 0x01168086 || id == 0x01268086 || id == 0x01028086 || id == 0x01128086 || id == 0x01228086 || id == 0x010A8086)
|
|
||||||
|
|
||||||
u32 ioh_id;
|
|
||||||
u32 igd_id;
|
|
||||||
bool_t rwbf_quirk;
|
|
||||||
static int is_cantiga_b3;
|
|
||||||
+static int is_snb_gfx;
|
|
||||||
static u8 *igd_reg_va;
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -92,6 +94,12 @@ static void cantiga_b3_errata_init(void)
|
|
||||||
is_cantiga_b3 = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/* check for Sandybridge IGD device ID's */
|
|
||||||
+static void snb_errata_init(void)
|
|
||||||
+{
|
|
||||||
+ is_snb_gfx = IS_SNB_GFX(igd_id);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* QUIRK to workaround Cantiga IGD VT-d low power errata.
|
|
||||||
* This errata impacts IGD assignment on Cantiga systems
|
|
||||||
@@ -104,12 +112,15 @@ static void cantiga_b3_errata_init(void)
|
|
||||||
/*
|
|
||||||
* map IGD MMIO+0x2000 page to allow Xen access to IGD 3D register.
|
|
||||||
*/
|
|
||||||
-static void map_igd_reg(void)
|
|
||||||
+static void *map_igd_reg(void)
|
|
||||||
{
|
|
||||||
u64 igd_mmio, igd_reg;
|
|
||||||
|
|
||||||
- if ( !is_cantiga_b3 || igd_reg_va != NULL )
|
|
||||||
- return;
|
|
||||||
+ if ( !is_cantiga_b3 && !is_snb_gfx )
|
|
||||||
+ return NULL;
|
|
||||||
+
|
|
||||||
+ if ( igd_reg_va )
|
|
||||||
+ return igd_reg_va;
|
|
||||||
|
|
||||||
/* get IGD mmio address in PCI BAR */
|
|
||||||
igd_mmio = ((u64)pci_conf_read32(0, IGD_DEV, 0, 0x14) << 32) +
|
|
||||||
@@ -121,6 +132,7 @@ static void map_igd_reg(void)
|
|
||||||
/* ioremap this physical page */
|
|
||||||
set_fixmap_nocache(FIX_IGD_MMIO, igd_reg);
|
|
||||||
igd_reg_va = (u8 *)fix_to_virt(FIX_IGD_MMIO);
|
|
||||||
+ return igd_reg_va;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -134,6 +146,9 @@ static int cantiga_vtd_ops_preamble(stru
|
|
||||||
if ( !is_igd_drhd(drhd) || !is_cantiga_b3 )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
+ if ( !map_igd_reg() )
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* read IGD register at IGD MMIO + 0x20A4 to force IGD
|
|
||||||
* to exit low power state. Since map_igd_reg()
|
|
||||||
@@ -144,11 +159,69 @@ static int cantiga_vtd_ops_preamble(stru
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
+ * Sandybridge RC6 power management inhibit state erratum.
|
|
||||||
+ * This can cause power high power consumption.
|
|
||||||
+ * Workaround is to prevent graphics get into RC6
|
|
||||||
+ * state when doing VT-d IOTLB operations, do the VT-d
|
|
||||||
+ * IOTLB operation, and then re-enable RC6 state.
|
|
||||||
+ */
|
|
||||||
+static void snb_vtd_ops_preamble(struct iommu* iommu)
|
|
||||||
+{
|
|
||||||
+ struct intel_iommu *intel = iommu->intel;
|
|
||||||
+ struct acpi_drhd_unit *drhd = intel ? intel->drhd : NULL;
|
|
||||||
+ s_time_t start_time;
|
|
||||||
+
|
|
||||||
+ if ( !is_igd_drhd(drhd) || !is_snb_gfx )
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ if ( !map_igd_reg() )
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ *((volatile u32 *)(igd_reg_va + 0x54)) = 0x000FFFFF;
|
|
||||||
+ *((volatile u32 *)(igd_reg_va + 0x700)) = 0;
|
|
||||||
+
|
|
||||||
+ start_time = NOW();
|
|
||||||
+ while ( (*((volatile u32 *)(igd_reg_va + 0x2AC)) & 0xF) != 0 )
|
|
||||||
+ {
|
|
||||||
+ if ( NOW() > start_time + DMAR_OPERATION_TIMEOUT )
|
|
||||||
+ {
|
|
||||||
+ dprintk(XENLOG_INFO VTDPREFIX,
|
|
||||||
+ "snb_vtd_ops_preamble: failed to disable idle handshake\n");
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ cpu_relax();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ *((volatile u32*)(igd_reg_va + 0x50)) = 0x10001;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void snb_vtd_ops_postamble(struct iommu* iommu)
|
|
||||||
+{
|
|
||||||
+ struct intel_iommu *intel = iommu->intel;
|
|
||||||
+ struct acpi_drhd_unit *drhd = intel ? intel->drhd : NULL;
|
|
||||||
+
|
|
||||||
+ if ( !is_igd_drhd(drhd) || !is_snb_gfx )
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ if ( !map_igd_reg() )
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ *((volatile u32 *)(igd_reg_va + 0x54)) = 0xA;
|
|
||||||
+ *((volatile u32 *)(igd_reg_va + 0x50)) = 0x10000;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
* call before VT-d translation enable and IOTLB flush operations.
|
|
||||||
*/
|
|
||||||
+
|
|
||||||
+static int snb_igd_quirk;
|
|
||||||
+boolean_param("snb_igd_quirk", snb_igd_quirk);
|
|
||||||
+
|
|
||||||
void vtd_ops_preamble_quirk(struct iommu* iommu)
|
|
||||||
{
|
|
||||||
cantiga_vtd_ops_preamble(iommu);
|
|
||||||
+ if ( snb_igd_quirk )
|
|
||||||
+ snb_vtd_ops_preamble(iommu);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -156,7 +229,8 @@ void vtd_ops_preamble_quirk(struct iommu
|
|
||||||
*/
|
|
||||||
void vtd_ops_postamble_quirk(struct iommu* iommu)
|
|
||||||
{
|
|
||||||
- return;
|
|
||||||
+ if ( snb_igd_quirk )
|
|
||||||
+ snb_vtd_ops_postamble(iommu);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize platform identification flags */
|
|
||||||
@@ -175,6 +249,8 @@ void __init platform_quirks_init(void)
|
|
||||||
/* initialize cantiga B3 identification */
|
|
||||||
cantiga_b3_errata_init();
|
|
||||||
|
|
||||||
+ snb_errata_init();
|
|
||||||
+
|
|
||||||
/* ioremap IGD MMIO+0x2000 page */
|
|
||||||
map_igd_reg();
|
|
||||||
}
|
|
||||||
@@ -246,11 +322,14 @@ void me_wifi_quirk(struct domain *domain
|
|
||||||
id = pci_conf_read32(bus, PCI_SLOT(devfn), PCI_FUNC(devfn), 0);
|
|
||||||
switch (id)
|
|
||||||
{
|
|
||||||
- case 0x00878086:
|
|
||||||
+ case 0x00878086: /* Kilmer Peak */
|
|
||||||
case 0x00898086:
|
|
||||||
- case 0x00828086:
|
|
||||||
+ case 0x00828086: /* Taylor Peak */
|
|
||||||
case 0x00858086:
|
|
||||||
- case 0x42388086:
|
|
||||||
+ case 0x008F8086: /* Rainbow Peak */
|
|
||||||
+ case 0x00908086:
|
|
||||||
+ case 0x00918086:
|
|
||||||
+ case 0x42388086: /* Puma Peak */
|
|
||||||
case 0x422b8086:
|
|
||||||
case 0x422c8086:
|
|
||||||
map_me_phantom_function(domain, 22, map);
|
|
||||||
@@ -258,6 +337,28 @@ void me_wifi_quirk(struct domain *domain
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
|
|
||||||
+/*
|
|
||||||
+ * Mask reporting Intel VT-d faults to IOH core logic:
|
|
||||||
+ * - Some platform escalates VT-d faults to platform errors
|
|
||||||
+ * - This can cause system failure upon non-fatal VT-d faults
|
|
||||||
+ * - Potential security issue if malicious guest trigger VT-d faults
|
|
||||||
+ */
|
|
||||||
+void pci_vtd_quirk(struct pci_dev *pdev)
|
|
||||||
+{
|
|
||||||
+#ifdef CONFIG_X86_64
|
|
||||||
+ int bus = pdev->bus;
|
|
||||||
+ int dev = PCI_SLOT(pdev->devfn);
|
|
||||||
+ int func = PCI_FUNC(pdev->devfn);
|
|
||||||
+ int id, val;
|
|
||||||
+
|
|
||||||
+ id = pci_conf_read32(bus, dev, func, 0);
|
|
||||||
+ if ( id == 0x342e8086 || id == 0x3c288086 )
|
|
||||||
+ {
|
|
||||||
+ val = pci_conf_read32(bus, dev, func, 0x1AC);
|
|
||||||
+ pci_conf_write32(bus, dev, func, 0x1AC, val | (1 << 31));
|
|
||||||
}
|
|
||||||
+#endif
|
|
||||||
}
|
|
@ -1,110 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Jan Beulich <jbeulich@novell.com>
|
|
||||||
# Date 1295353690 0
|
|
||||||
# Node ID 1e7594758b28706c2b72358598ecf632ddda247b
|
|
||||||
# Parent 78e2e5a50daa1702e3fd9dbceada700cdaefd511
|
|
||||||
VT-d/ATS: misc fixes
|
|
||||||
|
|
||||||
First of all there were three places potentially de-referencing NULL
|
|
||||||
(two after an allocation failure, and one after a failed lookup).
|
|
||||||
|
|
||||||
Second, if ATS_ENABLE was already set, the device would not have got
|
|
||||||
added to the ats_devices list, potentially resulting in
|
|
||||||
dev_invalidate_iotlb() doing an incomplete job.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/drivers/passthrough/vtd/x86/ats.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/drivers/passthrough/vtd/x86/ats.c
|
|
||||||
+++ xen-4.0.2-testing/xen/drivers/passthrough/vtd/x86/ats.c
|
|
||||||
@@ -91,6 +91,9 @@ int ats_device(int seg, int bus, int dev
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
pdev = pci_get_pdev(bus, devfn);
|
|
||||||
+ if ( !pdev )
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
drhd = acpi_find_matched_drhd_unit(pdev);
|
|
||||||
if ( !drhd )
|
|
||||||
return 0;
|
|
||||||
@@ -108,6 +111,8 @@ int ats_device(int seg, int bus, int dev
|
|
||||||
if ( pos && (ats_drhd == NULL) )
|
|
||||||
{
|
|
||||||
new_drhd = xmalloc(struct acpi_drhd_unit);
|
|
||||||
+ if ( !new_drhd )
|
|
||||||
+ return 0;
|
|
||||||
memcpy(new_drhd, drhd, sizeof(struct acpi_drhd_unit));
|
|
||||||
list_add_tail(&new_drhd->list, &ats_dev_drhd_units);
|
|
||||||
}
|
|
||||||
@@ -116,9 +121,8 @@ int ats_device(int seg, int bus, int dev
|
|
||||||
|
|
||||||
int enable_ats_device(int seg, int bus, int devfn)
|
|
||||||
{
|
|
||||||
- struct pci_ats_dev *pdev;
|
|
||||||
+ struct pci_ats_dev *pdev = NULL;
|
|
||||||
u32 value;
|
|
||||||
- u16 queue_depth;
|
|
||||||
int pos;
|
|
||||||
|
|
||||||
if ( !acpi_find_matched_atsr_unit(bus, devfn) )
|
|
||||||
@@ -142,26 +146,43 @@ int enable_ats_device(int seg, int bus,
|
|
||||||
|
|
||||||
/* BUGBUG: add back seg when multi-seg platform support is enabled */
|
|
||||||
value = pci_conf_read16(bus, PCI_SLOT(devfn),
|
|
||||||
- PCI_FUNC(devfn), pos + ATS_REG_CAP);
|
|
||||||
- queue_depth = value & ATS_QUEUE_DEPTH_MASK;
|
|
||||||
-
|
|
||||||
- value = pci_conf_read16(bus, PCI_SLOT(devfn),
|
|
||||||
PCI_FUNC(devfn), pos + ATS_REG_CTL);
|
|
||||||
if ( value & ATS_ENABLE )
|
|
||||||
- return 0;
|
|
||||||
+ {
|
|
||||||
+ list_for_each_entry ( pdev, &ats_devices, list )
|
|
||||||
+ {
|
|
||||||
+ if ( pdev->bus == bus && pdev->devfn == devfn )
|
|
||||||
+ {
|
|
||||||
+ pos = 0;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if ( pos )
|
|
||||||
+ pdev = xmalloc(struct pci_ats_dev);
|
|
||||||
+ if ( !pdev )
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+
|
|
||||||
+ if ( !(value & ATS_ENABLE) )
|
|
||||||
+ {
|
|
||||||
+ value |= ATS_ENABLE;
|
|
||||||
+ pci_conf_write16(bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
|
|
||||||
+ pos + ATS_REG_CTL, value);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ( pos )
|
|
||||||
+ {
|
|
||||||
+ pdev->bus = bus;
|
|
||||||
+ pdev->devfn = devfn;
|
|
||||||
+ value = pci_conf_read16(bus, PCI_SLOT(devfn),
|
|
||||||
+ PCI_FUNC(devfn), pos + ATS_REG_CAP);
|
|
||||||
+ pdev->ats_queue_depth = value & ATS_QUEUE_DEPTH_MASK;
|
|
||||||
+ list_add(&pdev->list, &ats_devices);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- value |= ATS_ENABLE;
|
|
||||||
- pci_conf_write16(bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
|
|
||||||
- pos + ATS_REG_CTL, value);
|
|
||||||
-
|
|
||||||
- pdev = xmalloc(struct pci_ats_dev);
|
|
||||||
- pdev->bus = bus;
|
|
||||||
- pdev->devfn = devfn;
|
|
||||||
- pdev->ats_queue_depth = queue_depth;
|
|
||||||
- list_add(&(pdev->list), &ats_devices);
|
|
||||||
if ( iommu_verbose )
|
|
||||||
- dprintk(XENLOG_INFO VTDPREFIX, "%x:%x.%x: ATS is enabled\n",
|
|
||||||
- bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
|
|
||||||
+ dprintk(XENLOG_INFO VTDPREFIX, "%x:%x.%x: ATS %s enabled\n",
|
|
||||||
+ bus, PCI_SLOT(devfn), PCI_FUNC(devfn), pos ? "is" : "was");
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
}
|
|
@ -1,64 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User George Dunlap <george.dunlap@eu.citrix.com>
|
|
||||||
# Date 1295274541 0
|
|
||||||
# Node ID 3decd02e0b18ae21fb926c6bad96a4cd02c48272
|
|
||||||
# Parent 97ab84aca65cdcbce2ddccc51629fb24adb056cf
|
|
||||||
PoD,hap: Fix logdirty mode when using hardware assisted paging
|
|
||||||
|
|
||||||
When writing a writable p2m entry for a pfn, we need to mark the pfn
|
|
||||||
dirty to avoid corruption when doing live migration.
|
|
||||||
|
|
||||||
Marking the page dirty exposes another issue, where there are
|
|
||||||
excessive sweeps for zero pages if there's a mismatch between PoD
|
|
||||||
entries and cache entries. Only sweep for zero pages if we actually
|
|
||||||
need more memory.
|
|
||||||
|
|
||||||
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
|
|
||||||
Acked-by: Tim Deegan <Tim.Deegan@citrix.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/mm/p2m.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/mm/p2m.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/mm/p2m.c
|
|
||||||
@@ -1064,14 +1064,22 @@ p2m_pod_demand_populate(struct domain *d
|
|
||||||
if ( unlikely(d->is_dying) )
|
|
||||||
goto out_fail;
|
|
||||||
|
|
||||||
- /* If we're low, start a sweep */
|
|
||||||
- if ( order == 9 && page_list_empty(&p2md->pod.super) )
|
|
||||||
- p2m_pod_emergency_sweep_super(d);
|
|
||||||
-
|
|
||||||
- if ( page_list_empty(&p2md->pod.single) &&
|
|
||||||
- ( ( order == 0 )
|
|
||||||
- || (order == 9 && page_list_empty(&p2md->pod.super) ) ) )
|
|
||||||
- p2m_pod_emergency_sweep(d);
|
|
||||||
+ /* Once we've ballooned down enough that we can fill the remaining
|
|
||||||
+ * PoD entries from the cache, don't sweep even if the particular
|
|
||||||
+ * list we want to use is empty: that can lead to thrashing zero pages
|
|
||||||
+ * through the cache for no good reason. */
|
|
||||||
+ if ( p2md->pod.entry_count > p2md->pod.count )
|
|
||||||
+ {
|
|
||||||
+
|
|
||||||
+ /* If we're low, start a sweep */
|
|
||||||
+ if ( order == 9 && page_list_empty(&p2md->pod.super) )
|
|
||||||
+ p2m_pod_emergency_sweep_super(d);
|
|
||||||
+
|
|
||||||
+ if ( page_list_empty(&p2md->pod.single) &&
|
|
||||||
+ ( ( order == 0 )
|
|
||||||
+ || (order == 9 && page_list_empty(&p2md->pod.super) ) ) )
|
|
||||||
+ p2m_pod_emergency_sweep(d);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/* Keep track of the highest gfn demand-populated by a guest fault */
|
|
||||||
if ( q == p2m_guest && gfn > p2md->pod.max_guest )
|
|
||||||
@@ -1098,7 +1106,10 @@ p2m_pod_demand_populate(struct domain *d
|
|
||||||
set_p2m_entry(d, gfn_aligned, mfn, order, p2m_ram_rw);
|
|
||||||
|
|
||||||
for( i = 0 ; i < (1UL << order) ; i++ )
|
|
||||||
+ {
|
|
||||||
set_gpfn_from_mfn(mfn_x(mfn) + i, gfn_aligned + i);
|
|
||||||
+ paging_mark_dirty(d, mfn_x(mfn) + i);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
p2md->pod.entry_count -= (1 << order); /* Lock: p2m */
|
|
||||||
BUG_ON(p2md->pod.entry_count < 0);
|
|
@ -1,82 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1295625507 0
|
|
||||||
# Node ID 9bd5f65050f8014de7d0fcf9d89ed8c441f261fa
|
|
||||||
# Parent 5852612cd4c461e5219db73cc52de0c643c414e8
|
|
||||||
x86:x2apic: Disable x2apic on x86-32 permanently
|
|
||||||
|
|
||||||
x2apic initialization on x86_32 uses vcpu pointer before it is
|
|
||||||
initialized. As x2apic is unlikely to be used on x86_32, this patch
|
|
||||||
disables x2apic permanently on x86_32. It also asserts the sanity of
|
|
||||||
vcpu pointer before dereference to prevent further misuse.
|
|
||||||
|
|
||||||
Signed-off-by: Fengzhe Zhang <fengzhe.zhang@intel.com>
|
|
||||||
|
|
||||||
jb: Moved logic into check_x2apic_preenabled(), disabled dead code on
|
|
||||||
x86_32.
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/apic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/apic.c
|
|
||||||
@@ -959,6 +959,10 @@ void x2apic_setup(void)
|
|
||||||
if ( !cpu_has_x2apic )
|
|
||||||
return;
|
|
||||||
|
|
||||||
+#ifdef __i386__
|
|
||||||
+ BUG();
|
|
||||||
+#else
|
|
||||||
+
|
|
||||||
if ( !opt_x2apic )
|
|
||||||
{
|
|
||||||
if ( !x2apic_enabled )
|
|
||||||
@@ -1020,6 +1024,7 @@ restore_out:
|
|
||||||
unmask_8259A();
|
|
||||||
|
|
||||||
out:
|
|
||||||
+#endif /* !__i386__ */
|
|
||||||
if ( ioapic_entries )
|
|
||||||
free_ioapic_entries(ioapic_entries);
|
|
||||||
}
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/genapic/x2apic.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/genapic/x2apic.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/genapic/x2apic.c
|
|
||||||
@@ -25,6 +25,8 @@
|
|
||||||
#include <xen/smp.h>
|
|
||||||
#include <asm/mach-default/mach_mpparse.h>
|
|
||||||
|
|
||||||
+#ifndef __i386__
|
|
||||||
+
|
|
||||||
static int x2apic_phys; /* By default we use logical cluster mode. */
|
|
||||||
boolean_param("x2apic_phys", x2apic_phys);
|
|
||||||
|
|
||||||
@@ -137,6 +139,8 @@ const struct genapic *apic_x2apic_probe(
|
|
||||||
return x2apic_phys ? &apic_x2apic_phys : &apic_x2apic_cluster;
|
|
||||||
}
|
|
||||||
|
|
||||||
+#endif /* !__i386__ */
|
|
||||||
+
|
|
||||||
void __init check_x2apic_preenabled(void)
|
|
||||||
{
|
|
||||||
u32 lo, hi;
|
|
||||||
@@ -149,7 +153,19 @@ void __init check_x2apic_preenabled(void
|
|
||||||
if ( lo & MSR_IA32_APICBASE_EXTD )
|
|
||||||
{
|
|
||||||
printk("x2APIC mode is already enabled by BIOS.\n");
|
|
||||||
+#ifndef __i386__
|
|
||||||
x2apic_enabled = 1;
|
|
||||||
genapic = apic_x2apic_probe();
|
|
||||||
+#else
|
|
||||||
+ lo &= ~(MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_EXTD);
|
|
||||||
+ wrmsr(MSR_IA32_APICBASE, lo, hi);
|
|
||||||
+ lo |= MSR_IA32_APICBASE_ENABLE;
|
|
||||||
+ wrmsr(MSR_IA32_APICBASE, lo, hi);
|
|
||||||
+ printk("x2APIC disabled permanently on x86_32.\n");
|
|
||||||
+#endif
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+#ifdef __i386__
|
|
||||||
+ clear_bit(X86_FEATURE_X2APIC, boot_cpu_data.x86_capability);
|
|
||||||
+#endif
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Keir Fraser <keir@xen.org>
|
|
||||||
# Date 1295625605 0
|
|
||||||
# Node ID 43592043cefc8357e6e6a0ab9ba85ca480968cb1
|
|
||||||
# Parent 9bd5f65050f8014de7d0fcf9d89ed8c441f261fa
|
|
||||||
svm: migrate pirq with vcpu
|
|
||||||
|
|
||||||
hvm_migrate_pirqs() is missing in svm_do_resume().
|
|
||||||
|
|
||||||
Signed-off-by: Wei Wang <wei.wang2@amd.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/hvm/svm/svm.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/hvm/svm/svm.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/hvm/svm/svm.c
|
|
||||||
@@ -697,7 +697,7 @@ static void svm_do_resume(struct vcpu *v
|
|
||||||
{
|
|
||||||
v->arch.hvm_svm.launch_core = smp_processor_id();
|
|
||||||
hvm_migrate_timers(v);
|
|
||||||
-
|
|
||||||
+ hvm_migrate_pirqs(v);
|
|
||||||
/* Migrating to another ASID domain. Request a new ASID. */
|
|
||||||
hvm_asid_flush_vcpu(v);
|
|
||||||
}
|
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -2919,7 +2919,7 @@ class XendDomainInfo:
|
@@ -2912,7 +2912,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
|
||||||
|
@ -1,118 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Ian Jackson <ian.jackson@eu.citrix.com>
|
|
||||||
# Date 1284481903 -3600
|
|
||||||
# Node ID f71a4c18e34e86e1011662fa42c10ec54bff0688
|
|
||||||
# Parent 080b5a094d4e0acab6646125f91f988911409016
|
|
||||||
ioemu: fix VNC altgr-insert behavior
|
|
||||||
|
|
||||||
When access to a Xen DomU (Linux) from a VNC client in Windows, alt-gr
|
|
||||||
key is not working properly with Spanish keyboard. When Alt + another
|
|
||||||
key pressed, vncserver receives Altgr down, Altgr up and key down
|
|
||||||
messages in order, that causes incorrect output.
|
|
||||||
|
|
||||||
With following patch, when vncerver receives key down message, it
|
|
||||||
first check if the keysym needs altgr modifer, if it needs altgr
|
|
||||||
modifier but altgr is not 'down', sending altgr keycode before sending
|
|
||||||
key keycode.
|
|
||||||
|
|
||||||
Signed-off-by: Chunyan Liu <cyliu@novell.com>
|
|
||||||
|
|
||||||
committer: Ian Jackson <Ian.Jackson@eu.citrix.com>
|
|
||||||
git-commit-id: f95d202ed6444dacb15fbea4dee185eb0e048d9a
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/keymaps.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/keymaps.c
|
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/keymaps.c
|
|
||||||
@@ -51,6 +51,7 @@ typedef struct {
|
|
||||||
struct key_range *numlock_range;
|
|
||||||
struct key_range *shift_range;
|
|
||||||
struct key_range *localstate_range;
|
|
||||||
+ struct key_range *altgr_range;
|
|
||||||
} kbd_layout_t;
|
|
||||||
|
|
||||||
static void add_to_key_range(struct key_range **krp, int code) {
|
|
||||||
@@ -133,6 +134,10 @@ static kbd_layout_t *parse_keyboard_layo
|
|
||||||
add_to_key_range(&k->localstate_range, keycode);
|
|
||||||
//fprintf(stderr, "localstate keysym %04x keycode %d\n", keysym, keycode);
|
|
||||||
}
|
|
||||||
+ if (rest && strstr(rest, "altgr")) {
|
|
||||||
+ add_to_key_range(&k->altgr_range, keysym);
|
|
||||||
+ //fprintf(stderr, "altgr keysym %04x keycode %d\n", keysym, keycode);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/* if(keycode&0x80)
|
|
||||||
keycode=(keycode<<8)^0x80e0; */
|
|
||||||
@@ -233,3 +238,16 @@ static inline int keycode_is_shiftable(v
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+static inline int keysym_is_altgr(void *kbd_layout, int keysym)
|
|
||||||
+{
|
|
||||||
+ kbd_layout_t *k = kbd_layout;
|
|
||||||
+ struct key_range *kr;
|
|
||||||
+
|
|
||||||
+ for (kr = k->altgr_range; kr; kr = kr->next)
|
|
||||||
+ if (keysym >= kr->start && keysym <= kr->end){
|
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/vnc.c
|
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
|
||||||
@@ -1274,12 +1274,27 @@ static void press_key_shift_up(VncState
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void press_key_altgr_down(VncState *vs, int down)
|
|
||||||
+{
|
|
||||||
+ kbd_put_keycode(0xe0);
|
|
||||||
+ if (down){
|
|
||||||
+ kbd_put_keycode(0xb8 & 0x7f);
|
|
||||||
+ vs->modifiers_state[0xb8] = 1;
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ kbd_put_keycode(0xb8 | 0x80);
|
|
||||||
+ vs->modifiers_state[0xb8] = 0;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void do_key_event(VncState *vs, int down, uint32_t sym)
|
|
||||||
{
|
|
||||||
int keycode;
|
|
||||||
int shift_keys = 0;
|
|
||||||
int shift = 0;
|
|
||||||
int keypad = 0;
|
|
||||||
+ int altgr = 0;
|
|
||||||
+ int altgr_keys = 0;
|
|
||||||
|
|
||||||
if (is_graphic_console()) {
|
|
||||||
if (sym >= 'A' && sym <= 'Z') {
|
|
||||||
@@ -1289,8 +1304,11 @@ static void do_key_event(VncState *vs, i
|
|
||||||
else {
|
|
||||||
shift = keysym_is_shift(vs->kbd_layout, sym & 0xFFFF);
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ altgr = keysym_is_altgr(vs->kbd_layout, sym & 0xFFFF);
|
|
||||||
}
|
|
||||||
shift_keys = vs->modifiers_state[0x2a] | vs->modifiers_state[0x36];
|
|
||||||
+ altgr_keys = vs->modifiers_state[0xb8];
|
|
||||||
|
|
||||||
keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
|
|
||||||
if (keycode == 0) {
|
|
||||||
@@ -1357,6 +1375,11 @@ static void do_key_event(VncState *vs, i
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_graphic_console()) {
|
|
||||||
+
|
|
||||||
+ if (altgr && !altgr_keys) {
|
|
||||||
+ press_key_altgr_down(vs, down);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
/* If the shift state needs to change then simulate an additional
|
|
||||||
keypress before sending this one. Ignore for non shiftable keys.
|
|
||||||
*/
|
|
@ -1,50 +0,0 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xenfb.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/xenfb.c
|
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xenfb.c
|
|
||||||
@@ -622,6 +622,18 @@ static void xenfb_guest_copy(struct XenF
|
|
||||||
oops = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
+ case 16:
|
|
||||||
+ if (bpp == 16) {
|
|
||||||
+ for (line = y; line < (y+h); line++) {
|
|
||||||
+ memcpy (data + (line * linesize) + (x * bpp / 8), xenfb->pixels + xenfb->offset
|
|
||||||
+ + (line * xenfb->row_stride) + (x * xenfb->depth / 8), w * xenfb->depth / 8);
|
|
||||||
+ }
|
|
||||||
+ } else if (bpp == 32) {
|
|
||||||
+ BLT(uint16_t, uint32_t, 5, 6, 5, 8, 8, 8);
|
|
||||||
+ } else {
|
|
||||||
+ oops = 1;
|
|
||||||
+ }
|
|
||||||
+ break;
|
|
||||||
case 24:
|
|
||||||
if (bpp == 16) {
|
|
||||||
BLT(uint32_t, uint16_t, 8, 8, 8, 5, 6, 5);
|
|
||||||
@@ -631,6 +643,18 @@ static void xenfb_guest_copy(struct XenF
|
|
||||||
oops = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
+ case 32:
|
|
||||||
+ if (bpp == 16) {
|
|
||||||
+ BLT(uint32_t, uint16_t, 8, 8, 8, 5, 6, 5);
|
|
||||||
+ } else if (bpp == 32) {
|
|
||||||
+ for (line = y; line < (y+h); line++) {
|
|
||||||
+ memcpy (data + (line * linesize) + (x * bpp / 8), xenfb->pixels + xenfb->offset
|
|
||||||
+ + (line * xenfb->row_stride) + (x * xenfb->depth / 8), w * xenfb->depth / 8);
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ oops = 1;
|
|
||||||
+ }
|
|
||||||
+ break;
|
|
||||||
default:
|
|
||||||
oops = 1;
|
|
||||||
}
|
|
||||||
@@ -784,6 +808,7 @@ static void xenfb_update(void *opaque)
|
|
||||||
static void xenfb_invalidate(void *opaque)
|
|
||||||
{
|
|
||||||
struct XenFB *xenfb = opaque;
|
|
||||||
+ xenfb->do_resize = 1;
|
|
||||||
xenfb->up_fullscreen = 1;
|
|
||||||
}
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Chun Yan Liu <cyliu@novell.com>
|
|
||||||
# Date 1294271316 0
|
|
||||||
# Node ID a283996796c91dd29ecff444b78798e0ce902047
|
|
||||||
# Parent 39df13908a3ad54e79dd3b53ed307e57f12f6d3d
|
|
||||||
fix '|' key display problem in en-us with altgr processing
|
|
||||||
|
|
||||||
Commit f95d202ed644 handles altgr-insert problem. Unfortunately, with
|
|
||||||
that patch, there is a problem in En-us keyboard: '|' (bar) cannot be
|
|
||||||
displayed. After checking keymap files, we found there are two
|
|
||||||
definitions to "bar" in en-us: bar 0x56 altgr (in "common") bar 0x2b
|
|
||||||
shift (in "en-us") First line is actually invalid in en-us
|
|
||||||
lanuage. The 2nd definition will cover the 1st one.
|
|
||||||
|
|
||||||
The previous change in didn't consider multi-definition case. It scans
|
|
||||||
keymap files, if keysym needs altgr, it will records that, after that,
|
|
||||||
if keysym is pressed but altgr not pressed, it will add an altgr press
|
|
||||||
opeartion. It is correct if all keysyms are unique and valid. But in
|
|
||||||
the above multi-definition case, there is problem: when reading bar
|
|
||||||
0x56 altgr (in "common") it will record altgr needed, but in fact,
|
|
||||||
that definition won't be used, it always use the 2nd definition and
|
|
||||||
won't need altgr. Then if the keysym is pressed, the code will still
|
|
||||||
add an altgr press operation, that will cause problem.
|
|
||||||
|
|
||||||
So, if we cannot avoid multi-definition in keymap files, the altgr
|
|
||||||
flag (whether altgr needed or not) should also be refreshed according
|
|
||||||
to the 2nd defintion. In the above case, when reading the 1st line, it
|
|
||||||
records altgr needed; then reading 2nd line, 2nd definition will cover
|
|
||||||
the 1st, meanwhile the altgr flag should be reset (the 2nd definition
|
|
||||||
doesn't need altgr, so altgr flag should be removed.)
|
|
||||||
|
|
||||||
Following patch supplements f95d202ed644, and solve the
|
|
||||||
problem.
|
|
||||||
|
|
||||||
Signed-off-by: Chun Yan Liu <cyliu@novell.com>
|
|
||||||
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
|
||||||
|
|
||||||
committer: Ian Jackson <Ian.Jackson@eu.citrix.com>
|
|
||||||
git-commit-id: 99d53fbb69d3e03be61ae10506a304a3d08d792f
|
|
||||||
|
|
||||||
# HG changeset patch
|
|
||||||
# User Jan Beulich <jbeulich@novell.com>
|
|
||||||
# Date 1295287237 0
|
|
||||||
# Node ID b47bf8f7a5e1959d6f5c62febaef9e81dc3231a0
|
|
||||||
# Parent b6bbe8be0afa54774a19ef43767a029ebddb2666
|
|
||||||
keymaps.c: fix use after free in del_key_range
|
|
||||||
|
|
||||||
Commit 99d53fbb69d3e03be61ae10506a304a3d08d792f introduced this, and
|
|
||||||
the compiler indirectly warned about it.
|
|
||||||
|
|
||||||
The patch is only compile tested (I don't even know how to reproduce
|
|
||||||
the original problem), but I suppose worth applying regardless.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
Cc: Chun Yan Liu <cyliu@novell.com>
|
|
||||||
|
|
||||||
committer: Ian Jackson <Ian.Jackson@eu.citrix.com>
|
|
||||||
git-commit-id: fdb22f24bc8adb3455b771d804496e11b4570085
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/keymaps.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/keymaps.c
|
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/keymaps.c
|
|
||||||
@@ -54,6 +54,17 @@ typedef struct {
|
|
||||||
struct key_range *altgr_range;
|
|
||||||
} kbd_layout_t;
|
|
||||||
|
|
||||||
+static void del_key_range(struct key_range **krp, int code) {
|
|
||||||
+ struct key_range *kr;
|
|
||||||
+ while ((kr = *krp) != NULL) {
|
|
||||||
+ if (code >= kr->start && code <= kr->end) {
|
|
||||||
+ *krp = kr->next;
|
|
||||||
+ qemu_free(kr);
|
|
||||||
+ } else
|
|
||||||
+ krp = &kr->next;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void add_to_key_range(struct key_range **krp, int code) {
|
|
||||||
struct key_range *kr;
|
|
||||||
for (kr = *krp; kr; kr = kr->next) {
|
|
||||||
@@ -137,6 +148,8 @@ static kbd_layout_t *parse_keyboard_layo
|
|
||||||
if (rest && strstr(rest, "altgr")) {
|
|
||||||
add_to_key_range(&k->altgr_range, keysym);
|
|
||||||
//fprintf(stderr, "altgr keysym %04x keycode %d\n", keysym, keycode);
|
|
||||||
+ } else {
|
|
||||||
+ del_key_range(&k->altgr_range, keysym);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if(keycode&0x80)
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/vnc.c
|
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
|
||||||
@@ -1279,11 +1279,9 @@ static void press_key_altgr_down(VncStat
|
|
||||||
kbd_put_keycode(0xe0);
|
|
||||||
if (down){
|
|
||||||
kbd_put_keycode(0xb8 & 0x7f);
|
|
||||||
- vs->modifiers_state[0xb8] = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
kbd_put_keycode(0xb8 | 0x80);
|
|
||||||
- vs->modifiers_state[0xb8] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
|||||||
# HG changeset patch
|
|
||||||
# User Jan Beulich <jbeulich@novell.com>
|
|
||||||
# Date 1294771190 0
|
|
||||||
# Node ID d224cef9d82c5c1ba9a6d73ca2628f288ce6f434
|
|
||||||
# Parent a283996796c91dd29ecff444b78798e0ce902047
|
|
||||||
bump RLIMIT_AS if restricted
|
|
||||||
References: bnc#641419
|
|
||||||
|
|
||||||
Mostly the same as is already being done for several other RLIMIT_*
|
|
||||||
values.
|
|
||||||
|
|
||||||
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
||||||
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
|
||||||
|
|
||||||
committer: Ian Jackson <Ian.Jackson@eu.citrix.com>
|
|
||||||
git-commit-id: 2aa36d470e97f4baa219f78df82e2d3fe3d9f96d
|
|
||||||
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vl.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/vl.c
|
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/vl.c
|
|
||||||
@@ -4845,6 +4845,13 @@ int main(int argc, char **argv, char **e
|
|
||||||
rl.rlim_cur = rl.rlim_max;
|
|
||||||
if (setrlimit(RLIMIT_DATA, &rl) != 0)
|
|
||||||
perror("setrlimit(RLIMIT_DATA)");
|
|
||||||
+ if (getrlimit(RLIMIT_AS, &rl) == 0) {
|
|
||||||
+ rl.rlim_cur = rl.rlim_max;
|
|
||||||
+ if (setrlimit(RLIMIT_AS, &rl) != 0)
|
|
||||||
+ perror("setrlimit(RLIMIT_AS)");
|
|
||||||
+ } else {
|
|
||||||
+ perror("getrlimit(RLIMIT_AS)");
|
|
||||||
+ }
|
|
||||||
rl.rlim_cur = RLIM_INFINITY;
|
|
||||||
rl.rlim_max = RLIM_INFINITY;
|
|
||||||
if (setrlimit(RLIMIT_RSS, &rl) != 0)
|
|
@ -29,10 +29,10 @@ keycodes up and down events and make sure the intentionally added altgr keycode
|
|||||||
|
|
||||||
Signed-off by Chunyan Liu (cyliu@novell.com)
|
Signed-off by Chunyan Liu (cyliu@novell.com)
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/vnc.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/vnc.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/vnc.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/vnc.c
|
||||||
@@ -1308,6 +1308,9 @@ static void do_key_event(VncState *vs, i
|
@@ -1308,6 +1308,9 @@ static void do_key_event(VncState *vs, i
|
||||||
shift_keys = vs->modifiers_state[0x2a] | vs->modifiers_state[0x36];
|
shift_keys = vs->modifiers_state[0x2a] | vs->modifiers_state[0x36];
|
||||||
altgr_keys = vs->modifiers_state[0xb8];
|
altgr_keys = vs->modifiers_state[0xb8];
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
Subject: modify default read/write flag in bdrv_init.
|
Subject: modify default read/write flag in bdrv_init.
|
||||||
Signed-off by Chunyan Liu <cyliu@novell.com>
|
Signed-off by Chunyan Liu <cyliu@novell.com>
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vl.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/vl.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/vl.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/vl.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/vl.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/vl.c
|
||||||
@@ -2612,6 +2612,8 @@ int drive_init(struct drive_opt *arg, in
|
@@ -2617,6 +2617,8 @@ int drive_init(struct drive_opt *arg, in
|
||||||
strncpy(drives_table[nb_drives].serial, serial, sizeof(serial));
|
strncpy(drives_table[nb_drives].serial, serial, sizeof(serial));
|
||||||
nb_drives++;
|
nb_drives++;
|
||||||
|
|
||||||
@ -13,8 +13,8 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vl.c
|
|||||||
+
|
+
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case IF_IDE:
|
case IF_IDE:
|
||||||
case IF_SCSI:
|
case IF_XEN:
|
||||||
@@ -2624,6 +2626,7 @@ int drive_init(struct drive_opt *arg, in
|
@@ -2630,6 +2632,7 @@ int drive_init(struct drive_opt *arg, in
|
||||||
break;
|
break;
|
||||||
case MEDIA_CDROM:
|
case MEDIA_CDROM:
|
||||||
bdrv_set_type_hint(bdrv, BDRV_TYPE_CDROM);
|
bdrv_set_type_hint(bdrv, BDRV_TYPE_CDROM);
|
||||||
@ -22,7 +22,7 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vl.c
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -2644,7 +2647,6 @@ int drive_init(struct drive_opt *arg, in
|
@@ -2650,7 +2653,6 @@ int drive_init(struct drive_opt *arg, in
|
||||||
}
|
}
|
||||||
if (!file[0])
|
if (!file[0])
|
||||||
return -2;
|
return -2;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/block.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/block.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/block.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/block.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/block.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/block.c
|
||||||
@@ -350,7 +350,7 @@ int bdrv_file_open(BlockDriverState **pb
|
@@ -350,7 +350,7 @@ int bdrv_file_open(BlockDriverState **pb
|
||||||
|
|
||||||
int bdrv_open(BlockDriverState *bs, const char *filename, int flags)
|
int bdrv_open(BlockDriverState *bs, const char *filename, int flags)
|
||||||
@ -28,10 +28,10 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/block.c
|
|||||||
ret = drv->bdrv_open(bs, filename, open_flags);
|
ret = drv->bdrv_open(bs, filename, open_flags);
|
||||||
if ((ret == -EACCES || ret == -EPERM) && !(flags & BDRV_O_FILE)) {
|
if ((ret == -EACCES || ret == -EPERM) && !(flags & BDRV_O_FILE)) {
|
||||||
ret = drv->bdrv_open(bs, filename, open_flags & ~BDRV_O_RDWR);
|
ret = drv->bdrv_open(bs, filename, open_flags & ~BDRV_O_RDWR);
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/usb-msd.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/usb-msd.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/usb-msd.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/hw/usb-msd.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/usb-msd.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/usb-msd.c
|
||||||
@@ -551,7 +551,7 @@ USBDevice *usb_msd_init(const char *file
|
@@ -551,7 +551,7 @@ USBDevice *usb_msd_init(const char *file
|
||||||
s = qemu_mallocz(sizeof(MSDState));
|
s = qemu_mallocz(sizeof(MSDState));
|
||||||
|
|
||||||
@ -41,10 +41,10 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/usb-msd.c
|
|||||||
goto fail;
|
goto fail;
|
||||||
s->bs = bdrv;
|
s->bs = bdrv;
|
||||||
*pbs = bdrv;
|
*pbs = bdrv;
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-img.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/qemu-img.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/qemu-img.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/qemu-img.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-img.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/qemu-img.c
|
||||||
@@ -32,7 +32,7 @@
|
@@ -32,7 +32,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
@@ -237,6 +237,7 @@ static int open_disk(struct td_state *s,
|
@@ -237,6 +237,7 @@ static int open_disk(struct td_state *s,
|
||||||
BlockDriver* drv;
|
BlockDriver* drv;
|
||||||
char* devname;
|
char* devname;
|
||||||
@ -19,10 +19,10 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
|||||||
fprintf(stderr, "Could not open image file %s\n", path);
|
fprintf(stderr, "Could not open image file %s\n", path);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/xenstore.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/xenstore.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
||||||
@@ -136,7 +136,8 @@ static void insert_media(void *opaque)
|
@@ -136,7 +136,8 @@ static void insert_media(void *opaque)
|
||||||
else
|
else
|
||||||
format = &bdrv_raw;
|
format = &bdrv_raw;
|
||||||
@ -33,7 +33,7 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
#ifdef CONFIG_STUBDOM
|
#ifdef CONFIG_STUBDOM
|
||||||
{
|
{
|
||||||
char *buf, *backend, *params_path, *params;
|
char *buf, *backend, *params_path, *params;
|
||||||
@@ -469,7 +470,8 @@ void xenstore_parse_domain_config(int hv
|
@@ -511,7 +512,8 @@ void xenstore_parse_domain_config(int hv
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < num; i++) {
|
for (i = 0; i < num; i++) {
|
||||||
@ -43,7 +43,7 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
/* read the backend path */
|
/* read the backend path */
|
||||||
xenstore_get_backend_path(&bpath, "vbd", danger_path, hvm_domid, e_danger[i]);
|
xenstore_get_backend_path(&bpath, "vbd", danger_path, hvm_domid, e_danger[i]);
|
||||||
if (bpath == NULL)
|
if (bpath == NULL)
|
||||||
@@ -555,6 +557,17 @@ void xenstore_parse_domain_config(int hv
|
@@ -597,6 +599,17 @@ void xenstore_parse_domain_config(int hv
|
||||||
format = &bdrv_raw;
|
format = &bdrv_raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
#if 0
|
#if 0
|
||||||
/* Phantom VBDs are disabled because the use of paths
|
/* Phantom VBDs are disabled because the use of paths
|
||||||
* from guest-controlled areas in xenstore is unsafe.
|
* from guest-controlled areas in xenstore is unsafe.
|
||||||
@@ -622,7 +635,7 @@ void xenstore_parse_domain_config(int hv
|
@@ -664,7 +677,7 @@ void xenstore_parse_domain_config(int hv
|
||||||
#ifdef CONFIG_STUBDOM
|
#ifdef CONFIG_STUBDOM
|
||||||
if (pasprintf(&danger_buf, "%s/device/vbd/%s", danger_path, e_danger[i]) == -1)
|
if (pasprintf(&danger_buf, "%s/device/vbd/%s", danger_path, e_danger[i]) == -1)
|
||||||
continue;
|
continue;
|
||||||
@ -70,7 +70,7 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
pstrcpy(bs->filename, sizeof(bs->filename), params);
|
pstrcpy(bs->filename, sizeof(bs->filename), params);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -668,7 +681,7 @@ void xenstore_parse_domain_config(int hv
|
@@ -710,7 +723,7 @@ void xenstore_parse_domain_config(int hv
|
||||||
|
|
||||||
fprintf(stderr, "Using file %s in read-%s mode\n", bs->filename, is_readonly ? "only" : "write");
|
fprintf(stderr, "Using file %s in read-%s mode\n", bs->filename, is_readonly ? "only" : "write");
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/blktap/drivers/block-cdrom.c
|
Index: xen-4.1.0-testing/tools/blktap/drivers/block-cdrom.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ xen-4.0.2-testing/tools/blktap/drivers/block-cdrom.c
|
+++ xen-4.1.0-testing/tools/blktap/drivers/block-cdrom.c
|
||||||
@@ -0,0 +1,535 @@
|
@@ -0,0 +1,535 @@
|
||||||
+/* block-cdrom.c
|
+/* block-cdrom.c
|
||||||
+ *
|
+ *
|
||||||
@ -538,10 +538,10 @@ Index: xen-4.0.2-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.0.2-testing/xen/include/public/io/cdromif.h
|
Index: xen-4.1.0-testing/xen/include/public/io/cdromif.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ xen-4.0.2-testing/xen/include/public/io/cdromif.h
|
+++ xen-4.1.0-testing/xen/include/public/io/cdromif.h
|
||||||
@@ -0,0 +1,122 @@
|
@@ -0,0 +1,122 @@
|
||||||
+/******************************************************************************
|
+/******************************************************************************
|
||||||
+ * cdromif.h
|
+ * cdromif.h
|
||||||
@ -665,19 +665,19 @@ Index: xen-4.0.2-testing/xen/include/public/io/cdromif.h
|
|||||||
+ sizeof(struct vcd_generic_command) - sizeof(struct request_sense))
|
+ sizeof(struct vcd_generic_command) - sizeof(struct request_sense))
|
||||||
+
|
+
|
||||||
+#endif
|
+#endif
|
||||||
Index: xen-4.0.2-testing/tools/blktap/drivers/Makefile
|
Index: xen-4.1.0-testing/tools/blktap/drivers/Makefile
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/blktap/drivers/Makefile
|
--- xen-4.1.0-testing.orig/tools/blktap/drivers/Makefile
|
||||||
+++ xen-4.0.2-testing/tools/blktap/drivers/Makefile
|
+++ xen-4.1.0-testing/tools/blktap/drivers/Makefile
|
||||||
@@ -28,8 +28,9 @@ CFLAGS += -DMEMSHR
|
@@ -28,8 +28,9 @@ CFLAGS += -DMEMSHR
|
||||||
MEMSHRLIBS += $(MEMSHR_DIR)/libmemshr.a
|
MEMSHRLIBS += $(MEMSHR_DIR)/libmemshr.a
|
||||||
endif
|
endif
|
||||||
|
|
||||||
-LDFLAGS_blktapctrl := $(LDFLAGS_libxenctrl) $(LDFLAGS_libxenstore) $(MEMSHRLIBS) -L../lib -lblktap -lrt -lm -lpthread
|
-LDLIBS_blktapctrl := $(MEMSHRLIBS) $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) -L../lib -lblktap -lrt -lm -lpthread
|
||||||
-LDFLAGS_img := $(LIBAIO_DIR)/libaio.a $(CRYPT_LIB) -lpthread -lz
|
-LDLIBS_img := $(LIBAIO_DIR)/libaio.a $(CRYPT_LIB) -lpthread -lz
|
||||||
+LDFLAGS_xen := $(LDFLAGS_libxenctrl) $(LDFLAGS_libxenstore)
|
+LDLIBS_xen := $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore)
|
||||||
+LDFLAGS_blktapctrl := $(LDFLAGS_xen) $(MEMSHRLIBS) -L../lib -lblktap -lrt -lm -lpthread $(LDFLAGS_xen)
|
+LDLIBS_blktapctrl := $(MEMSHRLIBS) $(LDLIBS_xen) -L../lib -lblktap -lrt -lm -lpthread
|
||||||
+LDFLAGS_img := $(LIBAIO_DIR)/libaio.a $(CRYPT_LIB) -lpthread -lz $(LDFLAGS_xen)
|
+LDLIBS_img := $(LIBAIO_DIR)/libaio.a $(CRYPT_LIB) -lpthread -lz $(LDLIBS_xen)
|
||||||
|
|
||||||
BLK-OBJS-y := block-aio.o
|
BLK-OBJS-y := block-aio.o
|
||||||
BLK-OBJS-y += block-sync.o
|
BLK-OBJS-y += block-sync.o
|
||||||
@ -689,10 +689,10 @@ Index: xen-4.0.2-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.0.2-testing/tools/blktap/drivers/tapdisk.h
|
Index: xen-4.1.0-testing/tools/blktap/drivers/tapdisk.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/blktap/drivers/tapdisk.h
|
--- xen-4.1.0-testing.orig/tools/blktap/drivers/tapdisk.h
|
||||||
+++ xen-4.0.2-testing/tools/blktap/drivers/tapdisk.h
|
+++ xen-4.1.0-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,
|
||||||
@ -737,10 +737,10 @@ Index: xen-4.0.2-testing/tools/blktap/drivers/tapdisk.h
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef struct driver_list_entry {
|
typedef struct driver_list_entry {
|
||||||
Index: xen-4.0.2-testing/tools/blktap/lib/blktaplib.h
|
Index: xen-4.1.0-testing/tools/blktap/lib/blktaplib.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/blktap/lib/blktaplib.h
|
--- xen-4.1.0-testing.orig/tools/blktap/lib/blktaplib.h
|
||||||
+++ xen-4.0.2-testing/tools/blktap/lib/blktaplib.h
|
+++ xen-4.1.0-testing/tools/blktap/lib/blktaplib.h
|
||||||
@@ -225,6 +225,7 @@ typedef struct msg_pid {
|
@@ -225,6 +225,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
|
||||||
@ -749,25 +749,23 @@ Index: xen-4.0.2-testing/tools/blktap/lib/blktaplib.h
|
|||||||
|
|
||||||
/* xenstore/xenbus: */
|
/* xenstore/xenbus: */
|
||||||
#define DOMNAME "Domain-0"
|
#define DOMNAME "Domain-0"
|
||||||
Index: xen-4.0.2-testing/xen/include/public/io/blkif.h
|
Index: xen-4.1.0-testing/xen/include/public/io/blkif.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/xen/include/public/io/blkif.h
|
--- xen-4.1.0-testing.orig/xen/include/public/io/blkif.h
|
||||||
+++ xen-4.0.2-testing/xen/include/public/io/blkif.h
|
+++ xen-4.1.0-testing/xen/include/public/io/blkif.h
|
||||||
@@ -76,6 +76,10 @@
|
@@ -80,7 +80,7 @@
|
||||||
* "feature-flush-cache" node!
|
* Used in SLES sources for device specific command packet
|
||||||
|
* contained within the request. Reserved for that purpose.
|
||||||
*/
|
*/
|
||||||
#define BLKIF_OP_FLUSH_DISKCACHE 3
|
-#define BLKIF_OP_RESERVED_1 4
|
||||||
+/*
|
|
||||||
+ * Device specific command packet contained within the request
|
|
||||||
+ */
|
|
||||||
+#define BLKIF_OP_PACKET 4
|
+#define BLKIF_OP_PACKET 4
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Maximum scatter/gather segments per request.
|
* Recognised only if "feature-trim" is present in backend xenbus info.
|
||||||
Index: xen-4.0.2-testing/tools/blktap/drivers/tapdisk.c
|
* The "feature-trim" node contains a boolean indicating whether trim
|
||||||
|
Index: xen-4.1.0-testing/tools/blktap/drivers/tapdisk.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/blktap/drivers/tapdisk.c
|
--- xen-4.1.0-testing.orig/tools/blktap/drivers/tapdisk.c
|
||||||
+++ xen-4.0.2-testing/tools/blktap/drivers/tapdisk.c
|
+++ xen-4.1.0-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;
|
||||||
}
|
}
|
||||||
@ -791,11 +789,11 @@ Index: xen-4.0.2-testing/tools/blktap/drivers/tapdisk.c
|
|||||||
default:
|
default:
|
||||||
DPRINTF("Unknown block operation\n");
|
DPRINTF("Unknown block operation\n");
|
||||||
break;
|
break;
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/server/BlktapController.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/server/BlktapController.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/server/BlktapController.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/server/BlktapController.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/server/BlktapController.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/server/BlktapController.py
|
||||||
@@ -21,6 +21,7 @@ blktap1_disk_types = [
|
@@ -15,6 +15,7 @@ blktap1_disk_types = [
|
||||||
'ram',
|
'ram',
|
||||||
'qcow',
|
'qcow',
|
||||||
'qcow2',
|
'qcow2',
|
||||||
|
20
blktap.patch
20
blktap.patch
@ -1,11 +1,11 @@
|
|||||||
bug #239173
|
bug #239173
|
||||||
bug #242953
|
bug #242953
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -3291,7 +3291,7 @@ class XendDomainInfo:
|
@@ -3295,7 +3295,7 @@ class XendDomainInfo:
|
||||||
(fn, BOOTLOADER_LOOPBACK_DEVICE))
|
(fn, BOOTLOADER_LOOPBACK_DEVICE))
|
||||||
|
|
||||||
vbd = {
|
vbd = {
|
||||||
@ -14,11 +14,11 @@ Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
'device': BOOTLOADER_LOOPBACK_DEVICE,
|
'device': BOOTLOADER_LOOPBACK_DEVICE,
|
||||||
}
|
}
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/xenstore.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/xenstore.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
||||||
@@ -397,9 +397,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;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
@ -30,7 +30,7 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
unsigned int len, num, hd_index, pci_devid = 0;
|
unsigned int len, num, hd_index, pci_devid = 0;
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BlockDriver *format;
|
BlockDriver *format;
|
||||||
@@ -444,6 +444,14 @@ void xenstore_parse_domain_config(int hv
|
@@ -486,6 +486,14 @@ void xenstore_parse_domain_config(int hv
|
||||||
e_danger[i]);
|
e_danger[i]);
|
||||||
if (bpath == NULL)
|
if (bpath == NULL)
|
||||||
continue;
|
continue;
|
||||||
@ -45,7 +45,7 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
/* read the name of the device */
|
/* read the name of the device */
|
||||||
if (pasprintf(&buf, "%s/dev", bpath) == -1)
|
if (pasprintf(&buf, "%s/dev", bpath) == -1)
|
||||||
continue;
|
continue;
|
||||||
@@ -738,6 +746,7 @@ void xenstore_parse_domain_config(int hv
|
@@ -775,6 +783,7 @@ void xenstore_parse_domain_config(int hv
|
||||||
free(mode);
|
free(mode);
|
||||||
free(params);
|
free(params);
|
||||||
free(dev);
|
free(dev);
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
Calling function doesn't handle an "Exception" but only VmError, thus cleanup work won't been done if using Exception.
|
|
||||||
Change it to VmError.
|
|
||||||
|
|
||||||
Signed-off-by ChunyanLiu <cyliu@novell.com>
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/server/BlktapController.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/server/BlktapController.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/server/BlktapController.py
|
|
||||||
@@ -4,6 +4,7 @@ import string, re
|
|
||||||
from xen.xend.server.blkif import BlkifController
|
|
||||||
from xen.xend.XendLogging import log
|
|
||||||
from xen.util.xpopen import xPopen3
|
|
||||||
+from xen.xend.XendError import VmError
|
|
||||||
|
|
||||||
phantomDev = 0;
|
|
||||||
phantomId = 0;
|
|
||||||
@@ -209,7 +210,7 @@ class Blktap2Controller(BlktapController
|
|
||||||
out = stdout.read();
|
|
||||||
stdout.close();
|
|
||||||
stderr.close();
|
|
||||||
- raise Exception, 'Failed to create device.\n stdout: %s\n stderr: %s\nCheck that target \"%s\" exists and that blktap2 driver installed in dom0.' % (out.rstrip(), err.rstrip(), file);
|
|
||||||
+ raise VmError('Failed to create device.\n stdout: %s\n stderr: %s\nCheck that target \"%s\" exists and that blktap2 driver installed in dom0.' % (out.rstrip(), err.rstrip(), file));
|
|
||||||
|
|
||||||
minor, device, control = parseDeviceString(stdout.readline())
|
|
||||||
stdout.close();
|
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/blktap/drivers/tapdisk.h
|
Index: xen-4.1.0-testing/tools/blktap/drivers/tapdisk.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/blktap/drivers/tapdisk.h
|
--- xen-4.1.0-testing.orig/tools/blktap/drivers/tapdisk.h
|
||||||
+++ xen-4.0.2-testing/tools/blktap/drivers/tapdisk.h
|
+++ xen-4.1.0-testing/tools/blktap/drivers/tapdisk.h
|
||||||
@@ -168,7 +168,7 @@ static disk_info_t aio_disk = {
|
@@ -168,7 +168,7 @@ static disk_info_t aio_disk = {
|
||||||
"raw image (aio)",
|
"raw image (aio)",
|
||||||
"aio",
|
"aio",
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
Index: xen-4.1.0-testing/tools/hotplug/Linux/network-bridge
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/hotplug/Linux/network-bridge
|
--- xen-4.1.0-testing.orig/tools/hotplug/Linux/network-bridge
|
||||||
+++ xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
+++ xen-4.1.0-testing/tools/hotplug/Linux/network-bridge
|
||||||
@@ -245,6 +245,9 @@ op_start () {
|
@@ -249,6 +249,9 @@ op_start () {
|
||||||
|
|
||||||
claim_lock "network-bridge"
|
claim_lock "network-bridge"
|
||||||
|
|
||||||
@ -12,14 +12,14 @@ Index: xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
|||||||
vlans=$(find_active_vlans "${netdev}")
|
vlans=$(find_active_vlans "${netdev}")
|
||||||
for vlan in $vlans ; do ifdown $vlan ; done
|
for vlan in $vlans ; do ifdown $vlan ; done
|
||||||
|
|
||||||
@@ -262,18 +265,32 @@ op_start () {
|
@@ -266,18 +269,32 @@ op_start () {
|
||||||
ip link set ${netdev} down
|
ip link set ${netdev} down
|
||||||
ip addr flush ${netdev}
|
ip addr flush ${netdev}
|
||||||
fi
|
fi
|
||||||
- ip link set ${netdev} name ${pdev}
|
- ip link set ${netdev} name ${pdev}
|
||||||
- ip link set ${tdev} name ${bridge}
|
- ip link set ${tdev} name ${bridge}
|
||||||
-
|
-
|
||||||
- setup_bridge_port ${pdev}
|
- setup_physical_bridge_port ${pdev}
|
||||||
|
|
||||||
- # Restore slaves
|
- # Restore slaves
|
||||||
- if [ -n "${slaves}" ]; then
|
- if [ -n "${slaves}" ]; then
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
Index: xen-4.1.0-testing/tools/hotplug/Linux/network-bridge
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/hotplug/Linux/network-bridge
|
--- xen-4.1.0-testing.orig/tools/hotplug/Linux/network-bridge
|
||||||
+++ xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
+++ xen-4.1.0-testing/tools/hotplug/Linux/network-bridge
|
||||||
@@ -270,19 +270,19 @@ op_stop () {
|
@@ -278,19 +278,19 @@ op_stop () {
|
||||||
transfer_addrs ${bridge} ${pdev}
|
transfer_addrs ${bridge} ${pdev}
|
||||||
if ! ifdown ${bridge}; then
|
if ! ifdown ${bridge}; then
|
||||||
get_ip_info ${bridge}
|
get_ip_info ${bridge}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
Index: xen-4.1.0-testing/tools/hotplug/Linux/network-bridge
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/hotplug/Linux/network-bridge
|
--- xen-4.1.0-testing.orig/tools/hotplug/Linux/network-bridge
|
||||||
+++ xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
+++ xen-4.1.0-testing/tools/hotplug/Linux/network-bridge
|
||||||
@@ -253,6 +253,11 @@ op_start () {
|
@@ -257,6 +257,11 @@ op_start () {
|
||||||
|
|
||||||
create_bridge ${tdev}
|
create_bridge ${tdev}
|
||||||
|
|
||||||
@ -14,7 +14,7 @@ Index: xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
|||||||
preiftransfer ${netdev}
|
preiftransfer ${netdev}
|
||||||
transfer_addrs ${netdev} ${tdev}
|
transfer_addrs ${netdev} ${tdev}
|
||||||
# Remember slaves for bonding interface.
|
# Remember slaves for bonding interface.
|
||||||
@@ -330,6 +335,13 @@ op_stop () {
|
@@ -338,6 +343,13 @@ op_stop () {
|
||||||
ip link set ${pdev} name ${netdev}
|
ip link set ${pdev} name ${netdev}
|
||||||
do_ifup ${netdev}
|
do_ifup ${netdev}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
Index: xen-4.1.0-testing/tools/hotplug/Linux/network-bridge
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/hotplug/Linux/network-bridge
|
--- xen-4.1.0-testing.orig/tools/hotplug/Linux/network-bridge
|
||||||
+++ xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
+++ xen-4.1.0-testing/tools/hotplug/Linux/network-bridge
|
||||||
@@ -193,6 +193,28 @@ antispoofing () {
|
@@ -193,6 +193,28 @@ antispoofing () {
|
||||||
iptables -A FORWARD -m physdev --physdev-in ${pdev} -j ACCEPT
|
iptables -A FORWARD -m physdev --physdev-in ${pdev} -j ACCEPT
|
||||||
}
|
}
|
||||||
@ -31,7 +31,7 @@ Index: xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
|||||||
# Usage: show_status dev bridge
|
# Usage: show_status dev bridge
|
||||||
# Print ifconfig and routes.
|
# Print ifconfig and routes.
|
||||||
show_status () {
|
show_status () {
|
||||||
@@ -223,6 +245,9 @@ op_start () {
|
@@ -227,6 +249,9 @@ op_start () {
|
||||||
|
|
||||||
claim_lock "network-bridge"
|
claim_lock "network-bridge"
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ Index: xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
|||||||
create_bridge ${tdev}
|
create_bridge ${tdev}
|
||||||
|
|
||||||
preiftransfer ${netdev}
|
preiftransfer ${netdev}
|
||||||
@@ -250,6 +275,8 @@ op_start () {
|
@@ -254,6 +279,8 @@ op_start () {
|
||||||
add_to_bridge2 ${bridge} ${pdev}
|
add_to_bridge2 ${bridge} ${pdev}
|
||||||
do_ifup ${bridge}
|
do_ifup ${bridge}
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ Index: xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
|||||||
if [ ${antispoof} = 'yes' ] ; then
|
if [ ${antispoof} = 'yes' ] ; then
|
||||||
antispoofing
|
antispoofing
|
||||||
fi
|
fi
|
||||||
@@ -267,6 +294,9 @@ op_stop () {
|
@@ -275,6 +302,9 @@ op_stop () {
|
||||||
|
|
||||||
claim_lock "network-bridge"
|
claim_lock "network-bridge"
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ Index: xen-4.0.2-testing/tools/hotplug/Linux/network-bridge
|
|||||||
transfer_addrs ${bridge} ${pdev}
|
transfer_addrs ${bridge} ${pdev}
|
||||||
if ! ifdown ${bridge}; then
|
if ! ifdown ${bridge}; then
|
||||||
get_ip_info ${bridge}
|
get_ip_info ${bridge}
|
||||||
@@ -283,6 +313,8 @@ op_stop () {
|
@@ -291,6 +321,8 @@ op_stop () {
|
||||||
ip link set ${pdev} name ${netdev}
|
ip link set ${pdev} name ${netdev}
|
||||||
do_ifup ${netdev}
|
do_ifup ${netdev}
|
||||||
|
|
||||||
|
@ -15,10 +15,10 @@ Signed-off-by: Kevin Wolf <kwolf@suse.de>
|
|||||||
tapdisk-ioemu.c | 17 -----------------
|
tapdisk-ioemu.c | 17 -----------------
|
||||||
4 files changed, 17 insertions(+), 26 deletions(-)
|
4 files changed, 17 insertions(+), 26 deletions(-)
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/Makefile
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/Makefile
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/Makefile
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/Makefile
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/Makefile
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/Makefile
|
||||||
@@ -46,14 +46,6 @@ $(filter %-user,$(SUBDIR_RULES)): libqem
|
@@ -46,14 +46,6 @@ $(filter %-user,$(SUBDIR_RULES)): libqem
|
||||||
|
|
||||||
recurse-all: $(SUBDIR_RULES)
|
recurse-all: $(SUBDIR_RULES)
|
||||||
@ -56,10 +56,10 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/Makefile
|
|||||||
######################################################################
|
######################################################################
|
||||||
# libqemu_common.a: Target independent part of system emulation. The
|
# libqemu_common.a: Target independent part of system emulation. The
|
||||||
# long term path is to suppress *all* target specific code in case of
|
# long term path is to suppress *all* target specific code in case of
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/configure
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/configure
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/configure
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/configure
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/configure
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/configure
|
||||||
@@ -1511,7 +1511,7 @@ bsd)
|
@@ -1511,7 +1511,7 @@ bsd)
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@ -69,10 +69,10 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/configure
|
|||||||
if test `expr "$target_list" : ".*softmmu.*"` != 0 ; then
|
if test `expr "$target_list" : ".*softmmu.*"` != 0 ; then
|
||||||
tools="qemu-img\$(EXESUF) $tools"
|
tools="qemu-img\$(EXESUF) $tools"
|
||||||
if [ "$linux" = "yes" ] ; then
|
if [ "$linux" = "yes" ] ; then
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-tool.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/qemu-tool.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/qemu-tool.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/qemu-tool.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-tool.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/qemu-tool.c
|
||||||
@@ -68,7 +68,7 @@ void qemu_bh_delete(QEMUBH *bh)
|
@@ -68,7 +68,7 @@ void qemu_bh_delete(QEMUBH *bh)
|
||||||
qemu_free(bh);
|
qemu_free(bh);
|
||||||
}
|
}
|
||||||
@ -82,10 +82,10 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-tool.c
|
|||||||
IOCanRWHandler *fd_read_poll,
|
IOCanRWHandler *fd_read_poll,
|
||||||
IOHandler *fd_read,
|
IOHandler *fd_read,
|
||||||
IOHandler *fd_write,
|
IOHandler *fd_write,
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/tapdisk-ioemu.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/tapdisk-ioemu.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/tapdisk-ioemu.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/tapdisk-ioemu.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/tapdisk-ioemu.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/tapdisk-ioemu.c
|
||||||
@@ -12,34 +12,12 @@
|
@@ -12,34 +12,12 @@
|
||||||
|
|
||||||
extern void qemu_aio_init(void);
|
extern void qemu_aio_init(void);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/vnc.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/vnc.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/vnc.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/vnc.c
|
||||||
@@ -1342,6 +1342,11 @@ static void do_key_event(VncState *vs, i
|
@@ -1342,6 +1342,11 @@ static void do_key_event(VncState *vs, i
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/server/HalDaemon.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/server/HalDaemon.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/server/HalDaemon.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/server/HalDaemon.py
|
||||||
@@ -0,0 +1,243 @@
|
@@ -0,0 +1,243 @@
|
||||||
+#!/usr/bin/env python
|
+#!/usr/bin/env python
|
||||||
+# -*- mode: python; -*-
|
+# -*- mode: python; -*-
|
||||||
@ -246,10 +246,10 @@ Index: xen-4.0.2-testing/tools/python/xen/xend/server/HalDaemon.py
|
|||||||
+ print 'Falling off end'
|
+ print 'Falling off end'
|
||||||
+
|
+
|
||||||
+
|
+
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/server/Hald.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/server/Hald.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/server/Hald.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/server/Hald.py
|
||||||
@@ -0,0 +1,125 @@
|
@@ -0,0 +1,125 @@
|
||||||
+#============================================================================
|
+#============================================================================
|
||||||
+# This library is free software; you can redistribute it and/or
|
+# This library is free software; you can redistribute it and/or
|
||||||
@ -376,11 +376,11 @@ Index: xen-4.0.2-testing/tools/python/xen/xend/server/Hald.py
|
|||||||
+ watcher.run()
|
+ watcher.run()
|
||||||
+ time.sleep(10)
|
+ time.sleep(10)
|
||||||
+ watcher.shutdown()
|
+ watcher.shutdown()
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/server/SrvServer.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/server/SrvServer.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/server/SrvServer.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/server/SrvServer.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/server/SrvServer.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/server/SrvServer.py
|
||||||
@@ -56,6 +56,7 @@ from xen.web.SrvDir import SrvDir
|
@@ -57,6 +57,7 @@ from xen.web.SrvDir import SrvDir
|
||||||
|
|
||||||
from SrvRoot import SrvRoot
|
from SrvRoot import SrvRoot
|
||||||
from XMLRPCServer import XMLRPCServer
|
from XMLRPCServer import XMLRPCServer
|
||||||
@ -388,7 +388,7 @@ Index: xen-4.0.2-testing/tools/python/xen/xend/server/SrvServer.py
|
|||||||
|
|
||||||
xoptions = XendOptions.instance()
|
xoptions = XendOptions.instance()
|
||||||
|
|
||||||
@@ -245,6 +246,8 @@ def _loadConfig(servers, root, reload):
|
@@ -252,6 +253,8 @@ def _loadConfig(servers, root, reload):
|
||||||
if xoptions.get_xend_unix_xmlrpc_server():
|
if xoptions.get_xend_unix_xmlrpc_server():
|
||||||
servers.add(XMLRPCServer(XendAPI.AUTH_PAM, False))
|
servers.add(XMLRPCServer(XendAPI.AUTH_PAM, False))
|
||||||
|
|
||||||
@ -397,10 +397,10 @@ Index: xen-4.0.2-testing/tools/python/xen/xend/server/SrvServer.py
|
|||||||
|
|
||||||
def create():
|
def create():
|
||||||
root = SrvDir()
|
root = SrvDir()
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/xenstore.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/xenstore.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
||||||
@@ -18,6 +18,7 @@
|
@@ -18,6 +18,7 @@
|
||||||
#include "exec-all.h"
|
#include "exec-all.h"
|
||||||
#include "sysemu.h"
|
#include "sysemu.h"
|
||||||
@ -409,7 +409,7 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
#include "hw.h"
|
#include "hw.h"
|
||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
#include "qemu-timer.h"
|
#include "qemu-timer.h"
|
||||||
@@ -553,6 +554,21 @@ void xenstore_parse_domain_config(int hv
|
@@ -595,6 +596,21 @@ void xenstore_parse_domain_config(int hv
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bs = bdrv_new(dev);
|
bs = bdrv_new(dev);
|
||||||
@ -431,8 +431,8 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
/* check if it is a cdrom */
|
/* check if it is a cdrom */
|
||||||
if (danger_type && !strcmp(danger_type, "cdrom")) {
|
if (danger_type && !strcmp(danger_type, "cdrom")) {
|
||||||
bdrv_set_type_hint(bs, BDRV_TYPE_CDROM);
|
bdrv_set_type_hint(bs, BDRV_TYPE_CDROM);
|
||||||
@@ -961,6 +977,50 @@ void xenstore_record_dm_state(const char
|
@@ -1028,6 +1044,50 @@ static void xenstore_process_vcpu_set_ev
|
||||||
xenstore_record_dm("state", state);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
+static void xenstore_process_media_change_event(char **vec)
|
+static void xenstore_process_media_change_event(char **vec)
|
||||||
@ -482,7 +482,7 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
void xenstore_process_event(void *opaque)
|
void xenstore_process_event(void *opaque)
|
||||||
{
|
{
|
||||||
char **vec, *offset, *bpath = NULL, *buf = NULL, *drv = NULL, *image = NULL;
|
char **vec, *offset, *bpath = NULL, *buf = NULL, *drv = NULL, *image = NULL;
|
||||||
@@ -991,6 +1051,11 @@ void xenstore_process_event(void *opaque
|
@@ -1063,6 +1123,11 @@ void xenstore_process_event(void *opaque
|
||||||
xenstore_watch_callbacks[i].cb(vec[XS_WATCH_TOKEN],
|
xenstore_watch_callbacks[i].cb(vec[XS_WATCH_TOKEN],
|
||||||
xenstore_watch_callbacks[i].opaque);
|
xenstore_watch_callbacks[i].opaque);
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -3135,6 +3135,11 @@ class XendDomainInfo:
|
@@ -3130,6 +3130,11 @@ class XendDomainInfo:
|
||||||
self._cleanup_phantom_devs(paths)
|
self._cleanup_phantom_devs(paths)
|
||||||
self._cleanupVm()
|
self._cleanupVm()
|
||||||
|
|
||||||
|
@ -5,10 +5,11 @@ get the signal, it will wait until timeout, thus incorrect device status is
|
|||||||
returned. To fix this problem, we do not depend on ev.wait() result, but read
|
returned. To fix this problem, we do not depend on ev.wait() result, but read
|
||||||
xenstore directly to get correct device status.
|
xenstore directly to get correct device status.
|
||||||
|
|
||||||
diff -r ce65e0e03a57 tools/python/xen/xend/server/DevController.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/server/DevController.py
|
||||||
--- a/tools/python/xen/xend/server/DevController.py Fri Aug 27 16:53:00 2010 +0800
|
===================================================================
|
||||||
+++ b/tools/python/xen/xend/server/DevController.py Fri Aug 27 17:13:32 2010 +0800
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/server/DevController.py
|
||||||
@@ -149,7 +149,10 @@
|
+++ xen-4.1.0-testing/tools/python/xen/xend/server/DevController.py
|
||||||
|
@@ -149,7 +149,10 @@ class DevController:
|
||||||
(status, err) = self.waitForBackend(devid)
|
(status, err) = self.waitForBackend(devid)
|
||||||
|
|
||||||
if status == Timeout:
|
if status == Timeout:
|
||||||
@ -20,7 +21,7 @@ diff -r ce65e0e03a57 tools/python/xen/xend/server/DevController.py
|
|||||||
raise VmError("Device %s (%s) could not be connected. "
|
raise VmError("Device %s (%s) could not be connected. "
|
||||||
"Hotplug scripts not working." %
|
"Hotplug scripts not working." %
|
||||||
(devid, self.deviceClass))
|
(devid, self.deviceClass))
|
||||||
@@ -554,7 +557,17 @@
|
@@ -554,7 +557,17 @@ class DevController:
|
||||||
|
|
||||||
xswatch(statusPath, hotplugStatusCallback, ev, result)
|
xswatch(statusPath, hotplugStatusCallback, ev, result)
|
||||||
|
|
||||||
@ -39,7 +40,7 @@ diff -r ce65e0e03a57 tools/python/xen/xend/server/DevController.py
|
|||||||
|
|
||||||
err = xstransact.Read(backpath, HOTPLUG_ERROR_NODE)
|
err = xstransact.Read(backpath, HOTPLUG_ERROR_NODE)
|
||||||
|
|
||||||
@@ -571,7 +584,12 @@
|
@@ -571,7 +584,12 @@ class DevController:
|
||||||
|
|
||||||
xswatch(statusPath, deviceDestroyCallback, ev, result)
|
xswatch(statusPath, deviceDestroyCallback, ev, result)
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendCheckpoint.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/XendCheckpoint.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendCheckpoint.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/XendCheckpoint.py
|
||||||
@@ -165,7 +165,7 @@ def save(fd, dominfo, network, live, dst
|
@@ -172,7 +172,7 @@ def save(fd, dominfo, network, live, dst
|
||||||
dominfo.destroy()
|
dominfo.destroy()
|
||||||
dominfo.testDeviceComplete()
|
dominfo.testDeviceComplete()
|
||||||
try:
|
try:
|
||||||
|
1484
cpu-pools-docs.patch
1484
cpu-pools-docs.patch
File diff suppressed because it is too large
Load Diff
@ -1,307 +0,0 @@
|
|||||||
Index: xen-4.0.2-testing/tools/libxc/Makefile
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/libxc/Makefile
|
|
||||||
+++ xen-4.0.2-testing/tools/libxc/Makefile
|
|
||||||
@@ -8,6 +8,7 @@ CTRL_SRCS-y :=
|
|
||||||
CTRL_SRCS-y += xc_core.c
|
|
||||||
CTRL_SRCS-$(CONFIG_X86) += xc_core_x86.c
|
|
||||||
CTRL_SRCS-$(CONFIG_IA64) += xc_core_ia64.c
|
|
||||||
+CTRL_SRCS-y += xc_cpupool.c
|
|
||||||
CTRL_SRCS-y += xc_domain.c
|
|
||||||
CTRL_SRCS-y += xc_evtchn.c
|
|
||||||
CTRL_SRCS-y += xc_misc.c
|
|
||||||
Index: xen-4.0.2-testing/tools/libxc/xc_cpupool.c
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ xen-4.0.2-testing/tools/libxc/xc_cpupool.c
|
|
||||||
@@ -0,0 +1,165 @@
|
|
||||||
+/******************************************************************************
|
|
||||||
+ * xc_cpupool.c
|
|
||||||
+ *
|
|
||||||
+ * API for manipulating and obtaining information on cpupools.
|
|
||||||
+ *
|
|
||||||
+ * Copyright (c) 2009, J Gross.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#include <stdarg.h>
|
|
||||||
+#include "xc_private.h"
|
|
||||||
+
|
|
||||||
+static int do_sysctl_save(int xc_handle, struct xen_sysctl *sysctl)
|
|
||||||
+{
|
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ do {
|
|
||||||
+ ret = do_sysctl(xc_handle, sysctl);
|
|
||||||
+ } while ( (ret < 0) && (errno == EAGAIN) );
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int xc_cpupool_create(int xc_handle,
|
|
||||||
+ uint32_t *ppoolid,
|
|
||||||
+ uint32_t sched_id)
|
|
||||||
+{
|
|
||||||
+ int err;
|
|
||||||
+ DECLARE_SYSCTL;
|
|
||||||
+
|
|
||||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
|
||||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_CREATE;
|
|
||||||
+ sysctl.u.cpupool_op.cpupool_id = (*ppoolid == 0) ?
|
|
||||||
+ XEN_SYSCTL_CPUPOOL_PAR_ANY : *ppoolid;
|
|
||||||
+ sysctl.u.cpupool_op.sched_id = sched_id;
|
|
||||||
+ if ( (err = do_sysctl_save(xc_handle, &sysctl)) != 0 )
|
|
||||||
+ return err;
|
|
||||||
+
|
|
||||||
+ *ppoolid = sysctl.u.cpupool_op.cpupool_id;
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int xc_cpupool_destroy(int xc_handle,
|
|
||||||
+ uint32_t poolid)
|
|
||||||
+{
|
|
||||||
+ DECLARE_SYSCTL;
|
|
||||||
+
|
|
||||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
|
||||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_DESTROY;
|
|
||||||
+ sysctl.u.cpupool_op.cpupool_id = poolid;
|
|
||||||
+ return do_sysctl_save(xc_handle, &sysctl);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int xc_cpupool_getinfo(int xc_handle,
|
|
||||||
+ uint32_t first_poolid,
|
|
||||||
+ uint32_t n_max,
|
|
||||||
+ xc_cpupoolinfo_t *info)
|
|
||||||
+{
|
|
||||||
+ int err = 0;
|
|
||||||
+ int p;
|
|
||||||
+ uint32_t poolid = first_poolid;
|
|
||||||
+ uint8_t local[sizeof (info->cpumap)];
|
|
||||||
+ DECLARE_SYSCTL;
|
|
||||||
+
|
|
||||||
+ memset(info, 0, n_max * sizeof(xc_cpupoolinfo_t));
|
|
||||||
+
|
|
||||||
+ for (p = 0; p < n_max; p++)
|
|
||||||
+ {
|
|
||||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
|
||||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_INFO;
|
|
||||||
+ sysctl.u.cpupool_op.cpupool_id = poolid;
|
|
||||||
+ set_xen_guest_handle(sysctl.u.cpupool_op.cpumap.bitmap, local);
|
|
||||||
+ sysctl.u.cpupool_op.cpumap.nr_cpus = sizeof(info->cpumap) * 8;
|
|
||||||
+
|
|
||||||
+ if ( (err = lock_pages(local, sizeof(local))) != 0 )
|
|
||||||
+ {
|
|
||||||
+ PERROR("Could not lock memory for Xen hypercall");
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ err = do_sysctl_save(xc_handle, &sysctl);
|
|
||||||
+ unlock_pages(local, sizeof (local));
|
|
||||||
+
|
|
||||||
+ if ( err < 0 )
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ info->cpupool_id = sysctl.u.cpupool_op.cpupool_id;
|
|
||||||
+ info->sched_id = sysctl.u.cpupool_op.sched_id;
|
|
||||||
+ info->n_dom = sysctl.u.cpupool_op.n_dom;
|
|
||||||
+ bitmap_byte_to_64(&(info->cpumap), local, sizeof(local) * 8);
|
|
||||||
+ poolid = sysctl.u.cpupool_op.cpupool_id + 1;
|
|
||||||
+ info++;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ( p == 0 )
|
|
||||||
+ return err;
|
|
||||||
+
|
|
||||||
+ return p;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int xc_cpupool_addcpu(int xc_handle,
|
|
||||||
+ uint32_t poolid,
|
|
||||||
+ int cpu)
|
|
||||||
+{
|
|
||||||
+ DECLARE_SYSCTL;
|
|
||||||
+
|
|
||||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
|
||||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_ADDCPU;
|
|
||||||
+ sysctl.u.cpupool_op.cpupool_id = poolid;
|
|
||||||
+ sysctl.u.cpupool_op.cpu = (cpu < 0) ? XEN_SYSCTL_CPUPOOL_PAR_ANY : cpu;
|
|
||||||
+ return do_sysctl_save(xc_handle, &sysctl);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int xc_cpupool_removecpu(int xc_handle,
|
|
||||||
+ uint32_t poolid,
|
|
||||||
+ int cpu)
|
|
||||||
+{
|
|
||||||
+ DECLARE_SYSCTL;
|
|
||||||
+
|
|
||||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
|
||||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_RMCPU;
|
|
||||||
+ sysctl.u.cpupool_op.cpupool_id = poolid;
|
|
||||||
+ sysctl.u.cpupool_op.cpu = (cpu < 0) ? XEN_SYSCTL_CPUPOOL_PAR_ANY : cpu;
|
|
||||||
+ return do_sysctl_save(xc_handle, &sysctl);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int xc_cpupool_movedomain(int xc_handle,
|
|
||||||
+ uint32_t poolid,
|
|
||||||
+ uint32_t domid)
|
|
||||||
+{
|
|
||||||
+ DECLARE_SYSCTL;
|
|
||||||
+
|
|
||||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
|
||||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN;
|
|
||||||
+ sysctl.u.cpupool_op.cpupool_id = poolid;
|
|
||||||
+ sysctl.u.cpupool_op.domid = domid;
|
|
||||||
+ return do_sysctl_save(xc_handle, &sysctl);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int xc_cpupool_freeinfo(int xc_handle,
|
|
||||||
+ uint64_t *cpumap)
|
|
||||||
+{
|
|
||||||
+ int err;
|
|
||||||
+ uint8_t local[sizeof (*cpumap)];
|
|
||||||
+ DECLARE_SYSCTL;
|
|
||||||
+
|
|
||||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
|
||||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_FREEINFO;
|
|
||||||
+ set_xen_guest_handle(sysctl.u.cpupool_op.cpumap.bitmap, local);
|
|
||||||
+ sysctl.u.cpupool_op.cpumap.nr_cpus = sizeof(*cpumap) * 8;
|
|
||||||
+
|
|
||||||
+ if ( (err = lock_pages(local, sizeof(local))) != 0 )
|
|
||||||
+ {
|
|
||||||
+ PERROR("Could not lock memory for Xen hypercall");
|
|
||||||
+ return err;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ err = do_sysctl_save(xc_handle, &sysctl);
|
|
||||||
+ unlock_pages(local, sizeof (local));
|
|
||||||
+
|
|
||||||
+ if (err < 0)
|
|
||||||
+ return err;
|
|
||||||
+
|
|
||||||
+ bitmap_byte_to_64(cpumap, local, sizeof(local) * 8);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
Index: xen-4.0.2-testing/tools/libxc/xc_domain.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/libxc/xc_domain.c
|
|
||||||
+++ xen-4.0.2-testing/tools/libxc/xc_domain.c
|
|
||||||
@@ -220,6 +220,7 @@ int xc_domain_getinfo(int xc_handle,
|
|
||||||
info->cpu_time = domctl.u.getdomaininfo.cpu_time;
|
|
||||||
info->nr_online_vcpus = domctl.u.getdomaininfo.nr_online_vcpus;
|
|
||||||
info->max_vcpu_id = domctl.u.getdomaininfo.max_vcpu_id;
|
|
||||||
+ info->cpupool = domctl.u.getdomaininfo.cpupool;
|
|
||||||
|
|
||||||
memcpy(info->handle, domctl.u.getdomaininfo.handle,
|
|
||||||
sizeof(xen_domain_handle_t));
|
|
||||||
Index: xen-4.0.2-testing/tools/libxc/xenctrl.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/libxc/xenctrl.h
|
|
||||||
+++ xen-4.0.2-testing/tools/libxc/xenctrl.h
|
|
||||||
@@ -161,6 +161,7 @@ typedef struct xc_dominfo {
|
|
||||||
unsigned int nr_online_vcpus;
|
|
||||||
unsigned int max_vcpu_id;
|
|
||||||
xen_domain_handle_t handle;
|
|
||||||
+ unsigned int cpupool;
|
|
||||||
} xc_dominfo_t;
|
|
||||||
|
|
||||||
typedef xen_domctl_getdomaininfo_t xc_domaininfo_t;
|
|
||||||
@@ -492,6 +493,100 @@ int xc_domain_setdebugging(int xc_handle
|
|
||||||
unsigned int enable);
|
|
||||||
|
|
||||||
/*
|
|
||||||
+ * CPUPOOL MANAGEMENT FUNCTIONS
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+typedef struct xc_cpupoolinfo {
|
|
||||||
+ uint32_t cpupool_id;
|
|
||||||
+ uint32_t sched_id;
|
|
||||||
+ uint32_t n_dom;
|
|
||||||
+ uint64_t cpumap;
|
|
||||||
+} xc_cpupoolinfo_t;
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Create a new cpupool.
|
|
||||||
+ *
|
|
||||||
+ * @parm xc_handle a handle to an open hypervisor interface
|
|
||||||
+ * @parm ppoolid pointer to the new cpupool id (in/out)
|
|
||||||
+ * @parm sched_id id of scheduler to use for pool
|
|
||||||
+ * return 0 on success, -1 on failure
|
|
||||||
+ */
|
|
||||||
+int xc_cpupool_create(int xc_handle,
|
|
||||||
+ uint32_t *ppoolid,
|
|
||||||
+ uint32_t sched_id);
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Destroy a cpupool. Pool must be unused and have no cpu assigned.
|
|
||||||
+ *
|
|
||||||
+ * @parm xc_handle a handle to an open hypervisor interface
|
|
||||||
+ * @parm poolid id of the cpupool to destroy
|
|
||||||
+ * return 0 on success, -1 on failure
|
|
||||||
+ */
|
|
||||||
+int xc_cpupool_destroy(int xc_handle,
|
|
||||||
+ uint32_t poolid);
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Get cpupool info. Returns info for up to the specified number of cpupools
|
|
||||||
+ * starting at the given id.
|
|
||||||
+ * @parm xc_handle a handle to an open hypervisor interface
|
|
||||||
+ * @parm first_poolid lowest id for which info is returned
|
|
||||||
+ * @parm n_max maximum number of cpupools to return info
|
|
||||||
+ * @parm info pointer to xc_cpupoolinfo_t array
|
|
||||||
+ * return number of cpupool infos
|
|
||||||
+ */
|
|
||||||
+int xc_cpupool_getinfo(int xc_handle,
|
|
||||||
+ uint32_t first_poolid,
|
|
||||||
+ uint32_t n_max,
|
|
||||||
+ xc_cpupoolinfo_t *info);
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Add cpu to a cpupool. cpu may be -1 indicating the first unassigned.
|
|
||||||
+ *
|
|
||||||
+ * @parm xc_handle a handle to an open hypervisor interface
|
|
||||||
+ * @parm poolid id of the cpupool
|
|
||||||
+ * @parm cpu cpu number to add
|
|
||||||
+ * return 0 on success, -1 on failure
|
|
||||||
+ */
|
|
||||||
+int xc_cpupool_addcpu(int xc_handle,
|
|
||||||
+ uint32_t poolid,
|
|
||||||
+ int cpu);
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Remove cpu from cpupool. cpu may be -1 indicating the last cpu of the pool.
|
|
||||||
+ *
|
|
||||||
+ * @parm xc_handle a handle to an open hypervisor interface
|
|
||||||
+ * @parm poolid id of the cpupool
|
|
||||||
+ * @parm cpu cpu number to remove
|
|
||||||
+ * return 0 on success, -1 on failure
|
|
||||||
+ */
|
|
||||||
+int xc_cpupool_removecpu(int xc_handle,
|
|
||||||
+ uint32_t poolid,
|
|
||||||
+ int cpu);
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Move domain to another cpupool.
|
|
||||||
+ *
|
|
||||||
+ * @parm xc_handle a handle to an open hypervisor interface
|
|
||||||
+ * @parm poolid id of the destination cpupool
|
|
||||||
+ * @parm domid id of the domain to move
|
|
||||||
+ * return 0 on success, -1 on failure
|
|
||||||
+ */
|
|
||||||
+int xc_cpupool_movedomain(int xc_handle,
|
|
||||||
+ uint32_t poolid,
|
|
||||||
+ uint32_t domid);
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Return map of cpus not in any cpupool.
|
|
||||||
+ *
|
|
||||||
+ * @parm xc_handle a handle to an open hypervisor interface
|
|
||||||
+ * @parm cpumap pointer where to store the cpumap
|
|
||||||
+ * return 0 on success, -1 on failure
|
|
||||||
+ */
|
|
||||||
+int xc_cpupool_freeinfo(int xc_handle,
|
|
||||||
+ uint64_t *cpumap);
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
* EVENT CHANNEL FUNCTIONS
|
|
||||||
*/
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,838 +0,0 @@
|
|||||||
Index: xen-4.0.2-testing/tools/xm-test/configure.ac
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/xm-test/configure.ac
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/configure.ac
|
|
||||||
@@ -161,6 +161,7 @@ AC_CONFIG_FILES([
|
|
||||||
tests/vtpm/Makefile
|
|
||||||
tests/xapi/Makefile
|
|
||||||
tests/enforce_dom0_cpus/Makefile
|
|
||||||
+ tests/cpupool/Makefile
|
|
||||||
lib/XmTestReport/xmtest.py
|
|
||||||
lib/XmTestLib/config.py
|
|
||||||
])
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/grouptest/cpupool
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/grouptest/cpupool
|
|
||||||
@@ -0,0 +1 @@
|
|
||||||
+cpupool
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/lib/XmTestLib/NetConfig.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/xm-test/lib/XmTestLib/NetConfig.py
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/lib/XmTestLib/NetConfig.py
|
|
||||||
@@ -56,17 +56,21 @@ def getXendNetConfig():
|
|
||||||
val = pin.get_val()
|
|
||||||
while val[0] != 'network-script':
|
|
||||||
val = pin.get_val()
|
|
||||||
-
|
|
||||||
- # split network command into script name and its parameters
|
|
||||||
- sub_val = val[1].split()
|
|
||||||
- if sub_val[0] == "network-bridge":
|
|
||||||
+
|
|
||||||
+ if val[0] != 'network-script' or len(val) < 2:
|
|
||||||
+ # entry network-script not found or no type specified
|
|
||||||
netenv = "bridge"
|
|
||||||
- elif sub_val[0] == "network-route":
|
|
||||||
- netenv = "route"
|
|
||||||
- elif sub_val[0] == "network-nat":
|
|
||||||
- netenv = "nat"
|
|
||||||
else:
|
|
||||||
- raise NetworkError("Failed to get network env from xend config")
|
|
||||||
+ # split network command into script name and its parameters
|
|
||||||
+ sub_val = val[1].split()
|
|
||||||
+ if sub_val[0] == "network-bridge":
|
|
||||||
+ netenv = "bridge"
|
|
||||||
+ elif sub_val[0] == "network-route":
|
|
||||||
+ netenv = "route"
|
|
||||||
+ elif sub_val[0] == "network-nat":
|
|
||||||
+ netenv = "nat"
|
|
||||||
+ else:
|
|
||||||
+ raise NetworkError("Failed to get network env from xend config")
|
|
||||||
|
|
||||||
configfile.close()
|
|
||||||
return netenv
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/lib/XmTestLib/XenDomain.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/xm-test/lib/XmTestLib/XenDomain.py
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/lib/XmTestLib/XenDomain.py
|
|
||||||
@@ -181,6 +181,7 @@ class XenDomain:
|
|
||||||
|
|
||||||
if not self.isManaged:
|
|
||||||
ret, output = traceCommand("xm create %s" % self.config)
|
|
||||||
+ print self.config
|
|
||||||
else:
|
|
||||||
ret, output = traceCommand("xm new %s" % self.config)
|
|
||||||
if ret != 0:
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/runtest.sh
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/xm-test/runtest.sh
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/runtest.sh
|
|
||||||
@@ -91,7 +91,7 @@ runnable_tests() {
|
|
||||||
echo "Error: ramdisk/initrd.img is from an old version, or is not for this "
|
|
||||||
echo "architecture ($ARCH)."
|
|
||||||
echo "You need to build a ramdisk from at least ${XM_TEST_MAJ}.${XM_TEST_MIN}"
|
|
||||||
- exit 1
|
|
||||||
+ #exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# See if xend is running
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/tests/Makefile.am
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/xm-test/tests/Makefile.am
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/tests/Makefile.am
|
|
||||||
@@ -28,7 +28,8 @@ SUBDIRS = \
|
|
||||||
vcpu-pin \
|
|
||||||
vtpm \
|
|
||||||
enforce_dom0_cpus \
|
|
||||||
- save restore migrate
|
|
||||||
+ save restore migrate \
|
|
||||||
+ cpupool
|
|
||||||
|
|
||||||
EXTRA_DIST = $(SUBDIRS) Makefile.am.template
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/01_cpupool_basic_pos.py
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/01_cpupool_basic_pos.py
|
|
||||||
@@ -0,0 +1,72 @@
|
|
||||||
+#!/usr/bin/python
|
|
||||||
+
|
|
||||||
+import sys
|
|
||||||
+import re
|
|
||||||
+import time
|
|
||||||
+
|
|
||||||
+from XmTestLib import *
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Check output of xm info. It must include field 'free_cpus'
|
|
||||||
+# The value must be between 0 - nr_cpus
|
|
||||||
+#
|
|
||||||
+free_cpus = getInfo("free_cpus")
|
|
||||||
+if free_cpus == "":
|
|
||||||
+ FAIL("Missing 'free_cpus' entry in xm info output")
|
|
||||||
+if int(free_cpus) not in range(int(getInfo("nr_cpus")) + 1):
|
|
||||||
+ FAIL("Wrong value of 'free_cpus' (%s)" % int(free_cpus))
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Check output of xm list -l. It must contain the key 'pool_name'
|
|
||||||
+# If XM_USES_API is set, output must also contain 'cpu_pool'.
|
|
||||||
+#
|
|
||||||
+status, output = traceCommand("xm list -l Domain-0")
|
|
||||||
+if status != 0 or "Traceback" in output:
|
|
||||||
+ raise XmError("xm failed", trace=output, status=status)
|
|
||||||
+if not re.search("pool_name Pool-0", output):
|
|
||||||
+ FAIL("Missing or wrong attribute 'pool_name' in output of 'xm list -l'")
|
|
||||||
+if os.getenv("XM_USES_API"):
|
|
||||||
+ if not re.search("cpu_pool (.+)", output):
|
|
||||||
+ FAIL("Missing or wrong attribute 'cpu_pool' in output of 'xm list -l'")
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Test pool selection option of xm list.
|
|
||||||
+#
|
|
||||||
+status, output = traceCommand("xm list --pool=Pool-0")
|
|
||||||
+if status != 0 or "Traceback" in output:
|
|
||||||
+ raise XmError("xm failed", trace=output, status=status)
|
|
||||||
+if not re.search("Domain-0 +0 +", output):
|
|
||||||
+ FAIL("Missing 'Domain-0' in Pool-0")
|
|
||||||
+
|
|
||||||
+status, output = traceCommand("xm list --pool=Dummy-Pool")
|
|
||||||
+if status != 0 or "Traceback" in output:
|
|
||||||
+ raise XmError("xm failed", trace=output, status=status)
|
|
||||||
+if len(output.splitlines()) != 1:
|
|
||||||
+ FAIL("Wrong pool selection; output must be empty")
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Create a Domain without pool specification.
|
|
||||||
+# Default pool is Pool-0
|
|
||||||
+#
|
|
||||||
+name = "TestDomPool-1"
|
|
||||||
+domain = XmTestDomain(name=name)
|
|
||||||
+try:
|
|
||||||
+ domain.start(noConsole=True)
|
|
||||||
+except DomainError, ex:
|
|
||||||
+ FAIL(str(e))
|
|
||||||
+
|
|
||||||
+if not isDomainRunning(name):
|
|
||||||
+ FAIL("Couldn't start domain without pool specification")
|
|
||||||
+
|
|
||||||
+status, output = traceCommand("xm list -l %s" % name)
|
|
||||||
+if status != 0 or "Traceback" in output:
|
|
||||||
+ raise XmError("xm failed", trace=output, status=status)
|
|
||||||
+if not re.search("pool_name Pool-0", output):
|
|
||||||
+ FAIL("Missing or wrong attribute 'pool_name' in output of 'xm list -l %s'" % name)
|
|
||||||
+
|
|
||||||
+destroyAllDomUs()
|
|
||||||
+
|
|
||||||
+
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/02_cpupool_manage_pos.py
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/02_cpupool_manage_pos.py
|
|
||||||
@@ -0,0 +1,152 @@
|
|
||||||
+#!/usr/bin/python
|
|
||||||
+
|
|
||||||
+# Description:
|
|
||||||
+# Verify commands pool-new and pool-delete.
|
|
||||||
+#
|
|
||||||
+import sys
|
|
||||||
+import re
|
|
||||||
+import time
|
|
||||||
+
|
|
||||||
+from XmTestLib import *
|
|
||||||
+from pools import *
|
|
||||||
+
|
|
||||||
+checkRequirements()
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Check output of xm pool-list (of Pool-0)
|
|
||||||
+#
|
|
||||||
+status, output = traceCommand("xm pool-list Pool-0")
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("xm pool-list failed, rc %s" % status)
|
|
||||||
+lines = output.splitlines()
|
|
||||||
+if len(lines) != 2:
|
|
||||||
+ FAIL("Wrong output of xm pool-list Pool-0 (%s)" % lines)
|
|
||||||
+if not re.search("Pool-0 +[0-9]+ +credit +y +[0-9]", lines[1]):
|
|
||||||
+ FAIL("Wrong output of xm pool-list Pool-0 (%s)" % lines)
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Check output of xm pool-list -l (of Pool-0)
|
|
||||||
+#
|
|
||||||
+status, output = traceCommand("xm pool-list Pool-0 -l")
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("xm pool-list failed, rc %s" % status)
|
|
||||||
+if not re.search("name_label Pool-0", output):
|
|
||||||
+ FAIL("Wrong output of xm pool-list Pool-0 -l; missing 'name_label'")
|
|
||||||
+if not re.search("started_VMs 00000000-0000-0000-0000-000000000000", output):
|
|
||||||
+ FAIL("Wrong output of xm pool-list Pool-0 -l; missing 'started_VMs'")
|
|
||||||
+if not re.search("started_VM_names Domain-0", output):
|
|
||||||
+ FAIL("Wrong output of xm pool-list Pool-0 -l; missing 'started_VMi_names'")
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Create a pool from pool1.cfg
|
|
||||||
+#
|
|
||||||
+cmd = "xm pool-new pool1.cfg name=Pool-1"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+
|
|
||||||
+status, output = traceCommand("xm pool-list")
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("xm pool-list failed, rc %s" % status)
|
|
||||||
+if not re.search("Pool-1 +1 +credit", output):
|
|
||||||
+ FAIL("Missing or wrong pool definition for 'Pool-1'")
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# check persistence of pool; restart xend
|
|
||||||
+#
|
|
||||||
+restartXend()
|
|
||||||
+
|
|
||||||
+status, output = traceCommand("xm pool-list")
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("xm pool-list failed, rc %s" % status)
|
|
||||||
+if not re.search("Pool-1 +1 +credit", output):
|
|
||||||
+ FAIL("Missing or wrong pool definition for 'Pool-1'")
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Delete pool
|
|
||||||
+#
|
|
||||||
+deletePool("Pool-1")
|
|
||||||
+status, output = traceCommand("xm pool-list")
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("xm pool-list failed, rc %s" % status)
|
|
||||||
+if re.search("Pool-1 +1 +credit", output):
|
|
||||||
+ FAIL("'Pool-1' not deleted")
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# create / start / check / destroy / delete a managed pool
|
|
||||||
+#
|
|
||||||
+cmd = "xm pool-new pool1.cfg"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+
|
|
||||||
+cmd = "xm pool-start Pool-1"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+
|
|
||||||
+cmd = "xm pool-list -l Pool-1"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+if not re.search("host_CPU_numbers +[0-9]", output):
|
|
||||||
+ FAIL("'Pool-1' not activated")
|
|
||||||
+
|
|
||||||
+restartXend()
|
|
||||||
+
|
|
||||||
+cmd = "xm pool-list -l Pool-1"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+if not re.search("host_CPU_numbers +[0-9]", output):
|
|
||||||
+ FAIL("'Pool-1' not activated")
|
|
||||||
+
|
|
||||||
+destroyPool("Pool-1")
|
|
||||||
+deletePool("Pool-1")
|
|
||||||
+
|
|
||||||
+cmd = "xm pool-list Pool-1"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+if re.search("Pool-1 +1 +credit", output):
|
|
||||||
+ FAIL("'Pool-1' not deleted")
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# create / check / destroy a unmanaged pool
|
|
||||||
+#
|
|
||||||
+cmd = "xm pool-create pool1.cfg"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+
|
|
||||||
+cmd = "xm pool-list -l Pool-1"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+if not re.search("host_CPU_numbers +[0-9]", output):
|
|
||||||
+ FAIL("'Pool-1' not activated")
|
|
||||||
+
|
|
||||||
+restartXend()
|
|
||||||
+
|
|
||||||
+cmd = "xm pool-list -l Pool-1"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+if not re.search("host_CPU_numbers +[0-9]", output):
|
|
||||||
+ FAIL("'Pool-1' not activated")
|
|
||||||
+
|
|
||||||
+destroyPool("Pool-1", True)
|
|
||||||
+
|
|
||||||
+cmd = "xm pool-list"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+if re.search("Pool-1", output):
|
|
||||||
+ FAIL("'Pool-1' not deleted")
|
|
||||||
+
|
|
||||||
+
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/03_cpupool_domain.py
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/03_cpupool_domain.py
|
|
||||||
@@ -0,0 +1,126 @@
|
|
||||||
+#!/usr/bin/python
|
|
||||||
+
|
|
||||||
+import sys
|
|
||||||
+import re
|
|
||||||
+import time
|
|
||||||
+
|
|
||||||
+from XmTestLib import *
|
|
||||||
+from pools import *
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+checkRequirements()
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# create Pool-1 with 1 CPU and start a VM
|
|
||||||
+#
|
|
||||||
+createStdPool()
|
|
||||||
+name = "TestDomPool-1"
|
|
||||||
+domain = XmTestDomain(extraConfig={'pool' : 'Pool-1'}, name=name)
|
|
||||||
+try:
|
|
||||||
+ domain.start(noConsole=True)
|
|
||||||
+except DomainError, ex:
|
|
||||||
+ FAIL(str(e))
|
|
||||||
+
|
|
||||||
+cmd = "xm list --pool=Pool-1"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+if not re.search(name, output):
|
|
||||||
+ FAIL("%s; missing '%s' in Pool-1" % (cmd,name))
|
|
||||||
+
|
|
||||||
+domain.stop()
|
|
||||||
+waitForDomain(name)
|
|
||||||
+destroyPool("Pool-1", True)
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# create Pool-1 with 1 CPU, add a second CPU
|
|
||||||
+# start a VM (with vpcu=3) add a third CPU
|
|
||||||
+# remove 2 CPUs from pool
|
|
||||||
+# create Pool-1 with 1 CPU and start a VM
|
|
||||||
+#
|
|
||||||
+pool_names = ['Pool-1', 'Pool-2']
|
|
||||||
+createStdPool({'name' : pool_names[0], 'cpus' : '"1"'})
|
|
||||||
+name = "TestDomPool-1"
|
|
||||||
+cmd = "xm pool-cpu-add Pool-1 2"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+
|
|
||||||
+domain = XmTestDomain(extraConfig={ 'pool' : 'Pool-1'}, name=name)
|
|
||||||
+try:
|
|
||||||
+ domain.start(noConsole=True)
|
|
||||||
+except DomainError, ex:
|
|
||||||
+ FAIL(str(e))
|
|
||||||
+
|
|
||||||
+cmd = "xm pool-cpu-add Pool-1 3"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+
|
|
||||||
+cmd = "xm pool-cpu-remove Pool-1 2"
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+cmd = "xm pool-cpu-remove Pool-1 3"
|
|
||||||
+
|
|
||||||
+status, output = traceCommand(cmd)
|
|
||||||
+if status != 0:
|
|
||||||
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+createStdPool({'name' : pool_names[1]})
|
|
||||||
+name2 = "TestDomPool-2"
|
|
||||||
+domain2 = XmTestDomain(extraConfig={ 'pool' : 'Pool-2'}, name=name2)
|
|
||||||
+try:
|
|
||||||
+ domain2.start(noConsole=True)
|
|
||||||
+except DomainError, ex:
|
|
||||||
+ FAIL(str(e))
|
|
||||||
+
|
|
||||||
+domain2.stop()
|
|
||||||
+domain.stop()
|
|
||||||
+
|
|
||||||
+waitForDomain(name)
|
|
||||||
+waitForDomain(name2)
|
|
||||||
+
|
|
||||||
+for pool in pool_names:
|
|
||||||
+ destroyPool(pool, True)
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Create 2 pools with 1 cpu per pool.
|
|
||||||
+# Create three domains in each pool, with 1,2,3 VCPUs
|
|
||||||
+# Switch a thrid cpu between the pools.
|
|
||||||
+#
|
|
||||||
+pool_names = ['Pool-1', 'Pool-2']
|
|
||||||
+domains = {}
|
|
||||||
+cpu=3
|
|
||||||
+
|
|
||||||
+for pool in pool_names:
|
|
||||||
+ createStdPool({'name' : pool})
|
|
||||||
+ for dom_nr in range(3):
|
|
||||||
+ name = "TestDom%s-%s" % (pool, dom_nr)
|
|
||||||
+ domains[name] = XmTestDomain(extraConfig={'pool' : pool},
|
|
||||||
+ name=name)
|
|
||||||
+ try:
|
|
||||||
+ domains[name].start(noConsole=True)
|
|
||||||
+ except DomainError, ex:
|
|
||||||
+ FAIL(str(ex))
|
|
||||||
+
|
|
||||||
+cmd_add_1 = "xm pool-cpu-add Pool-1 %s" % cpu
|
|
||||||
+cmd_rem_1 = "xm pool-cpu-remove Pool-1 %s" % cpu
|
|
||||||
+cmd_add_2 = "xm pool-cpu-add Pool-2 %s" % cpu
|
|
||||||
+cmd_rem_2 = "xm pool-cpu-remove Pool-2 %s" % cpu
|
|
||||||
+
|
|
||||||
+for i in range(25):
|
|
||||||
+ traceCommand(cmd_add_1)
|
|
||||||
+ traceCommand(cmd_rem_1)
|
|
||||||
+ traceCommand(cmd_add_2)
|
|
||||||
+ traceCommand(cmd_rem_2)
|
|
||||||
+
|
|
||||||
+destroyAllDomUs()
|
|
||||||
+for pool in pool_names:
|
|
||||||
+ destroyPool(pool, True)
|
|
||||||
+
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/04_cpupool_migrate.py
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/04_cpupool_migrate.py
|
|
||||||
@@ -0,0 +1,84 @@
|
|
||||||
+#!/usr/bin/python
|
|
||||||
+
|
|
||||||
+import sys
|
|
||||||
+import re
|
|
||||||
+import time
|
|
||||||
+
|
|
||||||
+from XmTestLib import *
|
|
||||||
+from pools import *
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Check requirements of test case
|
|
||||||
+# - min 2 free cpus (not assigned to a pool)
|
|
||||||
+#
|
|
||||||
+if int(getInfo("free_cpus")) < 2:
|
|
||||||
+ SKIP("Need at least 2 free cpus")
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Create 2 pools with one cpu per pool.
|
|
||||||
+#
|
|
||||||
+createStdPool({'name' : 'Pool-1'})
|
|
||||||
+createStdPool({'name' : 'Pool-2'})
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Create a domain with vcpus=1 in Pool-0.
|
|
||||||
+# Migrate it to one of the created pools afterwards to the other pool
|
|
||||||
+#
|
|
||||||
+name = "TestDomPool-1"
|
|
||||||
+domain = XmTestDomain(extraConfig={'pool' : 'Pool-0'}, name=name)
|
|
||||||
+try:
|
|
||||||
+ domain.start(noConsole=True)
|
|
||||||
+except DomainError, ex:
|
|
||||||
+ FAIL(str(e))
|
|
||||||
+if not domInPool(name, 'Pool-0'):
|
|
||||||
+ FAIL("missing '%s' in Pool-0" % name)
|
|
||||||
+
|
|
||||||
+if not migrateToPool(name, 'Pool-1'):
|
|
||||||
+ FAIL("missing '%s' in Pool-1" % name)
|
|
||||||
+if not migrateToPool(name, 'Pool-2'):
|
|
||||||
+ FAIL("missing '%s' in Pool-2" % name)
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Create a domain in Pool-0.
|
|
||||||
+# Migrate it to one of the created pools afterwards to the other pool
|
|
||||||
+#
|
|
||||||
+name = "TestDomPool-2"
|
|
||||||
+domain = XmTestDomain(extraConfig={'pool' : 'Pool-0'}, name=name)
|
|
||||||
+try:
|
|
||||||
+ domain.start(noConsole=True)
|
|
||||||
+except DomainError, ex:
|
|
||||||
+ FAIL(str(e))
|
|
||||||
+if not domInPool(name, 'Pool-0'):
|
|
||||||
+ FAIL("missing '%s' in Pool-0" % name)
|
|
||||||
+
|
|
||||||
+if not migrateToPool(name, 'Pool-1'):
|
|
||||||
+ FAIL("missing '%s' in Pool-1" % name)
|
|
||||||
+if not migrateToPool(name, 'Pool-2'):
|
|
||||||
+ FAIL("missing '%s' in Pool-2" % name)
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Migrate other domains between pools
|
|
||||||
+#
|
|
||||||
+for cnt in range(10):
|
|
||||||
+ for pool in ['Pool-0', 'Pool-1', 'Pool-2']:
|
|
||||||
+ for domain in getRunningDomains():
|
|
||||||
+ if domain != 'Domain-0':
|
|
||||||
+ if not migrateToPool(domain, pool):
|
|
||||||
+ FAIL("missing '%s' in %s" % (domain, pool))
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Cleanup
|
|
||||||
+#
|
|
||||||
+cleanupPoolsDomains()
|
|
||||||
+
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/Makefile.am
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/Makefile.am
|
|
||||||
@@ -0,0 +1,22 @@
|
|
||||||
+SUBDIRS =
|
|
||||||
+
|
|
||||||
+TESTS = 01_cpupool_basic_pos.test \
|
|
||||||
+ 02_cpupool_manage_pos.test \
|
|
||||||
+ 03_cpupool_domain.test \
|
|
||||||
+ 04_cpupool_migrate.test
|
|
||||||
+
|
|
||||||
+EXTRA_DIST = $(TESTS)
|
|
||||||
+
|
|
||||||
+TESTS_ENVIRONMENT=@TENV@
|
|
||||||
+
|
|
||||||
+%.test: %.py
|
|
||||||
+ cp $< $@
|
|
||||||
+ chmod +x $@
|
|
||||||
+
|
|
||||||
+clean-local: am_config_clean-local
|
|
||||||
+
|
|
||||||
+am_config_clean-local:
|
|
||||||
+ rm -f *test
|
|
||||||
+ rm -f *log
|
|
||||||
+ rm -f *~
|
|
||||||
+
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/pool1.cfg
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/pool1.cfg
|
|
||||||
@@ -0,0 +1 @@
|
|
||||||
+name="Pool-1"
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/pools.py
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/pools.py
|
|
||||||
@@ -0,0 +1,78 @@
|
|
||||||
+#!/usr/bin/python
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+from XmTestLib import *
|
|
||||||
+
|
|
||||||
+def checkRequirements():
|
|
||||||
+ # - min 4 cpus
|
|
||||||
+ # - only Pool-0 defined
|
|
||||||
+ nr_cpus = int(getInfo("nr_cpus"))
|
|
||||||
+ if nr_cpus < 4:
|
|
||||||
+ SKIP("Need at least 4 cpus for pool tests")
|
|
||||||
+ if len(getPoolList()) > 1:
|
|
||||||
+ SKIP("More than one pool already defined")
|
|
||||||
+
|
|
||||||
+ # reduce Pool-0 to CPU-0
|
|
||||||
+ traceCommand("xm pool-cpu-add Pool-0 0")
|
|
||||||
+ for i in range(1, nr_cpus):
|
|
||||||
+ traceCommand("xm pool-cpu-remove Pool-0 %s" % i)
|
|
||||||
+
|
|
||||||
+def createStdPool(add_param=None):
|
|
||||||
+ cmd = "xm pool-create pool1.cfg "
|
|
||||||
+ if add_param:
|
|
||||||
+ for k,v in add_param.items():
|
|
||||||
+ cmd += "%s=%s " % (k,v)
|
|
||||||
+ status, output = traceCommand(cmd)
|
|
||||||
+ if status != 0 or "Traceback" in output:
|
|
||||||
+ raise XmError("xm failed", trace=output, status=status)
|
|
||||||
+
|
|
||||||
+def deletePool(name):
|
|
||||||
+ cmd = "xm pool-delete %s" % name
|
|
||||||
+ status, output = traceCommand(cmd)
|
|
||||||
+ if status != 0 or "Traceback" in output:
|
|
||||||
+ raise XmError("xm failed", trace=output, status=status)
|
|
||||||
+
|
|
||||||
+def destroyPool(name, delete_on_xenapi=False):
|
|
||||||
+ cmd = "xm pool-destroy %s" % name
|
|
||||||
+ status, output = traceCommand(cmd)
|
|
||||||
+ if status != 0 or "Traceback" in output:
|
|
||||||
+ raise XmError("xm failed", trace=output, status=status)
|
|
||||||
+ if os.getenv("XM_USES_API") and delete_on_xenapi:
|
|
||||||
+ deletePool(name)
|
|
||||||
+
|
|
||||||
+def getPoolList():
|
|
||||||
+ status, output = traceCommand("xm pool-list")
|
|
||||||
+ if status != 0 or "Traceback" in output:
|
|
||||||
+ raise XmError("xm failed", trace=output, status=status)
|
|
||||||
+ lines = output.splitlines()
|
|
||||||
+ pools = []
|
|
||||||
+ for l in lines[1:]:
|
|
||||||
+ elms = l.split(" ", 1)
|
|
||||||
+ pools.append(elms[0]);
|
|
||||||
+ return pools
|
|
||||||
+
|
|
||||||
+def domInPool(dom, pool):
|
|
||||||
+ cmd = "xm list --pool=%s" % pool
|
|
||||||
+ status, output = traceCommand(cmd)
|
|
||||||
+ if status != 0 or "Traceback" in output:
|
|
||||||
+ raise XmError("xm failed", trace=output, status=status)
|
|
||||||
+ return re.search(dom, output) != None
|
|
||||||
+
|
|
||||||
+def migrateToPool(dom, pool):
|
|
||||||
+ status, output = traceCommand("xm pool-migrate %s %s" % (dom, pool))
|
|
||||||
+ if status != 0 or "Traceback" in output:
|
|
||||||
+ raise XmError("xm failed", trace=output, status=status)
|
|
||||||
+ return domInPool(dom, pool)
|
|
||||||
+
|
|
||||||
+def cleanupPoolsDomains():
|
|
||||||
+ destroyAllDomUs()
|
|
||||||
+ for pool in getPoolList():
|
|
||||||
+ if pool != 'Pool-0':
|
|
||||||
+ destroyPool(pool, True)
|
|
||||||
+
|
|
||||||
+def waitForDomain(name):
|
|
||||||
+ for i in range(10):
|
|
||||||
+ if not isDomainRunning(name):
|
|
||||||
+ break
|
|
||||||
+ time.sleep(1)
|
|
||||||
+
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/tests/xapi/20_xapi-cpu_pool_basic.py
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/tests/xapi/20_xapi-cpu_pool_basic.py
|
|
||||||
@@ -0,0 +1,157 @@
|
|
||||||
+#!/usr/bin/python
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# Basic Pool creation tests
|
|
||||||
+
|
|
||||||
+from XmTestLib import xapi
|
|
||||||
+from XmTestLib import *
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+session = xapi.connect()
|
|
||||||
+host_ref = session.xenapi.host.get_all()[0]
|
|
||||||
+pools = session.xenapi.host.get_resident_cpu_pools(host_ref)
|
|
||||||
+if len(pools) != 1:
|
|
||||||
+ SKIP("Only Pool-0 have to be created for this test")
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# check extension of host object
|
|
||||||
+host_recs = session.xenapi.host.get_all_records()
|
|
||||||
+host_rec = host_recs[host_recs.keys()[0]]
|
|
||||||
+if len(host_recs.keys()) != 1 or not host_rec.has_key("resident_cpu_pools") or \
|
|
||||||
+ len(host_rec["resident_cpu_pools"]) != 1:
|
|
||||||
+ FAIL("Missing or wrong field 'resident_cpu_pools' in host record")
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# check extension of host_cpu object
|
|
||||||
+host_cpu_recs = session.xenapi.host_cpu.get_all_records()
|
|
||||||
+assigned_cpus = [ cpu for cpu in host_cpu_recs.values() if len(cpu["cpu_pool"]) > 0 ]
|
|
||||||
+unassigned_cpus = session.xenapi.host_cpu.get_unassigned_cpus()
|
|
||||||
+if len(host_cpu_recs) - len(assigned_cpus) != len(unassigned_cpus):
|
|
||||||
+ FAIL("Wrong host_cpu count values; CPUS total: %d, CPUS ass: %d, CPUS unass: %d" % (
|
|
||||||
+ len(host_cpu_recs), len(assigned_cpus), len(unassigned_cpus)))
|
|
||||||
+
|
|
||||||
+for cpu_rec in host_cpu_recs.values():
|
|
||||||
+ cpu_pool = session.xenapi.host_cpu.get_cpu_pool(cpu_rec['uuid'])
|
|
||||||
+ if cpu_pool != cpu_rec['cpu_pool']:
|
|
||||||
+ FAIL("Inconsistency of cpu_pool ref between host_cpu record (%s) "
|
|
||||||
+ "and get_cpu_pool (%s)" % (cpu_rec['cpu_pool'], cpu_pool))
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# create / modify / remove managed cpu pools
|
|
||||||
+pool1_cfg = { 'name_label' : 'Pool-1',
|
|
||||||
+ 'name_description' : 'new pool',
|
|
||||||
+ 'auto_power_on' : False,
|
|
||||||
+ 'ncpu' : '3',
|
|
||||||
+ 'sched_policy' : 'credit',
|
|
||||||
+ 'proposed_CPUs' : ['1','2'],
|
|
||||||
+ 'other_config' : { 'xmtest' : True },
|
|
||||||
+ }
|
|
||||||
+pool1 = session.xenapi.cpu_pool.create(pool1_cfg)
|
|
||||||
+pool1_rec = session.xenapi.cpu_pool.get_record(pool1)
|
|
||||||
+for k in pool1_cfg.keys():
|
|
||||||
+ if pool1_rec[k] != pool1_cfg[k]:
|
|
||||||
+ FAIL("Create error Pool-1 (create config %s, current config: %s, key: %s)" % (
|
|
||||||
+ pool1_cfg, pool1_rec, k))
|
|
||||||
+
|
|
||||||
+pool_all = session.xenapi.cpu_pool.get_all()
|
|
||||||
+if len(pool_all) != 2:
|
|
||||||
+ FAIL("cpu_pool.get_all() returns '%d', expected '2'" % len(pool_all))
|
|
||||||
+
|
|
||||||
+pool_all = session.xenapi.cpu_pool.get_all_records()
|
|
||||||
+if len(pool_all) != 2:
|
|
||||||
+ FAIL("cpu_pool.get_all_records() returns '%d', expected '2'" % len(pool_all))
|
|
||||||
+
|
|
||||||
+if pool1 != session.xenapi.cpu_pool.get_by_name_label(pool1_cfg['name_label'])[0]:
|
|
||||||
+ FAIL("cpu_pool.get_by_name_label() returns wrong value")
|
|
||||||
+
|
|
||||||
+if pool1 != session.xenapi.cpu_pool.get_by_uuid(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_by_uuid() returns wrong value")
|
|
||||||
+
|
|
||||||
+if session.xenapi.cpu_pool.get_activated(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_activated() returns 'true' instead of 'false'")
|
|
||||||
+
|
|
||||||
+if pool1_cfg['auto_power_on'] != session.xenapi.cpu_pool.get_auto_power_on(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_auto_power_on() returns wrong value")
|
|
||||||
+
|
|
||||||
+if len(session.xenapi.cpu_pool.get_host_CPUs(pool1)) != 0:
|
|
||||||
+ FAIL("cpu_pool.get_host_CPUs has to return an empty list")
|
|
||||||
+
|
|
||||||
+if pool1_cfg['name_label'] != session.xenapi.cpu_pool.get_name_label(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_name_label() returns wrong value")
|
|
||||||
+
|
|
||||||
+if pool1_cfg['name_description'] != session.xenapi.cpu_pool.get_name_description(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_name_description() returns wrong value")
|
|
||||||
+
|
|
||||||
+if pool1_cfg['ncpu'] != session.xenapi.cpu_pool.get_ncpu(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_ncpu() returns wrong value")
|
|
||||||
+
|
|
||||||
+cfg_len = len(pool1_cfg['proposed_CPUs'])
|
|
||||||
+api_len = len(session.xenapi.cpu_pool.get_proposed_CPUs(pool1))
|
|
||||||
+if cfg_len != api_len:
|
|
||||||
+ FAIL("cpu_pool.get_proposed_CPUs() returns wrong value; cfg_cnt: %s, api_cnt:%s" % (cfg_len, api_len))
|
|
||||||
+
|
|
||||||
+other_config = session.xenapi.cpu_pool.get_other_config(pool1)
|
|
||||||
+if pool1_cfg['other_config']['xmtest'] != other_config.get('xmtest'):
|
|
||||||
+ FAIL("cpu_pool.get_other_config() returns wrong value")
|
|
||||||
+
|
|
||||||
+if session.xenapi.cpu_pool.get_resident_on(pool1) != session.xenapi.host.get_all()[0]:
|
|
||||||
+ FAIL("cpu_pool.get_resident_on() returns wrong value")
|
|
||||||
+
|
|
||||||
+if pool1_cfg['sched_policy'] != session.xenapi.cpu_pool.get_sched_policy(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_sched_policy() returns wrong value")
|
|
||||||
+
|
|
||||||
+if len(session.xenapi.cpu_pool.get_started_VMs(pool1)) != 0:
|
|
||||||
+ FAIL("cpu_pool.get_started_VMs() returns wrong value")
|
|
||||||
+
|
|
||||||
+if pool1 != session.xenapi.cpu_pool.get_uuid(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_uuid() returns wrong value")
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.set_auto_power_on(pool1, True)
|
|
||||||
+if not session.xenapi.cpu_pool.get_auto_power_on(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_auto_power_on() returns wrong value")
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.set_proposed_CPUs(pool1, [4])
|
|
||||||
+if '4' not in session.xenapi.cpu_pool.get_proposed_CPUs(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_proposed_CPUs() returns wrong value; (set_proposed_CPUs)")
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.add_to_proposed_CPUs(pool1, 5)
|
|
||||||
+val = session.xenapi.cpu_pool.get_proposed_CPUs(pool1)
|
|
||||||
+if '5' not in val:
|
|
||||||
+ FAIL("cpu_pool.get_proposed_CPUs() returns wrong value; %s not in %s" % ('5',val))
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.remove_from_proposed_CPUs(pool1, 5)
|
|
||||||
+val = session.xenapi.cpu_pool.get_proposed_CPUs(pool1)
|
|
||||||
+if '5' in val:
|
|
||||||
+ FAIL("cpu_pool.get_proposed_CPUs() returns wrong value; %s in %s" % ('5',val))
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.set_name_label(pool1, 'New-Pool-1')
|
|
||||||
+if 'New-Pool-1' != session.xenapi.cpu_pool.get_name_label(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_name_label() returns wrong value")
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.set_ncpu(pool1, 4)
|
|
||||||
+if '4' != session.xenapi.cpu_pool.get_ncpu(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_ncpu() returns wrong value")
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.set_other_config(pool1, {'test' : 'ok'})
|
|
||||||
+other_config = session.xenapi.cpu_pool.get_other_config(pool1)
|
|
||||||
+if other_config.get('test') != 'ok':
|
|
||||||
+ FAIL("cpu_pool.get_other_config() returns wrong value")
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.add_to_other_config(pool1, 'new_entry', 'added')
|
|
||||||
+other_config = session.xenapi.cpu_pool.get_other_config(pool1)
|
|
||||||
+if other_config.get('new_entry') != 'added':
|
|
||||||
+ FAIL("cpu_pool.get_other_config() returns wrong value")
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.remove_from_other_config(pool1, 'new_entry')
|
|
||||||
+other_config = session.xenapi.cpu_pool.get_other_config(pool1)
|
|
||||||
+if other_config.get('new_entry') != None:
|
|
||||||
+ FAIL("cpu_pool.get_other_config() returns wrong value")
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.set_sched_policy(pool1, 'credit')
|
|
||||||
+if 'credit' != session.xenapi.cpu_pool.get_sched_policy(pool1):
|
|
||||||
+ FAIL("cpu_pool.get_sched_policy() returns wrong value")
|
|
||||||
+
|
|
||||||
+session.xenapi.cpu_pool.destroy(pool1)
|
|
||||||
+if pool1 in session.xenapi.cpu_pool.get_all():
|
|
||||||
+ FAIL("cpu_pool.destroy() has not removed pool")
|
|
||||||
+
|
|
||||||
Index: xen-4.0.2-testing/tools/xm-test/tests/xapi/Makefile.am
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/xm-test/tests/xapi/Makefile.am
|
|
||||||
+++ xen-4.0.2-testing/tools/xm-test/tests/xapi/Makefile.am
|
|
||||||
@@ -3,7 +3,8 @@ SUBDIRS =
|
|
||||||
TESTS = 01_xapi-vm_basic.test \
|
|
||||||
02_xapi-vbd_basic.test \
|
|
||||||
03_xapi-network_pos.test \
|
|
||||||
- 04_xapi-data_uri_handling.test
|
|
||||||
+ 04_xapi-data_uri_handling.test \
|
|
||||||
+ 20_xapi-cpu_pool_basic.test
|
|
||||||
|
|
||||||
XFAIL_TESTS =
|
|
||||||
|
|
@ -1,144 +0,0 @@
|
|||||||
- fix tasklet_schedule_cpu() when invoked from the tasklet's handler
|
|
||||||
(and rename to tasklet_schedule_on_cpu() to match upstream)
|
|
||||||
- properly balance (un-)pausing in continue_hypercall_on_cpu() code
|
|
||||||
paths
|
|
||||||
- bump domctl interface version (due to the addition of the "cpupool"
|
|
||||||
member to struct xen_domctl_getdomaininfo)
|
|
||||||
- move and rename csched_priv to make sure eventual backported
|
|
||||||
upstream patches using the variable get correctly adjusted (i.e.
|
|
||||||
missing adjustments get detected at build time)
|
|
||||||
- remove boot time per-CPU pool assignment messages (bnc#572146)
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/domain.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/domain.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/domain.c
|
|
||||||
@@ -1585,6 +1585,7 @@ int continue_hypercall_on_cpu(int cpu, v
|
|
||||||
|
|
||||||
v->arch.schedule_tail = continue_hypercall_on_cpu_helper;
|
|
||||||
v->arch.continue_info = info;
|
|
||||||
+ vcpu_pause_nosync(v);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@@ -1595,8 +1596,7 @@ int continue_hypercall_on_cpu(int cpu, v
|
|
||||||
info->func = func;
|
|
||||||
info->data = data;
|
|
||||||
|
|
||||||
- vcpu_pause_nosync(v);
|
|
||||||
- tasklet_schedule_cpu(&info->tasklet, cpu);
|
|
||||||
+ tasklet_schedule_on_cpu(&info->tasklet, cpu);
|
|
||||||
raise_softirq(SCHEDULE_SOFTIRQ);
|
|
||||||
|
|
||||||
/* Dummy return value will be overwritten by new schedule_tail. */
|
|
||||||
Index: xen-4.0.2-testing/xen/common/sched_credit.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/common/sched_credit.c
|
|
||||||
+++ xen-4.0.2-testing/xen/common/sched_credit.c
|
|
||||||
@@ -176,7 +176,6 @@ struct csched_private {
|
|
||||||
/*
|
|
||||||
* Global variables
|
|
||||||
*/
|
|
||||||
-static struct csched_private csched_priv;
|
|
||||||
static struct csched_private *csched_priv0 = NULL;
|
|
||||||
|
|
||||||
static void csched_tick(void *_cpu);
|
|
||||||
@@ -1527,11 +1526,13 @@ static void csched_tick_resume(struct sc
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+static struct csched_private _csched_priv;
|
|
||||||
+
|
|
||||||
struct scheduler sched_credit_def = {
|
|
||||||
.name = "SMP Credit Scheduler",
|
|
||||||
.opt_name = "credit",
|
|
||||||
.sched_id = XEN_SCHEDULER_CREDIT,
|
|
||||||
- .sched_data = &csched_priv,
|
|
||||||
+ .sched_data = &_csched_priv,
|
|
||||||
|
|
||||||
.init_domain = csched_dom_init,
|
|
||||||
.destroy_domain = csched_dom_destroy,
|
|
||||||
Index: xen-4.0.2-testing/xen/common/softirq.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/common/softirq.c
|
|
||||||
+++ xen-4.0.2-testing/xen/common/softirq.c
|
|
||||||
@@ -114,12 +114,15 @@ static void tasklet_schedule_list(struct
|
|
||||||
{
|
|
||||||
BUG_ON(!list_empty(&t->list));
|
|
||||||
list_add_tail(&t->list, tlist);
|
|
||||||
+ t->scheduled_on = NR_CPUS;
|
|
||||||
}
|
|
||||||
t->is_scheduled = 1;
|
|
||||||
if ( cpu == smp_processor_id() )
|
|
||||||
raise_softirq(TASKLET_SOFTIRQ);
|
|
||||||
- else
|
|
||||||
+ else if ( !t->is_running )
|
|
||||||
cpu_raise_softirq(cpu, TASKLET_SOFTIRQ);
|
|
||||||
+ else
|
|
||||||
+ t->scheduled_on = cpu;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&tasklet_lock, flags);
|
|
||||||
@@ -130,7 +133,7 @@ void tasklet_schedule(struct tasklet *t)
|
|
||||||
tasklet_schedule_list(t, &tasklet_list, smp_processor_id());
|
|
||||||
}
|
|
||||||
|
|
||||||
-void tasklet_schedule_cpu(struct tasklet *t, int cpu)
|
|
||||||
+void tasklet_schedule_on_cpu(struct tasklet *t, int cpu)
|
|
||||||
{
|
|
||||||
tasklet_schedule_list(t, &per_cpu(tasklet_list_pcpu, cpu), cpu);
|
|
||||||
}
|
|
||||||
@@ -166,7 +169,15 @@ static void tasklet_action(void)
|
|
||||||
if ( t->is_scheduled )
|
|
||||||
{
|
|
||||||
BUG_ON(t->is_dead || !list_empty(&t->list));
|
|
||||||
- list_add_tail(&t->list, tlist);
|
|
||||||
+ if ( t->scheduled_on >= NR_CPUS )
|
|
||||||
+ list_add_tail(&t->list, tlist);
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ unsigned int cpu = t->scheduled_on;
|
|
||||||
+
|
|
||||||
+ list_add_tail(&t->list, &per_cpu(tasklet_list_pcpu, cpu));
|
|
||||||
+ cpu_raise_softirq(cpu, TASKLET_SOFTIRQ);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Index: xen-4.0.2-testing/xen/include/public/domctl.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/public/domctl.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/public/domctl.h
|
|
||||||
@@ -35,7 +35,7 @@
|
|
||||||
#include "xen.h"
|
|
||||||
#include "grant_table.h"
|
|
||||||
|
|
||||||
-#define XEN_DOMCTL_INTERFACE_VERSION 0x00000006
|
|
||||||
+#define XEN_DOMCTL_INTERFACE_VERSION 0x00000007
|
|
||||||
|
|
||||||
struct xenctl_cpumap {
|
|
||||||
XEN_GUEST_HANDLE_64(uint8) bitmap;
|
|
||||||
Index: xen-4.0.2-testing/xen/include/xen/softirq.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/xen/softirq.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/xen/softirq.h
|
|
||||||
@@ -52,15 +52,17 @@ struct tasklet
|
|
||||||
bool_t is_scheduled;
|
|
||||||
bool_t is_running;
|
|
||||||
bool_t is_dead;
|
|
||||||
+ unsigned int scheduled_on;
|
|
||||||
void (*func)(unsigned long);
|
|
||||||
unsigned long data;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DECLARE_TASKLET(name, func, data) \
|
|
||||||
- struct tasklet name = { LIST_HEAD_INIT(name.list), 0, 0, 0, func, data }
|
|
||||||
+ struct tasklet name = { LIST_HEAD_INIT(name.list), 0, 0, 0, NR_CPUS, \
|
|
||||||
+ func, data }
|
|
||||||
|
|
||||||
void tasklet_schedule(struct tasklet *t);
|
|
||||||
-void tasklet_schedule_cpu(struct tasklet *t, int cpu);
|
|
||||||
+void tasklet_schedule_on_cpu(struct tasklet *t, int cpu);
|
|
||||||
void tasklet_kill(struct tasklet *t);
|
|
||||||
void tasklet_init(
|
|
||||||
struct tasklet *t, void (*func)(unsigned long), unsigned long data);
|
|
3230
cpupools-core.patch
3230
cpupools-core.patch
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -1312,8 +1312,15 @@ class XendDomainInfo:
|
@@ -1297,8 +1297,15 @@ class XendDomainInfo:
|
||||||
frontpath = self.getDeviceController(deviceClass).frontendPath(dev)
|
frontpath = self.getDeviceController(deviceClass).frontendPath(dev)
|
||||||
backpath = xstransact.Read(frontpath, "backend")
|
backpath = xstransact.Read(frontpath, "backend")
|
||||||
thread.start_new_thread(self.getDeviceController(deviceClass).finishDeviceCleanup, (backpath, path))
|
thread.start_new_thread(self.getDeviceController(deviceClass).finishDeviceCleanup, (backpath, path))
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
Index: xen-4.1.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
--- xen-4.1.0-testing.orig/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
||||||
+++ xen-4.0.2-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
+++ xen-4.1.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
||||||
@@ -396,6 +396,11 @@ static int __devinit platform_pci_init(s
|
@@ -398,6 +398,11 @@ static int __devinit platform_pci_init(s
|
||||||
platform_mmio = mmio_addr;
|
platform_mmio = mmio_addr;
|
||||||
platform_mmiolen = mmio_len;
|
platform_mmiolen = mmio_len;
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/xen/arch/x86/domain.c
|
Index: xen-4.1.0-testing/xen/arch/x86/domain.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/domain.c
|
--- xen-4.1.0-testing.orig/xen/arch/x86/domain.c
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/domain.c
|
+++ xen-4.1.0-testing/xen/arch/x86/domain.c
|
||||||
@@ -144,15 +144,30 @@ void dump_pageframe_info(struct domain *
|
@@ -150,15 +150,30 @@ void dump_pageframe_info(struct domain *
|
||||||
|
|
||||||
printk("Memory pages belonging to domain %u:\n", d->domain_id);
|
printk("Memory pages belonging to domain %u:\n", d->domain_id);
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendConfig.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/XendConfig.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendConfig.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/XendConfig.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendConfig.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/XendConfig.py
|
||||||
@@ -1861,7 +1861,14 @@ class XendConfig(dict):
|
@@ -1874,7 +1874,14 @@ class XendConfig(dict):
|
||||||
ports = sxp.child(dev_sxp, 'port')
|
ports = sxp.child(dev_sxp, 'port')
|
||||||
for port in ports[1:]:
|
for port in ports[1:]:
|
||||||
try:
|
try:
|
||||||
|
@ -1,220 +0,0 @@
|
|||||||
Index: xen-4.0.2-testing/xen/arch/ia64/linux-xen/smp.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/ia64/linux-xen/smp.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/ia64/linux-xen/smp.c
|
|
||||||
@@ -94,6 +94,7 @@ static volatile struct call_data_struct
|
|
||||||
|
|
||||||
#define IPI_CALL_FUNC 0
|
|
||||||
#define IPI_CPU_STOP 1
|
|
||||||
+#define IPI_STATE_DUMP 2
|
|
||||||
|
|
||||||
/* This needs to be cacheline aligned because it is written to by *other* CPUs. */
|
|
||||||
static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned;
|
|
||||||
@@ -202,6 +203,10 @@ handle_IPI (int irq, void *dev_id, struc
|
|
||||||
stop_this_cpu();
|
|
||||||
break;
|
|
||||||
|
|
||||||
+ case IPI_STATE_DUMP:
|
|
||||||
+ dump_execstate(regs);
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
default:
|
|
||||||
printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which);
|
|
||||||
break;
|
|
||||||
@@ -479,6 +484,12 @@ smp_send_stop (void)
|
|
||||||
send_IPI_allbutself(IPI_CPU_STOP);
|
|
||||||
}
|
|
||||||
|
|
||||||
+void
|
|
||||||
+smp_send_state_dump (unsigned int cpu)
|
|
||||||
+{
|
|
||||||
+ send_IPI_single(cpu, IPI_STATE_DUMP);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
int __init
|
|
||||||
setup_profiling_timer (unsigned int multiplier)
|
|
||||||
{
|
|
||||||
Index: xen-4.0.2-testing/xen/arch/x86/smp.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/arch/x86/smp.c
|
|
||||||
+++ xen-4.0.2-testing/xen/arch/x86/smp.c
|
|
||||||
@@ -375,11 +375,24 @@ void smp_send_nmi_allbutself(void)
|
|
||||||
send_IPI_mask(&cpu_online_map, APIC_DM_NMI);
|
|
||||||
}
|
|
||||||
|
|
||||||
+void smp_send_state_dump(unsigned int cpu)
|
|
||||||
+{
|
|
||||||
+ state_dump_pending(cpu) = 1;
|
|
||||||
+ smp_send_event_check_cpu(cpu);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
fastcall void smp_event_check_interrupt(struct cpu_user_regs *regs)
|
|
||||||
{
|
|
||||||
struct cpu_user_regs *old_regs = set_irq_regs(regs);
|
|
||||||
ack_APIC_irq();
|
|
||||||
perfc_incr(ipis);
|
|
||||||
+ if ( unlikely(state_dump_pending(smp_processor_id())) )
|
|
||||||
+ {
|
|
||||||
+ irq_enter();
|
|
||||||
+ state_dump_pending(smp_processor_id()) = 0;
|
|
||||||
+ dump_execstate(regs);
|
|
||||||
+ irq_exit();
|
|
||||||
+ }
|
|
||||||
set_irq_regs(old_regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/common/keyhandler.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/common/keyhandler.c
|
|
||||||
+++ xen-4.0.2-testing/xen/common/keyhandler.c
|
|
||||||
@@ -71,19 +71,52 @@ static struct keyhandler show_handlers_k
|
|
||||||
.desc = "show this message"
|
|
||||||
};
|
|
||||||
|
|
||||||
-static void __dump_execstate(void *unused)
|
|
||||||
+#ifdef CONFIG_SMP
|
|
||||||
+static cpumask_t dump_execstate_mask;
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+void dump_execstate(struct cpu_user_regs *regs)
|
|
||||||
{
|
|
||||||
- dump_execution_state();
|
|
||||||
- printk("*** Dumping CPU%d guest state: ***\n", smp_processor_id());
|
|
||||||
+ unsigned int cpu = smp_processor_id();
|
|
||||||
+
|
|
||||||
+ if ( !guest_mode(regs) )
|
|
||||||
+ {
|
|
||||||
+ printk("\n*** Dumping CPU%u host state: ***\n", cpu);
|
|
||||||
+ show_execution_state(regs);
|
|
||||||
+ }
|
|
||||||
if ( is_idle_vcpu(current) )
|
|
||||||
- printk("No guest context (CPU is idle).\n");
|
|
||||||
+ printk("No guest context (CPU%u is idle).\n", cpu);
|
|
||||||
else
|
|
||||||
+ {
|
|
||||||
+ printk("*** Dumping CPU%u guest state (d%d:v%d): ***\n",
|
|
||||||
+ smp_processor_id(), current->domain->domain_id,
|
|
||||||
+ current->vcpu_id);
|
|
||||||
show_execution_state(guest_cpu_user_regs());
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+#ifdef CONFIG_SMP
|
|
||||||
+ cpu_clear(cpu, dump_execstate_mask);
|
|
||||||
+ if ( !alt_key_handling )
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ cpu = cycle_cpu(cpu, dump_execstate_mask);
|
|
||||||
+ if ( cpu < NR_CPUS )
|
|
||||||
+ smp_send_state_dump(cpu);
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ printk("\n");
|
|
||||||
+
|
|
||||||
+ console_end_sync();
|
|
||||||
+ watchdog_enable();
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump_registers(unsigned char key, struct cpu_user_regs *regs)
|
|
||||||
{
|
|
||||||
+#ifdef CONFIG_SMP
|
|
||||||
unsigned int cpu;
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
/* We want to get everything out that we possibly can. */
|
|
||||||
watchdog_disable();
|
|
||||||
@@ -91,17 +124,28 @@ static void dump_registers(unsigned char
|
|
||||||
|
|
||||||
printk("'%c' pressed -> dumping registers\n", key);
|
|
||||||
|
|
||||||
+#ifdef CONFIG_SMP
|
|
||||||
+ if ( alt_key_handling )
|
|
||||||
+ dump_execstate_mask = cpu_online_map;
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
/* Get local execution state out immediately, in case we get stuck. */
|
|
||||||
- printk("\n*** Dumping CPU%d host state: ***\n", smp_processor_id());
|
|
||||||
- __dump_execstate(NULL);
|
|
||||||
+ dump_execstate(regs);
|
|
||||||
+
|
|
||||||
+#ifdef CONFIG_SMP
|
|
||||||
+ if ( alt_key_handling )
|
|
||||||
+ return;
|
|
||||||
|
|
||||||
for_each_online_cpu ( cpu )
|
|
||||||
{
|
|
||||||
if ( cpu == smp_processor_id() )
|
|
||||||
continue;
|
|
||||||
- printk("\n*** Dumping CPU%d host state: ***\n", cpu);
|
|
||||||
- on_selected_cpus(cpumask_of(cpu), __dump_execstate, NULL, 1);
|
|
||||||
+ cpu_set(cpu, dump_execstate_mask);
|
|
||||||
+ smp_send_state_dump(cpu);
|
|
||||||
+ while ( cpu_isset(cpu, dump_execstate_mask) )
|
|
||||||
+ cpu_relax();
|
|
||||||
}
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
printk("\n");
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-ia64/linux-xen/asm/ptrace.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-ia64/linux-xen/asm/ptrace.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-ia64/linux-xen/asm/ptrace.h
|
|
||||||
@@ -278,7 +278,7 @@ struct switch_stack {
|
|
||||||
# define ia64_task_regs(t) (((struct pt_regs *) ((char *) (t) + IA64_STK_OFFSET)) - 1)
|
|
||||||
# define ia64_psr(regs) ((struct ia64_psr *) &(regs)->cr_ipsr)
|
|
||||||
#ifdef XEN
|
|
||||||
-# define guest_mode(regs) (ia64_psr(regs)->cpl != 0)
|
|
||||||
+# define guest_mode(regs) (ia64_psr(regs)->cpl && !ia64_psr(regs)->vm)
|
|
||||||
# define guest_kernel_mode(regs) (ia64_psr(regs)->cpl == CONFIG_CPL0_EMUL)
|
|
||||||
# define vmx_guest_kernel_mode(regs) (ia64_psr(regs)->cpl == 0)
|
|
||||||
# define regs_increment_iip(regs) \
|
|
||||||
Index: xen-4.0.2-testing/xen/include/asm-x86/hardirq.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/asm-x86/hardirq.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/asm-x86/hardirq.h
|
|
||||||
@@ -8,6 +8,7 @@ typedef struct {
|
|
||||||
unsigned long __softirq_pending;
|
|
||||||
unsigned int __local_irq_count;
|
|
||||||
unsigned int __nmi_count;
|
|
||||||
+ bool_t __state_dump_pending;
|
|
||||||
} __cacheline_aligned irq_cpustat_t;
|
|
||||||
|
|
||||||
#include <xen/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
|
|
||||||
Index: xen-4.0.2-testing/xen/include/xen/irq_cpustat.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/xen/irq_cpustat.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/xen/irq_cpustat.h
|
|
||||||
@@ -26,5 +26,6 @@ extern irq_cpustat_t irq_stat[];
|
|
||||||
#define softirq_pending(cpu) __IRQ_STAT((cpu), __softirq_pending)
|
|
||||||
#define local_irq_count(cpu) __IRQ_STAT((cpu), __local_irq_count)
|
|
||||||
#define nmi_count(cpu) __IRQ_STAT((cpu), __nmi_count)
|
|
||||||
+#define state_dump_pending(cpu) __IRQ_STAT((cpu), __state_dump_pending)
|
|
||||||
|
|
||||||
#endif /* __irq_cpustat_h */
|
|
||||||
Index: xen-4.0.2-testing/xen/include/xen/lib.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/xen/lib.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/xen/lib.h
|
|
||||||
@@ -116,4 +116,7 @@ extern int tainted;
|
|
||||||
extern char *print_tainted(char *str);
|
|
||||||
extern void add_taint(unsigned);
|
|
||||||
|
|
||||||
+struct cpu_user_regs;
|
|
||||||
+void dump_execstate(struct cpu_user_regs *);
|
|
||||||
+
|
|
||||||
#endif /* __LIB_H__ */
|
|
||||||
Index: xen-4.0.2-testing/xen/include/xen/smp.h
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/xen/include/xen/smp.h
|
|
||||||
+++ xen-4.0.2-testing/xen/include/xen/smp.h
|
|
||||||
@@ -13,6 +13,8 @@ extern void smp_send_event_check_mask(co
|
|
||||||
#define smp_send_event_check_cpu(cpu) \
|
|
||||||
smp_send_event_check_mask(cpumask_of(cpu))
|
|
||||||
|
|
||||||
+extern void smp_send_state_dump(unsigned int cpu);
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* Prepare machine for booting other CPUs.
|
|
||||||
*/
|
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/firmware/hvmloader/acpi/dsdt.asl
|
Index: xen-4.1.0-testing/tools/firmware/hvmloader/acpi/dsdt.asl
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/firmware/hvmloader/acpi/dsdt.asl
|
--- xen-4.1.0-testing.orig/tools/firmware/hvmloader/acpi/dsdt.asl
|
||||||
+++ xen-4.0.2-testing/tools/firmware/hvmloader/acpi/dsdt.asl
|
+++ xen-4.1.0-testing/tools/firmware/hvmloader/acpi/dsdt.asl
|
||||||
@@ -30,21 +30,9 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2,
|
@@ -30,21 +30,9 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2,
|
||||||
/*
|
/*
|
||||||
* S3 (suspend-to-ram), S4 (suspend-to-disc) and S5 (power-off) type codes:
|
* S3 (suspend-to-ram), S4 (suspend-to-disc) and S5 (power-off) type codes:
|
||||||
@ -11,18 +11,18 @@ Index: xen-4.0.2-testing/tools/firmware/hvmloader/acpi/dsdt.asl
|
|||||||
*/
|
*/
|
||||||
- Name (\_S3, Package (0x04)
|
- Name (\_S3, Package (0x04)
|
||||||
- {
|
- {
|
||||||
- 0x05, /* PM1a_CNT.SLP_TYP */
|
- 0x01, /* PM1a_CNT.SLP_TYP */
|
||||||
- 0x05, /* PM1b_CNT.SLP_TYP */
|
- 0x01, /* PM1b_CNT.SLP_TYP */
|
||||||
- 0x0, /* reserved */
|
- 0x0, /* reserved */
|
||||||
- 0x0 /* reserved */
|
- 0x0 /* reserved */
|
||||||
- })
|
- })
|
||||||
- Name (\_S4, Package (0x04)
|
- Name (\_S4, Package (0x04)
|
||||||
- {
|
- {
|
||||||
- 0x06, /* PM1a_CNT.SLP_TYP */
|
- 0x00, /* PM1a_CNT.SLP_TYP */
|
||||||
- 0x06, /* PM1b_CNT.SLP_TYP */
|
- 0x00, /* PM1b_CNT.SLP_TYP */
|
||||||
- 0x00, /* reserved */
|
- 0x00, /* reserved */
|
||||||
- 0x00 /* reserved */
|
- 0x00 /* reserved */
|
||||||
- })
|
- })
|
||||||
Name (\_S5, Package (0x04)
|
Name (\_S5, Package (0x04)
|
||||||
{
|
{
|
||||||
0x07, /* PM1a_CNT.SLP_TYP */
|
0x00, /* PM1a_CNT.SLP_TYP */
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
Subject: hotplug: allow hardlinked files for block device images
|
|
||||||
|
|
||||||
tools/hotplug/Linux/block change for this losetup -a output:
|
|
||||||
inode 12 is listed twice due to hardlinks
|
|
||||||
|
|
||||||
/dev/loop0: [0809]:139267 (/abuild/vdisk-sles11_2-disk0)
|
|
||||||
/dev/loop1: [0809]:139266 (/abuild/vdisk-sles11_1-disk1)
|
|
||||||
/dev/loop3: [0809]:139267 (/abuild/vdisk-sles11_2-disk0)
|
|
||||||
/dev/loop5: [0809]:139273 (/abuild/vdisk-sles11_5-disk1)
|
|
||||||
/dev/loop8: [0809]:12 (/abuild/bootiso-xenpaging-sles11_5.iso)
|
|
||||||
/dev/loop10: [0809]:12 (/abuild/bootiso-xenpaging-sles11_4.iso)
|
|
||||||
/dev/loop11: [0809]:139271 (/abuild/vdisk-sles11_4-disk0)
|
|
||||||
|
|
||||||
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
|
||||||
|
|
||||||
---
|
|
||||||
tools/hotplug/Linux/block | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/hotplug/Linux/block
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/hotplug/Linux/block
|
|
||||||
+++ xen-4.0.2-testing/tools/hotplug/Linux/block
|
|
||||||
@@ -279,8 +279,8 @@ mount it read-write in a guest domain."
|
|
||||||
fatal "Unable to lookup $file: dev: $dev inode: $inode"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- shared_list=$(losetup -a | grep ' \[0*'${dev}'\]:'${inode} |
|
|
||||||
- cut -d : -f 1)
|
|
||||||
+ shared_list=$(losetup -a |
|
|
||||||
+ sed -n -e "s@^\([^:]\+\)\(:[[:blank:]]\[${dev}\]:${inode}[[:blank:]](${file})\)@\1@p" )
|
|
||||||
for dev in "$shared_list"
|
|
||||||
do
|
|
||||||
if [ -n "$dev" ]
|
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendConfig.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/XendConfig.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendConfig.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/XendConfig.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendConfig.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/XendConfig.py
|
||||||
@@ -157,6 +157,7 @@ XENAPI_PLATFORM_CFG_TYPES = {
|
@@ -159,6 +159,7 @@ XENAPI_PLATFORM_CFG_TYPES = {
|
||||||
'nographic': int,
|
'nographic': int,
|
||||||
'nomigrate': int,
|
'nomigrate': int,
|
||||||
'pae' : int,
|
'pae' : int,
|
||||||
@ -10,7 +10,7 @@ Index: xen-4.0.2-testing/tools/python/xen/xend/XendConfig.py
|
|||||||
'rtc_timeoffset': int,
|
'rtc_timeoffset': int,
|
||||||
'parallel': str,
|
'parallel': str,
|
||||||
'serial': str,
|
'serial': str,
|
||||||
@@ -509,6 +510,8 @@ class XendConfig(dict):
|
@@ -515,6 +516,8 @@ class XendConfig(dict):
|
||||||
if self.is_hvm():
|
if self.is_hvm():
|
||||||
if 'timer_mode' not in self['platform']:
|
if 'timer_mode' not in self['platform']:
|
||||||
self['platform']['timer_mode'] = 1
|
self['platform']['timer_mode'] = 1
|
||||||
@ -19,10 +19,10 @@ Index: xen-4.0.2-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.0.2-testing/tools/python/xen/xend/image.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/image.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/image.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/image.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/image.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/image.py
|
||||||
@@ -839,6 +839,7 @@ class HVMImageHandler(ImageHandler):
|
@@ -839,6 +839,7 @@ class HVMImageHandler(ImageHandler):
|
||||||
|
|
||||||
self.apic = int(vmConfig['platform'].get('apic', 0))
|
self.apic = int(vmConfig['platform'].get('apic', 0))
|
||||||
@ -31,10 +31,10 @@ Index: xen-4.0.2-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.0.2-testing/tools/python/xen/xm/create.py
|
Index: xen-4.1.0-testing/tools/python/xen/xm/create.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xm/create.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xm/create.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xm/create.py
|
+++ xen-4.1.0-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).""")
|
||||||
|
@ -17,10 +17,10 @@ qcow2 image (the header is gone after three loop iterations):
|
|||||||
|
|
||||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/block-qcow2.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/block-qcow2.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/block-qcow2.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/block-qcow2.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/block-qcow2.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/block-qcow2.c
|
||||||
@@ -916,7 +916,7 @@ static int alloc_cluster_link_l2(BlockDr
|
@@ -916,7 +916,7 @@ static int alloc_cluster_link_l2(BlockDr
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
@@ -259,8 +259,11 @@ static int open_disk(struct td_state *s,
|
@@ -259,8 +259,11 @@ static int open_disk(struct td_state *s,
|
||||||
drv = blktap_drivers[i].drv;
|
drv = blktap_drivers[i].drv;
|
||||||
DPRINTF("%s driver specified\n", drv ? drv->format_name : "No");
|
DPRINTF("%s driver specified\n", drv ? drv->format_name : "No");
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
@@ -360,6 +360,15 @@ static void qemu_send_responses(void* op
|
@@ -360,6 +360,15 @@ static void qemu_send_responses(void* op
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_machine_fv.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_machine_fv.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/xen_machine_fv.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/hw/xen_machine_fv.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_machine_fv.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_machine_fv.c
|
||||||
@@ -268,6 +268,7 @@ void qemu_invalidate_entry(uint8_t *buff
|
@@ -269,6 +269,7 @@ void qemu_invalidate_entry(uint8_t *buff
|
||||||
|
|
||||||
#endif /* defined(MAPCACHE) */
|
#endif /* defined(MAPCACHE) */
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_machine_fv.c
|
|||||||
|
|
||||||
static void xen_init_fv(ram_addr_t ram_size, int vga_ram_size,
|
static void xen_init_fv(ram_addr_t ram_size, int vga_ram_size,
|
||||||
const char *boot_device,
|
const char *boot_device,
|
||||||
@@ -293,6 +294,11 @@ static void xen_init_fv(ram_addr_t ram_s
|
@@ -294,6 +295,11 @@ static void xen_init_fv(ram_addr_t ram_s
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -15,10 +15,10 @@ Signed-off-by: Kevin Wolf <kwolf@suse.de>
|
|||||||
hw/xen_blktap.h | 14 ++++++++++++++
|
hw/xen_blktap.h | 14 ++++++++++++++
|
||||||
2 files changed, 33 insertions(+), 3 deletions(-)
|
2 files changed, 33 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
@@ -230,9 +230,10 @@ static int map_new_dev(struct td_state *
|
@@ -230,9 +230,10 @@ static int map_new_dev(struct td_state *
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -64,10 +64,10 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
|||||||
msglen = sizeof(msg_hdr_t);
|
msglen = sizeof(msg_hdr_t);
|
||||||
msg->type = CTLMSG_IMG_FAIL;
|
msg->type = CTLMSG_IMG_FAIL;
|
||||||
msg->len = msglen;
|
msg->len = msglen;
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.h
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.h
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.h
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.h
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.h
|
||||||
@@ -53,4 +53,18 @@ typedef struct fd_list_entry {
|
@@ -53,4 +53,18 @@ typedef struct fd_list_entry {
|
||||||
|
|
||||||
int init_blktap(void);
|
int init_blktap(void);
|
||||||
|
@ -12,10 +12,10 @@ Signed-off-by: Kevin Wolf <kwolf@suse.de>
|
|||||||
hw/xen_blktap.c | 6 ++++++
|
hw/xen_blktap.c | 6 ++++++
|
||||||
1 files changed, 6 insertions(+), 0 deletions(-)
|
1 files changed, 6 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
||||||
@@ -268,6 +268,12 @@ static int open_disk(struct td_state *s,
|
@@ -268,6 +268,12 @@ static int open_disk(struct td_state *s,
|
||||||
s->size = bs->total_sectors;
|
s->size = bs->total_sectors;
|
||||||
s->sector_size = 512;
|
s->sector_size = 512;
|
||||||
@ -29,10 +29,10 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_blktap.c
|
|||||||
s->info = ((s->flags & TD_RDONLY) ? VDISK_READONLY : 0);
|
s->info = ((s->flags & TD_RDONLY) ? VDISK_READONLY : 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/server/DevController.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/server/DevController.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/server/DevController.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/server/DevController.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/server/DevController.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/server/DevController.py
|
||||||
@@ -155,7 +155,7 @@ class DevController:
|
@@ -155,7 +155,7 @@ class DevController:
|
||||||
(devid, self.deviceClass))
|
(devid, self.deviceClass))
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/Makefile
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/Makefile
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/Makefile
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/Makefile
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/Makefile
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/Makefile
|
||||||
@@ -243,7 +243,7 @@ endif
|
@@ -243,7 +243,7 @@ endif
|
||||||
install: all $(if $(BUILD_DOCS),install-doc)
|
install: all $(if $(BUILD_DOCS),install-doc)
|
||||||
mkdir -p "$(DESTDIR)$(bindir)"
|
mkdir -p "$(DESTDIR)$(bindir)"
|
||||||
@ -11,11 +11,11 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/Makefile
|
|||||||
endif
|
endif
|
||||||
ifneq ($(BLOBS),)
|
ifneq ($(BLOBS),)
|
||||||
mkdir -p "$(DESTDIR)$(datadir)"
|
mkdir -p "$(DESTDIR)$(datadir)"
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/Makefile.target
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/Makefile.target
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/Makefile.target
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/Makefile.target
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/Makefile.target
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/Makefile.target
|
||||||
@@ -754,7 +754,7 @@ clean:
|
@@ -755,7 +755,7 @@ clean:
|
||||||
|
|
||||||
install: all install-hook
|
install: all install-hook
|
||||||
ifneq ($(PROGS),)
|
ifneq ($(PROGS),)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-xen.h
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/qemu-xen.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/qemu-xen.h
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/qemu-xen.h
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-xen.h
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/qemu-xen.h
|
||||||
@@ -1,6 +1,8 @@
|
@@ -1,6 +1,8 @@
|
||||||
#ifndef QEMU_XEN_H
|
#ifndef QEMU_XEN_H
|
||||||
#define QEMU_XEN_H
|
#define QEMU_XEN_H
|
||||||
@ -11,46 +11,45 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-xen.h
|
|||||||
/* vl.c */
|
/* vl.c */
|
||||||
extern int restore;
|
extern int restore;
|
||||||
extern int vga_ram_size;
|
extern int vga_ram_size;
|
||||||
@@ -73,7 +75,7 @@ void handle_buffered_pio(void);
|
@@ -75,7 +77,7 @@ void handle_buffered_pio(void);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* xenstore.c */
|
/* xenstore.c */
|
||||||
|
void xenstore_init(void);
|
||||||
|
uint32_t xenstore_read_target(void);
|
||||||
-void xenstore_parse_domain_config(int domid);
|
-void xenstore_parse_domain_config(int domid);
|
||||||
+void xenstore_parse_domain_config(int domid, QEMUMachine *machine);
|
+void xenstore_parse_domain_config(int domid, QEMUMachine *machine);
|
||||||
int xenstore_parse_disable_pf_config(void);
|
int xenstore_parse_disable_pf_config(void);
|
||||||
int xenstore_fd(void);
|
int xenstore_fd(void);
|
||||||
void xenstore_process_event(void *opaque);
|
void xenstore_process_event(void *opaque);
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vl.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/vl.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/vl.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/vl.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/vl.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/vl.c
|
||||||
@@ -5827,10 +5827,10 @@ int main(int argc, char **argv, char **e
|
@@ -5830,9 +5830,9 @@ int main(int argc, char **argv, char **e
|
||||||
if ((msg = xenbus_read(XBT_NIL, "domid", &domid_s)))
|
if ((msg = xenbus_read(XBT_NIL, "domid", &domid_s)))
|
||||||
fprintf(stderr,"Can not read our own domid: %s\n", msg);
|
fprintf(stderr,"Can not read our own domid: %s\n", msg);
|
||||||
else
|
else
|
||||||
- xenstore_parse_domain_config(atoi(domid_s));
|
- xenstore_parse_domain_config(atoi(domid_s));
|
||||||
+ xenstore_parse_domain_config(atoi(domid_s), machine);
|
+ xenstore_parse_domain_config(atoi(domid_s), machine);
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
- xenstore_parse_domain_config(domid);
|
- xenstore_parse_domain_config(domid);
|
||||||
+ xenstore_parse_domain_config(domid, machine);
|
+ xenstore_parse_domain_config(domid, machine);
|
||||||
#endif /* CONFIG_STUBDOM */
|
#endif /* CONFIG_STUBDOM */
|
||||||
|
}
|
||||||
|
|
||||||
/* we always create the cdrom drive, even if no disk is there */
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/xenstore.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/xenstore.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/xenstore.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
||||||
@@ -397,7 +397,7 @@ static const char *xenstore_get_guest_uu
|
@@ -447,7 +447,7 @@ void xenstore_init(void)
|
||||||
#define PT_PCI_POWER_MANAGEMENT_DEFAULT 0
|
}
|
||||||
int direct_pci_msitranslate;
|
}
|
||||||
int direct_pci_power_mgmt;
|
|
||||||
-void xenstore_parse_domain_config(int hvm_domid)
|
-void xenstore_parse_domain_config(int hvm_domid)
|
||||||
+void xenstore_parse_domain_config(int hvm_domid, QEMUMachine *machine)
|
+void xenstore_parse_domain_config(int hvm_domid, QEMUMachine *machine)
|
||||||
{
|
{
|
||||||
char **e_danger = NULL;
|
char **e_danger = NULL;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
@@ -712,15 +712,19 @@ void xenstore_parse_domain_config(int hv
|
@@ -754,15 +754,19 @@ void xenstore_parse_domain_config(int hv
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_platform.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_platform.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/xen_platform.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/hw/xen_platform.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_platform.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/xen_platform.c
|
||||||
@@ -359,6 +359,8 @@ static void platform_ioport_write(void *
|
@@ -359,6 +359,8 @@ static void platform_ioport_write(void *
|
||||||
case 4:
|
case 4:
|
||||||
fprintf(logfile, "Disconnect IDE hard disk...\n");
|
fprintf(logfile, "Disconnect IDE hard disk...\n");
|
||||||
@ -11,10 +11,10 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/xen_platform.c
|
|||||||
fprintf(logfile, "Disconnect netifs...\n");
|
fprintf(logfile, "Disconnect netifs...\n");
|
||||||
pci_unplug_netifs();
|
pci_unplug_netifs();
|
||||||
fprintf(logfile, "Shutdown taps...\n");
|
fprintf(logfile, "Shutdown taps...\n");
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-xen.h
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/qemu-xen.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/qemu-xen.h
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/qemu-xen.h
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-xen.h
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/qemu-xen.h
|
||||||
@@ -57,6 +57,7 @@ void unset_vram_mapping(void *opaque);
|
@@ -57,6 +57,7 @@ void unset_vram_mapping(void *opaque);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -23,11 +23,11 @@ Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/qemu-xen.h
|
|||||||
void destroy_hvm_domain(void);
|
void destroy_hvm_domain(void);
|
||||||
void unregister_iomem(target_phys_addr_t start);
|
void unregister_iomem(target_phys_addr_t start);
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/pci.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/pci.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/hw/pci.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/hw/pci.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/hw/pci.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/hw/pci.c
|
||||||
@@ -892,6 +892,50 @@ void pci_unplug_netifs(void)
|
@@ -871,6 +871,50 @@ void pci_unplug_netifs(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/vnc.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/vnc.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/vnc.c
|
||||||
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/vnc.c
|
||||||
@@ -1734,6 +1734,25 @@ static int protocol_client_msg(VncState
|
@@ -1734,6 +1734,25 @@ static int protocol_client_msg(VncState
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: xen-4.0.2-testing/tools/libxen/src/xen_common.c
|
Index: xen-4.1.0-testing/tools/libxen/src/xen_common.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/libxen/src/xen_common.c
|
--- xen-4.1.0-testing.orig/tools/libxen/src/xen_common.c
|
||||||
+++ xen-4.0.2-testing/tools/libxen/src/xen_common.c
|
+++ xen-4.1.0-testing/tools/libxen/src/xen_common.c
|
||||||
@@ -904,8 +904,15 @@ static void parse_into(xen_session *s, x
|
@@ -904,8 +904,15 @@ static void parse_into(xen_session *s, x
|
||||||
0 != strcmp((char *)value_node->children->name, "struct") ||
|
0 != strcmp((char *)value_node->children->name, "struct") ||
|
||||||
value_node->children->children == NULL)
|
value_node->children->children == NULL)
|
||||||
|
@ -2,11 +2,11 @@ Make our PV drivers work with older hosts that do not recognize the new PV driv
|
|||||||
|
|
||||||
Signed-off-by: K. Y. Srinivasan <ksrinivasan@novell.com>
|
Signed-off-by: K. Y. Srinivasan <ksrinivasan@novell.com>
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
Index: xen-4.1.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
--- xen-4.1.0-testing.orig/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
||||||
+++ xen-4.0.2-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
+++ xen-4.1.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
|
||||||
@@ -320,7 +320,10 @@ static int check_platform_magic(struct d
|
@@ -322,7 +322,10 @@ static int check_platform_magic(struct d
|
||||||
|
|
||||||
if (magic != XEN_IOPORT_MAGIC_VAL) {
|
if (magic != XEN_IOPORT_MAGIC_VAL) {
|
||||||
err = "unrecognised magic value";
|
err = "unrecognised magic value";
|
||||||
|
@ -1,23 +1,8 @@
|
|||||||
Index: xen-4.0.2-testing/extras/mini-os/netfront.c
|
Index: xen-4.1.0-testing/extras/mini-os/lib/math.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/extras/mini-os/netfront.c
|
--- xen-4.1.0-testing.orig/extras/mini-os/lib/math.c
|
||||||
+++ xen-4.0.2-testing/extras/mini-os/netfront.c
|
+++ xen-4.1.0-testing/extras/mini-os/lib/math.c
|
||||||
@@ -25,8 +25,8 @@ DECLARE_WAIT_QUEUE_HEAD(netfront_queue);
|
@@ -187,6 +187,7 @@ __qdivrem(uint64_t uq, uint64_t vq, uint
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-#define NET_TX_RING_SIZE __RING_SIZE((struct netif_tx_sring *)0, PAGE_SIZE)
|
|
||||||
-#define NET_RX_RING_SIZE __RING_SIZE((struct netif_rx_sring *)0, PAGE_SIZE)
|
|
||||||
+#define NET_TX_RING_SIZE __CONST_RING_SIZE(netif_tx, PAGE_SIZE)
|
|
||||||
+#define NET_RX_RING_SIZE __CONST_RING_SIZE(netif_rx, PAGE_SIZE)
|
|
||||||
#define GRANT_INVALID_REF 0
|
|
||||||
|
|
||||||
|
|
||||||
Index: xen-4.0.2-testing/extras/mini-os/lib/math.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/extras/mini-os/lib/math.c
|
|
||||||
+++ xen-4.0.2-testing/extras/mini-os/lib/math.c
|
|
||||||
@@ -191,6 +191,7 @@ __qdivrem(uint64_t uq, uint64_t vq, uint
|
|
||||||
* and thus
|
* and thus
|
||||||
* m = 4 - n <= 2
|
* m = 4 - n <= 2
|
||||||
*/
|
*/
|
||||||
@ -25,16 +10,3 @@ Index: xen-4.0.2-testing/extras/mini-os/lib/math.c
|
|||||||
tmp.uq = uq;
|
tmp.uq = uq;
|
||||||
u[0] = 0;
|
u[0] = 0;
|
||||||
u[1] = HHALF(tmp.ul[H]);
|
u[1] = HHALF(tmp.ul[H]);
|
||||||
Index: xen-4.0.2-testing/extras/mini-os/arch/x86/mm.c
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/extras/mini-os/arch/x86/mm.c
|
|
||||||
+++ xen-4.0.2-testing/extras/mini-os/arch/x86/mm.c
|
|
||||||
@@ -281,7 +281,7 @@ static void build_pagetable(unsigned lon
|
|
||||||
/*
|
|
||||||
* Mark portion of the address space read only.
|
|
||||||
*/
|
|
||||||
-extern void shared_info;
|
|
||||||
+extern char shared_info[PAGE_SIZE];
|
|
||||||
static void set_readonly(void *text, void *etext)
|
|
||||||
{
|
|
||||||
unsigned long start_address =
|
|
||||||
|
@ -5,27 +5,11 @@ 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.0.2-testing/tools/python/xen/util/blkif.py
|
Index: xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/util/blkif.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/util/blkif.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -19,11 +19,6 @@ def blkdev_name_to_number(name):
|
@@ -74,7 +74,7 @@ from xen.xend.XendPSCSI import XendPSCSI
|
||||||
devname = 'virtual-device'
|
|
||||||
devnum = None
|
|
||||||
|
|
||||||
- try:
|
|
||||||
- return (devname, os.stat(n).st_rdev)
|
|
||||||
- except Exception, ex:
|
|
||||||
- pass
|
|
||||||
-
|
|
||||||
scsi_major = [ 8, 65, 66, 67, 68, 69, 70, 71, 128, 129, 130, 131, 132, 133, 134, 135 ]
|
|
||||||
if re.match( '/dev/sd[a-z]([1-9]|1[0-5])?$', n):
|
|
||||||
major = scsi_major[(ord(n[7:8]) - ord('a')) / 16]
|
|
||||||
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
||||||
@@ -73,7 +73,7 @@ from xen.xend.XendPSCSI import XendPSCSI
|
|
||||||
from xen.xend.XendDSCSI import XendDSCSI, XendDSCSI_HBA
|
from xen.xend.XendDSCSI import XendDSCSI, XendDSCSI_HBA
|
||||||
|
|
||||||
MIGRATE_TIMEOUT = 30.0
|
MIGRATE_TIMEOUT = 30.0
|
||||||
@ -34,7 +18,7 @@ Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
|
|
||||||
xc = xen.lowlevel.xc.xc()
|
xc = xen.lowlevel.xc.xc()
|
||||||
xoptions = XendOptions.instance()
|
xoptions = XendOptions.instance()
|
||||||
@@ -3305,33 +3305,38 @@ class XendDomainInfo:
|
@@ -3299,33 +3299,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.
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user