Subjective of course, but imho makes the code more readable. No functional changes (I hope), PTRACE_SYSEMU/PTRACE_SYSEMU_SINGLESTEP logic still waits for implementation.
Rewrite the code to use switch(request) instead of multiple "if" checks. This also consolidates some ifdef's and kills is_xxx(request). Also, factor our utrace_set_events() calls. static int ptrace_resume(struct utrace_engine *engine, struct task_struct *tracee, long request, long data) { enum utrace_resume_action action; enum utrace_syscall_action syscall; unsigned long events; if (!valid_signal(data)) return -EIO; syscall = UTRACE_SYSCALL_RUN; events = engine->flags & ~UTRACE_EVENT_SYSCALL; action = UTRACE_RESUME; switch (request) { #ifdef PTRACE_SINGLEBLOCK case PTRACE_SINGLEBLOCK: if (unlikely(!arch_has_block_step())) return -EIO; action = UTRACE_BLOCKSTEP; break; #endif #ifdef PTRACE_SINGLESTEP case PTRACE_SINGLESTEP: if (unlikely(!arch_has_single_step())) return -EIO; action = UTRACE_SINGLESTEP; break; #endif #ifdef PTRACE_SYSEMU case PTRACE_SYSEMU_SINGLESTEP: if (unlikely(!arch_has_single_step())) return -EIO; action = UTRACE_SINGLESTEP; case PTRACE_SYSEMU: syscall = UTRACE_SYSCALL_ABORT; /* fallthrough */ #endif case PTRACE_SYSCALL: events |= UTRACE_EVENT_SYSCALL; break; } if (events != engine->flags && utrace_set_events(tracee, engine, events)) return -ESRCH; do_ptrace_resume(engine, tracee, action, request, data); return 0; } --- kernel/ptrace.c | 78 +++++++++++++++++++++++++------------------------------- 1 file changed, 35 insertions(+), 43 deletions(-) --- PU/kernel/ptrace.c~102_RESUME_CLEANUP_REQUEST_PROCESSING 2009-10-18 18:34:55.000000000 +0200 +++ PU/kernel/ptrace.c 2009-10-18 18:35:30.000000000 +0200 @@ -882,24 +882,6 @@ static int ptrace_rw_siginfo(struct task } } -#ifdef PTRACE_SINGLESTEP -#define is_singlestep(request) ((request) == PTRACE_SINGLESTEP) -#else -#define is_singlestep(request) 0 -#endif - -#ifdef PTRACE_SINGLEBLOCK -#define is_singleblock(request) ((request) == PTRACE_SINGLEBLOCK) -#else -#define is_singleblock(request) 0 -#endif - -#ifdef PTRACE_SYSEMU -#define is_sysemu_singlestep(request) ((request) == PTRACE_SYSEMU_SINGLESTEP) -#else -#define is_sysemu_singlestep(request) 0 -#endif - static void do_ptrace_notify_stop(struct ptrace_context *context, struct task_struct *tracee) { @@ -1022,47 +1004,57 @@ static void do_ptrace_resume(struct utra } static int ptrace_resume(struct utrace_engine *engine, - struct task_struct *child, long request, long data) + struct task_struct *tracee, long request, long data) { enum utrace_resume_action action; enum utrace_syscall_action syscall; - int ret = 0; + unsigned long events; if (!valid_signal(data)) return -EIO; syscall = UTRACE_SYSCALL_RUN; -#ifdef PTRACE_SYSEMU - if (request == PTRACE_SYSEMU || request == PTRACE_SYSEMU_SINGLESTEP) - syscall = UTRACE_SYSCALL_ABORT; -#endif - - if (syscall != UTRACE_SYSCALL_RUN || request == PTRACE_SYSCALL) { - if (!(engine->flags & UTRACE_EVENT_SYSCALL) && - utrace_set_events(child, engine, - engine->flags | UTRACE_EVENT_SYSCALL)) - ret = -ESRCH; - } else if (engine->flags & UTRACE_EVENT(SYSCALL_ENTRY)) { - if (utrace_set_events(child, engine, - engine->flags & ~UTRACE_EVENT_SYSCALL)) - ret = -ESRCH; - } + events = engine->flags & ~UTRACE_EVENT_SYSCALL; + action = UTRACE_RESUME; - action = UTRACE_RESUME; - if (is_singleblock(request)) { + switch (request) { +#ifdef PTRACE_SINGLEBLOCK + case PTRACE_SINGLEBLOCK: if (unlikely(!arch_has_block_step())) - ret = -EIO; + return -EIO; action = UTRACE_BLOCKSTEP; - } else if (is_singlestep(request) || is_sysemu_singlestep(request)) { + break; +#endif + +#ifdef PTRACE_SINGLESTEP + case PTRACE_SINGLESTEP: if (unlikely(!arch_has_single_step())) - ret = -EIO; + return -EIO; action = UTRACE_SINGLESTEP; + break; +#endif + +#ifdef PTRACE_SYSEMU + case PTRACE_SYSEMU_SINGLESTEP: + if (unlikely(!arch_has_single_step())) + return -EIO; + action = UTRACE_SINGLESTEP; + case PTRACE_SYSEMU: + syscall = UTRACE_SYSCALL_ABORT; + /* fallthrough */ +#endif + + case PTRACE_SYSCALL: + events |= UTRACE_EVENT_SYSCALL; + break; } - if (!ret) - do_ptrace_resume(engine, child, action, request, data); + if (events != engine->flags && + utrace_set_events(tracee, engine, events)) + return -ESRCH; - return ret; + do_ptrace_resume(engine, tracee, action, request, data); + return 0; } int ptrace_request(struct task_struct *child, long request,