lkml.org 
[lkml]   [2007]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/5] Add TASK_WAKEKILL
    Date
    Set TASK_WAKEKILL for TASK_STOPPED and TASK_TRACED, add TASK_KILLABLE and
    use TASK_WAKEKILL in signal_wake_up()

    Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
    ---
    include/linux/sched.h | 22 ++++++++++++++--------
    kernel/signal.c | 8 ++++----
    2 files changed, 18 insertions(+), 12 deletions(-)

    diff --git a/include/linux/sched.h b/include/linux/sched.h
    index fc28637..d1e32ec 100644
    --- a/include/linux/sched.h
    +++ b/include/linux/sched.h
    @@ -170,27 +170,33 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
    #define TASK_RUNNING 0
    #define TASK_INTERRUPTIBLE 1
    #define TASK_UNINTERRUPTIBLE 2
    -#define TASK_STOPPED 4
    -#define TASK_TRACED 8
    +#define __TASK_STOPPED 4
    +#define __TASK_TRACED 8
    /* in tsk->exit_state */
    #define EXIT_ZOMBIE 16
    #define EXIT_DEAD 32
    /* in tsk->state again */
    #define TASK_DEAD 64
    +#define TASK_WAKEKILL 128
    +
    +/* Convenience macros for the sake of set_task_state */
    +#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
    +#define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED)
    +#define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED)

    /* Convenience macros for the sake of wake_up */
    #define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE)
    -#define TASK_ALL (TASK_NORMAL | TASK_STOPPED | TASK_TRACED)
    +#define TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED)

    /* get_task_state() */
    #define TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \
    - TASK_UNINTERRUPTIBLE | TASK_STOPPED | \
    - TASK_TRACED)
    + TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \
    + __TASK_TRACED)

    -#define is_task_traced(task) ((task->state & TASK_TRACED) != 0)
    -#define is_task_stopped(task) ((task->state & TASK_STOPPED) != 0)
    +#define is_task_traced(task) ((task->state & __TASK_TRACED) != 0)
    +#define is_task_stopped(task) ((task->state & __TASK_STOPPED) != 0)
    #define is_task_stopped_or_traced(task) \
    - ((task->state & (TASK_STOPPED | TASK_TRACED)) != 0)
    + ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0)
    #define is_task_loadavg(task) ((task->state & TASK_UNINTERRUPTIBLE) != 0)

    #define __set_task_state(tsk, state_value) \
    diff --git a/kernel/signal.c b/kernel/signal.c
    index 1b08700..0a805b7 100644
    --- a/kernel/signal.c
    +++ b/kernel/signal.c
    @@ -456,15 +456,15 @@ void signal_wake_up(struct task_struct *t, int resume)
    set_tsk_thread_flag(t, TIF_SIGPENDING);

    /*
    - * For SIGKILL, we want to wake it up in the stopped/traced case.
    - * We don't check t->state here because there is a race with it
    + * For SIGKILL, we want to wake it up in the stopped/traced/killable
    + * case. We don't check t->state here because there is a race with it
    * executing another processor and just now entering stopped state.
    * By using wake_up_state, we ensure the process will wake up and
    * handle its death signal.
    */
    mask = TASK_INTERRUPTIBLE;
    if (resume)
    - mask |= TASK_STOPPED | TASK_TRACED;
    + mask |= TASK_WAKEKILL;
    if (!wake_up_state(t, mask))
    kick_process(t);
    }
    @@ -620,7 +620,7 @@ static void handle_stop_signal(int sig, struct task_struct *p)
    * Wake up the stopped thread _after_ setting
    * TIF_SIGPENDING
    */
    - state = TASK_STOPPED;
    + state = __TASK_STOPPED;
    if (sig_user_defined(t, SIGCONT) && !sigismember(&t->blocked, SIGCONT)) {
    set_tsk_thread_flag(t, TIF_SIGPENDING);
    state |= TASK_INTERRUPTIBLE;
    --
    1.4.4.2
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-10-24 14:29    [W:2.101 / U:0.632 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site