WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] Fix cpu selection at the time vCPU allocation

To: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] Fix cpu selection at the time vCPU allocation
From: "Yang, Xiaowei" <xiaowei.yang@xxxxxxxxx>
Date: Fri, 06 Mar 2009 16:33:56 +0800
Delivery-date: Fri, 06 Mar 2009 00:34:50 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.19 (X11/20090105)
After cpu_[online/offline], set bits in cpu_online_map could be not continuous. Use cycle_cpu() to pick the next one.

Signed-off-by: Xiaowei Yang <xiaowei.yang@xxxxxxxxx>

Thanks,
xiaowei
diff -r 310c85c9cb86 xen/common/domctl.c
--- a/xen/common/domctl.c       Mon Mar 02 16:24:50 2009 +0000
+++ b/xen/common/domctl.c       Fri Mar 06 10:07:25 2009 +0800
@@ -428,7 +428,7 @@
 
             cpu = (i == 0) ?
                 default_vcpu0_location() :
-                (d->vcpu[i-1]->processor + 1) % num_online_cpus();
+                cycle_cpu(d->vcpu[i-1]->processor, cpu_online_map);
 
             if ( alloc_vcpu(d, i, cpu) == NULL )
                 goto maxvcpu_out;
diff -r 310c85c9cb86 xen/common/sched_credit.c
--- a/xen/common/sched_credit.c Mon Mar 02 16:24:50 2009 +0000
+++ b/xen/common/sched_credit.c Fri Mar 06 10:07:25 2009 +0800
@@ -248,15 +248,6 @@
 static struct csched_private csched_priv;
 
 static void csched_tick(void *_cpu);
-
-static inline int
-__cycle_cpu(int cpu, const cpumask_t *mask)
-{
-    int nxt = next_cpu(cpu, *mask);
-    if (nxt == NR_CPUS)
-        nxt = first_cpu(*mask);
-    return nxt;
-}
 
 static inline int
 __vcpu_on_runq(struct csched_vcpu *svc)
@@ -428,7 +419,7 @@
     cpus_and(cpus, cpu_online_map, vc->cpu_affinity);
     cpu = cpu_isset(vc->processor, cpus)
             ? vc->processor
-            : __cycle_cpu(vc->processor, &cpus);
+            : cycle_cpu(vc->processor, cpus);
     ASSERT( !cpus_empty(cpus) && cpu_isset(cpu, cpus) );
 
     /*
@@ -454,7 +445,7 @@
         cpumask_t nxt_idlers;
         int nxt;
 
-        nxt = __cycle_cpu(cpu, &cpus);
+        nxt = cycle_cpu(cpu, cpus);
 
         if ( cpu_isset(cpu, cpu_core_map[nxt]) )
         {
@@ -1128,7 +1119,7 @@
 
     while ( !cpus_empty(workers) )
     {
-        peer_cpu = __cycle_cpu(peer_cpu, &workers);
+        peer_cpu = cycle_cpu(peer_cpu, workers);
         cpu_clear(peer_cpu, workers);
 
         /*
diff -r 310c85c9cb86 xen/include/xen/cpumask.h
--- a/xen/include/xen/cpumask.h Mon Mar 02 16:24:50 2009 +0000
+++ b/xen/include/xen/cpumask.h Fri Mar 06 10:07:25 2009 +0800
@@ -38,6 +38,8 @@
  *
  * int first_cpu(mask)                 Number lowest set bit, or NR_CPUS
  * int next_cpu(cpu, mask)             Next cpu past 'cpu', or NR_CPUS
+ * int last_cpu(mask)                  Number highest set bit, or NR_CPUS
+ * int cycle_cpu(cpu, mask)            Next cpu cycling from 'cpu', or NR_CPUS
  *
  * cpumask_t cpumask_of_cpu(cpu)       Return cpumask with bit 'cpu' set
  * CPU_MASK_ALL                                Initializer - all bits set
@@ -225,10 +227,21 @@
 #define last_cpu(src) __last_cpu(&(src), NR_CPUS)
 static inline int __last_cpu(const cpumask_t *srcp, int nbits)
 {
-       int cpu, pcpu = NR_CPUS;
-       for (cpu = first_cpu(*srcp); cpu < NR_CPUS; cpu = next_cpu(cpu, *srcp))
+       int cpu, pcpu = nbits;
+       for (cpu = __first_cpu(srcp, nbits);
+            cpu < nbits;
+            cpu = __next_cpu(cpu, srcp, nbits))
                pcpu = cpu;
        return pcpu;
+}
+
+#define cycle_cpu(n, src) __cycle_cpu((n), &(src), NR_CPUS)
+static inline int __cycle_cpu(int n, const cpumask_t *srcp, int nbits)
+{
+    int nxt = __next_cpu(n, srcp, nbits);
+    if (nxt == nbits)
+        nxt = __first_cpu(srcp, nbits);
+    return nxt;
 }
 
 #define cpumask_of_cpu(cpu)                                            \
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] Fix cpu selection at the time vCPU allocation, Yang, Xiaowei <=