Commit da35048f authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Luis Chamberlain
Browse files

kallsyms: Fix scheduling with interrupts disabled in self-test



kallsyms_on_each* may schedule so must not be called with interrupts
disabled. The iteration function could disable interrupts, but this
also changes lookup_symbol() to match the change to the other timing
code.

Reported-by: default avatarErhard F. <erhard_f@mailbox.org>
Link: https://lore.kernel.org/all/bug-216902-206035@https.bugzilla.kernel.org%2F/


Reported-by: default avatarkernel test robot <oliver.sang@intel.com>
Link: https://lore.kernel.org/oe-lkp/202212251728.8d0872ff-oliver.sang@intel.com


Fixes: 30f3bb09 ("kallsyms: Add self-test facility")
Tested-by: default avatar"Erhard F." <erhard_f@mailbox.org>
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarLuis Chamberlain <mcgrof@kernel.org>
parent 88603b6d
Loading
Loading
Loading
Loading
+6 −15
Original line number Original line Diff line number Diff line
@@ -157,14 +157,11 @@ static void test_kallsyms_compression_ratio(void)
static int lookup_name(void *data, const char *name, struct module *mod, unsigned long addr)
static int lookup_name(void *data, const char *name, struct module *mod, unsigned long addr)
{
{
	u64 t0, t1, t;
	u64 t0, t1, t;
	unsigned long flags;
	struct test_stat *stat = (struct test_stat *)data;
	struct test_stat *stat = (struct test_stat *)data;


	local_irq_save(flags);
	t0 = ktime_get_ns();
	t0 = sched_clock();
	(void)kallsyms_lookup_name(name);
	(void)kallsyms_lookup_name(name);
	t1 = sched_clock();
	t1 = ktime_get_ns();
	local_irq_restore(flags);


	t = t1 - t0;
	t = t1 - t0;
	if (t < stat->min)
	if (t < stat->min)
@@ -234,18 +231,15 @@ static int find_symbol(void *data, const char *name, struct module *mod, unsigne
static void test_perf_kallsyms_on_each_symbol(void)
static void test_perf_kallsyms_on_each_symbol(void)
{
{
	u64 t0, t1;
	u64 t0, t1;
	unsigned long flags;
	struct test_stat stat;
	struct test_stat stat;


	memset(&stat, 0, sizeof(stat));
	memset(&stat, 0, sizeof(stat));
	stat.max = INT_MAX;
	stat.max = INT_MAX;
	stat.name = stub_name;
	stat.name = stub_name;
	stat.perf = 1;
	stat.perf = 1;
	local_irq_save(flags);
	t0 = ktime_get_ns();
	t0 = sched_clock();
	kallsyms_on_each_symbol(find_symbol, &stat);
	kallsyms_on_each_symbol(find_symbol, &stat);
	t1 = sched_clock();
	t1 = ktime_get_ns();
	local_irq_restore(flags);
	pr_info("kallsyms_on_each_symbol() traverse all: %lld ns\n", t1 - t0);
	pr_info("kallsyms_on_each_symbol() traverse all: %lld ns\n", t1 - t0);
}
}


@@ -270,17 +264,14 @@ static int match_symbol(void *data, unsigned long addr)
static void test_perf_kallsyms_on_each_match_symbol(void)
static void test_perf_kallsyms_on_each_match_symbol(void)
{
{
	u64 t0, t1;
	u64 t0, t1;
	unsigned long flags;
	struct test_stat stat;
	struct test_stat stat;


	memset(&stat, 0, sizeof(stat));
	memset(&stat, 0, sizeof(stat));
	stat.max = INT_MAX;
	stat.max = INT_MAX;
	stat.name = stub_name;
	stat.name = stub_name;
	local_irq_save(flags);
	t0 = ktime_get_ns();
	t0 = sched_clock();
	kallsyms_on_each_match_symbol(match_symbol, stat.name, &stat);
	kallsyms_on_each_match_symbol(match_symbol, stat.name, &stat);
	t1 = sched_clock();
	t1 = ktime_get_ns();
	local_irq_restore(flags);
	pr_info("kallsyms_on_each_match_symbol() traverse all: %lld ns\n", t1 - t0);
	pr_info("kallsyms_on_each_match_symbol() traverse all: %lld ns\n", t1 - t0);
}
}