xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Fix locking bug in vcpu_migrate
@ 2011-04-22 10:00 John Weekes
  2011-04-22 10:30 ` Keir Fraser
  0 siblings, 1 reply; 6+ messages in thread
From: John Weekes @ 2011-04-22 10:00 UTC (permalink / raw)
  To: xen-devel@lists.xensource.com; +Cc: George Dunlap

[-- Attachment #1: Type: text/plain, Size: 2623 bytes --]

c/s 22957:c5c4688d5654 (unstable) changed the locking scheme for 
vcpu_migrate by adjusting the order so that the lock with the lowest 
lock address is obtained first. However, the code does not release them 
in the correct reverse order; it removes new_lock first if it differs 
from old_lock, but that is not the last lock obtained when old_lock > 
new_lock.

As a result of this bug, under credit2, domUs would sometimes take a 
long time to start, and there was an occasional panic.

This fix should be applied to both xen-unstable and xen-4.1-testing. I 
have tested and seen the problem with both, and also tested to confirm 
an improvement for both.

Signed-off-by: John Weekes <lists.xen@nuclearfallout.net>

diff -r eb4505f8dd97 xen/common/schedule.c
--- a/xen/common/schedule.c     Wed Apr 20 12:02:51 2011 +0100
+++ b/xen/common/schedule.c     Fri Apr 22 03:46:00 2011 -0500
@@ -455,9 +455,20 @@
              pick_called = 0;
          }

-        if ( old_lock != new_lock )
+        if ( old_lock == new_lock )
+        {
+            spin_unlock_irqrestore(old_lock, flags);
+        }
+        else if ( old_lock < new_lock )
+        {
              spin_unlock(new_lock);
-        spin_unlock_irqrestore(old_lock, flags);
+            spin_unlock_irqrestore(old_lock, flags);
+        }
+        else
+        {
+            spin_unlock(old_lock);
+            spin_unlock_irqrestore(new_lock, flags);
+        }
      }

      /*
@@ -468,9 +479,20 @@
      if ( v->is_running ||
           !test_and_clear_bit(_VPF_migrating, &v->pause_flags) )
      {
-        if ( old_lock != new_lock )
+        if ( old_lock == new_lock )
+        {
+            spin_unlock_irqrestore(old_lock, flags);
+        }
+        else if ( old_lock < new_lock )
+        {
              spin_unlock(new_lock);
-        spin_unlock_irqrestore(old_lock, flags);
+            spin_unlock_irqrestore(old_lock, flags);
+        }
+        else
+        {
+            spin_unlock(old_lock);
+            spin_unlock_irqrestore(new_lock, flags);
+        }
          return;
      }

@@ -491,9 +513,20 @@
       */
      v->processor = new_cpu;

-    if ( old_lock != new_lock )
+    if ( old_lock == new_lock )
+    {
+        spin_unlock_irqrestore(old_lock, flags);
+    }
+    else if ( old_lock < new_lock )
+    {
          spin_unlock(new_lock);
-    spin_unlock_irqrestore(old_lock, flags);
+        spin_unlock_irqrestore(old_lock, flags);
+    }
+    else
+    {
+        spin_unlock_irqrestore(old_lock, flags);
+        spin_unlock(new_lock);
+    }

      if ( old_cpu != new_cpu )
          evtchn_move_pirqs(v);


[-- Attachment #2: schedule.dff --]
[-- Type: text/plain, Size: 1889 bytes --]

diff -r eb4505f8dd97 xen/common/schedule.c
--- a/xen/common/schedule.c     Wed Apr 20 12:02:51 2011 +0100
+++ b/xen/common/schedule.c     Fri Apr 22 03:46:00 2011 -0500
@@ -455,9 +455,20 @@
             pick_called = 0;
         }

-        if ( old_lock != new_lock )
+        if ( old_lock == new_lock )
+        {
+            spin_unlock_irqrestore(old_lock, flags);
+        }
+        else if ( old_lock < new_lock )
+        {
             spin_unlock(new_lock);
-        spin_unlock_irqrestore(old_lock, flags);
+            spin_unlock_irqrestore(old_lock, flags);
+        }
+        else
+        {
+            spin_unlock(old_lock);
+            spin_unlock_irqrestore(new_lock, flags);
+        }
     }

     /*
@@ -468,9 +479,20 @@
     if ( v->is_running ||
          !test_and_clear_bit(_VPF_migrating, &v->pause_flags) )
     {
-        if ( old_lock != new_lock )
+        if ( old_lock == new_lock )
+        {
+            spin_unlock_irqrestore(old_lock, flags);
+        }
+        else if ( old_lock < new_lock )
+        {
             spin_unlock(new_lock);
-        spin_unlock_irqrestore(old_lock, flags);
+            spin_unlock_irqrestore(old_lock, flags);
+        }
+        else
+        {
+            spin_unlock(old_lock);
+            spin_unlock_irqrestore(new_lock, flags);
+        }
         return;
     }

@@ -491,9 +513,20 @@
      */
     v->processor = new_cpu;

-    if ( old_lock != new_lock )
+    if ( old_lock == new_lock )
+    {
+        spin_unlock_irqrestore(old_lock, flags);
+    }
+    else if ( old_lock < new_lock )
+    {
         spin_unlock(new_lock);
-    spin_unlock_irqrestore(old_lock, flags);
+        spin_unlock_irqrestore(old_lock, flags);
+    }
+    else
+    {
+        spin_unlock_irqrestore(old_lock, flags);
+        spin_unlock(new_lock);
+    }

     if ( old_cpu != new_cpu )
         evtchn_move_pirqs(v);

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-04-23  7:01 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-22 10:00 [PATCH] Fix locking bug in vcpu_migrate John Weekes
2011-04-22 10:30 ` Keir Fraser
2011-04-22 18:23   ` John Weekes
2011-04-22 18:43     ` Keir Fraser
2011-04-22 22:33       ` John Weekes
2011-04-23  7:01         ` Keir Fraser

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).