[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH RFC V2 12/45] xen/sched: add scheduler helpers hiding vcpu



Add the following helpers using a sched_item as input instead of a
vcpu:

- is_idle_item() similar to is_idle_vcpu()
- item_runnable() like vcpu_runnable()
- sched_set_res() to set the current processor of an item
- sched_item_cpu() to get the current processor of an item
- sched_{set|clear}_pause_flags[_atomic]() to modify pause_flags of the
  associated vcpu(s)
- sched_idle_item() to get the sched_item pointer of the idle vcpu of a
  specific physical cpu

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
 xen/common/sched_credit.c  |  3 +--
 xen/common/schedule.c      | 19 ++++++++--------
 xen/include/xen/sched-if.h | 56 ++++++++++++++++++++++++++++++++++++++++++----
 3 files changed, 62 insertions(+), 16 deletions(-)

diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c
index 9e7c849b94..8cfe54ec36 100644
--- a/xen/common/sched_credit.c
+++ b/xen/common/sched_credit.c
@@ -1673,8 +1673,7 @@ csched_runq_steal(int peer_cpu, int cpu, int pri, int 
balance_step)
             SCHED_STAT_CRANK(migrate_queued);
             WARN_ON(vc->is_urgent);
             runq_remove(speer);
-            vc->processor = cpu;
-            vc->sched_item->res = per_cpu(sched_res, cpu);
+            sched_set_res(vc->sched_item, per_cpu(sched_res, cpu));
             /*
              * speer will start executing directly on cpu, without having to
              * go through runq_insert(). So we must update the runnable count
diff --git a/xen/common/schedule.c b/xen/common/schedule.c
index f4850a57f6..d56dc567ac 100644
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -317,12 +317,11 @@ int sched_init_vcpu(struct vcpu *v, unsigned int 
processor)
     struct domain *d = v->domain;
     struct sched_item *item;
 
-    v->processor = processor;
-
     if ( (item = sched_alloc_item(v)) == NULL )
         return 1;
 
-    item->res = per_cpu(sched_res, processor);
+    sched_set_res(item, per_cpu(sched_res, processor));
+
     /* Initialise the per-vcpu timers. */
     init_timer(&v->periodic_timer, vcpu_periodic_timer_fn,
                v, v->processor);
@@ -436,8 +435,7 @@ int sched_move_domain(struct domain *d, struct cpupool *c)
 
         sched_set_affinity(v, &cpumask_all, &cpumask_all);
 
-        v->processor = new_p;
-       v->sched_item->res = per_cpu(sched_res, new_p);
+        sched_set_res(v->sched_item, per_cpu(sched_res, new_p));
         /*
          * With v->processor modified we must not
          * - make any further changes assuming we hold the scheduler lock,
@@ -775,8 +773,9 @@ void restore_vcpu_affinity(struct domain *d)
         spinlock_t *lock;
         unsigned int old_cpu = v->processor;
         struct sched_item *item = v->sched_item;
+        struct sched_resource *res;
 
-        ASSERT(!vcpu_runnable(v));
+        ASSERT(!item_runnable(item));
 
         /*
          * Re-assign the initial processor as after resume we have no
@@ -807,12 +806,12 @@ void restore_vcpu_affinity(struct domain *d)
             }
         }
 
-        v->processor = cpumask_any(cpumask_scratch_cpu(cpu));
-        item->res = per_cpu(sched_res, v->processor);
+        res = per_cpu(sched_res, cpumask_any(cpumask_scratch_cpu(cpu)));
+        sched_set_res(item, res);
 
         lock = item_schedule_lock_irq(item);
-        item->res = sched_pick_resource(vcpu_scheduler(v), item);
-        v->processor = item->res->processor;
+        res = sched_pick_resource(vcpu_scheduler(v), item);
+        sched_set_res(item, res);
         spin_unlock_irq(lock);
 
         if ( old_cpu != v->processor )
diff --git a/xen/include/xen/sched-if.h b/xen/include/xen/sched-if.h
index 5e024dceb0..51c3477580 100644
--- a/xen/include/xen/sched-if.h
+++ b/xen/include/xen/sched-if.h
@@ -49,6 +49,57 @@ DECLARE_PER_CPU(struct scheduler *, scheduler);
 DECLARE_PER_CPU(struct cpupool *, cpupool);
 DECLARE_PER_CPU(struct sched_resource *, sched_res);
 
+static inline bool is_idle_item(const struct sched_item *item)
+{
+    return is_idle_vcpu(item->vcpu);
+}
+
+static inline bool item_runnable(const struct sched_item *item)
+{
+    return vcpu_runnable(item->vcpu);
+}
+
+static inline void sched_set_res(struct sched_item *item,
+                                 struct sched_resource *res)
+{
+    item->vcpu->processor = res->processor;
+    item->res = res;
+}
+
+static inline unsigned int sched_item_cpu(struct sched_item *item)
+{
+    return item->res->processor;
+}
+
+static inline void sched_set_pause_flags(struct sched_item *item,
+                                         unsigned int bit)
+{
+    __set_bit(bit, &item->vcpu->pause_flags);
+}
+
+static inline void sched_clear_pause_flags(struct sched_item *item,
+                                           unsigned int bit)
+{
+    __clear_bit(bit, &item->vcpu->pause_flags);
+}
+
+static inline void sched_set_pause_flags_atomic(struct sched_item *item,
+                                                unsigned int bit)
+{
+    set_bit(bit, &item->vcpu->pause_flags);
+}
+
+static inline void sched_clear_pause_flags_atomic(struct sched_item *item,
+                                                  unsigned int bit)
+{
+    clear_bit(bit, &item->vcpu->pause_flags);
+}
+
+static inline struct sched_item *sched_idle_item(unsigned int cpu)
+{
+    return idle_vcpu[cpu]->sched_item;
+}
+
 /*
  * Scratch space, for avoiding having too many cpumask_t on the stack.
  * Within each scheduler, when using the scratch mask of one pCPU:
@@ -363,10 +414,7 @@ static inline void sched_migrate(const struct scheduler *s,
     if ( s->migrate )
         s->migrate(s, item, cpu);
     else
-    {
-        item->vcpu->processor = cpu;
-        item->res = per_cpu(sched_res, cpu);
-    }
+        sched_set_res(item, per_cpu(sched_res, cpu));
 }
 
 static inline struct sched_resource *sched_pick_resource(
-- 
2.16.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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