[PATCH 81] attach: try to re-use the self-detaching engine

Oleg Nesterov oleg at redhat.com
Sat Oct 10 16:17:05 UTC 2009


Change ptrace_attach_task() to re-use the self-detaching engine first,
then do utrace_attach_task(UTRACE_ATTACH_CREATE).

Unlike the previous version, ptrace_attach_task() just calls
ptrace_lookup_engine() and changes context->resume. The only caller
which can find the self-attaching engine is ptrace_atttach(), we
can rely on ->cred_guard_mutex.

Todo: re-check this all and cleanup the mess in ptrace_attach_task().

But first I'd like to know if you agree with this approach.	

---

 kernel/ptrace.c |   17 +++++++++++++++++
 1 file changed, 17 insertions(+)

--- PU/kernel/ptrace.c~81_REUSE_DETACHING_ENGINE	2009-10-10 17:10:07.000000000 +0200
+++ PU/kernel/ptrace.c	2009-10-10 17:13:37.000000000 +0200
@@ -442,6 +442,22 @@ static int ptrace_attach_task(struct tas
 	struct utrace_engine *engine;
 	int err;
 
+	engine = ptrace_lookup_engine(tracee);
+	if (!IS_ERR(engine)) {
+		context = ptrace_context(engine);
+		if (context->resume == UTRACE_DETACH) {
+			/* we rely on ->cred_guard_mutex */
+			context->resume = UTRACE_RESUME;
+			/*
+			 * Make sure we don't race with ptrace_report_signal()
+			 */
+			utrace_barrier(tracee, engine);
+			if (engine->ops == &ptrace_utrace_ops)
+				goto finish;
+		}
+		utrace_engine_put(engine);
+	}
+
 	context = kzalloc(sizeof(*context), GFP_KERNEL);
 	if (unlikely(!context))
 		return -ENOMEM;
@@ -459,6 +475,7 @@ static int ptrace_attach_task(struct tas
 		kfree(context);
 		return err;
 	}
+finish:
 	/*
 	 * It can fail only if the tracee is dead, the caller
 	 * must notice this before setting PT_PTRACED.




More information about the utrace-devel mailing list