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

[Xen-devel] [PATCH RFC 18/49] 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      | 24 +++++++++-------------
 xen/include/xen/sched-if.h | 51 ++++++++++++++++++++++++++++++++++++++++++++++
 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 be85fb8000..99660cee67 100644
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -321,12 +321,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);
@@ -440,8 +439,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,
@@ -632,10 +630,7 @@ static void vcpu_move_locked(struct vcpu *v, unsigned int 
new_cpu)
     if ( vcpu_scheduler(v)->migrate )
         SCHED_OP(vcpu_scheduler(v), migrate, v->sched_item, new_cpu);
     else
-    {
-        v->processor = new_cpu;
-        v->sched_item->res = per_cpu(sched_res, new_cpu);
-    }
+        sched_set_res(v->sched_item, per_cpu(sched_res, new_cpu));
 }
 
 /*
@@ -785,8 +780,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
@@ -817,12 +813,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_OP(vcpu_scheduler(v), pick_resource, item);
-        v->processor = item->res->processor;
+        res = SCHED_OP(vcpu_scheduler(v), pick_resource, 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 577015b868..b5cbbbbcb1 100644
--- a/xen/include/xen/sched-if.h
+++ b/xen/include/xen/sched-if.h
@@ -79,6 +79,57 @@ struct sched_item {
     for ( (v) = (i)->vcpu; (v) != NULL && (v)->sched_item == (i);         \
           (v) = (v)->next_in_list )
 
+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:
-- 
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®.