lkml.org 
[lkml]   [2020]   [Mar]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH kcsan 19/32] kcsan: Expose core configuration parameters as module params
    Date
    From: Marco Elver <elver@google.com>

    This adds early_boot, udelay_{task,interrupt}, and skip_watch as module
    params. The latter parameters are useful to modify at runtime to tune
    KCSAN's performance on new systems. This will also permit auto-tuning
    these parameters to maximize overall system performance and KCSAN's race
    detection ability.

    None of the parameters are used in the fast-path and referring to them
    via static variables instead of CONFIG constants will not affect
    performance.

    Signed-off-by: Marco Elver <elver@google.com>
    Cc: Qian Cai <cai@lca.pw>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    ---
    kernel/kcsan/core.c | 24 +++++++++++++++++++-----
    1 file changed, 19 insertions(+), 5 deletions(-)

    diff --git a/kernel/kcsan/core.c b/kernel/kcsan/core.c
    index 87ef01e..498b1eb 100644
    --- a/kernel/kcsan/core.c
    +++ b/kernel/kcsan/core.c
    @@ -6,6 +6,7 @@
    #include <linux/export.h>
    #include <linux/init.h>
    #include <linux/kernel.h>
    +#include <linux/moduleparam.h>
    #include <linux/percpu.h>
    #include <linux/preempt.h>
    #include <linux/random.h>
    @@ -16,6 +17,20 @@
    #include "encoding.h"
    #include "kcsan.h"

    +static bool kcsan_early_enable = IS_ENABLED(CONFIG_KCSAN_EARLY_ENABLE);
    +static unsigned int kcsan_udelay_task = CONFIG_KCSAN_UDELAY_TASK;
    +static unsigned int kcsan_udelay_interrupt = CONFIG_KCSAN_UDELAY_INTERRUPT;
    +static long kcsan_skip_watch = CONFIG_KCSAN_SKIP_WATCH;
    +
    +#ifdef MODULE_PARAM_PREFIX
    +#undef MODULE_PARAM_PREFIX
    +#endif
    +#define MODULE_PARAM_PREFIX "kcsan."
    +module_param_named(early_enable, kcsan_early_enable, bool, 0);
    +module_param_named(udelay_task, kcsan_udelay_task, uint, 0644);
    +module_param_named(udelay_interrupt, kcsan_udelay_interrupt, uint, 0644);
    +module_param_named(skip_watch, kcsan_skip_watch, long, 0644);
    +
    bool kcsan_enabled;

    /* Per-CPU kcsan_ctx for interrupts */
    @@ -239,9 +254,9 @@ should_watch(const volatile void *ptr, size_t size, int type)

    static inline void reset_kcsan_skip(void)
    {
    - long skip_count = CONFIG_KCSAN_SKIP_WATCH -
    + long skip_count = kcsan_skip_watch -
    (IS_ENABLED(CONFIG_KCSAN_SKIP_WATCH_RANDOMIZE) ?
    - prandom_u32_max(CONFIG_KCSAN_SKIP_WATCH) :
    + prandom_u32_max(kcsan_skip_watch) :
    0);
    this_cpu_write(kcsan_skip, skip_count);
    }
    @@ -253,8 +268,7 @@ static __always_inline bool kcsan_is_enabled(void)

    static inline unsigned int get_delay(void)
    {
    - unsigned int delay = in_task() ? CONFIG_KCSAN_UDELAY_TASK :
    - CONFIG_KCSAN_UDELAY_INTERRUPT;
    + unsigned int delay = in_task() ? kcsan_udelay_task : kcsan_udelay_interrupt;
    return delay - (IS_ENABLED(CONFIG_KCSAN_DELAY_RANDOMIZE) ?
    prandom_u32_max(delay) :
    0);
    @@ -527,7 +541,7 @@ void __init kcsan_init(void)
    * We are in the init task, and no other tasks should be running;
    * WRITE_ONCE without memory barrier is sufficient.
    */
    - if (IS_ENABLED(CONFIG_KCSAN_EARLY_ENABLE))
    + if (kcsan_early_enable)
    WRITE_ONCE(kcsan_enabled, true);
    }

    --
    2.9.5
    \
     
     \ /
      Last update: 2020-03-09 20:06    [W:2.215 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site