From: Cyril Hrubis <chrubis@suse.cz>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH 8/8] syscalls: Remove old epoll-ltp test
Date: Thu, 23 Apr 2026 11:58:34 +0200 [thread overview]
Message-ID: <20260423095834.11932-9-chrubis@suse.cz> (raw)
In-Reply-To: <20260423095834.11932-1-chrubis@suse.cz>
Now that the epoll coverate is greater than it ever was we can remove
the old and ugly epoll-ltp test.
Fixes: https://github.com/linux-test-project/ltp/issues/860
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
runtest/syscalls | 2 +-
testcases/kernel/syscalls/epoll/.gitignore | 1 -
testcases/kernel/syscalls/epoll/Makefile | 8 -
testcases/kernel/syscalls/epoll/README.1ST | 38 -
testcases/kernel/syscalls/epoll/epoll-ltp.c | 738 --------------------
5 files changed, 1 insertion(+), 786 deletions(-)
delete mode 100644 testcases/kernel/syscalls/epoll/.gitignore
delete mode 100644 testcases/kernel/syscalls/epoll/Makefile
delete mode 100644 testcases/kernel/syscalls/epoll/README.1ST
delete mode 100644 testcases/kernel/syscalls/epoll/epoll-ltp.c
diff --git a/runtest/syscalls b/runtest/syscalls
index 0200a9e13..2984f8ba9 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -181,7 +181,7 @@ epoll_create03 epoll_create03
epoll_create1_01 epoll_create1_01
epoll_create1_02 epoll_create1_02
-epoll01 epoll-ltp
+
epoll_ctl01 epoll_ctl01
epoll_ctl02 epoll_ctl02
epoll_ctl03 epoll_ctl03
diff --git a/testcases/kernel/syscalls/epoll/.gitignore b/testcases/kernel/syscalls/epoll/.gitignore
deleted file mode 100644
index dfb4445db..000000000
--- a/testcases/kernel/syscalls/epoll/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/epoll-ltp
diff --git a/testcases/kernel/syscalls/epoll/Makefile b/testcases/kernel/syscalls/epoll/Makefile
deleted file mode 100644
index 044619fb8..000000000
--- a/testcases/kernel/syscalls/epoll/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-or-later
-# Copyright (c) International Business Machines Corp., 2001
-
-top_srcdir ?= ../../../..
-
-include $(top_srcdir)/include/mk/testcases.mk
-
-include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/syscalls/epoll/README.1ST b/testcases/kernel/syscalls/epoll/README.1ST
deleted file mode 100644
index e5c5fcc5c..000000000
--- a/testcases/kernel/syscalls/epoll/README.1ST
+++ /dev/null
@@ -1,38 +0,0 @@
-Epoll Setup
-
-
- ** Directions for glibc version of 2.3.2 or higher **
-
-Epoll support is currently implemented in glibc 2.3.2, therefore if you have a$
-glibc version of 2.3.2 or higher then do the following steps:
-
-1. Download and untar the epoll library from:
- http://www.xmailserver.org/linux-patches/epoll-lib-0.11.tar.gz
-2. Copy <epoll-lib_directory>/include/epoll.h /usr/include
-3. Compile epoll-ltp.c in the <ltp_dir>testcases/kernel/syscall/epoll
-
-
-
- ** Older version of glibc **
-To compile the epoll-ltp successfully the following libraries are needed:
-
-Epoll library http://www.xmailserver.org/linux-patches/epoll-lib-0.11.tar.gz
-Portable Coroutine Library (PCL) http://www.xmailserver.org/libpcl.html
-
-
-1. Download and untar the PCL library
-2. Run ./configure
-3. Run make
-4. Run make install
-5. Copy <libpcl_directory>/pcl/.libs/libpcl.* /lib
-6. Download and untar the epoll library
-7. *You may have to modify the makefile in <epoll-lib_directory>/Makefile and <epoll-lib_directory>/examples/Makefile with the following
-- KERNELDIR = kernel_directory
-- #all: .depend $(TARGET) epoll-example change this line to$
-- all: .$(TARGET) epoll-example
-- #include .depend comment out this line
-8. Copy <epoll-lib_directory>/include/epoll.h /usr/include
-9. <epoll-lib_directory> make
-10. Copy <epoll-lib_directory>/lib/libepoll* /lib
-11. Compile epoll-ltp.c in the <ltp_dir>testcases/kernel/syscall/epoll
-
diff --git a/testcases/kernel/syscalls/epoll/epoll-ltp.c b/testcases/kernel/syscalls/epoll/epoll-ltp.c
deleted file mode 100644
index dac132e2f..000000000
--- a/testcases/kernel/syscalls/epoll/epoll-ltp.c
+++ /dev/null
@@ -1,738 +0,0 @@
-/*
- *
- * Copyright (c) International Business Machines Corp., 2001
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-/******************************************************************************
-
- File: epoll-ltp.c
-
- Description:
- Test the epoll_* system calls. This test program attempts to
- be very thorough in exercising epoll_* system calls. Large
- combinations of valid and invalid parameters are passed with
- valid and invalid sequences. Due to the combinatorial nature
- of this test program the test may take a "long" time to
- execute.
-
- Total Tests: 2 (2 system calls are being tested for)
-
- Test Name: epoll_create, epoll_ctl
-
- Test Assertion
- & Strategy: Test a variety of incorrect parameters for epoll_create
-
- Then run a reasonable epoll_create and get a fd for the epoll
- set.
-
- Next run epoll_ctl on that fd (epoll_fd) with a variety of
- incorrect parameters and a couple correct ones.
-
- Finally ?How to thoroughly test epoll_wait?
-
- Author: Matt Helsley <matthltc@us.ibm.com>
-
- History: Created - May 22 2003 - Matt Helsley <matthltc@us.ibm.com>
- Added -
-
- Notes: Currently we assume that the OS will never allocate an fd s.t.
- fd == INT_MAX and that it will instead choose to allocate fds
- from the "low" numbers. -MH
-
- Currently pokes epoll_create several times in 2 + NUM_RAND_ATTEMPTS ways
- pokes epoll_ctl 27648 - (2 + NUM_RAND_ATTEMPTS) ways
- does not poke epoll_wait
-
- TODO: change errno test code to build lists of possible errno values for
- each erroneous parameter. Check that the errno value is in one
- of the lists. Currently errno is not checked at all when multiple
- erroneous parameters are passed in.
-
- test epoll_ctl with a large number of file descriptor events in the
- set
-
- Link against epoll and ltp (-lepoll -lltp)
-
-*******************************************************************************/
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdarg.h>
-#include <string.h>
-#include <signal.h>
-#include <assert.h>
-#include <limits.h>
-#include <ctype.h>
-#include <time.h>
-#include <errno.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/file.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/select.h>
-#include <sys/wait.h>
-
-#include "config.h"
-#include "test.h"
-
-char *TCID = "epoll01";
-int TST_TOTAL = 1;
-
-#ifdef HAVE_SYS_EPOLL_H
-
-#include <sys/epoll.h>
-
-/* Local Defines */
-#if !defined(TRUE) && !defined(FALSE)
-#define TRUE 1
-#define FALSE 0
-#endif
-
-#define NUM_RAND_ATTEMPTS 16
-#define BACKING_STORE_SIZE_HINT 32
-
-/*
- Define the beginning of a "protected region".
- This is a region where a wide variety of errors
- could occur or signals could arrive (including
- SIGSEGV and SIGKILL).
-$
- The test program uses this to catch those
- conditions as best it can and continue testing.
-
- The region MUST be marked by a corresponding
- PROTECT_REGION_END.
-
- DO NOT nest protected regions! i.e. Do not build
- code of the form:
-
- PROTECT_REGION_START
- ...
- PROTECT_REGION_START
- ...
- PROTECT_REGION_END
- ...
- PROTECT_REGION_END
- */
-#define PROTECT_REGION_START \
-do { \
- pid_t kid_pid; \
- int kid_status; \
- \
- tst_old_flush(); \
- kid_pid = tst_fork(); \
- if (kid_pid == 0) {
-
-#define PROTECT_REGION_EXIT(errval) return (errval);
-
-#define PROTECT_REGION_END(result, errval) \
- return 0; \
- } else { \
- waitpid(kid_pid, &kid_status, 0); \
- if (WIFEXITED(kid_status)) { \
- (result) = WEXITSTATUS(kid_status); \
- } else { /* Must have been signaled */ \
- (result) = (errval); \
- if (WIFSIGNALED(kid_status)) \
- tst_resm(TFAIL, "Protected function test exited due to signal %d (%s)", \
- WTERMSIG(kid_status), strsignal(WTERMSIG(kid_status))); \
- } \
- } \
-} while (0)
-
-/*
- * Call a function in a "protected" context.
- * This protects the test program proper from segfaults
- * and allows for the extraction of an integer return
- * code.
- *
- * return only integer results.
- */
-#define PROTECT_FUNC(fn, errval, epoll_fd) ( \
-{ \
- pid_t kid_pid; \
- int kid_status; \
- \
- tst_old_flush(); \
- kid_pid = tst_fork(); \
- if (kid_pid == 0) { /* Run the function */ \
- return fn(epoll_fd); \
- } else { \
- waitpid(kid_pid, &kid_status, 0); \
- if (WIFEXITED(kid_status)) { \
- kid_status = WEXITSTATUS(kid_status); \
- } else { /* Must have been signaled */ \
- kid_status = (errval); \
- if (WIFSIGNALED(kid_status)) \
- tst_resm(TFAIL, "Protected function test exited due to signal %d (%s)", \
- WTERMSIG(kid_status), strsignal(WTERMSIG(kid_status))); \
- } \
-} \
-kid_status = kid_status;})
-
-/*
- * Given the number of random size requests to test,
- * test various boundary cases of epoll_create().
- *
- * Return the number of tests that failed. 0 indicates
- * 100% passed.
- */
-int test_epoll_create(unsigned int num_rand_attempts)
-{
- int epoll_fd = -1;
- int fd_set_size = -1;
- unsigned int attempt_count;
- unsigned int num_epoll_create_test_fails = 0;
- unsigned int num_epoll_create_test_calls = 0;
-
- /* Negative set sizes */
- errno = 0;
- fd_set_size = -1;
- num_epoll_create_test_calls++;
- epoll_fd = epoll_create(fd_set_size);
- if (epoll_fd >= 0) {
- tst_resm(TFAIL | TERRNO,
- "epoll_create with negative set size succeeded unexpectedly");
- num_epoll_create_test_fails++;
- close(epoll_fd);
- } else {
- if (errno != EINVAL) {
- tst_resm(TFAIL | TERRNO,
- "epoll_create with negative set size didn't set errno to EINVAL");
- num_epoll_create_test_fails++;
- } else {
- tst_resm(TPASS, "epoll_create with negative set size");
- }
- }
-
- /* Large set sizes -- try several less than or equal to INT_MAX by some
- small amount (expect num_rand_attempts to be approximately the
- amount we'd like to go below INT_MAX). */
- fd_set_size = INT_MAX;
- for (attempt_count = num_rand_attempts; attempt_count > 0;
- attempt_count--, fd_set_size--) {
- num_epoll_create_test_calls++;
- epoll_fd = epoll_create(fd_set_size);
- if (epoll_fd == -1) {
- if (errno != ENOMEM) {
- tst_resm(TFAIL,
- "epoll_create with large set size (size = %d)",
- fd_set_size);
- num_epoll_create_test_fails++;
- } else {
- tst_resm(TPASS,
- "epoll_create with large set size (size = %d)",
- fd_set_size);
- }
- } else {
- tst_resm(TPASS,
- "epoll_create with large set size (size = %d)",
- fd_set_size);
- close(epoll_fd);
- }
- }
-
- /* Random large set sizes */
- for (attempt_count = num_rand_attempts; attempt_count > 0;
- attempt_count--) {
- fd_set_size = abs(rand() + SHRT_MAX) % INT_MAX;
- errno = 0;
- num_epoll_create_test_calls++;
- epoll_fd = epoll_create(fd_set_size);
- if (epoll_fd < 0) {
- if (errno != ENOMEM) {
- tst_resm(TFAIL,
- "epoll_create with random random large set size (size = %d)",
- fd_set_size);
- num_epoll_create_test_fails++;
- } else {
- tst_resm(TPASS,
- "epoll_create with random random large set size (size = %d)",
- fd_set_size);
- }
- } else {
- tst_resm(TPASS,
- "epoll_create with random large set size (size = %d)",
- fd_set_size);
- close(epoll_fd);
- }
- }
-
- tst_resm(TINFO,
- "Summary: Of %d tests, epoll_create failed %d (%3.0f%% passed).",
- num_epoll_create_test_calls, num_epoll_create_test_fails,
- ((float)
- (num_epoll_create_test_calls - num_epoll_create_test_fails)
- * 100.0f / (float)
- num_epoll_create_test_calls));
- /* Return 0 on success. */
-
- return num_epoll_create_test_fails;
-}
-
-/* RES_PASS indicates a PASS result */
-#define RES_PASS 0
-
-/*
- * RES_FAIL_* indicates a FAIL result
- * In brief, there are two things that can go wrong in a
- * failure. The return value (result = epoll_ctl(...)) and
- * the errno value may not match expectations. In this notation,
- * MIS -> mismatch, MAT -> match, BAD -> bad, and IGN -> ignored.
- *
- * RETV_MIS_* indicates the return value was either 0 or 1, but did
- * not match the expected return value
- *
- * _RETV_MAT_* indicates that the return value was 0 xor 1 and did
- * match the expected value
- *
- *_RETV_BAD_* the return value was neither 0 nor 1.
- *_ERRNO_MAT the error number matched the expected number
- *_ERRNO_MIS the error number did not match the expected number
- *_ERRNO_IGN no error number was expected and so errno was ignored
- *
- * Keep these values below 256 as only 1 byte gets passed as a
- * return value for the process. Note that RES_PASS is 0 which
- * LTP interprets as a PASS.
- */
-
-/* Did not get the expected return value, but errno value was expected */
-#define RES_FAIL_RETV_MIS_ERRNO_MAT 1
-/* Did not get the expected return value, but errno value was expected */
-#define RES_FAIL_RETV_BAD_ERRNO_MAT 2
-/* Did get the expected return value, and errno value was not expected */
-#define RES_FAIL_RETV_MAT_ERRNO_MIS 3
-/* Return value was neither 0 nor -1. Mismatch in value of errno */
-#define RES_FAIL_RETV_BAD_ERRNO_MIS 4
-/* Did not get the expected return value and errno is irrelevant */
-#define RES_FAIL_RETV_MIS_ERRNO_IGN 5
-/* Return value was neither 0 nor -1. value of errno is irrelevant */
-#define RES_FAIL_RETV_BAD_ERRNO_IGN 6
-/* We expected multiple errors so we were unable to check errno for conformance */
-#define RES_PASS_RETV_MAT_ERRNO_IGN 7
-
-static const char *result_strings[] = {
- "Passed",
- "Return value mismatched yet errno matched.",
- "Return value was bad yet errno matched.",
- "Return value matched yet errno mismatched.",
- "Return value was bad and errno mismatched.",
- "Return value mismatched so errno ignored.",
- "Return value was bad so errno ignored.",
- "Return value matched but errno ignored. (multiple errors expected)"
-};
-
-/****************************************************************************************/
-/* This macro helps keep the code below understandable. It prints out the
- failure message passed to it plus the parameters to the system call. */
-#define EPOLL_CTL_TEST_RESULTS_SHOW_PARAMS 1
-#if EPOLL_CTL_TEST_RESULTS_SHOW_PARAMS
-#define EPOLL_CTL_TEST_FAIL(msg , ...) \
-({ \
- if (ev_ptr != NULL) { \
- tst_resm(TFAIL, ( "(epoll_ctl(%d,%08x,%d,%p = {%08x,%08d}) returned %d:%s)" ) , ##__VA_ARGS__ , \
- epoll_fds[epfd_index], epoll_ctl_ops[op_index], \
- epoll_fds[fd_index], ev_ptr, ev_ptr->events, ev_ptr->data.fd, errno, \
- strerror(errno)); \
- } else { \
- tst_resm(TFAIL, ( "(epoll_ctl(%d,%08x,%d,%p) returned %d:%s)" ) , ##__VA_ARGS__ , \
- epoll_fds[epfd_index], epoll_ctl_ops[op_index], \
- epoll_fds[fd_index], ev_ptr, errno, strerror(errno)); \
- } \
-})
-
-#define EPOLL_CTL_TEST_PASS(msg , ...) \
-({ \
- if (ev_ptr != NULL) { \
- tst_resm(TPASS, ( "(epoll_ctl(%d,%08x,%d,%p = {%08x,%08d}) returned %d:%s)" ) , ##__VA_ARGS__ , \
- epoll_fds[epfd_index], epoll_ctl_ops[op_index], \
- epoll_fds[fd_index], ev_ptr, ev_ptr->events, ev_ptr->data.fd, errno, \
- strerror(errno)); \
- } else { \
- tst_resm(TPASS, ( "(epoll_ctl(%d,%08x,%d,%p) returned %d:%s)" ) , ##__VA_ARGS__ , \
- epoll_fds[epfd_index], epoll_ctl_ops[op_index], \
- epoll_fds[fd_index], ev_ptr, errno, strerror(errno)); \
- } \
-})
-#else
-#define EPOLL_CTL_TEST_FAIL(msg , ...) tst_resm(TFAIL, msg , ##__VA_ARGS__)
-#define EPOLL_CTL_TEST_PASS(msg , ...) tst_resm(TPASS, msg , ##__VA_ARGS__)
-#endif
-
-/****************************************************************************************/
-
-int test_epoll_ctl(int epoll_fd)
-{
- int fds[] = { -1, INT_MAX };
- int epoll_fds[] = { 0, -1, 0, INT_MAX };
- int epoll_events[64];
- /* The list of operations to try AND THE ORDER THEY ARE TRIED IN */
- int epoll_ctl_ops[] =
- { EPOLL_CTL_DEL, EPOLL_CTL_MOD, EPOLL_CTL_ADD, EPOLL_CTL_MOD,
- EPOLL_CTL_DEL, EPOLL_CTL_MOD, EPOLL_CTL_DEL, INT_MAX, -1
- };
- struct epoll_event event;
- char event_mem[sizeof(struct epoll_event) * 2];
- struct epoll_event *unaligned_event_ptr;
-
- /* Indices into lists */
- int index = 0; /* multi-use index. First uses are to initialize
- lists. Second use is to iterate over the implicit
- list of structs to pass in */
- unsigned int epfd_index; /* index into fd list for the epfd parameter */
- unsigned int event_index; /* index into event list for the events field of the
- struct epoll_event parameter */
- unsigned int fd_index; /* index into fd list for the fd parameter */
- unsigned int op_index; /* index into the list of operations for the op
- parameter */
- unsigned int num_epoll_ctl_test_fails = 0;
- unsigned int num_epoll_ctl_test_calls = 0;
-
- /* Generate all possible combinations of events (2^6 == 64)
- Assume we know nothing about the EPOLL event types _except_
- that they describe bits in a set. */
- for (index = 0; index < 64; index++) {
- epoll_events[index] = ((EPOLLIN * ((index & 0x01) >> 0)) |
- (EPOLLOUT * ((index & 0x02) >> 1)) |
- (EPOLLPRI * ((index & 0x04) >> 2)) |
- (EPOLLERR * ((index & 0x08) >> 3)) |
- (EPOLLHUP * ((index & 0x10) >> 4)) |
- (EPOLLET * ((index & 0x20) >> 5)));
- }
-
- /* Get a pointer to an unaligned struct epoll_event */
- {
- char *unalign_ptr = event_mem;
-
- unalign_ptr =
- unalign_ptr + (((unsigned long)unalign_ptr & 1) ? 0 : 1);
- unaligned_event_ptr = (struct epoll_event *)unalign_ptr;
- }
-
- /* One of the fds we want to test is the valid one */
- epoll_fds[0] = epoll_fd;
-
- /* Test out all of the interesting combinations. This is going to
- take a while (in compute cycles). It took less than 1 minute to
- run on a PIII 500 without checking the results. */
- for (index = 0; index < 3; index++) {
- struct epoll_event *ev_ptr = NULL;
-
- switch (index) {
- case 0: /* Pass aligned struct */
- event.data.u64 = 0;
- ev_ptr = &event;
- break;
- case 1: /* Pass unaligned struct */
- unaligned_event_ptr->data.u64 = 0;
- ev_ptr = unaligned_event_ptr;
- break;
- case 2:
- default: /* Pass NULL ptr */
- ev_ptr = NULL;
- break;
- }
-
- for (epfd_index = 0;
- epfd_index < (sizeof(epoll_fds) / sizeof(int));
- epfd_index++) {
- for (event_index = 0;
- event_index < (sizeof(epoll_events) / sizeof(int));
- event_index++) {
- for (fd_index = 0;
- fd_index < (sizeof(fds) / sizeof(int));
- fd_index++) {
- /* Now epoll_fd is a descriptor that references the set of
- file descriptors we are interested in. Next we test epoll_ctl */
- for (op_index = 0;
- op_index <
- (sizeof(epoll_ctl_ops) /
- sizeof(int)); op_index++) {
- int result;
- int expected_errno = 0;
- int num_errors_expected = 0;
-
- if (ev_ptr != NULL)
- ev_ptr->events =
- epoll_events
- [event_index];
-
- /* Perform the call itself. Put it in a protected region which
- returns -1 in the variable result if a protection violation
- occurs (see PROTECT_REGION_END for the result) */
- PROTECT_REGION_START errno = 0;
-
- /* NOTE that we are assuming that epoll will operate across
- a fork() call such that a subsequent fork() in the parent
- will also manipulate the same set */
- result =
- epoll_ctl(epoll_fds
- [epfd_index],
- epoll_ctl_ops
- [op_index],
- fds[fd_index],
- ev_ptr);
-
- /* We can't test errno resulting from the epoll_ctl call outside of
- the PROTECT_REGION hence we do not have a PROTECT_REGION_END
- here */
-
- /*
- Test the results. Look for appropriate error conditions
- */
-
- /* Check the epfd */
- if (epoll_fds[epfd_index] !=
- epoll_fd) {
- /* Expect an error */
- if (epoll_fds
- [epfd_index] == 0)
- expected_errno =
- EINVAL;
- else /* epfd is not a valid file descriptor since it is
- neither epoll_fd nor stdin */
- expected_errno =
- EBADF;
- num_errors_expected++;
- }
-
- switch (epoll_ctl_ops[op_index]) {
- case EPOLL_CTL_ADD:
- case EPOLL_CTL_MOD:
- case EPOLL_CTL_DEL:
- break;
- default: /* Expect an error */
- expected_errno = EINVAL;
- num_errors_expected++;
- break;
- }
-
- expected_errno = EPERM;
- num_errors_expected++;
-
- if (ev_ptr == NULL) {
- expected_errno = EINVAL;
- num_errors_expected++;
- } else if ((ev_ptr == &event)
- || (ev_ptr ==
- unaligned_event_ptr))
- {
- if (ev_ptr->events == 0) {
- expected_errno =
- EINVAL;
- num_errors_expected++;
- }
-
- for (index = 1;
- index < 64;
- index++) {
- if ((int)ev_ptr->events != epoll_events[index]) {
- expected_errno
- =
- EINVAL;
- num_errors_expected++;
- }
- }
- } else {
- /* Do not expect an error */
- }
-
- if (num_errors_expected == 0) {
- /* We did not expect an error */
- if (result == 0) {
- /* We didn't get an error. Think of this as RES_PASS_RETV_MAT_ERRNO_IGN */
- return RES_PASS;
- } else if (result == -1) { /* The return value is -1, so it's not bad */
- return
- RES_FAIL_RETV_MIS_ERRNO_IGN;
- } else {
- return
- RES_FAIL_RETV_BAD_ERRNO_IGN;
- }
- } else if (num_errors_expected
- == 1) {
- /* We expected an error */
- if (result == 0) {
- return RES_FAIL_RETV_MIS_ERRNO_IGN; /* Unexpected success */
- } else if (result == -1) {
- /* We got an error. Check errno */
- if (errno ==
- expected_errno)
- {
- return RES_PASS; /* think of this as RETV_MAT_ERRNO_MAT */
- } else {
- return
- RES_FAIL_RETV_MAT_ERRNO_MIS;
- }
- } else {
- /* We got a bad return code! Interpret this as
- getting an error and check errno. */
- if (errno ==
- expected_errno)
- return
- RES_FAIL_RETV_BAD_ERRNO_MAT;
- else
- return
- RES_FAIL_RETV_BAD_ERRNO_MIS;
- }
- } else if (num_errors_expected >
- 1) {
- /* We expected multiple errors */
- if (result == 0) {
- return RES_FAIL_RETV_MIS_ERRNO_IGN; /* Unexpected success */
- } else if (result == -1) {
- /* We got an error. Check errno */
- if (errno ==
- expected_errno)
- {
- return RES_PASS; /* think of this as RETV_MAT_ERRNO_MAT */
- } else {
- /* Ignore errno because the desired value is unknowable
- without looking at the structure of the code. */
- return
- RES_PASS_RETV_MAT_ERRNO_IGN;
- }
- } else {
- /* We got a bad return code! Interpret this as
- getting an error and check errno. */
- if (errno ==
- expected_errno)
- /* Don't Ignore errno because the desired value
- happened to match what we expected. */
- return
- RES_FAIL_RETV_BAD_ERRNO_MAT;
- else
- /* Ignore errno because the desired value is unknowable
- without looking at the structure of the code. */
- return
- RES_FAIL_RETV_BAD_ERRNO_IGN;
- }
- }
-
- /* All "return"s between PROTECT_REGION_BEGIN
- and PROTECT_REGION_END place their value in
- the result parameter. If the region caused
- a protection violation (segfault or otherwise)
- then the result is set to the second parameter's
- value (-1 in this case). */
- PROTECT_REGION_END(result, -1);
-
- /* Count the number of tests run */
- num_epoll_ctl_test_calls++;
-
- /* Now test the result */
- if (!((result == RES_PASS)
- || (result ==
- RES_PASS_RETV_MAT_ERRNO_IGN)))
- {
- if (result >
- (int)(sizeof(result_strings) /
- sizeof(const char
- *))) {
- /* Returned a result which has no corresponding text description */
- EPOLL_CTL_TEST_FAIL
- ("FIXME FIX ME BUG in Test Program itself!");
- } else {
- if (result == -1) /* Segfault during epoll_ctl call */
- EPOLL_CTL_TEST_FAIL
- ("Test arguments caused abnormal exit.");
- else /* The 'normal' failure */
- EPOLL_CTL_TEST_FAIL
- ((result_strings[result]));
- }
- num_epoll_ctl_test_fails++;
-#ifdef DEBUG
- } else /* The call of epoll_ctl behaved as expected */
- EPOLL_CTL_TEST_PASS((result_strings[result]));
-#else
- }
-#endif
- }
- }
- }
- }
- close(epoll_fd);
- }
-
- tst_resm(TINFO,
- "Summary: Of %d tests, epoll_ctl failed %d (%3.0f%% passed).",
- num_epoll_ctl_test_calls, num_epoll_ctl_test_fails,
- ((float)(num_epoll_ctl_test_calls - num_epoll_ctl_test_fails) *
- 100.0f / (float)num_epoll_ctl_test_calls));
- return (num_epoll_ctl_test_fails / num_epoll_ctl_test_calls);
-}
-
-int main(void)
-{
- int epoll_fd;
- struct timeval tv;
- int last_result;
-
- tst_resm(TINFO, "testing if epoll() system call works");
-
- /* Get the current time */
- if (gettimeofday(&tv, NULL) != 0) {
- tst_brkm(TBROK | TERRNO, NULL, "gettimeofday failed");
- } else {
- tst_resm(TINFO, "gettimeofday() works");
- }
-
- /* Set up RNG */
- srand(tv.tv_usec);
- tst_resm(TINFO,
- "random number seeded with gettimeofday() [seed = %ld] works",
- tv.tv_usec);
-
- tst_resm(TINFO, "Testing epoll_create");
- /* Testing epoll_create with some different sizes */
- last_result = PROTECT_FUNC(test_epoll_create, -1, NUM_RAND_ATTEMPTS);
- if (last_result != 0) {
- /* create test(s) failed */
- }
-
- /* Create an epoll_fd for testing epoll_ctl */
- epoll_fd = epoll_create(BACKING_STORE_SIZE_HINT);
- if (epoll_fd < 0) {
- tst_brkm(TFAIL | TERRNO, NULL, "epoll_create failed");
- }
-
- tst_resm(TINFO, "Testing epoll_ctl");
- last_result = PROTECT_FUNC(test_epoll_ctl, -1, epoll_fd);
- if (last_result != 0) {
- /* ctl test(s) failed */
- }
-
- tst_exit();
-}
-
-#else
-
-int main(void)
-{
- tst_brkm(TCONF, NULL, "No epoll support found.");
-}
-
-#endif
--
2.52.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
prev parent reply other threads:[~2026-04-23 10:01 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-23 9:58 [LTP] [PATCH 0/8] Add more epoll tests Cyril Hrubis
2026-04-23 9:58 ` [LTP] [PATCH 1/8] syscalls: Add epoll_create03 Cyril Hrubis
2026-04-23 11:17 ` [LTP] " linuxtestproject.agent
2026-04-23 11:47 ` Cyril Hrubis
2026-04-23 9:58 ` [LTP] [PATCH 2/8] syscalls: Add epoll_wait08 Cyril Hrubis
2026-04-23 9:58 ` [LTP] [PATCH 3/8] syscalls: Add epoll_wait09 Cyril Hrubis
2026-04-23 9:58 ` [LTP] [PATCH 4/8] syscalls: Add epoll_ctl06 Cyril Hrubis
2026-04-23 9:58 ` [LTP] [PATCH 5/8] syscall: Add epoll_wait10 Cyril Hrubis
2026-04-23 9:58 ` [LTP] [PATCH 6/8] syscalls: Add epoll_wait11 Cyril Hrubis
2026-04-23 9:58 ` [LTP] [PATCH 7/8] syscalls: Add epoll_wait12 Cyril Hrubis
2026-04-23 9:58 ` Cyril Hrubis [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260423095834.11932-9-chrubis@suse.cz \
--to=chrubis@suse.cz \
--cc=ltp@lists.linux.it \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox