lguest: move process freezing before pending signals check
Michal Hocko [Tue, 27 Sep 2011 06:56:03 +0000 (08:56 +0200)]
run_guest tries to freeze the current process after it has handled
pending interrupts and before it calls lguest_arch_run_guest.
This doesn't work nicely if the task has been killed while being frozen
and when we want to handle that signal as soon as possible.
Let's move try_to_freeze before we check for pending signal so that we
can get out of the loop as soon as possible.

Signed-off-by: Michal Hocko <mhocko@suse.cz>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

drivers/lguest/core.c

index 5c13e93..b5fdcb7 100644 (file)
@@ -232,6 +232,13 @@ int run_guest(struct lg_cpu *cpu, unsigned long __user *user)
                        }
                }
 
+               /*
+                * All long-lived kernel loops need to check with this horrible
+                * thing called the freezer.  If the Host is trying to suspend,
+                * it stops us.
+                */
+               try_to_freeze();
+
                /* Check for signals */
                if (signal_pending(current))
                        return -ERESTARTSYS;
@@ -246,13 +253,6 @@ int run_guest(struct lg_cpu *cpu, unsigned long __user *user)
                        try_deliver_interrupt(cpu, irq, more);
 
                /*
-                * All long-lived kernel loops need to check with this horrible
-                * thing called the freezer.  If the Host is trying to suspend,
-                * it stops us.
-                */
-               try_to_freeze();
-
-               /*
                 * Just make absolutely sure the Guest is still alive.  One of
                 * those hypercalls could have been fatal, for example.
                 */