mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 15:43:08 -04:00
While making changes to the refcounted interrupt patch series, at some point on my local branch I broke something and ended up writing some kunit tests for testing refcounted interrupts as a result. So, let's include these tests now that we have refcounted interrupts. Signed-off-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Boqun Feng <boqun@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://patch.msgid.link/20260804161447.84806-7-boqun@kernel.org
110 lines
2.2 KiB
C
110 lines
2.2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* KUnit test for refcounted interrupt enable/disables.
|
|
*/
|
|
|
|
#include <kunit/test.h>
|
|
#include <linux/interrupt_rc.h>
|
|
|
|
#define TEST_IRQ_ON() KUNIT_EXPECT_FALSE(test, irqs_disabled())
|
|
#define TEST_IRQ_OFF() KUNIT_EXPECT_TRUE(test, irqs_disabled())
|
|
|
|
/* ===== Test cases ===== */
|
|
static void test_single_irq_change(struct kunit *test)
|
|
{
|
|
local_interrupt_disable();
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_enable();
|
|
}
|
|
|
|
static void test_nested_irq_change(struct kunit *test)
|
|
{
|
|
local_interrupt_disable();
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_disable();
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_disable();
|
|
TEST_IRQ_OFF();
|
|
|
|
local_interrupt_enable();
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_enable();
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_enable();
|
|
TEST_IRQ_ON();
|
|
}
|
|
|
|
static void test_multiple_irq_change(struct kunit *test)
|
|
{
|
|
local_interrupt_disable();
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_disable();
|
|
TEST_IRQ_OFF();
|
|
|
|
local_interrupt_enable();
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_enable();
|
|
TEST_IRQ_ON();
|
|
|
|
local_interrupt_disable();
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_enable();
|
|
TEST_IRQ_ON();
|
|
}
|
|
|
|
static void test_irq_save(struct kunit *test)
|
|
{
|
|
unsigned long flags;
|
|
|
|
local_irq_save(flags);
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_disable();
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_enable();
|
|
TEST_IRQ_OFF();
|
|
local_irq_restore(flags);
|
|
TEST_IRQ_ON();
|
|
|
|
local_interrupt_disable();
|
|
TEST_IRQ_OFF();
|
|
local_irq_save(flags);
|
|
TEST_IRQ_OFF();
|
|
local_irq_restore(flags);
|
|
TEST_IRQ_OFF();
|
|
local_interrupt_enable();
|
|
TEST_IRQ_ON();
|
|
}
|
|
|
|
static struct kunit_case test_cases[] = {
|
|
KUNIT_CASE(test_single_irq_change),
|
|
KUNIT_CASE(test_nested_irq_change),
|
|
KUNIT_CASE(test_multiple_irq_change),
|
|
KUNIT_CASE(test_irq_save),
|
|
{},
|
|
};
|
|
|
|
/* init and exit are the same. */
|
|
static int test_init(struct kunit *test)
|
|
{
|
|
TEST_IRQ_ON();
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void test_exit(struct kunit *test)
|
|
{
|
|
TEST_IRQ_ON();
|
|
}
|
|
|
|
static struct kunit_suite refcount_interrupt_test_suite = {
|
|
.name = "refcount_interrupt",
|
|
.test_cases = test_cases,
|
|
.init = test_init,
|
|
.exit = test_exit,
|
|
};
|
|
|
|
kunit_test_suite(refcount_interrupt_test_suite);
|
|
MODULE_AUTHOR("Lyude Paul <lyude@redhat.com>");
|
|
MODULE_DESCRIPTION("Refcounted interrupt unit test suite");
|
|
MODULE_LICENSE("GPL");
|