lkml.org 
[lkml]   [2021]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[patch V5 05/72] sched: Reorganize current::__state helpers
    Date
    In order to avoid more duplicate implementations for the debug and
    non-debug variants of the state change macros, split the debug portion out
    and make that conditional on CONFIG_DEBUG_ATOMIC_SLEEP.

    Suggested-by: Waiman Long <longman@redhat.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    V3: New patch.
    ---
    include/linux/sched.h | 48 +++++++++++++++++++++++-------------------------
    1 file changed, 23 insertions(+), 25 deletions(-)

    --- a/include/linux/sched.h
    +++ b/include/linux/sched.h
    @@ -123,8 +123,6 @@ struct task_group;

    #define task_is_stopped_or_traced(task) ((READ_ONCE(task->__state) & (__TASK_STOPPED | __TASK_TRACED)) != 0)

    -#ifdef CONFIG_DEBUG_ATOMIC_SLEEP
    -
    /*
    * Special states are those that do not use the normal wait-loop pattern. See
    * the comment with set_special_state().
    @@ -132,30 +130,24 @@ struct task_group;
    #define is_special_task_state(state) \
    ((state) & (__TASK_STOPPED | __TASK_TRACED | TASK_PARKED | TASK_DEAD))

    -#define __set_current_state(state_value) \
    - do { \
    - WARN_ON_ONCE(is_special_task_state(state_value));\
    - current->task_state_change = _THIS_IP_; \
    - WRITE_ONCE(current->__state, (state_value)); \
    - } while (0)
    -
    -#define set_current_state(state_value) \
    - do { \
    - WARN_ON_ONCE(is_special_task_state(state_value));\
    - current->task_state_change = _THIS_IP_; \
    - smp_store_mb(current->__state, (state_value)); \
    +#ifdef CONFIG_DEBUG_ATOMIC_SLEEP
    +# define debug_normal_state_change(state_value) \
    + do { \
    + WARN_ON_ONCE(is_special_task_state(state_value)); \
    + current->task_state_change = _THIS_IP_; \
    } while (0)

    -#define set_special_state(state_value) \
    +# define debug_special_state_change(state_value) \
    do { \
    - unsigned long flags; /* may shadow */ \
    WARN_ON_ONCE(!is_special_task_state(state_value)); \
    - raw_spin_lock_irqsave(&current->pi_lock, flags); \
    current->task_state_change = _THIS_IP_; \
    - WRITE_ONCE(current->__state, (state_value)); \
    - raw_spin_unlock_irqrestore(&current->pi_lock, flags); \
    } while (0)
    +
    #else
    +# define debug_normal_state_change(cond) do { } while (0)
    +# define debug_special_state_change(cond) do { } while (0)
    +#endif
    +
    /*
    * set_current_state() includes a barrier so that the write of current->state
    * is correctly serialised wrt the caller's subsequent test of whether to
    @@ -194,27 +186,33 @@ struct task_group;
    * Also see the comments of try_to_wake_up().
    */
    #define __set_current_state(state_value) \
    - WRITE_ONCE(current->__state, (state_value))
    + do { \
    + debug_normal_state_change((state_value)); \
    + WRITE_ONCE(current->__state, (state_value)); \
    + } while (0)

    #define set_current_state(state_value) \
    - smp_store_mb(current->__state, (state_value))
    + do { \
    + debug_normal_state_change((state_value)); \
    + smp_store_mb(current->__state, (state_value)); \
    + } while (0)

    /*
    * set_special_state() should be used for those states when the blocking task
    * can not use the regular condition based wait-loop. In that case we must
    - * serialize against wakeups such that any possible in-flight TASK_RUNNING stores
    - * will not collide with our state change.
    + * serialize against wakeups such that any possible in-flight TASK_RUNNING
    + * stores will not collide with our state change.
    */
    #define set_special_state(state_value) \
    do { \
    unsigned long flags; /* may shadow */ \
    + \
    raw_spin_lock_irqsave(&current->pi_lock, flags); \
    + debug_special_state_change((state_value)); \
    WRITE_ONCE(current->__state, (state_value)); \
    raw_spin_unlock_irqrestore(&current->pi_lock, flags); \
    } while (0)

    -#endif
    -
    #define get_current_state() READ_ONCE(current->__state)

    /* Task command name length: */
    \
     
     \ /
      Last update: 2021-08-15 23:29    [W:4.394 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site