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

[Xen-devel] [PATCH RFC 3/4] xen/x86: split context_switch()



Split up context_switch() to prepare switching of the used stack.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
 xen/arch/x86/domain.c | 67 ++++++++++++++++++++++++++++-----------------------
 1 file changed, 37 insertions(+), 30 deletions(-)

diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index da1bf1a97b..c0cb2cae64 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1673,38 +1673,10 @@ static void __context_switch(void)
     per_cpu(curr_vcpu, cpu) = n;
 }
 
-
-void context_switch(struct vcpu *prev, struct vcpu *next)
+static void context_switch_irqoff(struct vcpu *prev, struct vcpu *next,
+                                  unsigned int cpu)
 {
-    unsigned int cpu = smp_processor_id();
     const struct domain *prevd = prev->domain, *nextd = next->domain;
-    cpumask_t dirty_mask;
-
-    ASSERT(local_irq_is_enabled());
-
-    cpumask_copy(&dirty_mask, next->vcpu_dirty_cpumask);
-    /* Allow at most one CPU at a time to be dirty. */
-    ASSERT(cpumask_weight(&dirty_mask) <= 1);
-    if ( unlikely(!cpumask_test_cpu(cpu, &dirty_mask) &&
-                  !cpumask_empty(&dirty_mask)) )
-    {
-        /* Other cpus call __sync_local_execstate from flush ipi handler. */
-        flush_tlb_mask(&dirty_mask);
-    }
-
-    if ( prev != next )
-    {
-        _update_runstate_area(prev);
-        vpmu_switch_from(prev);
-        np2m_schedule(NP2M_SCHEDLE_OUT);
-    }
-
-    if ( is_hvm_domain(prevd) && !list_empty(&prev->arch.hvm_vcpu.tm_list) )
-        pt_save_timer(prev);
-
-    local_irq_disable();
-
-    set_current(next);
 
     if ( (per_cpu(curr_vcpu, cpu) == next) ||
          (is_idle_domain(nextd) && cpu_online(cpu)) )
@@ -1760,6 +1732,41 @@ void context_switch(struct vcpu *prev, struct vcpu *next)
     BUG();
 }
 
+void context_switch(struct vcpu *prev, struct vcpu *next)
+{
+    unsigned int cpu = smp_processor_id();
+    const struct domain *prevd = prev->domain;
+    cpumask_t dirty_mask;
+
+    ASSERT(local_irq_is_enabled());
+
+    cpumask_copy(&dirty_mask, next->vcpu_dirty_cpumask);
+    /* Allow at most one CPU at a time to be dirty. */
+    ASSERT(cpumask_weight(&dirty_mask) <= 1);
+    if ( unlikely(!cpumask_test_cpu(cpu, &dirty_mask) &&
+                  !cpumask_empty(&dirty_mask)) )
+    {
+        /* Other cpus call __sync_local_execstate from flush ipi handler. */
+        flush_tlb_mask(&dirty_mask);
+    }
+
+    if ( prev != next )
+    {
+        _update_runstate_area(prev);
+        vpmu_switch_from(prev);
+        np2m_schedule(NP2M_SCHEDLE_OUT);
+    }
+
+    if ( is_hvm_domain(prevd) && !list_empty(&prev->arch.hvm_vcpu.tm_list) )
+        pt_save_timer(prev);
+
+    local_irq_disable();
+
+    set_current(next);
+
+    context_switch_irqoff(prev, next, cpu);
+}
+
 void continue_running(struct vcpu *same)
 {
     /* See the comment above. */
-- 
2.13.6


_______________________________________________
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®.