[libbsd 14/22] Move select(), pselect(), and poll(), avoid VFS
Sebastian Huber
sebastian.huber at embedded-brains.de
Fri Jun 24 06:33:42 UTC 2022
Collecting all system calls in a single translation unit is not good due to the
library initialization through linker sets.
Partly revert commit 6514d561587fd1527fe6a26cb43e6b5742c8c779 in
"freebsd/sys/kern/sys_generic.c". The goal is to use USB, network, PCI, and
NVMe support without the VFS to reduce the memory and runtime overhead
introduced by VFS.
Avoid the VFS by providing a weak bwillwrite() implementation.
Update #4475.
---
freebsd/sys/kern/sys_generic.c | 111 +++++++++++++++++-
freebsd/sys/sys/sysproto.h | 4 +-
.../machine/rtems-bsd-kernel-namespace.h | 3 -
rtemsbsd/rtems/rtems-bsd-syscall-api.c | 86 --------------
4 files changed, 108 insertions(+), 96 deletions(-)
diff --git a/freebsd/sys/kern/sys_generic.c b/freebsd/sys/kern/sys_generic.c
index 1e5351a7..1c3bb714 100644
--- a/freebsd/sys/kern/sys_generic.c
+++ b/freebsd/sys/kern/sys_generic.c
@@ -77,6 +77,19 @@ __FBSDID("$FreeBSD$");
#endif
#include <security/audit/audit.h>
+#ifdef __rtems__
+#include <machine/rtems-bsd-syscall-api.h>
+
+static int kern_select(struct thread *, int, fd_set *, fd_set *,
+ fd_set *, struct timeval *, int);
+
+__weak_symbol void
+bwillwrite(void)
+{
+
+ /* Do not pull in the VFS support only through this translation unit */
+}
+#endif /* __rtems__ */
/*
* The following macro defines how many bytes will be allocated from
@@ -259,7 +272,6 @@ freebsd6_pread(struct thread *td, struct freebsd6_pread_args *uap)
return (kern_pread(td, uap->fd, uap->buf, uap->nbyte, uap->offset));
}
#endif
-#endif /* __rtems__ */
/*
* Scatter read system call.
@@ -284,6 +296,7 @@ sys_readv(struct thread *td, struct readv_args *uap)
free(auio, M_IOV);
return (error);
}
+#endif /* __rtems__ */
int
kern_readv(struct thread *td, int fd, struct uio *auio)
@@ -465,7 +478,6 @@ freebsd6_pwrite(struct thread *td, struct freebsd6_pwrite_args *uap)
return (kern_pwrite(td, uap->fd, uap->buf, uap->nbyte, uap->offset));
}
#endif
-#endif /* __rtems__ */
/*
* Gather write system call.
@@ -490,6 +502,7 @@ sys_writev(struct thread *td, struct writev_args *uap)
free(auio, M_IOV);
return (error);
}
+#endif /* __rtems__ */
int
kern_writev(struct thread *td, int fd, struct uio *auio)
@@ -865,6 +878,7 @@ poll_no_poll(int events)
return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
}
+#ifndef __rtems__
int
sys_pselect(struct thread *td, struct pselect_args *uap)
{
@@ -898,7 +912,6 @@ kern_pselect(struct thread *td, int nd, fd_set *in, fd_set *ou, fd_set *ex,
{
int error;
-#ifndef __rtems__
if (uset != NULL) {
error = kern_sigprocmask(td, SIG_SETMASK, uset,
&td->td_oldsigmask, 0);
@@ -914,7 +927,6 @@ kern_pselect(struct thread *td, int nd, fd_set *in, fd_set *ou, fd_set *ex,
td->td_flags |= TDF_ASTPENDING;
thread_unlock(td);
}
-#endif /* __rtems__ */
error = kern_select(td, nd, in, ou, ex, tvp, abi_nfdbits);
return (error);
}
@@ -943,6 +955,7 @@ sys_select(struct thread *td, struct select_args *uap)
return (kern_select(td, uap->nd, uap->in, uap->ou, uap->ex, tvp,
NFDBITS));
}
+#endif /* __rtems__ */
/*
* In the unlikely case when user specified n greater then the last
@@ -1171,6 +1184,65 @@ done:
return (error);
}
+#ifdef __rtems__
+int
+select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds,
+ struct timeval *timeout)
+{
+ struct thread *td = rtems_bsd_get_curthread_or_null();
+ int error;
+
+ if (td != NULL) {
+ error = kern_select(td, nfds, readfds, writefds, errorfds,
+ timeout, NFDBITS);
+ } else {
+ error = ENOMEM;
+ }
+
+ if (error == 0) {
+ return td->td_retval[0];
+ } else {
+ rtems_set_errno_and_return_minus_one(error);
+ }
+}
+
+int
+pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds,
+ const struct timespec *timeout, const sigset_t *set)
+{
+ struct thread *td;
+ int error;
+
+ if (set != NULL) {
+ rtems_set_errno_and_return_minus_one(ENOSYS);
+ }
+
+ td = rtems_bsd_get_curthread_or_null();
+
+ if (td != NULL) {
+ struct timeval tv;
+ struct timeval *tvp;
+
+ if (timeout != NULL) {
+ TIMESPEC_TO_TIMEVAL(&tv, timeout);
+ tvp = &tv;
+ } else {
+ tvp = NULL;
+ }
+
+ error = kern_select(td, nfds, readfds, writefds, errorfds,
+ tvp, NFDBITS);
+ } else {
+ error = ENOMEM;
+ }
+
+ if (error == 0) {
+ return td->td_retval[0];
+ } else {
+ rtems_set_errno_and_return_minus_one(error);
+ }
+}
+#endif /* __rtems__ */
/*
* Convert a select bit set to poll flags.
@@ -1404,6 +1476,12 @@ selscan(struct thread *td, fd_mask **ibits, fd_mask **obits, int nfd)
return (0);
}
+#ifdef __rtems__
+static int kern_poll(struct thread *td, struct pollfd *fds, u_int nfds,
+ struct timespec *tsp, sigset_t *uset);
+
+static
+#endif /* __rtems__ */
int
sys_poll(struct thread *td, struct poll_args *uap)
{
@@ -1522,6 +1600,31 @@ out:
free(bits, M_TEMP);
return (error);
}
+#ifdef __rtems__
+int
+poll(struct pollfd fds[], nfds_t nfds, int timeout)
+{
+ struct thread *td = rtems_bsd_get_curthread_or_null();
+ struct poll_args ua = {
+ .fds = &fds[0],
+ .nfds = nfds,
+ .timeout = timeout
+ };
+ int error;
+
+ if (td != NULL) {
+ error = sys_poll(td, &ua);
+ } else {
+ error = ENOMEM;
+ }
+
+ if (error == 0) {
+ return td->td_retval[0];
+ } else {
+ rtems_set_errno_and_return_minus_one(error);
+ }
+}
+#endif /* __rtems__ */
#ifndef __rtems__
int
diff --git a/freebsd/sys/sys/sysproto.h b/freebsd/sys/sys/sysproto.h
index 8e915185..8d72d52b 100644
--- a/freebsd/sys/sys/sysproto.h
+++ b/freebsd/sys/sys/sysproto.h
@@ -1975,8 +1975,8 @@ int sys_getitimer(struct thread *, struct getitimer_args *);
int sys_getdtablesize(struct thread *, struct getdtablesize_args *);
int sys_dup2(struct thread *, struct dup2_args *);
int sys_fcntl(struct thread *, struct fcntl_args *);
-#endif /* __rtems__ */
int sys_select(struct thread *, struct select_args *);
+#endif /* __rtems__ */
int sys_fsync(struct thread *, struct fsync_args *);
#ifndef __rtems__
int sys_setpriority(struct thread *, struct setpriority_args *);
@@ -2042,9 +2042,7 @@ int sys_munlock(struct thread *, struct munlock_args *);
int sys_undelete(struct thread *, struct undelete_args *);
int sys_futimes(struct thread *, struct futimes_args *);
int sys_getpgid(struct thread *, struct getpgid_args *);
-#endif /* __rtems__ */
int sys_poll(struct thread *, struct poll_args *);
-#ifndef __rtems__
int sys_semget(struct thread *, struct semget_args *);
int sys_semop(struct thread *, struct semop_args *);
int sys_msgget(struct thread *, struct msgget_args *);
diff --git a/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h b/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h
index dc19c7c2..6f28fea4 100644
--- a/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h
+++ b/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h
@@ -5840,8 +5840,6 @@
#define sys_open _bsd_sys_open
#define sys_openat _bsd_sys_openat
#define sys_pipe2 _bsd_sys_pipe2
-#define sys_poll _bsd_sys_poll
-#define sys_pselect _bsd_sys_pselect
#define sys_read _bsd_sys_read
#define sys_readlink _bsd_sys_readlink
#define sys_readlinkat _bsd_sys_readlinkat
@@ -5851,7 +5849,6 @@
#define sys_rename _bsd_sys_rename
#define sys_renameat _bsd_sys_renameat
#define sys_rmdir _bsd_sys_rmdir
-#define sys_select _bsd_sys_select
#define sys_sendmsg _bsd_sys_sendmsg
#define sys_sendto _bsd_sys_sendto
#define sys_setsockopt _bsd_sys_setsockopt
diff --git a/rtemsbsd/rtems/rtems-bsd-syscall-api.c b/rtemsbsd/rtems/rtems-bsd-syscall-api.c
index 8a60afc1..0ab85bbf 100644
--- a/rtemsbsd/rtems/rtems-bsd-syscall-api.c
+++ b/rtemsbsd/rtems/rtems-bsd-syscall-api.c
@@ -401,68 +401,6 @@ listen(int socket, int backlog)
return rtems_bsd_error_to_status_and_errno(error);
}
-int
-poll(struct pollfd fds[], nfds_t nfds, int timeout)
-{
- struct thread *td = rtems_bsd_get_curthread_or_null();
- struct poll_args ua;
- int error;
- if (RTEMS_BSD_SYSCALL_TRACE) {
- printf("bsd: sys: poll: %d\n", nfds);
- }
- if (td == NULL) {
- return rtems_bsd_error_to_status_and_errno(ENOMEM);
- }
- /*
- * Pass libio descriptors through as libio and bsd descriptors
- * can be in the list at the same time.
- */
- ua.fds = &fds[0];
- ua.nfds = nfds;
- ua.timeout = timeout;
- error = sys_poll(td, &ua);
- if (error != 0) {
- return rtems_bsd_error_to_status_and_errno(error);
- }
- return td->td_retval[0];
-}
-
-int
-pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds,
- const struct timespec *timeout, const sigset_t *set)
-{
- struct thread *td;
- struct timeval tv;
- struct timeval *tvp;
- int error;
- if (RTEMS_BSD_SYSCALL_TRACE) {
- printf("bsd: sys: pselect: %d\n", nfds);
- }
- if (set != NULL) {
- return rtems_bsd_error_to_status_and_errno(ENOSYS);
- }
- td = rtems_bsd_get_curthread_or_null();
- if (td == NULL) {
- return rtems_bsd_error_to_status_and_errno(ENOMEM);
- }
- if (timeout != NULL) {
- TIMESPEC_TO_TIMEVAL(&tv, timeout);
- tvp = &tv;
- } else {
- tvp = NULL;
- }
- /*
- * Pass libio descriptors through as libio and bsd descriptors
- * can be in the list at the same time.
- */
- error = kern_select(
- td, nfds, readfds, writefds, errorfds, tvp, NFDBITS);
- if (error != 0) {
- return rtems_bsd_error_to_status_and_errno(error);
- }
- return td->td_retval[0];
-}
-
ssize_t
recvfrom(int socket, void *__restrict buffer, size_t length, int flags,
struct sockaddr *__restrict address, socklen_t *__restrict address_len)
@@ -511,30 +449,6 @@ recvmsg(int socket, struct msghdr *message, int flags)
return td->td_retval[0];
}
-int
-select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds,
- struct timeval *timeout)
-{
- struct thread *td = rtems_bsd_get_curthread_or_null();
- int error;
- if (RTEMS_BSD_SYSCALL_TRACE) {
- printf("bsd: sys: select: %d\n", nfds);
- }
- if (td == NULL) {
- return rtems_bsd_error_to_status_and_errno(ENOMEM);
- }
- /*
- * Pass libio descriptors through as libio and bsd descriptors
- * can be in the list at the same time.
- */
- error = kern_select(
- td, nfds, readfds, writefds, errorfds, timeout, NFDBITS);
- if (error != 0) {
- return rtems_bsd_error_to_status_and_errno(error);
- }
- return td->td_retval[0];
-}
-
ssize_t
sendto(int socket, const void *message, size_t length, int flags,
const struct sockaddr *dest_addr, socklen_t dest_len)
--
2.35.3
More information about the devel
mailing list