-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
lib/test: introduce cpumask KUnit test suite
Add a basic suite of tests for cpumask, providing some tests for empty and completely filled cpumasks. Link: https://lkml.kernel.org/r/c96980ec35c3bd23f17c3374bf42c22971545e85.1656777646.git.sander@svanheule.net Signed-off-by: Sander Vanheule <sander@svanheule.net> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Suggested-by: Yury Norov <yury.norov@gmail.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Marco Elver <elver@google.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Valentin Schneider <vschneid@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
- Loading branch information
Sander Vanheule
authored and
akpm
committed
Jul 18, 2022
1 parent
b81dce7
commit c41e886
Showing
3 changed files
with
148 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* | ||
* KUnit tests for cpumask. | ||
* | ||
* Author: Sander Vanheule <sander@svanheule.net> | ||
*/ | ||
|
||
#include <kunit/test.h> | ||
#include <linux/cpu.h> | ||
#include <linux/cpumask.h> | ||
|
||
#define EXPECT_FOR_EACH_CPU_EQ(test, mask) \ | ||
do { \ | ||
const cpumask_t *m = (mask); \ | ||
int mask_weight = cpumask_weight(m); \ | ||
int cpu, iter = 0; \ | ||
for_each_cpu(cpu, m) \ | ||
iter++; \ | ||
KUNIT_EXPECT_EQ((test), mask_weight, iter); \ | ||
} while (0) | ||
|
||
#define EXPECT_FOR_EACH_CPU_NOT_EQ(test, mask) \ | ||
do { \ | ||
const cpumask_t *m = (mask); \ | ||
int mask_weight = cpumask_weight(m); \ | ||
int cpu, iter = 0; \ | ||
for_each_cpu_not(cpu, m) \ | ||
iter++; \ | ||
KUNIT_EXPECT_EQ((test), nr_cpu_ids - mask_weight, iter); \ | ||
} while (0) | ||
|
||
#define EXPECT_FOR_EACH_CPU_WRAP_EQ(test, mask) \ | ||
do { \ | ||
const cpumask_t *m = (mask); \ | ||
int mask_weight = cpumask_weight(m); \ | ||
int cpu, iter = 0; \ | ||
for_each_cpu_wrap(cpu, m, nr_cpu_ids / 2) \ | ||
iter++; \ | ||
KUNIT_EXPECT_EQ((test), mask_weight, iter); \ | ||
} while (0) | ||
|
||
#define EXPECT_FOR_EACH_CPU_BUILTIN_EQ(test, name) \ | ||
do { \ | ||
int mask_weight = num_##name##_cpus(); \ | ||
int cpu, iter = 0; \ | ||
for_each_##name##_cpu(cpu) \ | ||
iter++; \ | ||
KUNIT_EXPECT_EQ((test), mask_weight, iter); \ | ||
} while (0) | ||
|
||
static cpumask_t mask_empty; | ||
static cpumask_t mask_all; | ||
|
||
static void test_cpumask_weight(struct kunit *test) | ||
{ | ||
KUNIT_EXPECT_TRUE(test, cpumask_empty(&mask_empty)); | ||
KUNIT_EXPECT_TRUE(test, cpumask_full(cpu_possible_mask)); | ||
KUNIT_EXPECT_TRUE(test, cpumask_full(&mask_all)); | ||
|
||
KUNIT_EXPECT_EQ(test, 0, cpumask_weight(&mask_empty)); | ||
KUNIT_EXPECT_EQ(test, nr_cpu_ids, cpumask_weight(cpu_possible_mask)); | ||
KUNIT_EXPECT_EQ(test, nr_cpumask_bits, cpumask_weight(&mask_all)); | ||
} | ||
|
||
static void test_cpumask_first(struct kunit *test) | ||
{ | ||
KUNIT_EXPECT_LE(test, nr_cpu_ids, cpumask_first(&mask_empty)); | ||
KUNIT_EXPECT_EQ(test, 0, cpumask_first(cpu_possible_mask)); | ||
|
||
KUNIT_EXPECT_EQ(test, 0, cpumask_first_zero(&mask_empty)); | ||
KUNIT_EXPECT_LE(test, nr_cpu_ids, cpumask_first_zero(cpu_possible_mask)); | ||
} | ||
|
||
static void test_cpumask_last(struct kunit *test) | ||
{ | ||
KUNIT_EXPECT_LE(test, nr_cpumask_bits, cpumask_last(&mask_empty)); | ||
KUNIT_EXPECT_EQ(test, nr_cpumask_bits - 1, cpumask_last(cpu_possible_mask)); | ||
} | ||
|
||
static void test_cpumask_next(struct kunit *test) | ||
{ | ||
KUNIT_EXPECT_EQ(test, 0, cpumask_next_zero(-1, &mask_empty)); | ||
KUNIT_EXPECT_LE(test, nr_cpu_ids, cpumask_next_zero(-1, cpu_possible_mask)); | ||
|
||
KUNIT_EXPECT_LE(test, nr_cpu_ids, cpumask_next(-1, &mask_empty)); | ||
KUNIT_EXPECT_EQ(test, 0, cpumask_next(-1, cpu_possible_mask)); | ||
} | ||
|
||
static void test_cpumask_iterators(struct kunit *test) | ||
{ | ||
EXPECT_FOR_EACH_CPU_EQ(test, &mask_empty); | ||
EXPECT_FOR_EACH_CPU_NOT_EQ(test, &mask_empty); | ||
EXPECT_FOR_EACH_CPU_WRAP_EQ(test, &mask_empty); | ||
|
||
EXPECT_FOR_EACH_CPU_EQ(test, cpu_possible_mask); | ||
EXPECT_FOR_EACH_CPU_NOT_EQ(test, cpu_possible_mask); | ||
EXPECT_FOR_EACH_CPU_WRAP_EQ(test, cpu_possible_mask); | ||
} | ||
|
||
static void test_cpumask_iterators_builtin(struct kunit *test) | ||
{ | ||
EXPECT_FOR_EACH_CPU_BUILTIN_EQ(test, possible); | ||
|
||
/* Ensure the dynamic masks are stable while running the tests */ | ||
cpu_hotplug_disable(); | ||
|
||
EXPECT_FOR_EACH_CPU_BUILTIN_EQ(test, online); | ||
EXPECT_FOR_EACH_CPU_BUILTIN_EQ(test, present); | ||
|
||
cpu_hotplug_enable(); | ||
} | ||
|
||
static int test_cpumask_init(struct kunit *test) | ||
{ | ||
cpumask_clear(&mask_empty); | ||
cpumask_setall(&mask_all); | ||
|
||
return 0; | ||
} | ||
|
||
static struct kunit_case test_cpumask_cases[] = { | ||
KUNIT_CASE(test_cpumask_weight), | ||
KUNIT_CASE(test_cpumask_first), | ||
KUNIT_CASE(test_cpumask_last), | ||
KUNIT_CASE(test_cpumask_next), | ||
KUNIT_CASE(test_cpumask_iterators), | ||
KUNIT_CASE(test_cpumask_iterators_builtin), | ||
{} | ||
}; | ||
|
||
static struct kunit_suite test_cpumask_suite = { | ||
.name = "cpumask", | ||
.init = test_cpumask_init, | ||
.test_cases = test_cpumask_cases, | ||
}; | ||
kunit_test_suite(test_cpumask_suite); | ||
|
||
MODULE_LICENSE("GPL"); |