diff --git a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c index a85684d402..431841523d 100644 --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c @@ -1045,8 +1045,6 @@ static void network_connect(struct net_device *dev) notify_remote_via_irq(np->irq); network_tx_buf_gc(dev); - network_maybe_wake_tx(dev); - spin_unlock(&np->rx_lock); spin_unlock_irq(&np->tx_lock); } diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index f6961b71c9..029c0c969c 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -1264,7 +1264,7 @@ class XendDomainInfo: m = self.image.getDomainMemory(self.info['memory'] * 1024) balloon.free(m) xc.domain_setmaxmem(self.domid, m) - xc.domain_memory_increase_reservation(self.domid, m, 0, 0) + xc.domain_memory_increase_reservation(self.domid, self.info['memory'] * 1024, 0, 0) self.createChannels() diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py index 43ed39993c..6d2da07cd6 100644 --- a/tools/python/xen/xend/image.py +++ b/tools/python/xen/xend/image.py @@ -19,6 +19,7 @@ import os, string import re +import math import xen.lowlevel.xc from xen.xend import sxp @@ -141,11 +142,13 @@ class ImageHandler: % (self.ostype, self.vm.getDomid(), str(result))) - def getDomainMemory(self, mem): + def getDomainMemory(self, mem_kb): """@return The memory required, in KiB, by the domain to store the - given amount, also in KiB. This is normally just mem, but HVM domains - have overheads to account for.""" - return mem + given amount, also in KiB. This is normally just mem, but if HVM is + supported, keep a little extra free.""" + if 'hvm' in xc.xeninfo()['xen_caps']: + mem_kb += 4*1024; + return mem_kb def buildDomain(self): """Build the domain. Define in subclass.""" @@ -377,15 +380,20 @@ class HVMImageHandler(ImageHandler): os.waitpid(self.pid, 0) self.pid = 0 - def getDomainMemory(self, mem): + def getDomainMemory(self, mem_kb): """@see ImageHandler.getDomainMemory""" - page_kb = 4 - extra_pages = 0 if os.uname()[4] == 'ia64': page_kb = 16 # ROM size for guest firmware, ioreq page and xenstore page extra_pages = 1024 + 2 - return mem + extra_pages * page_kb + else: + page_kb = 4 + # This was derived emperically: + # 2.4 MB overhead per 1024 MB RAM + 8 MB constant + # + 4 to avoid low-memory condition + extra_mb = (2.4/1024) * (mem_kb/1024.0) + 12; + extra_pages = int( math.ceil( extra_mb*1024 / page_kb )) + return mem_kb + extra_pages * page_kb def register_shutdown_watch(self): """ add xen store watch on control/shutdown """ diff --git a/tools/xm-test/tests/network/03_network_local_tcp_pos.py b/tools/xm-test/tests/network/03_network_local_tcp_pos.py index 8e3f80f847..b3b0bf103f 100644 --- a/tools/xm-test/tests/network/03_network_local_tcp_pos.py +++ b/tools/xm-test/tests/network/03_network_local_tcp_pos.py @@ -44,7 +44,7 @@ try: lofails="" for size in trysizes: out = console.runCmd("hping2 127.0.0.1 -E /dev/urandom -q -c 20 " - + "--fast -d " + str(size)) + + "--fast -d " + str(size) + " -N " + str(size)) if out["return"]: lofails += " " + str(size) @@ -54,7 +54,7 @@ try: ip = netdev.getNetDevIP() for size in trysizes: out = console.runCmd("hping2 " + ip + " -E /dev/urandom -q -c 20 " - + "--fast -d "+ str(size)) + + "--fast -d "+ str(size) + " -N " + str(size)) if out["return"]: eth0fails += " " + str(size) except ConsoleError, e: diff --git a/tools/xm-test/tests/network/04_network_local_udp_pos.py b/tools/xm-test/tests/network/04_network_local_udp_pos.py index 7cd5e6c0af..fcc6807a1d 100644 --- a/tools/xm-test/tests/network/04_network_local_udp_pos.py +++ b/tools/xm-test/tests/network/04_network_local_udp_pos.py @@ -43,7 +43,7 @@ try: lofails="" for size in trysizes: out = console.runCmd("hping2 127.0.0.1 -E /dev/urandom -2 -q -c 20 " - + "--fast -d " + str(size)) + + "--fast -d " + str(size) + " -N " + str(size)) if out["return"]: lofails += " " + str(size) print out["output"] @@ -54,7 +54,7 @@ try: ip = netdev.getNetDevIP() for size in trysizes: out = console.runCmd("hping2 " + ip + " -E /dev/urandom -2 -q -c 20 " - + "--fast -d " + str(size)) + + "--fast -d " + str(size) + " -N " + str(size)) if out["return"]: eth0fails += " " + str(size) print out["output"] diff --git a/tools/xm-test/tests/network/06_network_dom0_tcp_pos.py b/tools/xm-test/tests/network/06_network_dom0_tcp_pos.py index e5b67b5329..e36c090bf7 100644 --- a/tools/xm-test/tests/network/06_network_dom0_tcp_pos.py +++ b/tools/xm-test/tests/network/06_network_dom0_tcp_pos.py @@ -44,7 +44,7 @@ try: dom0ip = netdev.getDom0AliasIP() for size in trysizes: out = console.runCmd("hping2 " + dom0ip + " -E /dev/urandom -q -c 20 " - + "--fast -d " + str(size)) + + "--fast -d " + str(size) + " -N " + str(size)) if out["return"]: fails += " " + str(size) print out["output"] diff --git a/tools/xm-test/tests/network/07_network_dom0_udp_pos.py b/tools/xm-test/tests/network/07_network_dom0_udp_pos.py index 7521e8eb07..f86514f811 100644 --- a/tools/xm-test/tests/network/07_network_dom0_udp_pos.py +++ b/tools/xm-test/tests/network/07_network_dom0_udp_pos.py @@ -43,7 +43,7 @@ try: dom0ip = netdev.getDom0AliasIP() for size in trysizes: out = console.runCmd("hping2 " + dom0ip + " -E /dev/urandom -2 -q -c 20" - + " --fast -d " + str(size)) + + " --fast -d " + str(size) + " -N " + str(size)) if out["return"]: fails += " " + str(size) print out["output"] diff --git a/tools/xm-test/tests/network/12_network_domU_tcp_pos.py b/tools/xm-test/tests/network/12_network_domU_tcp_pos.py index 5c08bab2a8..50a8a9a569 100644 --- a/tools/xm-test/tests/network/12_network_domU_tcp_pos.py +++ b/tools/xm-test/tests/network/12_network_domU_tcp_pos.py @@ -50,7 +50,7 @@ try: ip2 = dst_netdev.getNetDevIP() for size in pingsizes: out = src_console.runCmd("hping2 " + ip2 + " -E /dev/urandom -q -c 20 " - + "--fast -d " + str(size)) + + "--fast -d " + str(size) + " -N " + str(size)) if out["return"]: fails += " " + str(size) print out["output"] diff --git a/tools/xm-test/tests/network/13_network_domU_udp_pos.py b/tools/xm-test/tests/network/13_network_domU_udp_pos.py index bb2aedf4a1..b247267f25 100644 --- a/tools/xm-test/tests/network/13_network_domU_udp_pos.py +++ b/tools/xm-test/tests/network/13_network_domU_udp_pos.py @@ -50,7 +50,7 @@ try: ip2 = dst_netdev.getNetDevIP() for size in pingsizes: out = src_console.runCmd("hping2 " + ip2 + " -E /dev/urandom -2 -q " - + "-c 20 --fast -d " + str(size)) + + "-c 20 --fast -d " + str(size) + " -N " + str(size)) if out["return"]: fails += " " + str(size) print out["output"] diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index e5a3c89703..a0844e4edf 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -189,7 +189,11 @@ void hvm_setup_platform(struct domain* d) if ( !hvm_guest(current) || (current->vcpu_id != 0) ) return; - shadow_direct_map_init(d); + if ( shadow_direct_map_init(d) == 0 ) + { + printk("Can not allocate shadow direct map for HVM domain.\n"); + domain_crash_synchronous(); + } hvm_map_io_shared_page(d); hvm_get_info(d); diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 2541a140f9..96e0d31b7f 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -458,6 +458,9 @@ int start_svm(void) if (!(test_bit(X86_FEATURE_SVME, &boot_cpu_data.x86_capability))) return 0; + svm_globals[cpu].hsa = alloc_host_save_area(); + if (! svm_globals[cpu].hsa) + return 0; rdmsr(MSR_EFER, eax, edx); eax |= EFER_SVME; @@ -466,7 +469,6 @@ int start_svm(void) printk("AMD SVM Extension is enabled for cpu %d.\n", cpu ); /* Initialize the HSA for this core */ - svm_globals[cpu].hsa = alloc_host_save_area(); phys_hsa = (u64) virt_to_maddr( svm_globals[cpu].hsa ); phys_hsa_lo = (u32) phys_hsa; phys_hsa_hi = (u32) (phys_hsa >> 32); diff --git a/xen/arch/x86/hvm/svm/vmcb.c b/xen/arch/x86/hvm/svm/vmcb.c index 3917650a4f..44c87335d6 100644 --- a/xen/arch/x86/hvm/svm/vmcb.c +++ b/xen/arch/x86/hvm/svm/vmcb.c @@ -139,18 +139,21 @@ static int construct_vmcb_controls(struct arch_svm_struct *arch_svm) /* The following is for I/O and MSR permision map */ iopm = alloc_xenheap_pages(get_order_from_bytes(IOPM_SIZE)); - - ASSERT(iopm); - memset(iopm, 0xff, IOPM_SIZE); - clear_bit(PC_DEBUG_PORT, iopm); + if (iopm) + { + memset(iopm, 0xff, IOPM_SIZE); + clear_bit(PC_DEBUG_PORT, iopm); + } msrpm = alloc_xenheap_pages(get_order_from_bytes(MSRPM_SIZE)); - - ASSERT(msrpm); - memset(msrpm, 0xff, MSRPM_SIZE); + if (msrpm) + memset(msrpm, 0xff, MSRPM_SIZE); arch_svm->iopm = iopm; arch_svm->msrpm = msrpm; + if (! iopm || ! msrpm) + return 1; + vmcb->iopm_base_pa = (u64) virt_to_maddr(iopm); vmcb->msrpm_base_pa = (u64) virt_to_maddr(msrpm);