Commit 19acd03d authored by Marco Elver's avatar Marco Elver Committed by Paul E. McKenney

kcsan: Add __kcsan_{enable,disable}_current() variants

The __kcsan_{enable,disable}_current() variants only call into KCSAN if
KCSAN is enabled for the current compilation unit. Note: This is
typically not what we want, as we usually want to ensure that even calls
into other functions still have KCSAN disabled.

These variants may safely be used in header files that are shared
between regular kernel code and code that does not link the KCSAN
runtime.
Signed-off-by: default avatarMarco Elver <elver@google.com>
Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent 5099a722
...@@ -49,6 +49,7 @@ void kcsan_disable_current(void); ...@@ -49,6 +49,7 @@ void kcsan_disable_current(void);
* Supports nesting. * Supports nesting.
*/ */
void kcsan_enable_current(void); void kcsan_enable_current(void);
void kcsan_enable_current_nowarn(void); /* Safe in uaccess regions. */
/** /**
* kcsan_nestable_atomic_begin - begin nestable atomic region * kcsan_nestable_atomic_begin - begin nestable atomic region
...@@ -149,6 +150,7 @@ static inline void __kcsan_check_access(const volatile void *ptr, size_t size, ...@@ -149,6 +150,7 @@ static inline void __kcsan_check_access(const volatile void *ptr, size_t size,
static inline void kcsan_disable_current(void) { } static inline void kcsan_disable_current(void) { }
static inline void kcsan_enable_current(void) { } static inline void kcsan_enable_current(void) { }
static inline void kcsan_enable_current_nowarn(void) { }
static inline void kcsan_nestable_atomic_begin(void) { } static inline void kcsan_nestable_atomic_begin(void) { }
static inline void kcsan_nestable_atomic_end(void) { } static inline void kcsan_nestable_atomic_end(void) { }
static inline void kcsan_flat_atomic_begin(void) { } static inline void kcsan_flat_atomic_begin(void) { }
...@@ -165,15 +167,24 @@ static inline void kcsan_end_scoped_access(struct kcsan_scoped_access *sa) { } ...@@ -165,15 +167,24 @@ static inline void kcsan_end_scoped_access(struct kcsan_scoped_access *sa) { }
#endif /* CONFIG_KCSAN */ #endif /* CONFIG_KCSAN */
#ifdef __SANITIZE_THREAD__
/* /*
* kcsan_*: Only calls into the runtime when the particular compilation unit has * Only calls into the runtime when the particular compilation unit has KCSAN
* KCSAN instrumentation enabled. May be used in header files. * instrumentation enabled. May be used in header files.
*/ */
#ifdef __SANITIZE_THREAD__
#define kcsan_check_access __kcsan_check_access #define kcsan_check_access __kcsan_check_access
/*
* Only use these to disable KCSAN for accesses in the current compilation unit;
* calls into libraries may still perform KCSAN checks.
*/
#define __kcsan_disable_current kcsan_disable_current
#define __kcsan_enable_current kcsan_enable_current_nowarn
#else #else
static inline void kcsan_check_access(const volatile void *ptr, size_t size, static inline void kcsan_check_access(const volatile void *ptr, size_t size,
int type) { } int type) { }
static inline void __kcsan_enable_current(void) { }
static inline void __kcsan_disable_current(void) { }
#endif #endif
/** /**
......
...@@ -625,6 +625,13 @@ void kcsan_enable_current(void) ...@@ -625,6 +625,13 @@ void kcsan_enable_current(void)
} }
EXPORT_SYMBOL(kcsan_enable_current); EXPORT_SYMBOL(kcsan_enable_current);
void kcsan_enable_current_nowarn(void)
{
if (get_ctx()->disable_count-- == 0)
kcsan_disable_current();
}
EXPORT_SYMBOL(kcsan_enable_current_nowarn);
void kcsan_nestable_atomic_begin(void) void kcsan_nestable_atomic_begin(void)
{ {
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment