• Marco Elver's avatar
    kcsan: Rewrite kcsan_prandom_u32_max() without prandom_u32_state() · 71a076f4
    Marco Elver authored
    Rewrite kcsan_prandom_u32_max() to not depend on code that might be
    instrumented, removing any dependency on lib/random32.c. The rewrite
    implements a simple linear congruential generator, that is sufficient
    for our purposes (for udelay() and skip_watch counter randomness).
    
    The initial motivation for this was to allow enabling KCSAN for
    kernel/sched (remove KCSAN_SANITIZE := n from kernel/sched/Makefile),
    with CONFIG_DEBUG_PREEMPT=y. Without this change, we could observe
    recursion:
    
    	check_access() [via instrumentation]
    	  kcsan_setup_watchpoint()
    	    reset_kcsan_skip()
    	      kcsan_prandom_u32_max()
    	        get_cpu_var()
    		  preempt_disable()
    		    preempt_count_add() [in kernel/sched/core.c]
    		      check_access() [via instrumentation]
    
    Note, while this currently does not affect an unmodified kernel, it'd be
    good to keep a KCSAN kernel working when KCSAN_SANITIZE := n is removed
    from kernel/sched/Makefile to permit testing scheduler code with KCSAN
    if desired.
    
    Fixes: cd290ec2 ("kcsan: Use tracing-safe version of prandom")
    Signed-off-by: default avatarMarco Elver <elver@google.com>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    71a076f4
core.c 37 KB