<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 8, 2020 at 12:28 PM Viresh Kumar <<a href="mailto:viresh.kumar@linaro.org">viresh.kumar@linaro.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This adds support for semtimedop() and its time64 variant to the<br>
existing semop() syscall tests.<br>
<br>
Signed-off-by: Viresh Kumar <<a href="mailto:viresh.kumar@linaro.org" target="_blank">viresh.kumar@linaro.org</a>><br>
---<br>
 testcases/kernel/syscalls/ipc/semop/semop.h   | 52 +++++++++++++++++++<br>
 testcases/kernel/syscalls/ipc/semop/semop01.c | 11 +++-<br>
 testcases/kernel/syscalls/ipc/semop/semop02.c | 12 ++++-<br>
 testcases/kernel/syscalls/ipc/semop/semop03.c | 12 ++++-<br>
 testcases/kernel/syscalls/ipc/semop/semop04.c | 12 ++++-<br>
 testcases/kernel/syscalls/ipc/semop/semop05.c | 12 ++++-<br>
 6 files changed, 106 insertions(+), 5 deletions(-)<br>
 create mode 100644 testcases/kernel/syscalls/ipc/semop/semop.h<br>
<br>
diff --git a/testcases/kernel/syscalls/ipc/semop/semop.h b/testcases/kernel/syscalls/ipc/semop/semop.h<br>
new file mode 100644<br>
index 000000000000..8d1245b65ec0<br>
--- /dev/null<br>
+++ b/testcases/kernel/syscalls/ipc/semop/semop.h<br>
@@ -0,0 +1,52 @@<br>
+// SPDX-License-Identifier: GPL-2.0-or-later<br>
+<br>
+#ifndef SEMOP_VAR__<br>
+#define SEMOP_VAR__<br>
+<br>
+#include <sys/sem.h><br>
+#include "tst_timer.h"<br>
+#include "lapi/abisize.h"<br>
+<br>
+static inline int sys_semtimedop(int semid, struct sembuf *sops, size_t nsops,<br>
+               void *timeout)<br>
+{<br>
+       return tst_syscall(__NR_semtimedop, semid, sops, nsops, timeout);<br>
+}<br>
+<br>
+static inline int sys_semtimedop_time64(int semid, struct sembuf *sops,<br>
+                                       size_t nsops, void *timeout)<br>
+{<br>
+       return tst_syscall(__NR_semtimedop_time64, semid, sops, nsops, timeout);<br>
+}<br>
+<br>
+struct test_variants {<br>
+       int (*semop)(int semid, struct sembuf *sops, size_t nsops);<br>
+       int (*semtimedop)(int semid, struct sembuf *sops, size_t nsops, void *timeout);<br>
+       enum tst_ts_type type;<br>
+       char *desc;<br>
+} variants[] = {<br>
+       { .semop = semop, .type = TST_LIBC_TIMESPEC, .desc = "semop: vDSO or syscall"},<br>
+#if defined(TST_ABI32)<br>
+       { .semtimedop = sys_semtimedop, .type = TST_LIBC_TIMESPEC, .desc = "semtimedop: syscall with libc spec"},<br>
+       { .semtimedop = sys_semtimedop, .type = TST_KERN_OLD_TIMESPEC, .desc = "semtimedop: syscall with kernel spec32"},<br>
+#endif<br>
+<br>
+#if defined(TST_ABI64)<br>
+       { .semtimedop = sys_semtimedop, .type = TST_KERN_TIMESPEC, .desc = "semtimedop: syscall with kernel spec64"},<br>
+#endif<br>
+<br>
+#if (__NR_semtimedop_time64 != __LTP__NR_INVALID_SYSCALL)<br>
+       { .semtimedop = sys_semtimedop_time64, .type = TST_KERN_TIMESPEC, .desc = "semtimedop: syscall time64 with kernel spec64"},<br>
+#endif<br>
+};<br>
+<br>
+static inline int call_semop(struct test_variants *tv, int semid,<br>
+               struct sembuf *sops, size_t nsops, struct tst_ts *timeout)<br>
+{<br>
+       if (tv->semop)<br>
+               return tv->semop(semid, sops, nsops);<br>
+<br>
+       return tv->semtimedop(semid, sops, nsops, tst_ts_get(timeout));<br>
+}<br>
+<br>
+#endif /* SEMOP_VAR__ */<br>
diff --git a/testcases/kernel/syscalls/ipc/semop/semop01.c b/testcases/kernel/syscalls/ipc/semop/semop01.c<br>
index bcb45fa69320..a4924376e32c 100644<br>
--- a/testcases/kernel/syscalls/ipc/semop/semop01.c<br>
+++ b/testcases/kernel/syscalls/ipc/semop/semop01.c<br>
@@ -41,6 +41,7 @@<br>
 #include "tst_test.h"<br>
 #include "libnewipc.h"<br>
 #include "lapi/semun.h"<br>
