Skip to content

Commit 1fcd09f

Browse files
committed
test_kprobes: Add recursed kprobe test case
Add a recursed kprobe test case to the KUnit test module for kprobes. This will probe a function which is called from the pre_handler and post_handler itself. If the kprobe is correctly implemented, the recursed kprobe handlers will be skipped and the number of skipped kprobe will be counted on kprobe::nmissed. Link: https://lore.kernel.org/all/167414238758.2301956.258548940194352895.stgit@devnote3/ Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
1 parent 8478cca commit 1fcd09f

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

lib/test_kprobes.c

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
static u32 rand1, preh_val, posth_val;
1616
static u32 (*target)(u32 value);
17+
static u32 (*recursed_target)(u32 value);
1718
static u32 (*target2)(u32 value);
1819
static struct kunit *current_test;
1920

@@ -27,18 +28,27 @@ static noinline u32 kprobe_target(u32 value)
2728
return (value / div_factor);
2829
}
2930

31+
static noinline u32 kprobe_recursed_target(u32 value)
32+
{
33+
return (value / div_factor);
34+
}
35+
3036
static int kp_pre_handler(struct kprobe *p, struct pt_regs *regs)
3137
{
3238
KUNIT_EXPECT_FALSE(current_test, preemptible());
33-
preh_val = (rand1 / div_factor);
39+
40+
preh_val = recursed_target(rand1);
3441
return 0;
3542
}
3643

3744
static void kp_post_handler(struct kprobe *p, struct pt_regs *regs,
3845
unsigned long flags)
3946
{
47+
u32 expval = recursed_target(rand1);
48+
4049
KUNIT_EXPECT_FALSE(current_test, preemptible());
41-
KUNIT_EXPECT_EQ(current_test, preh_val, (rand1 / div_factor));
50+
KUNIT_EXPECT_EQ(current_test, preh_val, expval);
51+
4252
posth_val = preh_val + div_factor;
4353
}
4454

@@ -136,6 +146,29 @@ static void test_kprobes(struct kunit *test)
136146
unregister_kprobes(kps, 2);
137147
}
138148

149+
static struct kprobe kp_missed = {
150+
.symbol_name = "kprobe_recursed_target",
151+
.pre_handler = kp_pre_handler,
152+
.post_handler = kp_post_handler,
153+
};
154+
155+
static void test_kprobe_missed(struct kunit *test)
156+
{
157+
current_test = test;
158+
preh_val = 0;
159+
posth_val = 0;
160+
161+
KUNIT_EXPECT_EQ(test, 0, register_kprobe(&kp_missed));
162+
163+
recursed_target(rand1);
164+
165+
KUNIT_EXPECT_EQ(test, 2, kp_missed.nmissed);
166+
KUNIT_EXPECT_NE(test, 0, preh_val);
167+
KUNIT_EXPECT_NE(test, 0, posth_val);
168+
169+
unregister_kprobe(&kp_missed);
170+
}
171+
139172
#ifdef CONFIG_KRETPROBES
140173
static u32 krph_val;
141174

@@ -336,6 +369,7 @@ static int kprobes_test_init(struct kunit *test)
336369
{
337370
target = kprobe_target;
338371
target2 = kprobe_target2;
372+
recursed_target = kprobe_recursed_target;
339373
stacktrace_target = kprobe_stacktrace_target;
340374
internal_target = kprobe_stacktrace_internal_target;
341375
stacktrace_driver = kprobe_stacktrace_driver;
@@ -346,6 +380,7 @@ static int kprobes_test_init(struct kunit *test)
346380
static struct kunit_case kprobes_testcases[] = {
347381
KUNIT_CASE(test_kprobe),
348382
KUNIT_CASE(test_kprobes),
383+
KUNIT_CASE(test_kprobe_missed),
349384
#ifdef CONFIG_KRETPROBES
350385
KUNIT_CASE(test_kretprobe),
351386
KUNIT_CASE(test_kretprobes),

0 commit comments

Comments
 (0)