cpupools: allocate CPU masks dynamically
authorJan Beulich <jbeulich@suse.com>
Fri, 21 Oct 2011 07:43:35 +0000 (09:43 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 21 Oct 2011 07:43:35 +0000 (09:43 +0200)
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
xen/arch/x86/domain_build.c
xen/arch/x86/smpboot.c
xen/common/cpupool.c
xen/common/domctl.c
xen/common/sched_credit.c
xen/common/sched_credit2.c
xen/common/sched_sedf.c
xen/common/schedule.c
xen/include/xen/sched-if.h
xen/include/xen/sched.h

index 364968d70c9c224578c4312d06b9308ef1d7448e..1b3818fc7fb2fbb0651cc882c7dbd97964843c04 100644 (file)
@@ -885,10 +885,10 @@ int __init construct_dom0(
 
     printk("Dom0 has maximum %u VCPUs\n", opt_dom0_max_vcpus);
 
-    cpu = first_cpu(cpupool0->cpu_valid);
+    cpu = cpumask_first(cpupool0->cpu_valid);
     for ( i = 1; i < opt_dom0_max_vcpus; i++ )
     {
-        cpu = cycle_cpu(cpu, cpupool0->cpu_valid);
+        cpu = cpumask_cycle(cpu, cpupool0->cpu_valid);
         (void)alloc_vcpu(d, i, cpu);
     }
 
index e9c613cdcc7ac3e49c8bfa1a5baa74de9bc8369b..24954684df0ef6a642726c2660796c8c99a56f8e 100644 (file)
@@ -850,8 +850,8 @@ void __cpu_disable(void)
     remove_siblinginfo(cpu);
 
     /* It's now safe to remove this processor from the online map */
-    cpu_clear(cpu, cpupool0->cpu_valid);
-    cpu_clear(cpu, cpu_online_map);
+    cpumask_clear_cpu(cpu, cpupool0->cpu_valid);
+    cpumask_clear_cpu(cpu, &cpu_online_map);
     fixup_irqs();
 
     if ( cpu_disable_scheduler(cpu) )
index 459edf73fb5ce3598422decbb64717dad917c2df..e3ad20bf37922ab6127f4ee5f72a23784fc8d692 100644 (file)
@@ -39,11 +39,18 @@ DEFINE_PER_CPU(struct cpupool *, cpupool);
 
 static struct cpupool *alloc_cpupool_struct(void)
 {
-    return xzalloc(struct cpupool);
+    struct cpupool *c = xzalloc(struct cpupool);
+
+    if ( c && zalloc_cpumask_var(&c->cpu_valid) )
+        return c;
+    xfree(c);
+    return NULL;
 }
 
 static void free_cpupool_struct(struct cpupool *c)
 {
+    if ( c )
+        free_cpumask_var(c->cpu_valid);
     xfree(c);
 }
 
@@ -191,7 +198,7 @@ static int cpupool_destroy(struct cpupool *c)
         spin_unlock(&cpupool_lock);
         return -ENOENT;
     }
-    if ( (c->n_dom != 0) || cpus_weight(c->cpu_valid) )
+    if ( (c->n_dom != 0) || cpumask_weight(c->cpu_valid) )
     {
         spin_unlock(&cpupool_lock);
         return -EBUSY;
@@ -232,7 +239,7 @@ static int cpupool_assign_cpu_locked(struct cpupool *c, unsigned int cpu)
         cpupool_put(cpupool_cpu_moving);
         cpupool_cpu_moving = NULL;
     }
-    cpu_set(cpu, c->cpu_valid);
+    cpumask_set_cpu(cpu, c->cpu_valid);
     return 0;
 }
 
@@ -296,10 +303,10 @@ int cpupool_unassign_cpu(struct cpupool *c, unsigned int cpu)
         goto out;
 
     ret = 0;
-    if ( !cpu_isset(cpu, c->cpu_valid) && (cpu != cpupool_moving_cpu) )
+    if ( !cpumask_test_cpu(cpu, c->cpu_valid) && (cpu != cpupool_moving_cpu) )
         goto out;
 