+#include "semop.h"<br>
<br>
 #define NSEMS  4               /* the number of primitive semaphores to test */<br>
<br>
@@ -52,11 +53,16 @@ static struct sembuf sops[PSEMS];<br>
<br>
 static void run(void)<br>
 {<br>
+       struct test_variants *tv = &variants[tst_variant];<br>
        union semun arr = { .val = 0 };<br>
+       struct tst_ts timeout;<br>
        int fail = 0;<br>
        int i;<br>
<br>
-       TEST(semop(sem_id, sops, NSEMS));<br>
+       timeout.type = tv->type;<br>
+       tst_ts_set_nsec(&timeout, 10000);<br>
+<br>
+       TEST(call_semop(tv, sem_id, sops, NSEMS, &timeout));<br>
<br>
        if (TST_RET == -1) {<br>
                tst_res(TFAIL | TTERRNO, "semop() failed");<br>
@@ -94,6 +100,8 @@ static void setup(void)<br>
 {<br>
        int i;<br>
<br>
+       tst_res(TINFO, "Testing variant: %s", variants[tst_variant].desc);<br>
+<br>
        get_arr.array = malloc(sizeof(unsigned short int) * PSEMS);<br>
        if (get_arr.array == NULL)<br>
                tst_brk(TBROK, "malloc failed");<br>
@@ -124,6 +132,7 @@ static void cleanup(void)<br>
<br>
 static struct tst_test test = {<br>
        .test_all = run,<br>
+       .test_variants = ARRAY_SIZE(variants),<br>
        .setup = setup,<br>
        .cleanup = cleanup,<br>
        .needs_tmpdir = 1,<br>
diff --git a/testcases/kernel/syscalls/ipc/semop/semop02.c b/testcases/kernel/syscalls/ipc/semop/semop02.c<br>
index f24d284776a4..a51906340400 100644<br>
--- a/testcases/kernel/syscalls/ipc/semop/semop02.c<br>
+++ b/testcases/kernel/syscalls/ipc/semop/semop02.c<br>
@@ -20,6 +20,7 @@<br>
 #include "tst_test.h"<br>
 #include "libnewipc.h"<br>
 #include "lapi/semun.h"<br>
+#include "semop.h"<br>
<br>
 static int sem_id_1 = -1;      /* a semaphore set with read & alter permissions */<br>
 static int sem_id_2 = -1;      /* a semaphore set without read & alter permissions */<br>
@@ -52,6 +53,8 @@ static void setup(void)<br>
        struct seminfo ipc_buf;<br>
        union semun arr;<br>
<br>
+       tst_res(TINFO, "Testing variant: %s", variants[tst_variant].desc);<br>
+<br>
        ltpuser = SAFE_GETPWNAM(nobody_uid);<br>
        SAFE_SETUID(ltpuser->pw_uid);<br>
<br>
@@ -84,7 +87,13 @@ static void setup(void)<br>
<br>
 static void run(unsigned int i)<br>
 {<br>
-       TEST(semop(*(tc[i].semid), tc[i].t_sbuf, tc[i].t_ops));<br>
+       struct test_variants *tv = &variants[tst_variant];<br>
+       struct tst_ts timeout;<br>
+<br>
+       timeout.type = tv->type;<br>
+       tst_ts_set_nsec(&timeout, 10000);<br>
+<br>
+       TEST(call_semop(tv, *(tc[i].semid), tc[i].t_sbuf, tc[i].t_ops, &timeout));<br>
<br>
        if (TST_RET != -1) {<br>
                tst_res(TFAIL | TTERRNO, "call succeeded unexpectedly");<br>
@@ -117,6 +126,7 @@ static void cleanup(void)<br>
 static struct tst_test test = {<br>
        .test = run,<br>
        .tcnt = ARRAY_SIZE(tc),<br>
+       .test_variants = ARRAY_SIZE(variants),<br>
        .setup = setup,<br>
        .cleanup = cleanup,<br>
        .needs_tmpdir = 1,<br>
diff --git a/testcases/kernel/syscalls/ipc/semop/semop03.c b/testcases/kernel/syscalls/ipc/semop/semop03.c<br>
index 4f5f78eb6d8d..d36194ce1f41 100644<br>
--- a/testcases/kernel/syscalls/ipc/semop/semop03.c<br>
+++ b/testcases/kernel/syscalls/ipc/semop/semop03.c<br>
@@ -38,6 +38,7 @@<br>
 #include "tst_test.h"<br>
 #include "libnewipc.h"<br>
 #include "lapi/semun.h"<br>
+#include "semop.h"<br>
<br>
 static key_t semkey;<br>
 static int sem_id = -1;<br>
@@ -47,6 +48,12 @@ static int tc[] = { -1, PSEMS + 1 }; /* negative and too many "primitive" semas<br>
<br>
 static void run(unsigned int i)<br>
 {<br>
+       struct test_variants *tv = &variants[tst_variant];<br>
+       struct tst_ts timeout;<br>
+<br>
+       timeout.type = tv->type;<br>
+       tst_ts_set_nsec(&timeout, 10000);<br>
+<br>
        /* initialize two fields in the sembuf structure here */<br>
        s_buf.sem_op = 1;       /* add this value to struct sem.semval */<br>
        s_buf.sem_flg = SEM_UNDO;       /* undo when process exits */<br>
@@ -61,7 +68,7 @@ static void run(unsigned int i)<br>
         * use the TEST macro to make the call<br>
         */<br>
<br>
-       TEST(semop(sem_id, &s_buf, 1));<br>
+       TEST(call_semop(tv, sem_id, &s_buf, 1, &timeout));<br>
<br>
        if (TST_RET != -1) {<br>
                tst_res(TFAIL | TTERRNO, "call succeeded unexpectedly");<br>
@@ -80,6 +87,8 @@ static void run(unsigned int i)<br>
<br>
 static void setup(void)<br>
 {<br>
+       tst_res(TINFO, "Testing variant: %s", variants[tst_variant].desc);<br>
+<br>
        /* get an IPC resource key */<br>
        semkey = GETIPCKEY();<br>
<br>
@@ -102,6 +111,7 @@ static void cleanup(void)<br>
 static struct tst_test test = {<br>
        .test = run,<br>
        .tcnt = ARRAY_SIZE(tc),<br>
+       .test_variants = ARRAY_SIZE(variants),<br>
        .setup = setup,<br>
        .cleanup = cleanup,<br>
        .needs_tmpdir = 1,<br>
diff --git a/testcases/kernel/syscalls/ipc/semop/semop04.c b/testcases/kernel/syscalls/ipc/semop/semop04.c<br>
index 0faf00a3585f..033065e7bbfc 100644<br>
--- a/testcases/kernel/syscalls/ipc/semop/semop04.c<br>
+++ b/testcases/kernel/syscalls/ipc/semop/semop04.c<br>
@@ -38,6 +38,7 @@<br>
 #include "tst_test.h"<br>
 #include "libnewipc.h"<br>
 #include "lapi/semun.h"<br>
+#include "semop.h"<br>
<br>
 static int sem_id = -1;<br>
 static int val; /* value for SETVAL */<br>
@@ -62,6 +63,12 @@ static struct test_case_t {<br>
<br>
 static void run(unsigned int i)<br>
 {<br>
+       struct test_variants *tv = &variants[tst_variant];<br>
+       struct tst_ts timeout;<br>
+<br>
+       timeout.type = tv->type;<br>
+       tst_ts_set_nsec(&timeout, 10000);<br>
+<br>
        /* initialize the s_buf buffer */<br>
        s_buf.sem_op = tc[i].op;<br>
        s_buf.sem_flg = tc[i].flg;<br>
@@ -72,7 +79,7 @@ static void run(unsigned int i)<br>
        if (semctl(sem_id, tc[i].num, SETVAL, tc[i].get_arr) == -1)<br>
                tst_brk(TBROK | TERRNO, "semctl() failed");<br>
<br>
-       TEST(semop(sem_id, &s_buf, 1));<br>
+       TEST(call_semop(tv, sem_id, &s_buf, 1, &timeout));<br>
        if (TST_RET != -1) {<br>
                tst_res(TFAIL, "call succeeded unexpectedly");<br>
                return;<br>
@@ -86,6 +93,8 @@ static void run(unsigned int i)<br>
<br>
 static void setup(void)<br>
 {<br>
+       tst_res(TINFO, "Testing variant: %s", variants[tst_variant].desc);<br>
+<br>
        val = 1;<br>
<br>
        /* get an IPC resource key */<br>
@@ -114,6 +123,7 @@ static void cleanup(void)<br>
 static struct tst_test test = {<br>
        .test = run,<br>
        .tcnt = ARRAY_SIZE(tc),<br>
+       .test_variants = ARRAY_SIZE(variants),<br>
        .setup = setup,<br>
        .cleanup = cleanup,<br>
        .needs_tmpdir = 1,<br>
diff --git a/testcases/kernel/syscalls/ipc/semop/semop05.c b/testcases/kernel/syscalls/ipc/semop/semop05.c<br>
index 9e8e040b0b19..f892cd519ecf 100644<br>
--- a/testcases/kernel/syscalls/ipc/semop/semop05.c<br>
+++ b/testcases/kernel/syscalls/ipc/semop/semop05.c<br>
@@ -52,6 +52,7 @@<br>
 #include "tst_test.h"<br>
 #include "libnewipc.h"<br>
 #include "lapi/semun.h"<br>
+#include "semop.h"<br>
<br>
 static key_t semkey;<br>
 static int sem_id = -1;<br>
@@ -115,7 +116,13 @@ static inline int process_state_wait2(pid_t pid, const char state)<br>
<br>
 static void do_child(int i)<br>
 {<br>
-       TEST(semop(sem_id, &s_buf, 1));<br>
+       struct test_variants *tv = &variants[tst_variant];<br>
+       struct tst_ts timeout;<br>
+<br>
+       timeout.type = tv->type;<br>
+       tst_ts_set_nsec(&timeout, 10000);<br>
+<br>
+       TEST(call_semop(tv, sem_id, &s_buf, 1, &timeout));<br>
        if (TST_RET != -1) {<br>
                tst_res(TFAIL, "call succeeded when error expected");<br>
                exit(-1);<br>
@@ -137,6 +144,8 @@ static void sighandler(int sig)<br>
<br>
 static void setup(void)<br>
 {<br>
+       tst_res(TINFO, "Testing variant: %s", variants[tst_variant].desc);<br>
+<br>
        SAFE_SIGNAL(SIGHUP, sighandler);<br>
<br>
        /* get an IPC resource key */<br>
@@ -238,6 +247,7 @@ static void do_child_uclinux(void)<br>
 static struct tst_test test = {<br>
        .test = run,<br>
        .tcnt = ARRAY_SIZE(tc),<br>
+       .test_variants = ARRAY_SIZE(variants),<br></blockquote><div><div class="gmail_default" style="font-size:small"></div><br></div><div><div class="gmail_default" style="font-size:small">RHEL8.2(x84_64) failed as:</div><br></div><div><div class="gmail_default" style="font-size:small"># ./semop05 </div>tst_test.c:1246: INFO: Timeout per run is 0h 05m 00s<br>semop05.c:147: INFO: Testing variant: semop: vDSO or syscall<br>semop05.c:132: PASS: expected failure: EIDRM (43)<br>semop05.c:132: PASS: expected failure: EIDRM (43)<br>semop05.c:132: PASS: expected failure: EINTR (4)<br>semop05.c:132: PASS: expected failure: EINTR (4)<br>tst_test.c:1246: INFO: Timeout per run is 0h 05m 00s<br>semop05.c:147: INFO: Testing variant: semtimedop: syscall with kernel spec64<br>semop05.c:134: FAIL: unexpected failure: EAGAIN/EWOULDBLOCK (11)<br>Test timeouted, sending SIGKILL!<br>tst_test.c:1286: INFO: If you are running on slow machine, try exporting LTP_TIMEOUT_MUL > 1<br>tst_test.c:1287: BROK: Test killed! (timeout?)<br><br></div><div><div class="gmail_default" style="font-size:small"></div><div><br></div><div class="gmail_default" style="font-size:small">RHEL8.2(s390x) failed as:</div></div><div><br></div><div>tst_test.c:1246: INFO: Timeout per run is 0h 05m 00s<br>semop05.c:147: INFO: Testing variant: semop: vDSO or syscall<br>semop05.c:132: PASS: expected failure: EIDRM (43)<br>semop05.c:132: PASS: expected failure: EIDRM (43)<br>semop05.c:132: PASS: expected failure: EINTR (4)<br>semop05.c:132: PASS: expected failure: EINTR (4)<br>tst_test.c:1246: INFO: Timeout per run is 0h 05m 00s<br>semop05.c:147: INFO: Testing variant: semtimedop: syscall with kernel spec64<br>semop.h:13: CONF: syscall(392) __NR_semtimedop not supported<br>Test timeouted, sending SIGKILL!<br>tst_test.c:1286: INFO: If you are running on slow machine, try exporting LTP_TIMEOUT_MUL > 1<br>tst_test.c:1287: BROK: Test killed! (timeout?)<br class="gmail-Apple-interchange-newline"><div class="gmail_default" style="font-size:small"></div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
        .setup = setup,<br>
        .cleanup = cleanup,<br>
        .needs_tmpdir = 1,<br>
-- <br>
2.25.0.rc1.19.g042ed3e048af<br>
<br>
<br>
-- <br>
Mailing list info: <a href="https://lists.linux.it/listinfo/ltp" rel="noreferrer" target="_blank">https://lists.linux.it/listinfo/ltp</a><br>
<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>