[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] HVM vcpu add/remove: parse 'vcpu_avail' to firmware and set up madt
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1260782747 0 # Node ID 5ea096ef7603da465562d7e4177225bc3a298723 # Parent eaea340b371dbb2c7d5261c915143ce87d6c1270 HVM vcpu add/remove: parse 'vcpu_avail' to firmware and set up madt accordingly -- currently firmware has got 'vcpus' from xend, this patch add parse 'vcpu_avail' to firmware; -- setup madt 'lapic' subitems of processors accoring to vcpus and vcpu_avail which finally come from config; Signed-off-by: Liu, Jinsong <jinsong.liu@xxxxxxxxx> Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- tools/firmware/hvmloader/acpi/build.c | 6 ++++-- tools/firmware/hvmloader/config.h | 3 --- tools/firmware/hvmloader/util.h | 5 +++++ tools/python/xen/lowlevel/xc/xc.c | 12 ++++++++---- tools/python/xen/xend/image.py | 2 ++ xen/include/public/hvm/hvm_info_table.h | 6 ++++++ 6 files changed, 25 insertions(+), 9 deletions(-) diff -r eaea340b371d -r 5ea096ef7603 tools/firmware/hvmloader/acpi/build.c --- a/tools/firmware/hvmloader/acpi/build.c Mon Dec 14 09:14:26 2009 +0000 +++ b/tools/firmware/hvmloader/acpi/build.c Mon Dec 14 09:25:47 2009 +0000 @@ -115,7 +115,7 @@ static int construct_madt(struct acpi_20 lapic = (struct acpi_20_madt_lapic *)(io_apic + 1); madt_lapic0_addr = (uint32_t)lapic; - for ( i = 0; i < MAX_VCPUS; i++ ) + for ( i = 0; i < HVM_MAX_VCPUS; i++ ) { memset(lapic, 0, sizeof(*lapic)); lapic->type = ACPI_PROCESSOR_LOCAL_APIC; @@ -123,7 +123,9 @@ static int construct_madt(struct acpi_20 /* Processor ID must match processor-object IDs in the DSDT. */ lapic->acpi_processor_id = i; lapic->apic_id = LAPIC_ID(i); - lapic->flags = (i < hvm_info->nr_vcpus) ? ACPI_LOCAL_APIC_ENABLED : 0; + lapic->flags = ((i < hvm_info->nr_vcpus) && + test_bit(i, hvm_info->vcpu_online) + ? ACPI_LOCAL_APIC_ENABLED : 0); offset += sizeof(*lapic); lapic++; } diff -r eaea340b371d -r 5ea096ef7603 tools/firmware/hvmloader/config.h --- a/tools/firmware/hvmloader/config.h Mon Dec 14 09:14:26 2009 +0000 +++ b/tools/firmware/hvmloader/config.h Mon Dec 14 09:25:47 2009 +0000 @@ -50,9 +50,6 @@ extern unsigned long pci_mem_start, pci_ #define XEN_PF_IOBASE 0x10 #define PFFLAG_ROM_LOCK 1 /* Sets whether ROM memory area is RW or RO */ -/* Maximum we can support with current vLAPIC ID mapping. */ -#define MAX_VCPUS 128 - /* Located at BIOS_INFO_PHYSICAL_ADDRESS. */ struct bios_info { uint8_t com1_present:1; /* 0[0] - System has COM1? */ diff -r eaea340b371d -r 5ea096ef7603 tools/firmware/hvmloader/util.h --- a/tools/firmware/hvmloader/util.h Mon Dec 14 09:14:26 2009 +0000 +++ b/tools/firmware/hvmloader/util.h Mon Dec 14 09:25:47 2009 +0000 @@ -29,6 +29,11 @@ void __bug(char *file, int line) __attri #define BUG() __bug(__FILE__, __LINE__) #define BUG_ON(p) do { if (p) BUG(); } while (0) #define BUILD_BUG_ON(p) ((void)sizeof(char[1 - 2 * !!(p)])) + +static inline int test_bit(unsigned int b, void *p) +{ + return !!(((uint8_t *)p)[b>>3] & (1u<<(b&7))); +} /* MSR access */ void wrmsr(uint32_t idx, uint64_t v); diff -r eaea340b371d -r 5ea096ef7603 tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Mon Dec 14 09:14:26 2009 +0000 +++ b/tools/python/xen/lowlevel/xc/xc.c Mon Dec 14 09:25:47 2009 +0000 @@ -915,13 +915,14 @@ static PyObject *pyxc_hvm_build(XcObject #endif char *image; int memsize, target=-1, vcpus = 1, acpi = 0, apic = 1; + uint64_t vcpu_avail = 1; static char *kwd_list[] = { "domid", - "memsize", "image", "target", "vcpus", "acpi", - "apic", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iis|iiii", kwd_list, + "memsize", "image", "target", "vcpus", + "vcpu_avail", "acpi", "apic", NULL }; + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iis|iilii", kwd_list, &dom, &memsize, &image, &target, &vcpus, - &acpi, &apic) ) + &vcpu_avail, &acpi, &apic) ) return NULL; if ( target == -1 ) @@ -942,6 +943,8 @@ static PyObject *pyxc_hvm_build(XcObject va_hvm->acpi_enabled = acpi; va_hvm->apic_mode = apic; va_hvm->nr_vcpus = vcpus; + ((uint64_t *)va_hvm->vcpu_online)[0] = vcpu_avail; + ((uint64_t *)va_hvm->vcpu_online)[1] = 0; for ( i = 0, sum = 0; i < va_hvm->length; i++ ) sum += ((uint8_t *)va_hvm)[i]; va_hvm->checksum -= sum; @@ -1810,6 +1813,7 @@ static PyMethodDef pyxc_methods[] = { " dom [int]: Identifier of domain to build into.\n" " image [str]: Name of HVM loader image file.\n" " vcpus [int, 1]: Number of Virtual CPUS in domain.\n\n" + " vcpu_avail [long, 1]: Which Virtual CPUS available.\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, { "hvm_get_param", diff -r eaea340b371d -r 5ea096ef7603 tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Mon Dec 14 09:14:26 2009 +0000 +++ b/tools/python/xen/xend/image.py Mon Dec 14 09:25:47 2009 +0000 @@ -938,6 +938,7 @@ class HVMImageHandler(ImageHandler): log.debug("memsize = %d", memmax_mb) log.debug("target = %d", mem_mb) log.debug("vcpus = %d", self.vm.getVCpuCount()) + log.debug("vcpu_avail = %li", self.vm.getVCpuAvail()) log.debug("acpi = %d", self.acpi) log.debug("apic = %d", self.apic) @@ -946,6 +947,7 @@ class HVMImageHandler(ImageHandler): memsize = memmax_mb, target = mem_mb, vcpus = self.vm.getVCpuCount(), + vcpu_avail = self.vm.getVCpuAvail(), acpi = self.acpi, apic = self.apic) rc['notes'] = { 'SUSPEND_CANCEL': 1 } diff -r eaea340b371d -r 5ea096ef7603 xen/include/public/hvm/hvm_info_table.h --- a/xen/include/public/hvm/hvm_info_table.h Mon Dec 14 09:14:26 2009 +0000 +++ b/xen/include/public/hvm/hvm_info_table.h Mon Dec 14 09:25:47 2009 +0000 @@ -28,6 +28,9 @@ #define HVM_INFO_PFN 0x09F #define HVM_INFO_OFFSET 0x800 #define HVM_INFO_PADDR ((HVM_INFO_PFN << 12) + HVM_INFO_OFFSET) + +/* Maximum we can support with current vLAPIC ID mapping. */ +#define HVM_MAX_VCPUS 128 struct hvm_info_table { char signature[8]; /* "HVM INFO" */ @@ -64,6 +67,9 @@ struct hvm_info_table { * RAM above 4GB */ uint32_t high_mem_pgend; + + /* Bitmap of which CPUs are online at boot time. */ + uint8_t vcpu_online[HVM_MAX_VCPUS/8]; }; #endif /* __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__ */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |