]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
xen: work with ia64 MAX_VIRT_CPUS of 64
authorEric Blake <eblake@redhat.com>
Fri, 29 Oct 2010 16:51:01 +0000 (10:51 -0600)
committerEric Blake <eblake@redhat.com>
Mon, 1 Nov 2010 15:31:23 +0000 (09:31 -0600)
* src/xen/xen_hypervisor.c (MAX_VIRT_CPUS): Move...
* src/xen/xen_driver.h (MAX_VIRT_CPUS): ...so all xen code can see
same value.
* src/xen/xend_internal.c (sexpr_to_xend_domain_info)
(xenDaemonDomainGetVcpusFlags, xenDaemonParseSxpr)
(xenDaemonFormatSxpr): Work if MAX_VIRT_CPUS is 64 on a platform
where long is 64-bits.
* src/xen/xm_internal.c (xenXMDomainConfigParse)
(xenXMDomainConfigFormat): Likewise.

src/xen/xen_driver.h
src/xen/xen_hypervisor.c
src/xen/xend_internal.c
src/xen/xm_internal.c

index 53f97d4748b75a12c4988ec2cb0961fb279c9f02..16d22f19805bc92dca4e9ef516344b622d3afc3b 100644 (file)
 #  include <winsock2.h>
 # endif
 
+/* xen-unstable changeset 19788 removed MAX_VIRT_CPUS from public
+ * headers.  Its semantic was retained with XEN_LEGACY_MAX_VCPUS.
+ * Ensure MAX_VIRT_CPUS is defined accordingly.
+ */
+# if !defined(MAX_VIRT_CPUS) && defined(XEN_LEGACY_MAX_VCPUS)
+#  define MAX_VIRT_CPUS XEN_LEGACY_MAX_VCPUS
+# endif
+
 extern int xenRegister (void);
 
 # define XEN_UNIFIED_HYPERVISOR_OFFSET 0
index 3797865e52772b5d3870e7a7a44987c2b3a6d8af..ec726fe819a04028b58b89f0c6ef9cbcbc693f01 100644 (file)
@@ -109,14 +109,6 @@ typedef privcmd_hypercall_t hypercall_t;
 # define SYS_IFACE_MIN_VERS_NUMA 4
 #endif
 
-/* xen-unstable changeset 19788 removed MAX_VIRT_CPUS from public
- * headers.  Its semanitc was retained with XEN_LEGACY_MAX_VCPUS.
- * Ensure MAX_VIRT_CPUS is defined accordingly.
- */
-#if !defined(MAX_VIRT_CPUS) && defined(XEN_LEGACY_MAX_VCPUS)
-# define MAX_VIRT_CPUS XEN_LEGACY_MAX_VCPUS
-#endif
-
 static int xen_ioctl_hypercall_cmd = 0;
 static int initialized = 0;
 static int in_init = 0;
index e96b7625ce7cfd63cab9b245addf12845cf7af69..614c0367f5d77d3022a4e665bbb9753e23e219c1 100644 (file)
@@ -2192,7 +2192,7 @@ xenDaemonParseSxpr(virConnectPtr conn,
     }
 
     def->maxvcpus = sexpr_int(root, "domain/vcpus");
-    def->vcpus = count_one_bits(sexpr_int(root, "domain/vcpu_avail"));
+    def->vcpus = count_one_bits_l(sexpr_u64(root, "domain/vcpu_avail"));
     if (!def->vcpus || def->maxvcpus < def->vcpus)
         def->vcpus = def->maxvcpus;
 
@@ -2468,7 +2468,7 @@ sexpr_to_xend_domain_info(virDomainPtr domain, const struct sexpr *root,
     }
     info->cpuTime = sexpr_float(root, "domain/cpu_time") * 1000000000;
     vcpus = sexpr_int(root, "domain/vcpus");
-    info->nrVirtCpu = count_one_bits(sexpr_int(root, "domain/vcpu_avail"));
+    info->nrVirtCpu = count_one_bits_l(sexpr_u64(root, "domain/vcpu_avail"));
     if (!info->nrVirtCpu || vcpus < info->nrVirtCpu)
         info->nrVirtCpu = vcpus;
 
@@ -3706,7 +3706,7 @@ xenDaemonDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
 
     ret = sexpr_int(root, "domain/vcpus");
     if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM)) {
-        int vcpus = count_one_bits(sexpr_int(root, "domain/vcpu_avail"));
+        int vcpus = count_one_bits_l(sexpr_u64(root, "domain/vcpu_avail"));
         if (vcpus)
             ret = MIN(vcpus, ret);
     }
@@ -5770,9 +5770,11 @@ xenDaemonFormatSxpr(virConnectPtr conn,
     virBufferVSprintf(&buf, "(memory %lu)(maxmem %lu)",
                       def->mem.cur_balloon/1024, def->mem.max_balloon/1024);
     virBufferVSprintf(&buf, "(vcpus %u)", def->maxvcpus);
-    /* Computing the vcpu_avail bitmask works because MAX_VIRT_CPUS is 32.  */
+    /* Computing the vcpu_avail bitmask works because MAX_VIRT_CPUS is
+       either 32, or 64 on a platform where long is big enough.  */
+    verify(MAX_VIRT_CPUS <= sizeof(1UL) * CHAR_BIT);
     if (def->vcpus < def->maxvcpus)
-        virBufferVSprintf(&buf, "(vcpu_avail %u)", (1U << def->vcpus) - 1);
+        virBufferVSprintf(&buf, "(vcpu_avail %lu)", (1UL << def->vcpus) - 1);
 
     if (def->cpumask) {
         char *ranges = virDomainCpuSetFormat(def->cpumask, def->cpumasklen);
@@ -5869,8 +5871,8 @@ xenDaemonFormatSxpr(virConnectPtr conn,
 
             virBufferVSprintf(&buf, "(vcpus %u)", def->maxvcpus);
             if (def->vcpus < def->maxvcpus)
-                virBufferVSprintf(&buf, "(vcpu_avail %u)",
-                                  (1U << def->vcpus) - 1);
+                virBufferVSprintf(&buf, "(vcpu_avail %lu)",
+                                  (1UL << def->vcpus) - 1);
 
             for (i = 0 ; i < def->os.nBootDevs ; i++) {
                 switch (def->os.bootDevs[i]) {
index 430d40b5f69f73ab163cda937037892df2a97f93..6c5df0f064d096b9379d077b7cacc8c244022a0e 100644 (file)
@@ -776,7 +776,7 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
     def->maxvcpus = count;
     if (xenXMConfigGetULong(conf, "vcpu_avail", &count, -1) < 0)
         goto cleanup;
-    def->vcpus = MIN(count_one_bits(count), def->maxvcpus);
+    def->vcpus = MIN(count_one_bits_l(count), def->maxvcpus);
 
     if (xenXMConfigGetString(conf, "cpus", &str, NULL) < 0)
         goto cleanup;
@@ -2336,8 +2336,11 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
 
     if (xenXMConfigSetInt(conf, "vcpus", def->maxvcpus) < 0)
         goto no_memory;
+    /* Computing the vcpu_avail bitmask works because MAX_VIRT_CPUS is
+       either 32, or 64 on a platform where long is big enough.  */
+    verify(MAX_VIRT_CPUS <= sizeof(1UL) * CHAR_BIT);
     if (def->vcpus < def->maxvcpus &&
-        xenXMConfigSetInt(conf, "vcpu_avail", (1U << def->vcpus) - 1) < 0)
+        xenXMConfigSetInt(conf, "vcpu_avail", (1UL << def->vcpus) - 1) < 0)
         goto no_memory;
 
     if ((def->cpumask != NULL) &&