[PATCH 4/6] utrace_report_jctl/utrace_get_signal: do not play with ->stopped
Oleg Nesterov
oleg at redhat.com
Fri Jul 31 01:06:54 UTC 2009
Now that we always clear ->stopped in utrace_finish_jctl(), we can cleanup
utrace_report_jctl() and utrace_get_signal(), they do not need to worry
about ->stopped == T any longer.
Note that the change in utrace_report_jctl() removes start_report()'s work
too. Contrary to what the comment says, REPORT() does call start_report().
>From now the rules for ->stopped are very simple:
- it is set by utrace_stop() or utrace_do_stop()
- it is clered by utrace_wakeup(), or if the tracee is woken by
signal we clear it in finish_utrace_stop() or utrace_finish_jctl()
Signed-off-by: Oleg Nesterov <oleg at redhat.com>
----
kernel/utrace.c | 36 +-----------------------------------
1 file changed, 1 insertion(+), 35 deletions(-)
--- __UTRACE/kernel/utrace.c~4_CLEANUP 2009-07-31 02:25:32.000000000 +0200
+++ __UTRACE/kernel/utrace.c 2009-07-31 02:29:32.000000000 +0200
@@ -1611,29 +1611,6 @@ void utrace_report_jctl(int notify, int
spin_unlock_irq(&task->sighand->siglock);
- /*
- * We get here with CLD_STOPPED when we've just entered
- * TASK_STOPPED, or with CLD_CONTINUED when we've just come
- * out but not yet been through utrace_get_signal() again.
- *
- * While in TASK_STOPPED, we can be considered safely
- * stopped by utrace_do_stop() and detached asynchronously.
- * If we woke up and checked task->utrace_flags before that
- * was finished, we might be here with utrace already
- * removed or in the middle of being removed.
- *
- * If we are indeed attached, then make sure we are no
- * longer considered stopped while we run callbacks.
- */
- spin_lock(&utrace->lock);
- utrace->stopped = 0;
- /*
- * Do start_report()'s work too since we already have the lock anyway.
- */
- utrace->report = 0;
- splice_attaching(utrace);
- spin_unlock(&utrace->lock);
-
REPORT(task, utrace, &report, UTRACE_EVENT(JCTL),
report_jctl, what, notify);
@@ -1925,8 +1902,6 @@ int utrace_get_signal(struct task_struct
* interrupt path, so clear the flags asking for those.
*/
utrace->interrupt = utrace->report = utrace->signal_handler = 0;
- utrace->stopped = 0;
-
/*
* Make sure signal_pending() only returns true
* if there are real signals pending.
@@ -1954,22 +1929,13 @@ int utrace_get_signal(struct task_struct
event = 0;
ka = NULL;
memset(return_ka, 0, sizeof *return_ka);
- } else if ((task->utrace_flags & UTRACE_EVENT_SIGNAL_ALL) == 0 &&
- !utrace->stopped) {
+ } else if ((task->utrace_flags & UTRACE_EVENT_SIGNAL_ALL) == 0) {
/*
* If no engine is interested in intercepting signals,
* let the caller just dequeue them normally.
*/
return 0;
} else {
- if (unlikely(utrace->stopped)) {
- spin_unlock_irq(&task->sighand->siglock);
- spin_lock(&utrace->lock);
- utrace->stopped = 0;
- spin_unlock(&utrace->lock);
- spin_lock_irq(&task->sighand->siglock);
- }
-
/*
* Steal the next signal so we can let tracing engines
* examine it. From the signal number and sigaction,
More information about the utrace-devel
mailing list