printk: export console trace point for kcsan/kasan/kfence/kmsan

JIRA: https://issues.redhat.com/browse/RHEL-3987

commit 1f6ab566cb3be9e8292e34b89e8be83d75aa232e
Author: Pavankumar Kondeti <quic_pkondeti@quicinc.com>
Date:   Thu Apr 13 15:38:59 2023 +0530

    printk: export console trace point for kcsan/kasan/kfence/kmsan

    The console tracepoint is used by kcsan/kasan/kfence/kmsan test modules.
    Since this tracepoint is not exported, these modules iterate over all
    available tracepoints to find the console trace point.  Export the trace
    point so that it can be directly used.

    Link: https://lkml.kernel.org/r/20230413100859.1492323-1-quic_pkondeti@quicinc.com
    Signed-off-by: Pavankumar Kondeti <quic_pkondeti@quicinc.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Andrey Konovalov <andreyknvl@gmail.com>
    Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: John Ogness <john.ogness@linutronix.de>
    Cc: Marco Elver <elver@google.com>
    Cc: Petr Mladek <pmladek@suse.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
This commit is contained in:
Andrew Halaney 2024-04-18 11:28:45 -05:00 committed by Derek Barbosa
parent a0f6399152
commit 5ee0f2a59a
5 changed files with 14 additions and 74 deletions

View File

@ -1566,34 +1566,26 @@ static void test_exit(struct kunit *test)
}
__no_kcsan
static void register_tracepoints(struct tracepoint *tp, void *ignore)
static void register_tracepoints(void)
{
check_trace_callback_type_console(probe_console);
if (!strcmp(tp->name, "console"))
WARN_ON(tracepoint_probe_register(tp, probe_console, NULL));
register_trace_console(probe_console, NULL);
}
__no_kcsan
static void unregister_tracepoints(struct tracepoint *tp, void *ignore)
static void unregister_tracepoints(void)
{
if (!strcmp(tp->name, "console"))
tracepoint_probe_unregister(tp, probe_console, NULL);
unregister_trace_console(probe_console, NULL);
}
static int kcsan_suite_init(struct kunit_suite *suite)
{
/*
* Because we want to be able to build the test as a module, we need to
* iterate through all known tracepoints, since the static registration
* won't work here.
*/
for_each_kernel_tracepoint(register_tracepoints, NULL);
register_tracepoints();
return 0;
}
static void kcsan_suite_exit(struct kunit_suite *suite)
{
for_each_kernel_tracepoint(unregister_tracepoints, NULL);
unregister_tracepoints();
tracepoint_synchronize_unregister();
}

View File

@ -71,6 +71,8 @@ EXPORT_SYMBOL_GPL(console_printk);
atomic_t ignore_console_lock_warning __read_mostly = ATOMIC_INIT(0);
EXPORT_SYMBOL(ignore_console_lock_warning);
EXPORT_TRACEPOINT_SYMBOL_GPL(console);
/*
* Low level drivers may need that to know if they can schedule in
* their unblank() callback or not. So let's export it.

View File

@ -56,19 +56,6 @@ static void probe_console(void *ignore, const char *buf, size_t len)
WRITE_ONCE(test_status.async_fault, true);
}
static void register_tracepoints(struct tracepoint *tp, void *ignore)
{
check_trace_callback_type_console(probe_console);
if (!strcmp(tp->name, "console"))
WARN_ON(tracepoint_probe_register(tp, probe_console, NULL));
}
static void unregister_tracepoints(struct tracepoint *tp, void *ignore)
{
if (!strcmp(tp->name, "console"))
tracepoint_probe_unregister(tp, probe_console, NULL);
}
static int kasan_suite_init(struct kunit_suite *suite)
{
if (!kasan_enabled()) {
@ -86,12 +73,7 @@ static int kasan_suite_init(struct kunit_suite *suite)
*/
multishot = kasan_save_enable_multi_shot();
/*
* Because we want to be able to build the test as a module, we need to
* iterate through all known tracepoints, since the static registration
* won't work here.
*/
for_each_kernel_tracepoint(register_tracepoints, NULL);
register_trace_console(probe_console, NULL);
return 0;
}
@ -99,7 +81,7 @@ static void kasan_suite_exit(struct kunit_suite *suite)
{
kasan_kunit_test_suite_end();
kasan_restore_multi_shot(multishot);
for_each_kernel_tracepoint(unregister_tracepoints, NULL);
unregister_trace_console(probe_console, NULL);
tracepoint_synchronize_unregister();
}

View File

@ -825,33 +825,15 @@ static void test_exit(struct kunit *test)
test_cache_destroy();
}
static void register_tracepoints(struct tracepoint *tp, void *ignore)
{
check_trace_callback_type_console(probe_console);
if (!strcmp(tp->name, "console"))
WARN_ON(tracepoint_probe_register(tp, probe_console, NULL));
}
static void unregister_tracepoints(struct tracepoint *tp, void *ignore)
{
if (!strcmp(tp->name, "console"))
tracepoint_probe_unregister(tp, probe_console, NULL);
}
static int kfence_suite_init(struct kunit_suite *suite)
{
/*
* Because we want to be able to build the test as a module, we need to
* iterate through all known tracepoints, since the static registration
* won't work here.
*/
for_each_kernel_tracepoint(register_tracepoints, NULL);
register_trace_console(probe_console, NULL);
return 0;
}
static void kfence_suite_exit(struct kunit_suite *suite)
{
for_each_kernel_tracepoint(unregister_tracepoints, NULL);
unregister_trace_console(probe_console, NULL);
tracepoint_synchronize_unregister();
}

View File

@ -541,33 +541,15 @@ static void test_exit(struct kunit *test)
{
}
static void register_tracepoints(struct tracepoint *tp, void *ignore)
{
check_trace_callback_type_console(probe_console);
if (!strcmp(tp->name, "console"))
WARN_ON(tracepoint_probe_register(tp, probe_console, NULL));
}
static void unregister_tracepoints(struct tracepoint *tp, void *ignore)
{
if (!strcmp(tp->name, "console"))
tracepoint_probe_unregister(tp, probe_console, NULL);
}
static int kmsan_suite_init(struct kunit_suite *suite)
{
/*
* Because we want to be able to build the test as a module, we need to
* iterate through all known tracepoints, since the static registration
* won't work here.
*/
for_each_kernel_tracepoint(register_tracepoints, NULL);
register_trace_console(probe_console, NULL);
return 0;
}
static void kmsan_suite_exit(struct kunit_suite *suite)
{
for_each_kernel_tracepoint(unregister_tracepoints, NULL);
unregister_trace_console(probe_console, NULL);
tracepoint_synchronize_unregister();
}