[PATCH 58] introduce context_siginfo() helper

Oleg Nesterov oleg at redhat.com
Thu Sep 24 00:40:09 UTC 2009


Not sure you will like it, hence the separate patch.

ptrace_{get,set}siginfo() need ACCESS_ONCE() to fix the theoretical
problem, and they also need a comment to explain why it is safe to
dereference ->siginfo under ->siglock.

I think it would be more readable if we add the trivial helper, just
to avoid duplicating the comment.

---

 kernel/ptrace.c |   20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

--- PU/kernel/ptrace.c~58_CONTEXT_SIGINFO	2009-09-24 02:14:17.000000000 +0200
+++ PU/kernel/ptrace.c	2009-09-24 02:26:26.000000000 +0200
@@ -326,6 +326,17 @@ static u32 ptrace_report_exec(enum utrac
 	return UTRACE_STOP;
 }
 
+static inline siginfo_t *context_siginfo(struct ptrace_context *context)
+{
+	/*
+	 * Make sure the compiler reads ->siginfo only once, if we race
+	 * with SIGKILL ->siginfo can be cleared under us. But since we
+	 * hold ->siglock the memory it points to can't go away, see the
+	 * comment in ptrace_report_signal() below.
+	 */
+	return ACCESS_ONCE(context->siginfo);
+}
+
 static void ptrace_resume_signal(struct utrace_engine *engine,
 					struct task_struct *tracee, long data)
 {
@@ -334,13 +345,8 @@ static void ptrace_resume_signal(struct 
 
 	if (!lock_task_sighand(tracee, &flags))
 		return;
-	/*
-	 * Make sure the compiler reads ->siginfo only once, if we race
-	 * with SIGKILL ->siginfo can be cleared under us. But since we
-	 * hold ->siglock the memory it points to can't go away, see the
-	 * comment in ptrace_report_signal() below.
-	 */
-	info = ACCESS_ONCE(ptrace_context(engine)->siginfo);
+
+	info = context_siginfo(ptrace_context(engine));
 	WARN_ON(!info && !(tracee->signal->flags & SIGNAL_GROUP_EXIT));
 
 	if (likely(info) && info->si_signo != data) {




More information about the utrace-devel mailing list