lkml.org 
[lkml]   [2013]   [Jul]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 10/18] context_tracking: Optimize context switch off case with static keys
    Date
    No need for syscall slowpath if no CPU is full dynticks,
    rather nop this in this case.

    Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Li Zhong <zhong@linux.vnet.ibm.com>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Kevin Hilman <khilman@linaro.org>
    ---
    include/linux/context_tracking.h | 11 +++++++++--
    kernel/context_tracking.c | 6 +++---
    2 files changed, 12 insertions(+), 5 deletions(-)

    diff --git a/include/linux/context_tracking.h b/include/linux/context_tracking.h
    index 8eba58c..77f7306 100644
    --- a/include/linux/context_tracking.h
    +++ b/include/linux/context_tracking.h
    @@ -40,6 +40,8 @@ extern void context_tracking_cpu_set(int cpu);

    extern void context_tracking_user_enter(void);
    extern void context_tracking_user_exit(void);
    +extern void __context_tracking_task_switch(struct task_struct *prev,
    + struct task_struct *next);

    static inline void user_enter(void)
    {
    @@ -74,8 +76,12 @@ static inline void exception_exit(enum ctx_state prev_ctx)
    }
    }

    -extern void context_tracking_task_switch(struct task_struct *prev,
    - struct task_struct *next);
    +static inline void context_tracking_task_switch(struct task_struct *prev,
    + struct task_struct *next)
    +{
    + if (static_key_false(&context_tracking_enabled))
    + __context_tracking_task_switch(prev, next);
    +}
    #else
    static inline bool context_tracking_in_user(void) { return false; }
    static inline void user_enter(void) { }
    @@ -104,6 +110,7 @@ static inline void guest_exit(void)
    else
    current->flags &= ~PF_VCPU;
    }
    +
    #else
    static inline void guest_enter(void)
    {
    diff --git a/kernel/context_tracking.c b/kernel/context_tracking.c
    index 7b0a22d..5323a5c 100644
    --- a/kernel/context_tracking.c
    +++ b/kernel/context_tracking.c
    @@ -164,7 +164,7 @@ void context_tracking_user_exit(void)
    }

    /**
    - * context_tracking_task_switch - context switch the syscall callbacks
    + * __context_tracking_task_switch - context switch the syscall callbacks
    * @prev: the task that is being switched out
    * @next: the task that is being switched in
    *
    @@ -176,8 +176,8 @@ void context_tracking_user_exit(void)
    * migrate to some CPU that doesn't do the context tracking. As such the TIF
    * flag may not be desired there.
    */
    -void context_tracking_task_switch(struct task_struct *prev,
    - struct task_struct *next)
    +void __context_tracking_task_switch(struct task_struct *prev,
    + struct task_struct *next)
    {
    clear_tsk_thread_flag(prev, TIF_NOHZ);
    set_tsk_thread_flag(next, TIF_NOHZ);
    --
    1.7.5.4


    \
     
     \ /
      Last update: 2013-07-18 09:01    [W:2.722 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site