lkml.org 
[lkml]   [2009]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:sched/urgent] sched: Assert task state bits at build time
    Commit-ID:  e1781538cf5c870ab696e9b8f0a5c498d3900f2f
    Gitweb: http://git.kernel.org/tip/e1781538cf5c870ab696e9b8f0a5c498d3900f2f
    Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
    AuthorDate: Thu, 17 Dec 2009 13:16:30 +0100
    Committer: Ingo Molnar <mingo@elte.hu>
    CommitDate: Thu, 17 Dec 2009 13:22:45 +0100

    sched: Assert task state bits at build time

    Since everybody is lazy and prone to forgetting things, make the
    compiler help us a bit.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    LKML-Reference: <20091217121830.060186433@chello.nl>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    ---
    fs/proc/array.c | 18 ++++++++++--------
    include/linux/sched.h | 4 ++++
    2 files changed, 14 insertions(+), 8 deletions(-)

    diff --git a/fs/proc/array.c b/fs/proc/array.c
    index 96361e8..f560325 100644
    --- a/fs/proc/array.c
    +++ b/fs/proc/array.c
    @@ -134,14 +134,14 @@ static inline void task_name(struct seq_file *m, struct task_struct *p)
    * simple bit tests.
    */
    static const char *task_state_array[] = {
    - "R (running)", /* 0 */
    - "S (sleeping)", /* 1 */
    - "D (disk sleep)", /* 2 */
    - "T (stopped)", /* 4 */
    - "t (tracing stop)", /* 8 */
    - "Z (zombie)", /* 16 */
    - "X (dead)", /* 32 */
    - "x (dead)", /* 64 */
    + "R (running)", /* 0 */
    + "S (sleeping)", /* 1 */
    + "D (disk sleep)", /* 2 */
    + "T (stopped)", /* 4 */
    + "t (tracing stop)", /* 8 */
    + "Z (zombie)", /* 16 */
    + "X (dead)", /* 32 */
    + "x (dead)", /* 64 */
    "K (wakekill)", /* 128 */
    "W (waking)", /* 256 */
    };
    @@ -151,6 +151,8 @@ static inline const char *get_task_state(struct task_struct *tsk)
    unsigned int state = (tsk->state & TASK_REPORT) | tsk->exit_state;
    const char **p = &task_state_array[0];

    + BUILD_BUG_ON(1 + ilog2(TASK_STATE_MAX) != ARRAY_SIZE(task_state_array));
    +
    while (state) {
    p++;
    state >>= 1;
    diff --git a/include/linux/sched.h b/include/linux/sched.h
    index 94858df..3754387 100644
    --- a/include/linux/sched.h
    +++ b/include/linux/sched.h
    @@ -192,9 +192,13 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
    #define TASK_DEAD 64
    #define TASK_WAKEKILL 128
    #define TASK_WAKING 256
    +#define TASK_STATE_MAX 512

    #define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"

    +extern char ___assert_task_state[1 - 2*!!(
    + sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)];
    +
    /* Convenience macros for the sake of set_task_state */
    #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
    #define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED)

    \
     
     \ /
      Last update: 2009-12-17 13:35    [W:0.028 / U:0.056 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site