Re: [2.5.60] dcachebench sleeps

Linus Torvalds
2003-02-11T20:08:16Z

In article <20030211181807.A1261@in.ibm.com>,
Maneesh Soni <maneesh@in.ibm.com> wrote:
>
>With 2.5.60, dcachebench no more completes. All threads
>go to sleep as below. Last time I tested was with an intermediated BK diff
>(diff-bk-030204-2.5.59) and it was working fine.

This should be fixed in the current BK tree. And for the non-BK-users,
here's the relevant changeset..

Linus

---
# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.997.1.20 -> 1.997.1.21
# kernel/signal.c 1.67 -> 1.68
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/02/11 torvalds@home.transmeta.com 1.997.1.21
# If we set TIF_SIGPENDING for SIGCONT, we have to wake up any sleeping
# tasks (even if we don't otherwise need to wake anything up), since
# otherwise later signals would see that signals are already pending and
# wouldn't cause wakeups.
# --------------------------------------------
#
diff -Nru a/kernel/signal.c b/kernel/signal.c
--- a/kernel/signal.c Tue Feb 11 12:13:43 2003
+++ b/kernel/signal.c Tue Feb 11 12:13:43 2003
@@ -619,6 +619,7 @@
rm_from_queue(SIG_KERNEL_STOP_MASK, &p->signal->shared_pending);
t = p;
do {
+ unsigned int state;
rm_from_queue(SIG_KERNEL_STOP_MASK, &t->pending);

/*
@@ -635,9 +636,12 @@
* Wake up the stopped thread _after_ setting
* TIF_SIGPENDING
*/
- if (!sigismember(&t->blocked, SIGCONT))
+ state = TASK_STOPPED;
+ if (!sigismember(&t->blocked, SIGCONT)) {
set_tsk_thread_flag(t, TIF_SIGPENDING);
- wake_up_state(t, TASK_STOPPED);
+ state |= TASK_INTERRUPTIBLE;
+ }
+ wake_up_state(t, state);

t = next_thread(t);
} while (t != p);