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);
        }
 
        /*

Reply via email to