mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-30 13:52:50 +01: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 <[email protected]> Signed-off-by: Boqun Feng <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Link: https://patch.msgid.link/[email protected]
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 <[email protected]>");
|
|
MODULE_DESCRIPTION("Refcounted interrupt unit test suite");
|
|
MODULE_LICENSE("GPL");
|