aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMina Chou <minachou@andestech.com>2024-03-28 16:33:44 +0800
committerPetr Vorel <petr.vorel@gmail.com>2024-05-15 08:55:47 +0200
commit76c8c04b5d856829e990698aaf8a293091827b74 (patch)
tree0c5d60fb10b4ada498e989b82c8f928053e57a07
parent7fd200fc3633e80ff4c9d0f2d05081d32a38fc63 (diff)
downloadltp-76c8c04b5d856829e990698aaf8a293091827b74.tar.gz
setitimer: Pass the kernel-defined struct __kernel_old_itimerval to sys_setitimer()
The setitimer01 tests fail on RV32 due to incompatible parameter definitions. 'value' and 'ovalue' are defined by glibc as itimerval (64-bit time_t on RV32), while the kernel expects __kernel_old_itimerval (32-bit time_t on RV32) for the setitimer syscall[1]. This discrepancy leads to incorrect 'ovalue' and test failures. Thus, the kernel-defined __kernel_old_itimerval should be used. [1] https://sourceware.org/git/?p=glibc.git;a=commit;h=a51e03588937ad804a9f583ea3d0fc0a4d088c33 Link: https://lore.kernel.org/ltp/20240328083344.277502-1-minachou@andestech.com/ Reviewed-by: Petr Vorel <pvorel@suse.cz> Reviewed-by: Cyril Hrubis <chrubis@suse.cz> Signed-off-by: Hui Min Mina Chou <minachou@andestech.com>
-rw-r--r--configure.ac3
-rw-r--r--include/tst_timer.h12
-rw-r--r--testcases/kernel/syscalls/setitimer/setitimer01.c8
-rw-r--r--testcases/kernel/syscalls/setitimer/setitimer02.c12
4 files changed, 20 insertions, 15 deletions
diff --git a/configure.ac b/configure.ac
index 6d7009763..85c5739c4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -221,7 +221,8 @@ AC_CHECK_TYPES([struct xt_entry_match, struct xt_entry_target],,,[
])
AC_CHECK_TYPES([struct __kernel_old_timeval, struct __kernel_old_timespec, struct __kernel_timespec,
- struct __kernel_old_itimerspec, struct __kernel_itimerspec],,,[#include <sys/socket.h>])
+ struct __kernel_old_itimerspec, struct __kernel_itimerspec,
+ struct __kernel_old_itimerval],,,[#include <sys/socket.h>])
AC_CHECK_TYPES([struct futex_waitv],,,[#include <linux/futex.h>])
AC_CHECK_TYPES([struct mount_attr],,,[
diff --git a/include/tst_timer.h b/include/tst_timer.h
index 703f03294..6fb940020 100644
--- a/include/tst_timer.h
+++ b/include/tst_timer.h
@@ -135,6 +135,13 @@ struct __kernel_itimerspec {
struct __kernel_timespec it_value; /* timer expiration */
};
#endif
+
+#ifndef HAVE_STRUCT___KERNEL_OLD_ITIMERVAL
+struct __kernel_old_itimerval {
+ struct __kernel_old_timeval it_interval; /* timer interval */
+ struct __kernel_old_timeval it_value; /* current value */
+};
+#endif
#endif
enum tst_ts_type {
@@ -370,6 +377,11 @@ static inline int sys_timerfd_settime64(int fd, int flags, void *its,
return tst_syscall(__NR_timerfd_settime64, fd, flags, its, old_its);
}
+static inline int sys_setitimer(int which, void *new_value, void *old_value)
+{
+ return tst_syscall(__NR_setitimer, which, new_value, old_value);
+}
+
/*
* Returns tst_ts seconds.
*/
diff --git a/testcases/kernel/syscalls/setitimer/setitimer01.c b/testcases/kernel/syscalls/setitimer/setitimer01.c
index d12abe904..94ee51c6a 100644
--- a/testcases/kernel/syscalls/setitimer/setitimer01.c
+++ b/testcases/kernel/syscalls/setitimer/setitimer01.c
@@ -20,9 +20,10 @@
#include "tst_test.h"
#include "lapi/syscalls.h"
#include "tst_safe_clocks.h"
+#include "tst_timer.h"
static struct timeval tv;
-static struct itimerval *value, *ovalue;
+static struct __kernel_old_itimerval *value, *ovalue;
static volatile unsigned long sigcnt;
static long time_step;
static long time_sec;
@@ -38,11 +39,6 @@ static struct tcase {
{ITIMER_PROF, "ITIMER_PROF", SIGPROF},
};
-static int sys_setitimer(int which, void *new_value, void *old_value)
-{
- return tst_syscall(__NR_setitimer, which, new_value, old_value);
-}
-
static void sig_routine(int signo LTP_ATTRIBUTE_UNUSED)
{
sigcnt++;
diff --git a/testcases/kernel/syscalls/setitimer/setitimer02.c b/testcases/kernel/syscalls/setitimer/setitimer02.c
index b012d71fa..c545f6288 100644
--- a/testcases/kernel/syscalls/setitimer/setitimer02.c
+++ b/testcases/kernel/syscalls/setitimer/setitimer02.c
@@ -19,13 +19,9 @@
#include <stdlib.h>
#include "tst_test.h"
#include "lapi/syscalls.h"
+#include "tst_timer.h"
-static struct itimerval *value, *ovalue;
-
-static int sys_setitimer(int which, void *new_value, void *old_value)
-{
- return tst_syscall(__NR_setitimer, which, new_value, old_value);
-}
+static struct __kernel_old_itimerval *value, *ovalue;
static void verify_setitimer(unsigned int i)
{
@@ -55,8 +51,8 @@ static struct tst_test test = {
.test = verify_setitimer,
.setup = setup,
.bufs = (struct tst_buffers[]) {
- {&value, .size = sizeof(struct itimerval)},
- {&ovalue, .size = sizeof(struct itimerval)},
+ {&value, .size = sizeof(struct __kernel_old_itimerval)},
+ {&ovalue, .size = sizeof(struct __kernel_old_itimerval)},
{}
}
};