-    if ( (c->n_dom > 0) && (cpus_weight(c->cpu_valid) == 1) &&
+    if ( (c->n_dom > 0) && (cpumask_weight(c->cpu_valid) == 1) &&
          (cpu != cpupool_moving_cpu) )
     {
         for_each_domain(d)
@@ -326,15 +333,15 @@ int cpupool_unassign_cpu(struct cpupool *c, unsigned int cpu)
     cpupool_moving_cpu = cpu;
     atomic_inc(&c->refcnt);
     cpupool_cpu_moving = c;
-    cpu_clear(cpu, c->cpu_valid);
+    cpumask_clear_cpu(cpu, c->cpu_valid);
     spin_unlock(&cpupool_lock);
 
     work_cpu = smp_processor_id();
     if ( work_cpu == cpu )
     {
-        work_cpu = first_cpu(cpupool0->cpu_valid);
+        work_cpu = cpumask_first(cpupool0->cpu_valid);
         if ( work_cpu == cpu )
-            work_cpu = next_cpu(cpu, cpupool0->cpu_valid);
+            work_cpu = cpumask_next(cpu, cpupool0->cpu_valid);
     }
     return continue_hypercall_on_cpu(work_cpu, cpupool_unassign_cpu_helper, c);
 
@@ -361,7 +368,7 @@ int cpupool_add_domain(struct domain *d, int poolid)
         return 0;
     spin_lock(&cpupool_lock);
     c = cpupool_find_by_id(poolid);
-    if ( (c != NULL) && cpus_weight(c->cpu_valid) )
+    if ( (c != NULL) && cpumask_weight(c->cpu_valid) )
     {
         c->n_dom++;
         n_dom = c->n_dom;
@@ -418,7 +425,7 @@ static int cpupool_cpu_remove(unsigned int cpu)
     int ret = 0;
        
     spin_lock(&cpupool_lock);
-    if ( !cpu_isset(cpu, cpupool0->cpu_valid))
+    if ( !cpumask_test_cpu(cpu, cpupool0->cpu_valid))
         ret = -EBUSY;
     else
         cpu_set(cpu, cpupool_locked_cpus);
@@ -473,7 +480,7 @@ int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op)
         op->cpupool_id = c->cpupool_id;
         op->sched_id = c->sched->sched_id;
         op->n_dom = c->n_dom;
-        ret = cpumask_to_xenctl_cpumap(&op->cpumap, &c->cpu_valid);
+        ret = cpumask_to_xenctl_cpumap(&op->cpumap, c->cpu_valid);
         cpupool_put(c);
     }
     break;
@@ -516,7 +523,7 @@ int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op)
             break;
         cpu = op->cpu;
         if ( cpu == XEN_SYSCTL_CPUPOOL_PAR_ANY )
-            cpu = last_cpu(c->cpu_valid);
+            cpu = cpumask_last(c->cpu_valid);
         ret = (cpu < nr_cpu_ids) ? cpupool_unassign_cpu(c, cpu) : -EINVAL;
         cpupool_put(c);
     }
@@ -550,7 +557,7 @@ int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op)
         ret = -ENOENT;
         spin_lock(&cpupool_lock);
         c = cpupool_find_by_id(op->cpupool_id);
-        if ( (c != NULL) && cpus_weight(c->cpu_valid) )
+        if ( (c != NULL) && cpumask_weight(c->cpu_valid) )
         {
             d->cpupool->n_dom--;
             ret = sched_move_domain(d, c);
index 685901a4d77d8c71d6ff2b7846f5c1a1ffcca31f..c524659d4fd80e3ec20820066319d684230f2c78 100644 (file)
@@ -502,7 +502,7 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domctl_t) u_domctl)
             goto maxvcpu_out;
 
         ret = -ENOMEM;
-        online = (d->cpupool == NULL) ? &cpu_online_map : &d->cpupool->cpu_valid;
+        online = (d->cpupool == NULL) ? &cpu_online_map : d->cpupool->cpu_valid;
         if ( max > d->max_vcpus )
         {
             struct vcpu **vcpus;
index cfd90a7cc8e21fd1cb3a11d37fd925861f7bf1e4..8d8f6cd36d33f6db371e1f49b0d0fab050b32313 100644 (file)
@@ -73,7 +73,7 @@
 #define CSCHED_DOM(_dom)    ((struct csched_dom *) (_dom)->sched_priv)
 #define RUNQ(_cpu)          (&(CSCHED_PCPU(_cpu)->runq))
 #define CSCHED_CPUONLINE(_pool)    \
-    (((_pool) == NULL) ? &cpupool_free_cpus : &(_pool)->cpu_valid)
+    (((_pool) == NULL) ? &cpupool_free_cpus : (_pool)->cpu_valid)
 
 
 /*
index e9c450cbf63f3673bb9b8f06cdf3bafff1ace86d..6e09c84ed65290ab92258725cafd142325295dd3 100644 (file)
@@ -176,7 +176,7 @@ integer_param("sched_credit2_migrate_resist", opt_migrate_resist);
 #define CSCHED_VCPU(_vcpu)  ((struct csched_vcpu *) (_vcpu)->sched_priv)
 #define CSCHED_DOM(_dom)    ((struct csched_dom *) (_dom)->sched_priv)
 #define CSCHED_CPUONLINE(_pool)    \
-    (((_pool) == NULL) ? &cpupool_free_cpus : &(_pool)->cpu_valid)
+    (((_pool) == NULL) ? &cpupool_free_cpus : (_pool)->cpu_valid)
 /* CPU to runq_id macro */
 #define c2r(_ops, _cpu)     (CSCHED_PRIV(_ops)->runq_map[(_cpu)])
 /* CPU to runqueue struct macro */
index ae93f39420b0ec68a8c7abf761888d82e0d256b4..6fe7ffa8b2d7656ff40f16d4235f484d02b7cf2d 100644 (file)
@@ -22,7 +22,7 @@
     } while ( 0 )
 
 #define SEDF_CPUONLINE(_pool)                                             \
