Skip to content

Commit 3209139

Browse files
eddyz87Alexei Starovoitov
authored andcommitted
selftests/bpf: allow send_signal test to timeout
The following invocation: $ t1=send_signal/send_signal_perf_thread_remote \ t2=send_signal/send_signal_nmi_thread_remote \ ./test_progs -t $t1,$t2 Leads to send_signal_nmi_thread_remote to be stuck on a line 180: /* wait for result */ err = read(pipe_c2p[0], buf, 1); In this test case: - perf event PERF_COUNT_HW_CPU_CYCLES is created for parent process; - BPF program is attached to perf event, and sends a signal to child process when event occurs; - parent program burns some CPU in busy loop and calls read() to get notification from child that it received a signal. The perf event is declared with .sample_period = 1. This forces perf to throttle events, and under some unclear conditions the event does not always occur while parent is in busy loop. After parent enters read() system call CPU cycles event won't be generated for parent anymore. Thus, if perf event had not occurred already the test is stuck. This commit updates the parent to wait for notification with a timeout, doing several iterations of busy loop + read_with_timeout(). Signed-off-by: Eduard Zingerman <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent 03066ed commit 3209139

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

tools/testing/selftests/bpf/prog_tests/send_signal.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <sys/time.h>
44
#include <sys/resource.h>
55
#include "test_send_signal_kern.skel.h"
6+
#include "io_helpers.h"
67

78
static int sigusr1_received;
89

@@ -24,6 +25,7 @@ static void test_send_signal_common(struct perf_event_attr *attr,
2425
int pipe_c2p[2], pipe_p2c[2];
2526
int err = -1, pmu_fd = -1;
2627
volatile int j = 0;
28+
int retry_count;
2729
char buf[256];
2830
pid_t pid;
2931
int old_prio;
@@ -163,21 +165,25 @@ static void test_send_signal_common(struct perf_event_attr *attr,
163165
/* notify child that bpf program can send_signal now */
164166
ASSERT_EQ(write(pipe_p2c[1], buf, 1), 1, "pipe_write");
165167

166-
/* For the remote test, the BPF program is triggered from this
167-
* process but the other process/thread is signaled.
168-
*/
169-
if (remote) {
170-
if (!attr) {
171-
for (int i = 0; i < 10; i++)
172-
usleep(1);
173-
} else {
174-
for (int i = 0; i < 100000000; i++)
175-
j /= i + 1;
168+
for (retry_count = 0;;) {
169+
/* For the remote test, the BPF program is triggered from this
170+
* process but the other process/thread is signaled.
171+
*/
172+
if (remote) {
173+
if (!attr) {
174+
for (int i = 0; i < 10; i++)
175+
usleep(1);
176+
} else {
177+
for (int i = 0; i < 100000000; i++)
178+
j /= i + 1;
179+
}
176180
}
181+
/* wait for result */
182+
err = read_with_timeout(pipe_c2p[0], buf, 1, 100);
183+
if (err == -EAGAIN && retry_count++ < 10000)
184+
continue;
185+
break;
177186
}
178-
179-
/* wait for result */
180-
err = read(pipe_c2p[0], buf, 1);
181187
if (!ASSERT_GE(err, 0, "reading pipe"))
182188
goto disable_pmu;
183189
if (!ASSERT_GT(err, 0, "reading pipe error: size 0")) {

0 commit comments

Comments
 (0)