lkml.org 
[lkml]   [2021]   [Feb]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: sched/core] preempt/dynamic: Support dynamic preempt with preempt= boot option
    The following commit has been merged into the sched/core branch of tip:

    Commit-ID: 4f8a0041162ab74ba5f89ee58f8aad59c4c85d22
    Gitweb: https://git.kernel.org/tip/4f8a0041162ab74ba5f89ee58f8aad59c4c85d22
    Author: Peter Zijlstra (Intel) <peterz@infradead.org>
    AuthorDate: Mon, 18 Jan 2021 15:12:23 +01:00
    Committer: Peter Zijlstra <peterz@infradead.org>
    CommitterDate: Fri, 05 Feb 2021 17:19:58 +01:00

    preempt/dynamic: Support dynamic preempt with preempt= boot option

    Support the preempt= boot option and patch the static call sites
    accordingly.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210118141223.123667-9-frederic@kernel.org
    ---
    kernel/sched/core.c | 67 +++++++++++++++++++++++++++++++++++++++++++-
    1 file changed, 66 insertions(+), 1 deletion(-)

    diff --git a/kernel/sched/core.c b/kernel/sched/core.c
    index cd0c46f..0562992 100644
    --- a/kernel/sched/core.c
    +++ b/kernel/sched/core.c
    @@ -12,6 +12,7 @@

    #include "sched.h"

    +#include <linux/entry-common.h>
    #include <linux/nospec.h>

    #include <linux/kcov.h>
    @@ -5314,9 +5315,73 @@ DEFINE_STATIC_CALL(preempt_schedule_notrace, __preempt_schedule_notrace_func);
    EXPORT_STATIC_CALL(preempt_schedule_notrace);
    #endif

    -
    #endif /* CONFIG_PREEMPTION */

    +#ifdef CONFIG_PREEMPT_DYNAMIC
    +
    +/*
    + * SC:cond_resched
    + * SC:might_resched
    + * SC:preempt_schedule
    + * SC:preempt_schedule_notrace
    + * SC:irqentry_exit_cond_resched
    + *
    + *
    + * NONE:
    + * cond_resched <- __cond_resched
    + * might_resched <- RET0
    + * preempt_schedule <- NOP
    + * preempt_schedule_notrace <- NOP
    + * irqentry_exit_cond_resched <- NOP
    + *
    + * VOLUNTARY:
    + * cond_resched <- __cond_resched
    + * might_resched <- __cond_resched
    + * preempt_schedule <- NOP
    + * preempt_schedule_notrace <- NOP
    + * irqentry_exit_cond_resched <- NOP
    + *
    + * FULL:
    + * cond_resched <- RET0
    + * might_resched <- RET0
    + * preempt_schedule <- preempt_schedule
    + * preempt_schedule_notrace <- preempt_schedule_notrace
    + * irqentry_exit_cond_resched <- irqentry_exit_cond_resched
    + */
    +static int __init setup_preempt_mode(char *str)
    +{
    + if (!strcmp(str, "none")) {
    + static_call_update(cond_resched, __cond_resched);
    + static_call_update(might_resched, (typeof(&__cond_resched)) __static_call_return0);
    + static_call_update(preempt_schedule, (typeof(&preempt_schedule)) NULL);
    + static_call_update(preempt_schedule_notrace, (typeof(&preempt_schedule_notrace)) NULL);
    + static_call_update(irqentry_exit_cond_resched, (typeof(&irqentry_exit_cond_resched)) NULL);
    + pr_info("Dynamic Preempt: %s\n", str);
    + } else if (!strcmp(str, "voluntary")) {
    + static_call_update(cond_resched, __cond_resched);
    + static_call_update(might_resched, __cond_resched);
    + static_call_update(preempt_schedule, (typeof(&preempt_schedule)) NULL);
    + static_call_update(preempt_schedule_notrace, (typeof(&preempt_schedule_notrace)) NULL);
    + static_call_update(irqentry_exit_cond_resched, (typeof(&irqentry_exit_cond_resched)) NULL);
    + pr_info("Dynamic Preempt: %s\n", str);
    + } else if (!strcmp(str, "full")) {
    + static_call_update(cond_resched, (typeof(&__cond_resched)) __static_call_return0);
    + static_call_update(might_resched, (typeof(&__cond_resched)) __static_call_return0);
    + static_call_update(preempt_schedule, __preempt_schedule_func);
    + static_call_update(preempt_schedule_notrace, __preempt_schedule_notrace_func);
    + static_call_update(irqentry_exit_cond_resched, irqentry_exit_cond_resched);
    + pr_info("Dynamic Preempt: %s\n", str);
    + } else {
    + pr_warn("Dynamic Preempt: Unsupported preempt mode %s, default to full\n", str);
    + return 1;
    + }
    + return 0;
    +}
    +__setup("preempt=", setup_preempt_mode);
    +
    +#endif /* CONFIG_PREEMPT_DYNAMIC */
    +
    +
    /*
    * This is the entry point to schedule() from kernel preemption
    * off of irq context.
    \
     
     \ /
      Last update: 2021-02-08 13:27    [W:4.071 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site