-    (((_pool) == NULL) ? &cpupool_free_cpus : &(_pool)->cpu_valid)
+    (((_pool) == NULL) ? &cpupool_free_cpus : (_pool)->cpu_valid)
 
 #ifndef NDEBUG
 #define SEDF_STATS
index c4ccc79997d0b0feafde3c01b2242c349d8f2981..bcdae7190a847de435b7779c61336ee98c6df45b 100644 (file)
@@ -74,7 +74,7 @@ static struct scheduler __read_mostly ops;
 #define VCPU2OP(_v)   (DOM2OP((_v)->domain))
 #define VCPU2ONLINE(_v)                                                    \
          (((_v)->domain->cpupool == NULL) ? &cpu_online_map                \
-         : &(_v)->domain->cpupool->cpu_valid)
+         : (_v)->domain->cpupool->cpu_valid)
 
 static inline void trace_runstate_change(struct vcpu *v, int new_state)
 {
@@ -258,7 +258,7 @@ int sched_move_domain(struct domain *d, struct cpupool *c)
 
     domain_pause(d);
 
-    new_p = first_cpu(c->cpu_valid);
+    new_p = cpumask_first(c->cpu_valid);
     for_each_vcpu ( d, v )
     {
         migrate_timer(&v->periodic_timer, new_p);
@@ -273,7 +273,7 @@ int sched_move_domain(struct domain *d, struct cpupool *c)
         v->sched_priv = vcpu_priv[v->vcpu_id];
         evtchn_move_pirqs(v);
 
-        new_p = cycle_cpu(new_p, c->cpu_valid);
+        new_p = cpumask_cycle(new_p, c->cpu_valid);
 
         SCHED_OP(VCPU2OP(v), insert_vcpu, v);
     }
@@ -431,13 +431,13 @@ static void vcpu_migrate(struct vcpu *v)
             if ( pick_called &&
                  (new_lock == per_cpu(schedule_data, new_cpu).schedule_lock) &&
                  cpumask_test_cpu(new_cpu, v->cpu_affinity) &&
-                 cpu_isset(new_cpu, v->domain->cpupool->cpu_valid) )
+                 cpumask_test_cpu(new_cpu, v->domain->cpupool->cpu_valid) )
                 break;
 
             /* Select a new CPU. */
             new_cpu = SCHED_OP(VCPU2OP(v), pick_cpu, v);
             if ( (new_lock == per_cpu(schedule_data, new_cpu).schedule_lock) &&
-                 cpu_isset(new_cpu, v->domain->cpupool->cpu_valid) )
+                 cpumask_test_cpu(new_cpu, v->domain->cpupool->cpu_valid) )
                 break;
             pick_called = 1;
         }
@@ -549,7 +549,7 @@ int cpu_disable_scheduler(unsigned int cpu)
         {
             vcpu_schedule_lock_irq(v);
 
-            cpumask_and(&online_affinity, v->cpu_affinity, &c->cpu_valid);
+            cpumask_and(&online_affinity, v->cpu_affinity, c->cpu_valid);
             if ( cpus_empty(online_affinity) &&
                  cpumask_test_cpu(cpu, v->cpu_affinity) )
             {
@@ -1446,7 +1446,7 @@ void schedule_dump(struct cpupool *c)
     cpumask_t        *cpus;
 
     sched = (c == NULL) ? &ops : c->sched;
-    cpus = (c == NULL) ? &cpupool_free_cpus : &c->cpu_valid;
+    cpus = (c == NULL) ? &cpupool_free_cpus : c->cpu_valid;
     printk("Scheduler: %s (%s)\n", sched->name, sched->opt_name);
     SCHED_OP(sched, dump_settings);
 
index 72a12935312181e25f216eb5c8f27f419e4032d4..d9519f0d6cf34aad8ca9a034ebb3f91e290d0431 100644 (file)
@@ -192,7 +192,7 @@ extern const struct scheduler sched_arinc653_def;
 struct cpupool
 {
     int              cpupool_id;
-    cpumask_t        cpu_valid;      /* all cpus assigned to pool */
+    cpumask_var_t    cpu_valid;      /* all cpus assigned to pool */
     struct cpupool   *next;
     unsigned int     n_dom;
     struct scheduler *sched;
index 4b9dc56cfe1c2d3afcfdfb3ada6af054d020ae21..3ba5495d11668adae0984326468949f4ba843251 100644 (file)
@@ -664,7 +664,7 @@ int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op);
 void schedule_dump(struct cpupool *c);
 extern void dump_runq(unsigned char key);
 
-#define num_cpupool_cpus(c) (cpus_weight((c)->cpu_valid))
+#define num_cpupool_cpus(c) cpumask_weight((c)->cpu_valid)
 
 #endif /* __SCHED_H__ */