Commit 69b2c81b authored by Marco Elver's avatar Marco Elver Committed by Paul E. McKenney
Browse files

kcsan: Simplify debugfs counter to name mapping



Simplify counter ID to name mapping by using an array with designated
inits. This way, we can turn a run-time BUG() into a compile-time static
assertion failure if a counter name is missing.

No functional change intended.

Signed-off-by: default avatarMarco Elver <elver@google.com>
Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent 3570a1bc
Loading
Loading
Loading
Loading
+13 −20
Original line number Diff line number Diff line
@@ -19,6 +19,18 @@
 * Statistics counters.
 */
static atomic_long_t counters[KCSAN_COUNTER_COUNT];
static const char *const counter_names[] = {
	[KCSAN_COUNTER_USED_WATCHPOINTS]		= "used_watchpoints",
	[KCSAN_COUNTER_SETUP_WATCHPOINTS]		= "setup_watchpoints",
	[KCSAN_COUNTER_DATA_RACES]			= "data_races",
	[KCSAN_COUNTER_ASSERT_FAILURES]			= "assert_failures",
	[KCSAN_COUNTER_NO_CAPACITY]			= "no_capacity",
	[KCSAN_COUNTER_REPORT_RACES]			= "report_races",
	[KCSAN_COUNTER_RACES_UNKNOWN_ORIGIN]		= "races_unknown_origin",
	[KCSAN_COUNTER_UNENCODABLE_ACCESSES]		= "unencodable_accesses",
	[KCSAN_COUNTER_ENCODING_FALSE_POSITIVES]	= "encoding_false_positives",
};
static_assert(ARRAY_SIZE(counter_names) == KCSAN_COUNTER_COUNT);

/*
 * Addresses for filtering functions from reporting. This list can be used as a
@@ -39,24 +51,6 @@ static struct {
};
static DEFINE_SPINLOCK(report_filterlist_lock);

static const char *counter_to_name(enum kcsan_counter_id id)
{
	switch (id) {
	case KCSAN_COUNTER_USED_WATCHPOINTS:		return "used_watchpoints";
	case KCSAN_COUNTER_SETUP_WATCHPOINTS:		return "setup_watchpoints";
	case KCSAN_COUNTER_DATA_RACES:			return "data_races";
	case KCSAN_COUNTER_ASSERT_FAILURES:		return "assert_failures";
	case KCSAN_COUNTER_NO_CAPACITY:			return "no_capacity";
	case KCSAN_COUNTER_REPORT_RACES:		return "report_races";
	case KCSAN_COUNTER_RACES_UNKNOWN_ORIGIN:	return "races_unknown_origin";
	case KCSAN_COUNTER_UNENCODABLE_ACCESSES:	return "unencodable_accesses";
	case KCSAN_COUNTER_ENCODING_FALSE_POSITIVES:	return "encoding_false_positives";
	case KCSAN_COUNTER_COUNT:
		BUG();
	}
	return NULL;
}

void kcsan_counter_inc(enum kcsan_counter_id id)
{
	atomic_long_inc(&counters[id]);
@@ -271,8 +265,7 @@ static int show_info(struct seq_file *file, void *v)
	/* show stats */
	seq_printf(file, "enabled: %i\n", READ_ONCE(kcsan_enabled));
	for (i = 0; i < KCSAN_COUNTER_COUNT; ++i)
		seq_printf(file, "%s: %ld\n", counter_to_name(i),
			   atomic_long_read(&counters[i]));
		seq_printf(file, "%s: %ld\n", counter_names[i], atomic_long_read(&counters[i]));

	/* show filter functions, and filter type */
	spin_lock_irqsave(&report_filterlist_lock, flags);