WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] Inroduce new vcpu_lock_affinity() and vcp

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Inroduce new vcpu_lock_affinity() and vcpu_unlock_affinity() helper
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 26 Jan 2008 03:30:35 -0800
Delivery-date: Sat, 26 Jan 2008 03:31:25 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1201346748 0
# Node ID 7327e1c2a42ced6b1b473e0e738b12e141fb0584
# Parent  4fd33f77be6b116538c8cc286c26434267a4135f
Inroduce new vcpu_lock_affinity() and vcpu_unlock_affinity() helper
functions for use by x86's continue_hypercall_on_cpu().

This has two advantages:
 1. We can lock out ordinary vcpu_set_affinity() commands from dom0.
 2. We avoid the (in this case bogus) check for dom0_vcpus_pin.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/domain.c   |    9 ++++-----
 xen/common/schedule.c   |   47 +++++++++++++++++++++++++++++++++++++++++------
 xen/include/xen/sched.h |    4 ++++
 3 files changed, 49 insertions(+), 11 deletions(-)

diff -r 4fd33f77be6b -r 7327e1c2a42c xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Sat Jan 26 10:39:58 2008 +0000
+++ b/xen/arch/x86/domain.c     Sat Jan 26 11:25:48 2008 +0000
@@ -1416,16 +1416,16 @@ static void continue_hypercall_on_cpu_he
 {
     struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct migrate_info *info = v->arch.continue_info;
+    cpumask_t mask = info->saved_affinity;
 
     regs->eax = info->func(info->data);
 
     v->arch.schedule_tail = info->saved_schedule_tail;
-    v->cpu_affinity = info->saved_affinity;
     v->arch.continue_info = NULL;
 
     xfree(info);
 
-    vcpu_set_affinity(v, &v->cpu_affinity);
+    vcpu_unlock_affinity(v, &mask);
     schedule_tail(v);
 }
 
@@ -1433,7 +1433,6 @@ int continue_hypercall_on_cpu(int cpu, l
 {
     struct vcpu *v = current;
     struct migrate_info *info;
-    cpumask_t mask = cpumask_of_cpu(cpu);
     int rc;
 
     if ( cpu == smp_processor_id() )
@@ -1446,12 +1445,12 @@ int continue_hypercall_on_cpu(int cpu, l
     info->func = func;
     info->data = data;
     info->saved_schedule_tail = v->arch.schedule_tail;
-    info->saved_affinity = v->cpu_affinity;
+    info->saved_affinity = cpumask_of_cpu(cpu);
 
     v->arch.schedule_tail = continue_hypercall_on_cpu_helper;
     v->arch.continue_info = info;
 
-    rc = vcpu_set_affinity(v, &mask);
+    rc = vcpu_lock_affinity(v, &info->saved_affinity);
     if ( rc )
     {
         v->arch.schedule_tail = info->saved_schedule_tail;
diff -r 4fd33f77be6b -r 7327e1c2a42c xen/common/schedule.c
--- a/xen/common/schedule.c     Sat Jan 26 10:39:58 2008 +0000
+++ b/xen/common/schedule.c     Sat Jan 26 11:25:48 2008 +0000
@@ -262,12 +262,11 @@ void vcpu_force_reschedule(struct vcpu *
     }
 }
 
-int vcpu_set_affinity(struct vcpu *v, cpumask_t *affinity)
-{
-    cpumask_t online_affinity;
-
-    if ( (v->domain->domain_id == 0) && opt_dom0_vcpus_pin )
-        return -EINVAL;
+static int __vcpu_set_affinity(
+    struct vcpu *v, cpumask_t *affinity,
+    bool_t old_lock_status, bool_t new_lock_status)
+{
+    cpumask_t online_affinity, old_affinity;
 
     cpus_and(online_affinity, *affinity, cpu_online_map);
     if ( cpus_empty(online_affinity) )
@@ -275,7 +274,18 @@ int vcpu_set_affinity(struct vcpu *v, cp
 
     vcpu_schedule_lock_irq(v);
 
+    if ( v->affinity_locked != old_lock_status )
+    {
+        BUG_ON(!v->affinity_locked);
+        vcpu_schedule_unlock_irq(v);
+        return -EBUSY;
+    }
+
+    v->affinity_locked = new_lock_status;
+
+    old_affinity = v->cpu_affinity;
     v->cpu_affinity = *affinity;
+    *affinity = old_affinity;
     if ( !cpu_isset(v->processor, v->cpu_affinity) )
         set_bit(_VPF_migrating, &v->pause_flags);
 
@@ -288,6 +298,31 @@ int vcpu_set_affinity(struct vcpu *v, cp
     }
 
     return 0;
+}
+
+int vcpu_set_affinity(struct vcpu *v, cpumask_t *affinity)
+{
+    if ( (v->domain->domain_id == 0) && opt_dom0_vcpus_pin )
+        return -EINVAL;
+    return __vcpu_set_affinity(v, affinity, 0, 0);
+}
+
+int vcpu_lock_affinity(struct vcpu *v, cpumask_t *affinity)
+{
+    return __vcpu_set_affinity(v, affinity, 0, 1);
+}
+
+void vcpu_unlock_affinity(struct vcpu *v, cpumask_t *affinity)
+{
+    cpumask_t online_affinity;
+
+    /* Do not fail if no CPU in old affinity mask is online. */
+    cpus_and(online_affinity, *affinity, cpu_online_map);
+    if ( cpus_empty(online_affinity) )
+        *affinity = cpu_online_map;
+
+    if ( __vcpu_set_affinity(v, affinity, 1, 0) != 0 )
+        BUG();
 }
 
 /* Block the currently-executing domain until a pertinent event occurs. */
diff -r 4fd33f77be6b -r 7327e1c2a42c xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Sat Jan 26 10:39:58 2008 +0000
+++ b/xen/include/xen/sched.h   Sat Jan 26 11:25:48 2008 +0000
@@ -122,6 +122,8 @@ struct vcpu
     bool_t           defer_shutdown;
     /* VCPU is paused following shutdown request (d->is_shutting_down)? */
     bool_t           paused_for_shutdown;
+    /* VCPU affinity is temporarily locked from controller changes? */
+    bool_t           affinity_locked;
 
     unsigned long    pause_flags;
     atomic_t         pause_count;
@@ -485,6 +487,8 @@ void cpu_init(void);
 
 void vcpu_force_reschedule(struct vcpu *v);
 int vcpu_set_affinity(struct vcpu *v, cpumask_t *affinity);
+int vcpu_lock_affinity(struct vcpu *v, cpumask_t *affinity);
+void vcpu_unlock_affinity(struct vcpu *v, cpumask_t *affinity);
 
 void vcpu_runstate_get(struct vcpu *v, struct vcpu_runstate_info *runstate);
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] Inroduce new vcpu_lock_affinity() and vcpu_unlock_affinity() helper, Xen patchbot-unstable <=