]> xenbits.xensource.com Git - xen.git/commitdiff
cpupools: Fix cpupool sysctl locking.
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 6 May 2010 10:14:17 +0000 (11:14 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 6 May 2010 10:14:17 +0000 (11:14 +0100)
Signed-off-by: Juergen Gross <juergen.gross@ts.fujitsu.com>
xen/common/cpupool.c

index 6cb99773ba84faf6cd7b65baf2aaa13fc4879209..c1af188bc3a374fef3801a8d23e1ff504feaf84e 100644 (file)
@@ -37,6 +37,7 @@ static cpumask_t cpupool_locked_cpus = CPU_MASK_NONE;
  *               as it was obtained!
  */
 static DEFINE_SPINLOCK(cpupool_lock);
+static DEFINE_SPINLOCK(cpupool_ctl_lock);
 
 DEFINE_PER_CPU(struct cpupool *, cpupool);
 
@@ -401,6 +402,8 @@ int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op)
     int ret;
     struct cpupool *c;
 
+    spin_lock(&cpupool_ctl_lock);
+
     switch ( op->op )
     {
 
@@ -426,9 +429,7 @@ int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op)
 
     case XEN_SYSCTL_CPUPOOL_OP_DESTROY:
     {
-        spin_lock(&cpupool_lock);
         c = cpupool_find_by_id(op->cpupool_id, 1);
-        spin_unlock(&cpupool_lock);
         ret = -ENOENT;
         if ( c == NULL )
             break;
@@ -438,9 +439,7 @@ int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op)
 
     case XEN_SYSCTL_CPUPOOL_OP_INFO:
     {
-        spin_lock(&cpupool_lock);
         c = cpupool_find_by_id(op->cpupool_id, 0);
-        spin_unlock(&cpupool_lock);
         ret = -ENOENT;
         if ( c == NULL )
             break;
@@ -484,9 +483,7 @@ addcpu_out:
     {
         unsigned cpu;
 
-        spin_lock(&cpupool_lock);
         c = cpupool_find_by_id(op->cpupool_id, 0);
-        spin_unlock(&cpupool_lock);
         ret = -ENOENT;
         if ( c == NULL )
             break;
@@ -560,6 +557,8 @@ addcpu_out:
 
     }
 
+    spin_unlock(&cpupool_ctl_lock);
+
     return ret;
 }