mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
irq: Add KUnit test for refcounted interrupt enable/disable
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
This commit is contained in:
parent
e901c1510e
commit
07a88e2bcd
|
|
@ -16,3 +16,4 @@ obj-$(CONFIG_SMP) += affinity.o
|
|||
obj-$(CONFIG_GENERIC_IRQ_DEBUGFS) += debugfs.o
|
||||
obj-$(CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR) += matrix.o
|
||||
obj-$(CONFIG_IRQ_KUNIT_TEST) += irq_test.o
|
||||
obj-$(CONFIG_KUNIT) += refcount_interrupt_test.o
|
||||
|
|
|
|||
109
kernel/irq/refcount_interrupt_test.c
Normal file
109
kernel/irq/refcount_interrupt_test.c
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
// 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");
|
||||
Loading…
Reference in New Issue
Block a user