]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests/bpf: add read_with_timeout() utility function
authorEduard Zingerman <eddyz87@gmail.com>
Tue, 12 Nov 2024 11:09:04 +0000 (03:09 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 12 Nov 2024 21:53:27 +0000 (13:53 -0800)
int read_with_timeout(int fd, char *buf, size_t count, long usec)

As a regular read(2), but allows to specify a timeout in
micro-seconds. Returns -EAGAIN on timeout.
Implemented using select().

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20241112110906.3045278-3-eddyz87@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/Makefile
tools/testing/selftests/bpf/io_helpers.c [new file with mode: 0644]
tools/testing/selftests/bpf/io_helpers.h [new file with mode: 0644]

index edef5df08cb2536260f8910b2ebd2b89dbd0ebd2..b1080284522d6615b753bd98f9d5135db55f922a 100644 (file)
@@ -742,6 +742,7 @@ TRUNNER_EXTRA_SOURCES := test_progs.c               \
                         unpriv_helpers.c       \
                         netlink_helpers.c      \
                         jit_disasm_helpers.c   \
+                        io_helpers.c           \
                         test_loader.c          \
                         xsk.c                  \
                         disasm.c               \
diff --git a/tools/testing/selftests/bpf/io_helpers.c b/tools/testing/selftests/bpf/io_helpers.c
new file mode 100644 (file)
index 0000000..4ada0a7
--- /dev/null
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <sys/select.h>
+#include <unistd.h>
+#include <errno.h>
+
+int read_with_timeout(int fd, char *buf, size_t count, long usec)
+{
+       const long M = 1000 * 1000;
+       struct timeval tv = { usec / M, usec % M };
+       fd_set fds;
+       int err;
+
+       FD_ZERO(&fds);
+       FD_SET(fd, &fds);
+       err = select(fd + 1, &fds, NULL, NULL, &tv);
+       if (err < 0)
+               return err;
+       if (FD_ISSET(fd, &fds))
+               return read(fd, buf, count);
+       return -EAGAIN;
+}
diff --git a/tools/testing/selftests/bpf/io_helpers.h b/tools/testing/selftests/bpf/io_helpers.h
new file mode 100644 (file)
index 0000000..21e1134
--- /dev/null
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <unistd.h>
+
+/* As a regular read(2), but allows to specify a timeout in micro-seconds.
+ * Returns -EAGAIN on timeout.
+ */
+int read_with_timeout(int fd, char *buf, size_t count, long usec);