Merge to Fedora kernel-2.6.18-1.2239_FC5 patched with stable patch-2.6.18.2-vs2.0...
[linux-2.6.git] / arch / ppc64 / kernel / HvLpEvent.c
index 93eea79..f8f1963 100644 (file)
@@ -34,10 +34,18 @@ int HvLpEvent_registerHandler( HvLpEvent_Type eventType, LpEventHandler handler
 int HvLpEvent_unregisterHandler( HvLpEvent_Type eventType )
 {
        int rc = 1;
+
+       might_sleep();
+
        if ( eventType < HvLpEvent_Type_NumTypes ) {
                if ( !lpEventHandlerPaths[eventType] ) {
                        lpEventHandler[eventType] = NULL;
                        rc = 0;
+
+                       /* We now sleep until all other CPUs have scheduled. This ensures that
+                        * the deletion is seen by all other CPUs, and that the deleted handler
+                        * isn't still running on another CPU when we return. */
+                       synchronize_rcu();
                }
        }
        return rc;