* [PATCH] Fix cpu selection at the time vCPU allocation
@ 2009-03-06 8:33 Yang, Xiaowei
0 siblings, 0 replies; only message in thread
From: Yang, Xiaowei @ 2009-03-06 8:33 UTC (permalink / raw)
To: xen-devel@lists.xensource.com
[-- Attachment #1: Type: text/plain, Size: 190 bytes --]
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@intel.com>
Thanks,
xiaowei
[-- Attachment #2: cycle_cpu.patch --]
[-- Type: text/x-patch, Size: 3012 bytes --]
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) \
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-03-06 8:33 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-06 8:33 [PATCH] Fix cpu selection at the time vCPU allocation Yang, Xiaowei
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.