Dear Roland, dear utrace developers, I have update also the second patch. Please note that now this patch must be applied after the first one. This patch implements a consistent nesting model for utrace machines. (There is a full description in the messages I sent on Feb. 14 and Mar. 6)
renzo --- diff -Naur linux-2.6.29-rc7-git5-utrace-p1/kernel/utrace.c linux-2.6.29-rc7-git5-utrace-p2/kernel/utrace.c --- linux-2.6.29-rc7-git5-utrace-p1/kernel/utrace.c 2009-03-12 11:05:50.000000000 +0100 +++ linux-2.6.29-rc7-git5-utrace-p2/kernel/utrace.c 2009-03-12 13:37:27.000000000 +0100 @@ -1405,6 +1405,7 @@ static bool finish_callback(struct utrace *utrace, struct utrace_report *report, struct utrace_engine *engine, + struct task_struct *task, u32 ret) { enum utrace_resume_action action = utrace_resume_action(ret); @@ -1426,6 +1427,7 @@ spin_lock(&utrace->lock); mark_engine_wants_stop(engine); spin_unlock(&utrace->lock); + utrace_stop(task, utrace); } } else if (engine_wants_stop(engine)) { spin_lock(&utrace->lock); @@ -1492,7 +1494,7 @@ ops = engine->ops; if (want & UTRACE_EVENT(QUIESCE)) { - if (finish_callback(utrace, report, engine, + if (finish_callback(utrace, report, engine, task, (*ops->report_quiesce)(report->action, engine, task, event))) @@ -1526,24 +1528,24 @@ * @callback is the name of the member in the ops vector, and remaining * args are the extras it takes after the standard three args. */ -#define REPORT(task, utrace, report, event, callback, ...) \ +#define REPORT(reverse, task, utrace, report, event, callback, ...) \ do { \ start_report(utrace); \ - REPORT_CALLBACKS(task, utrace, report, event, callback, \ + REPORT_CALLBACKS(reverse, task, utrace, report, event, callback, \ (report)->action, engine, current, \ ## __VA_ARGS__); \ finish_report(report, task, utrace); \ } while (0) -#define REPORT_CALLBACKS(task, utrace, report, event, callback, ...) \ +#define REPORT_CALLBACKS(reverse, task, utrace, report, event, callback, ...) \ do { \ struct utrace_engine *engine; \ const struct utrace_engine_ops *ops; \ - list_for_each_entry(engine, &utrace->attached, entry) { \ + list_for_each_entry ## reverse(engine, &utrace->attached, entry) { \ ops = start_callback(utrace, report, engine, task, \ event); \ if (!ops) \ continue; \ - finish_callback(utrace, report, engine, \ + finish_callback(utrace, report, engine, task, \ (*ops->callback)(__VA_ARGS__)); \ } \ } while (0) @@ -1558,7 +1560,7 @@ struct utrace *utrace = task_utrace_struct(task); INIT_REPORT(report); - REPORT(task, utrace, &report, UTRACE_EVENT(EXEC), + REPORT(, task, utrace, &report, UTRACE_EVENT(EXEC), report_exec, fmt, bprm, regs); } @@ -1573,7 +1575,7 @@ INIT_REPORT(report); start_report(utrace); - REPORT_CALLBACKS(task, utrace, &report, UTRACE_EVENT(SYSCALL_ENTRY), + REPORT_CALLBACKS(_reverse, task, utrace, &report, UTRACE_EVENT(SYSCALL_ENTRY), report_syscall_entry, report.result | report.action, engine, current, regs); finish_report(&report, task, utrace); @@ -1615,7 +1617,7 @@ struct utrace *utrace = task_utrace_struct(task); INIT_REPORT(report); - REPORT(task, utrace, &report, UTRACE_EVENT(SYSCALL_EXIT), + REPORT(, task, utrace, &report, UTRACE_EVENT(SYSCALL_EXIT), report_syscall_exit, regs); } @@ -1640,7 +1642,7 @@ start_report(utrace); utrace->cloning = child; - REPORT_CALLBACKS(task, utrace, &report, + REPORT_CALLBACKS(, task, utrace, &report, UTRACE_EVENT(CLONE), report_clone, report.action, engine, task, clone_flags, child); @@ -1708,7 +1710,7 @@ utrace->report = 0; spin_unlock(&utrace->lock); - REPORT(task, utrace, &report, UTRACE_EVENT(JCTL), + REPORT(, task, utrace, &report, UTRACE_EVENT(JCTL), report_jctl, was_stopped ? CLD_STOPPED : CLD_CONTINUED, what); if (was_stopped && !task_is_stopped(task)) { @@ -1745,7 +1747,7 @@ INIT_REPORT(report); long orig_code = *exit_code; - REPORT(task, utrace, &report, UTRACE_EVENT(EXIT), + REPORT(, task, utrace, &report, UTRACE_EVENT(EXIT), report_exit, orig_code, exit_code); if (report.action == UTRACE_STOP) @@ -1784,7 +1786,7 @@ utrace->interrupt = 0; spin_unlock(&utrace->lock); - REPORT_CALLBACKS(task, utrace, &report, UTRACE_EVENT(DEATH), + REPORT_CALLBACKS(, task, utrace, &report, UTRACE_EVENT(DEATH), report_death, engine, task, group_dead, signal); spin_lock(&utrace->lock); @@ -2129,7 +2131,7 @@ break; } - finish_callback(utrace, &report, engine, ret); + finish_callback(utrace, &report, engine, task, ret); } /*