[LTP] [PATCH v8] semctl01: fix SEM_STAT failures under parallel LTP runs
Stephen Bertram
sbertram@redhat.com
Wed Jul 29 16:53:17 CEST 2026
SEM_STAT was using the global high index from IPC_INFO, which is not
stable when other IPC tests run in parallel and can abort the test with
TBROK.
Signed-off-by: Stephen Bertram <sbertram@redhat.com>
---
Test: ./kirk -w 4 -f syscalls_32 -p semctl01 -i 1000
Before changes:
Total runs: 32000
Runtime: 16m 32s
Passed: 415968
Failed: 0
Skipped: 0
Broken: 16
Warnings: 0
After changes:
Total runs: 32000
Runtime: 16m 34s
Passed: 416000
Failed: 0
Skipped: 0
Broken: 0
Warnings: 0
Assisted-by: Cursor
testcases/kernel/syscalls/semctl/semctl01.c | 40 ++++++++++++++++-----
1 file changed, 32 insertions(+), 8 deletions(-)
diff --git a/testcases/kernel/syscalls/semctl/semctl01.c b/testcases/kernel/syscalls/semctl/semctl01.c
index 5bd675ab6..151061995 100644
--- a/testcases/kernel/syscalls/semctl/semctl01.c
+++ b/testcases/kernel/syscalls/semctl/semctl01.c
@@ -210,13 +210,10 @@ static void func_rmid(void)
static void func_iinfo(int hidx)
{
- if (hidx >= 0) {
- sem_index = hidx;
+ if (hidx >= 0)
tst_res(TPASS, "the highest index is correct");
- } else {
- sem_index = 0;
+ else
tst_res(TFAIL, "the highest index is incorrect");
- }
}
static void func_sinfo(void)
@@ -229,10 +226,10 @@ static void func_sinfo(void)
static void func_sstat(int semidx)
{
- if (semidx >= 0)
+ if (semidx == sem_id)
tst_res(TPASS, "id of the semaphore set is correct");
else
- tst_res(TFAIL, "id of the semaphore set is incorrect");
+ tst_res(TFAIL, "expected sem_id %d, got %d", sem_id, semidx);
}
static struct tcases {
@@ -258,13 +255,40 @@ static struct tcases {
{&sem_id, 0, IPC_RMID, func_rmid, SEMUN_CAST & buf, NULL},
};
+/*
+ * SEM_STAT takes an index into the kernel's internal array, not a semid.
+ * Return the index that maps to this test's set.
+ */
+static int get_sem_idx_from_id(int id)
+{
+ struct seminfo info;
+ struct semid_ds dummy_ds;
+ union semun arg;
+ int max_idx, i;
+
+ arg.__buf = &info;
+ max_idx = SAFE_SEMCTL(id, 0, SEM_INFO, arg);
+
+ arg.buf = &dummy_ds;
+ for (i = 0; i <= max_idx; i++) {
+ if (semctl(i, 0, SEM_STAT, arg) == id)
+ return i;
+ }
+
+ return -1;
+}
+
static void verify_semctl(unsigned int n)
{
struct tcases *tc = &tests[n];
int rval;
- if (sem_id == -1)
+ if (sem_id == -1) {
sem_id = SAFE_SEMGET(IPC_PRIVATE, PSEMS, IPC_CREAT | IPC_EXCL | SEM_RA);
+ sem_index = get_sem_idx_from_id(sem_id);
+ if (sem_index < 0)
+ tst_brk(TBROK, "Failed to get sem_id to idx mapping");
+ }
if (tc->func_setup) {
switch (tc->cmd) {
case GETNCNT:
--
2.55.0
More information about the ltp
mailing list