git: ce9f8d6ab00c - main - linux(4): Implement timerfd_gettime64 syscall.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 04 May 2022 10:08:20 UTC
The branch main has been updated by dchagin:
URL: https://cgit.FreeBSD.org/src/commit/?id=ce9f8d6ab00c491f84a021b23a28a1484ef817d8
commit ce9f8d6ab00c491f84a021b23a28a1484ef817d8
Author: Dmitry Chagin <dchagin@FreeBSD.org>
AuthorDate: 2022-05-04 10:06:52 +0000
Commit: Dmitry Chagin <dchagin@FreeBSD.org>
CommitDate: 2022-05-04 10:06:52 +0000
linux(4): Implement timerfd_gettime64 syscall.
MFC after: 2 weeks
---
sys/amd64/linux32/linux32_dummy_machdep.c | 1 -
sys/compat/linux/linux_event.c | 44 +++++++++++++++++++++++++------
sys/i386/linux/linux_dummy_machdep.c | 1 -
3 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/sys/amd64/linux32/linux32_dummy_machdep.c b/sys/amd64/linux32/linux32_dummy_machdep.c
index 6b264e2891f1..0cc1cd581c32 100644
--- a/sys/amd64/linux32/linux32_dummy_machdep.c
+++ b/sys/amd64/linux32/linux32_dummy_machdep.c
@@ -68,7 +68,6 @@ DUMMY(mq_getsetattr);
DUMMY(arch_prctl);
/* Linux 5.0: */
DUMMY(clock_adjtime64);
-DUMMY(timerfd_gettime64);
DUMMY(io_pgetevents_time64);
DUMMY(recvmmsg_time64);
DUMMY(mq_timedsend_time64);
diff --git a/sys/compat/linux/linux_event.c b/sys/compat/linux/linux_event.c
index 09c6391f88d2..5e62848303f1 100644
--- a/sys/compat/linux/linux_event.c
+++ b/sys/compat/linux/linux_event.c
@@ -901,16 +901,14 @@ linux_timerfd_curval(struct timerfd *tfd, struct itimerspec *ots)
}
}
-int
-linux_timerfd_gettime(struct thread *td, struct linux_timerfd_gettime_args *args)
+static int
+linux_timerfd_gettime_common(struct thread *td, int fd, struct itimerspec *ots)
{
- struct l_itimerspec lots;
- struct itimerspec ots;
struct timerfd *tfd;
struct file *fp;
int error;
- error = fget(td, args->fd, &cap_read_rights, &fp);
+ error = fget(td, fd, &cap_read_rights, &fp);
if (error != 0)
return (error);
tfd = fp->f_data;
@@ -920,17 +918,47 @@ linux_timerfd_gettime(struct thread *td, struct linux_timerfd_gettime_args *args
}
mtx_lock(&tfd->tfd_lock);
- linux_timerfd_curval(tfd, &ots);
+ linux_timerfd_curval(tfd, ots);
mtx_unlock(&tfd->tfd_lock);
+out:
+ fdrop(fp, td);
+ return (error);
+}
+
+int
+linux_timerfd_gettime(struct thread *td, struct linux_timerfd_gettime_args *args)
+{
+ struct l_itimerspec lots;
+ struct itimerspec ots;
+ int error;
+
+ error = linux_timerfd_gettime_common(td, args->fd, &ots);
+ if (error != 0)
+ return (error);
error = native_to_linux_itimerspec(&lots, &ots);
if (error == 0)
error = copyout(&lots, args->old_value, sizeof(lots));
+ return (error);
+}
-out:
- fdrop(fp, td);
+#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
+int
+linux_timerfd_gettime64(struct thread *td, struct linux_timerfd_gettime64_args *args)
+{
+ struct l_itimerspec64 lots;
+ struct itimerspec ots;
+ int error;
+
+ error = linux_timerfd_gettime_common(td, args->fd, &ots);
+ if (error != 0)
+ return (error);
+ error = native_to_linux_itimerspec64(&lots, &ots);
+ if (error == 0)
+ error = copyout(&lots, args->old_value, sizeof(lots));
return (error);
}
+#endif
static int
linux_timerfd_settime_common(struct thread *td, int fd, int flags,
diff --git a/sys/i386/linux/linux_dummy_machdep.c b/sys/i386/linux/linux_dummy_machdep.c
index f5852e97ddae..4619fa226a72 100644
--- a/sys/i386/linux/linux_dummy_machdep.c
+++ b/sys/i386/linux/linux_dummy_machdep.c
@@ -70,7 +70,6 @@ DUMMY(vm86old);
DUMMY(arch_prctl);
/* Linux 5.0: */
DUMMY(clock_adjtime64);
-DUMMY(timerfd_gettime64);
DUMMY(io_pgetevents_time64);
DUMMY(recvmmsg_time64);
DUMMY(mq_timedsend_time64);