KCSAN uses get_cycles() for two purposes:
1) Seeding the random state with get_cycles() is a historical leftover.
2) The microbenchmark uses get_cycles(), which provides an unit less
counter value and is not guaranteed to be functional on all
systems/platforms.
Use random_get_entropy() for seeding the random state and ktime_get() which
is universaly functional and provides at least a comprehensible unit.
This is part of a larger effort to remove get_cycles() usage from
non-architecture code.
Signed-off-by: Thomas Gleixner <[email protected]>
Cc: Marco Elver <[email protected]>
Cc: Dmitry Vyukov <[email protected]>
Cc: [email protected]
---
kernel/kcsan/core.c | 2 +-
kernel/kcsan/debugfs.c | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
--- a/kernel/kcsan/core.c
+++ b/kernel/kcsan/core.c
@@ -798,7 +798,7 @@ void __init kcsan_init(void)
BUG_ON(!in_task());
for_each_possible_cpu(cpu)
- per_cpu(kcsan_rand_state, cpu) = (u32)get_cycles();
+ per_cpu(kcsan_rand_state, cpu) = (u32)random_get_entropy();
/*
* We are in the init task, and no other tasks should be running;
--- a/kernel/kcsan/debugfs.c
+++ b/kernel/kcsan/debugfs.c
@@ -58,7 +58,7 @@ static noinline void microbenchmark(unsi
{
const struct kcsan_ctx ctx_save = current->kcsan_ctx;
const bool was_enabled = READ_ONCE(kcsan_enabled);
- u64 cycles;
+ ktime_t nsecs;
/* We may have been called from an atomic region; reset context. */
memset(¤t->kcsan_ctx, 0, sizeof(current->kcsan_ctx));
@@ -70,16 +70,16 @@ static noinline void microbenchmark(unsi
pr_info("%s begin | iters: %lu\n", __func__, iters);
- cycles = get_cycles();
+ nsecs = ktime_get();
while (iters--) {
unsigned long addr = iters & ((PAGE_SIZE << 8) - 1);
int type = !(iters & 0x7f) ? KCSAN_ACCESS_ATOMIC :
(!(iters & 0xf) ? KCSAN_ACCESS_WRITE : 0);
__kcsan_check_access((void *)addr, sizeof(long), type);
}
- cycles = get_cycles() - cycles;
+ nsecs = ktime_get() - nsecs;
- pr_info("%s end | cycles: %llu\n", __func__, cycles);
+ pr_info("%s end | nsecs: %llu\n", __func__, nsecs);
WRITE_ONCE(kcsan_enabled, was_enabled);
/* restore context */