Merge tag 'for-linus-6.4-1' of https://github.com/cminyard/linux-ipmi
[linux-block.git] / lib / test_kprobes.c
index 1c95e57198023e3aa38f215272800e64db70108f..0648f7154f5c4f6081a4d0eff01ceef4bc401363 100644 (file)
@@ -14,6 +14,7 @@
 
 static u32 rand1, preh_val, posth_val;
 static u32 (*target)(u32 value);
+static u32 (*recursed_target)(u32 value);
 static u32 (*target2)(u32 value);
 static struct kunit *current_test;
 
@@ -27,18 +28,27 @@ static noinline u32 kprobe_target(u32 value)
        return (value / div_factor);
 }
 
+static noinline u32 kprobe_recursed_target(u32 value)
+{
+       return (value / div_factor);
+}
+
 static int kp_pre_handler(struct kprobe *p, struct pt_regs *regs)
 {
        KUNIT_EXPECT_FALSE(current_test, preemptible());
-       preh_val = (rand1 / div_factor);
+
+       preh_val = recursed_target(rand1);
        return 0;
 }
 
 static void kp_post_handler(struct kprobe *p, struct pt_regs *regs,
                unsigned long flags)
 {
+       u32 expval = recursed_target(rand1);
+
        KUNIT_EXPECT_FALSE(current_test, preemptible());
-       KUNIT_EXPECT_EQ(current_test, preh_val, (rand1 / div_factor));
+       KUNIT_EXPECT_EQ(current_test, preh_val, expval);
+
        posth_val = preh_val + div_factor;
 }
 
@@ -136,6 +146,29 @@ static void test_kprobes(struct kunit *test)
        unregister_kprobes(kps, 2);
 }
 
+static struct kprobe kp_missed = {
+       .symbol_name = "kprobe_recursed_target",
+       .pre_handler = kp_pre_handler,
+       .post_handler = kp_post_handler,
+};
+
+static void test_kprobe_missed(struct kunit *test)
+{
+       current_test = test;
+       preh_val = 0;
+       posth_val = 0;
+
+       KUNIT_EXPECT_EQ(test, 0, register_kprobe(&kp_missed));
+
+       recursed_target(rand1);
+
+       KUNIT_EXPECT_EQ(test, 2, kp_missed.nmissed);
+       KUNIT_EXPECT_NE(test, 0, preh_val);
+       KUNIT_EXPECT_NE(test, 0, posth_val);
+
+       unregister_kprobe(&kp_missed);
+}
+
 #ifdef CONFIG_KRETPROBES
 static u32 krph_val;
 
@@ -336,6 +369,7 @@ static int kprobes_test_init(struct kunit *test)
 {
        target = kprobe_target;
        target2 = kprobe_target2;
+       recursed_target = kprobe_recursed_target;
        stacktrace_target = kprobe_stacktrace_target;
        internal_target = kprobe_stacktrace_internal_target;
        stacktrace_driver = kprobe_stacktrace_driver;
@@ -346,6 +380,7 @@ static int kprobes_test_init(struct kunit *test)
 static struct kunit_case kprobes_testcases[] = {
        KUNIT_CASE(test_kprobe),
        KUNIT_CASE(test_kprobes),
+       KUNIT_CASE(test_kprobe_missed),
 #ifdef CONFIG_KRETPROBES
        KUNIT_CASE(test_kretprobe),
        KUNIT_CASE(test_kretprobes),