[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.