[PATCH] md: make md threads interruptible again
authorNeilBrown <[email protected]>
Tue, 15 Nov 2005 08:09:12 +0000 (00:09 -0800)
committerLinus Torvalds <[email protected]>
Tue, 15 Nov 2005 16:59:19 +0000 (08:59 -0800)
Despite the fact that md threads don't need to be signalled, and won't
respond to signals anyway, we need to have an 'interruptible' wait, else
they stay in 'D' state and add to the load average.

(akpm: the signal_pending() test is unneeded - we'll fix that up in the next
round.  For now, leave it there because that's how the code used to be).

Signed-off-by: Neil Brown <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
drivers/md/md.c

index a9f032e341cbbcdacd64c13d32c132b612bfbd37..f3fed662f32ea603dbe76625369ea8ffaf24672f 100644 (file)
@@ -3437,10 +3437,19 @@ static int md_thread(void * arg)
        allow_signal(SIGKILL);
        while (!kthread_should_stop()) {
 
-               wait_event_timeout(thread->wqueue,
-                                  test_bit(THREAD_WAKEUP, &thread->flags)
-                                  || kthread_should_stop(),
-                                  thread->timeout);
+               /* We need to wait INTERRUPTIBLE so that
+                * we don't add to the load-average.
+                * That means we need to be sure no signals are
+                * pending
+                */
+               if (signal_pending(current))
+                       flush_signals(current);
+
+               wait_event_interruptible_timeout
+                       (thread->wqueue,
+                        test_bit(THREAD_WAKEUP, &thread->flags)
+                        || kthread_should_stop(),
+                        thread->timeout);
                try_to_freeze();
 
                clear_bit(THREAD_WAKEUP, &thread->flags);