Monitor initialisation also called during KUnit tests may register some tracepoints, this can lead to issues since we don't expect real monitor events running during KUnit tests.
Prevent tracepoint registration if an RV KUnit test is running. Reviewed-by: Nam Cao <[email protected]> Signed-off-by: Gabriele Monaco <[email protected]> --- include/rv/instrumentation.h | 5 +++++ include/rv/kunit.h | 2 ++ kernel/trace/rv/rv.c | 11 +++++++++++ 3 files changed, 18 insertions(+) diff --git a/include/rv/instrumentation.h b/include/rv/instrumentation.h index d4e7a02ede..761f8f147d 100644 --- a/include/rv/instrumentation.h +++ b/include/rv/instrumentation.h @@ -9,12 +9,15 @@ */ #include <linux/ftrace.h> +#include <rv/kunit.h> /* * rv_attach_trace_probe - check and attach a handler function to a tracepoint */ #define rv_attach_trace_probe(monitor, tp, rv_handler) \ do { \ + if (rv_mon_test_is_running()) \ + break; \ check_trace_callback_type_##tp(rv_handler); \ WARN_ONCE(register_trace_##tp(rv_handler, NULL), \ "fail attaching " #monitor " " #tp "handler"); \ @@ -25,5 +28,7 @@ */ #define rv_detach_trace_probe(monitor, tp, rv_handler) \ do { \ + if (rv_mon_test_is_running()) \ + break; \ unregister_trace_##tp(rv_handler, NULL); \ } while (0) diff --git a/include/rv/kunit.h b/include/rv/kunit.h index 5e8c604cf7..0c4c4bc933 100644 --- a/include/rv/kunit.h +++ b/include/rv/kunit.h @@ -19,6 +19,7 @@ int rv_set_testing(struct kunit_suite *suite); void rv_clear_testing(struct kunit_suite *suite); +bool rv_mon_test_is_running(void); struct task_struct *rv_get_current(void); struct rv_kunit_ctx { @@ -59,6 +60,7 @@ void teardown_test(void *arg); #else /* !CONFIG_RV_MONITORS_KUNIT_TEST */ #define rv_get_current() current +#define rv_mon_test_is_running() false #endif /* CONFIG_RV_MONITORS_KUNIT_TEST */ #endif /* _RV_KUNIT_H */ diff --git a/kernel/trace/rv/rv.c b/kernel/trace/rv/rv.c index 61d4f13960..86ef5dee7f 100644 --- a/kernel/trace/rv/rv.c +++ b/kernel/trace/rv/rv.c @@ -864,6 +864,14 @@ int __init rv_init_interface(void) #include <rv/kunit.h> #include <kunit/visibility.h> +static bool rv_mon_test_running; + +bool rv_mon_test_is_running(void) +{ + return rv_mon_test_running; +} +EXPORT_SYMBOL_GPL(rv_mon_test_is_running); + /* * rv_set_testing - ensure mutual exclusion between KUnit tests and real monitors * @@ -886,6 +894,8 @@ int rv_set_testing(struct kunit_suite *suite) } } + rv_mon_test_running = true; + return 0; } EXPORT_SYMBOL_IF_KUNIT(rv_set_testing); @@ -895,6 +905,7 @@ EXPORT_SYMBOL_IF_KUNIT(rv_set_testing); */ void rv_clear_testing(struct kunit_suite *suite) { + rv_mon_test_running = false; mutex_unlock(&rv_interface_lock); } EXPORT_SYMBOL_IF_KUNIT(rv_clear_testing); -- 2.54.0
