Collecting all system calls in a single translation unit is not good due to the library initialization through linker sets.
Revert commit 6514d561587fd1527fe6a26cb43e6b5742c8c779 in "freebsd/sys/kern/kern_event.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. Update #4475. --- freebsd/sys/kern/kern_event.c | 187 ++++++++++++++++++++++--- freebsd/sys/sys/eventvar.h | 2 + freebsd/sys/sys/sysproto.h | 4 - rtemsbsd/rtems/rtems-bsd-syscall-api.c | 48 ------- testsuite/syscalls01/test_main.c | 7 +- 5 files changed, 173 insertions(+), 75 deletions(-) diff --git a/freebsd/sys/kern/kern_event.c b/freebsd/sys/kern/kern_event.c index f5682b03..0d8332da 100644 --- a/freebsd/sys/kern/kern_event.c +++ b/freebsd/sys/kern/kern_event.c @@ -40,6 +40,9 @@ __FBSDID("$FreeBSD$"); #define _WANT_FREEBSD11_KEVENT #endif +#ifdef __rtems__ +#include <rtems/bsd/sys/file.h> +#endif /* __rtems__ */ #include <sys/param.h> #include <sys/systm.h> #include <sys/capsicum.h> @@ -81,6 +84,8 @@ __FBSDID("$FreeBSD$"); #include <vm/uma.h> #ifdef __rtems__ +#include <machine/rtems-bsd-syscall-api.h> + /* Maintain a global kqueue list on RTEMS */ static struct kqlist fd_kqlist; #endif /* __rtems__ */ @@ -129,6 +134,7 @@ static int kern_kevent_generic(struct thread *td, struct g_kevent_args *uap, struct kevent_copyops *k_ops, const char *struct_name); +#ifndef __rtems__ static fo_rdwr_t kqueue_read; static fo_rdwr_t kqueue_write; static fo_truncate_t kqueue_truncate; @@ -153,6 +159,9 @@ static struct fileops kqueueops = { .fo_sendfile = invfo_sendfile, .fo_fill_kinfo = kqueue_fill_kinfo, }; +#else /* __rtems__ */ +static const rtems_filesystem_file_handlers_r kqueueops; +#endif /* __rtems__ */ static int knote_attach(struct knote *kn, struct kqueue *kq); static void knote_drop(struct knote *kn, struct thread *td); @@ -404,11 +413,7 @@ filt_fileattach(struct knote *kn) static int kqueue_kqfilter(struct file *fp, struct knote *kn) { -#ifndef __rtems__ struct kqueue *kq = kn->kn_fp->f_data; -#else /* __rtems__ */ - struct kqueue *kq = rtems_bsd_knote_to_file(kn); -#endif /* __rtems__ */ if (kn->kn_filter != EVFILT_READ) return (EINVAL); @@ -419,15 +424,20 @@ kqueue_kqfilter(struct file *fp, struct knote *kn) return (0); } +#ifdef __rtems__ +static int +rtems_bsd_kqueue_kqfilter(rtems_libio_t *iop, struct knote *kn) +{ + + (void)iop; + return kqueue_kqfilter(NULL, kn); +} +#endif /* __rtems__ */ static void filt_kqdetach(struct knote *kn) { -#ifndef __rtems__ struct kqueue *kq = kn->kn_fp->f_data; -#else /* __rtems__ */ - struct kqueue *kq = rtems_bsd_knote_to_file(kn); -#endif /* __rtems__ */ knlist_remove(&kq->kq_sel.si_note, kn, 0); } @@ -436,11 +446,7 @@ filt_kqdetach(struct knote *kn) static int filt_kqueue(struct knote *kn, long hint) { -#ifndef __rtems__ struct kqueue *kq = kn->kn_fp->f_data; -#else /* __rtems__ */ - struct kqueue *kq = rtems_bsd_knote_to_file(kn); -#endif /* __rtems__ */ kn->kn_data = kq->kq_count; return (kn->kn_data > 0); @@ -992,6 +998,12 @@ filt_usertouch(struct knote *kn, struct kevent *kev, u_long type) } } +#ifdef __rtems__ +static int +kern_kqueue(struct thread *td, int flags, struct filecaps *fcaps); + +static +#endif /* __rtems__ */ int sys_kqueue(struct thread *td, struct kqueue_args *uap) { @@ -1018,10 +1030,15 @@ kern_kqueue(struct thread *td, int flags, struct filecaps *fcaps) struct ucred *cred; int fd, error; +#ifndef __rtems__ fdp = td->td_proc->p_fd; cred = td->td_ucred; if (!chgkqcnt(cred->cr_ruidinfo, 1, lim_cur(td, RLIMIT_KQUEUES))) return (ENOMEM); +#else /* __rtems__ */ + (void)fdp; + (void)cred; +#endif /* __rtems__ */ error = falloc_caps(td, &fp, &fd, flags, fcaps); if (error != 0) { @@ -1032,8 +1049,10 @@ kern_kqueue(struct thread *td, int flags, struct filecaps *fcaps) /* An extra reference on `fp' has been held for us by falloc(). */ kq = malloc(sizeof *kq, M_KQUEUE, M_WAITOK | M_ZERO); kqueue_init(kq); +#ifndef __rtems__ kq->kq_fdp = fdp; kq->kq_cred = crhold(cred); +#endif /* __rtems__ */ FILEDESC_XLOCK(fdp); #ifndef __rtems__ @@ -1051,16 +1070,50 @@ kern_kqueue(struct thread *td, int flags, struct filecaps *fcaps) td->td_retval[0] = fd; return (0); } +#ifdef __rtems__ +int +kqueue(void) +{ + struct thread *td = rtems_bsd_get_curthread_or_null(); + struct kqueue_args ua; + int error; + + if (td != NULL) { + error = sys_kqueue(td, &ua); + } else { + error = ENOMEM; + } + + if (error == 0) { + return td->td_retval[0]; + } else { + rtems_set_errno_and_return_minus_one(error); + } +} +#endif /* __rtems__ */ struct g_kevent_args { int fd; +#ifndef __rtems__ void *changelist; +#else /* __rtems__ */ + const void *changelist; +#endif /* __rtems__ */ int nchanges; void *eventlist; int nevents; const struct timespec *timeout; }; +#ifdef __rtems__ +static int kern_kevent(struct thread *td, int fd, int nchanges, int nevents, + struct kevent_copyops *k_ops, const struct timespec *timeout); + +static int kern_kevent_fp(struct thread *td, struct file *fp, int nchanges, + int nevents, struct kevent_copyops *k_ops, const struct timespec *timeout); + +static +#endif /* __rtems__ */ int sys_kevent(struct thread *td, struct kevent_args *uap) { @@ -1117,6 +1170,38 @@ kern_kevent_generic(struct thread *td, struct g_kevent_args *uap, return (error); } +#ifdef __rtems__ +__weak_reference(kevent, _kevent); + +int +kevent(int kq, const struct kevent *changelist, int nchanges, + struct kevent *eventlist, int nevents, + const struct timespec *timeout) +{ + struct thread *td = rtems_bsd_get_curthread_or_null(); + struct kevent_args ua = { + .fd = kq, + .changelist = changelist, + .nchanges = nchanges, + .eventlist = eventlist, + .nevents = nevents, + .timeout = timeout + }; + int error; + + if (td != NULL) { + error = sys_kevent(td, &ua); + } else { + error = ENOMEM; + } + + if (error == 0) { + return td->td_retval[0]; + } else { + rtems_set_errno_and_return_minus_one(error); + } +} +#endif /* __rtems__ */ /* * Copy 'count' items into the destination list pointed to by uap->eventlist. @@ -1430,7 +1515,6 @@ kqueue_register(struct kqueue *kq, struct kevent *kev, struct thread *td, struct file *fp; #else /* __rtems__ */ rtems_libio_t *fp; - struct file *bsd_fp; #endif /* __rtems__ */ struct knote *kn, *tkn; struct knlist *knl; @@ -1509,8 +1593,7 @@ findkn: #ifndef __rtems__ if (fp->f_type == DTYPE_KQUEUE) { #else /* __rtems__ */ - bsd_fp = rtems_bsd_iop_to_file(fp); - if (bsd_fp != NULL && bsd_fp->f_type == DTYPE_KQUEUE) { + if (fp->pathinfo.handlers == &kqueueops) { #endif /* __rtems__ */ /* * If we add some intelligence about what we are doing, @@ -1519,11 +1602,7 @@ findkn: * getting both the knlist lock and the kq lock since * they are the same thing. */ -#ifndef __rtems__ if (fp->f_data == kq) { -#else /* __rtems__ */ - if (bsd_fp->f_data == kq) { -#endif /* __rtems__ */ error = EINVAL; goto done; } @@ -1736,7 +1815,11 @@ kqueue_acquire(struct file *fp, struct kqueue **kqp) error = 0; kq = fp->f_data; +#ifndef __rtems__ if (fp->f_type != DTYPE_KQUEUE || kq == NULL) +#else /* __rtems__ */ + if (fp->pathinfo.handlers != &kqueueops || kq == NULL) +#endif /* __rtems__ */ return (EBADF); *kqp = kq; KQ_LOCK(kq); @@ -2077,6 +2160,7 @@ done_nl: return (error); } +#ifndef __rtems__ /*ARGSUSED*/ static int kqueue_ioctl(struct file *fp, u_long cmd, void *data, @@ -2124,6 +2208,7 @@ kqueue_ioctl(struct file *fp, u_long cmd, void *data, return (ENOTTY); } +#endif /* __rtems__ */ /*ARGSUSED*/ static int @@ -2151,14 +2236,38 @@ kqueue_poll(struct file *fp, int events, struct ucred *active_cred, KQ_UNLOCK(kq); return (revents); } +#ifdef __rtems__ +static int +rtems_bsd_kqueue_poll(rtems_libio_t *iop, int events) +{ + struct thread *td = rtems_bsd_get_curthread_or_null(); + int error; + + if (td != NULL) { + error = kqueue_poll(iop, events, NULL, td); + } else { + error = ENOMEM; + } + + return error; +} +#endif /* __rtems__ */ /*ARGSUSED*/ +#ifndef __rtems__ static int kqueue_stat(struct file *fp, struct stat *st, struct ucred *active_cred, struct thread *td) { bzero((void *)st, sizeof *st); +#else /* __rtems__ */ +static int +rtems_bsd_kqueue_stat(const rtems_filesystem_location_info_t *loc, + struct stat *st) +{ + (void) loc; +#endif /* __rtems__ */ /* * We no longer return kq_count because the unlocked value is useless. * If you spent all this time getting the count, why not spend your @@ -2237,8 +2346,10 @@ static void kqueue_destroy(struct kqueue *kq) { +#ifndef __rtems__ KASSERT(kq->kq_fdp == NULL, ("kqueue still attached to a file descriptor")); +#endif /* __rtems__ */ seldrain(&kq->kq_sel); knlist_destroy(&kq->kq_sel.si_note); mtx_destroy(&kq->kq_lock); @@ -2298,7 +2409,24 @@ kqueue_close(struct file *fp, struct thread *td) return (0); } +#ifdef __rtems__ +static int +rtems_bsd_kqueue_close(rtems_libio_t *iop) +{ + struct thread *td = rtems_bsd_get_curthread_or_null(); + int error; + + if (td != NULL) { + error = kqueue_close(iop, td); + } else { + error = ENOMEM; + } + + return rtems_bsd_error_to_status_and_errno(error); +} +#endif /* __rtems__ */ +#ifndef __rtems__ static int kqueue_fill_kinfo(struct file *fp, struct kinfo_file *kif, struct filedesc *fdp) { @@ -2306,6 +2434,7 @@ kqueue_fill_kinfo(struct file *fp, struct kinfo_file *kif, struct filedesc *fdp) kif->kf_type = KF_TYPE_KQUEUE; return (0); } +#endif /* __rtems__ */ static void kqueue_wakeup(struct kqueue *kq) @@ -2860,3 +2989,23 @@ noacquire: fdrop(fp, td); return (error); } +#ifdef __rtems__ +static const rtems_filesystem_file_handlers_r kqueueops = { + .open_h = rtems_filesystem_default_open, + .close_h = rtems_bsd_kqueue_close, + .read_h = rtems_filesystem_default_read, + .write_h = rtems_filesystem_default_write, + .ioctl_h = rtems_filesystem_default_ioctl, + .lseek_h = rtems_filesystem_default_lseek, + .fstat_h = rtems_bsd_kqueue_stat, + .ftruncate_h = rtems_filesystem_default_ftruncate, + .fsync_h = rtems_filesystem_default_fsync_or_fdatasync, + .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, + .fcntl_h = rtems_filesystem_default_fcntl, + .poll_h = rtems_bsd_kqueue_poll, + .kqfilter_h = rtems_bsd_kqueue_kqfilter, + .readv_h = rtems_filesystem_default_readv, + .writev_h = rtems_filesystem_default_writev, + .mmap_h = rtems_filesystem_default_mmap +}; +#endif /* __rtems__ */ diff --git a/freebsd/sys/sys/eventvar.h b/freebsd/sys/sys/eventvar.h index 1ed6e9fc..8afaa1aa 100644 --- a/freebsd/sys/sys/eventvar.h +++ b/freebsd/sys/sys/eventvar.h @@ -48,7 +48,9 @@ struct kqueue { int kq_count; /* number of pending events */ struct selinfo kq_sel; struct sigio *kq_sigio; +#ifndef __rtems__ struct filedesc *kq_fdp; +#endif /* __rtems__ */ int kq_state; #define KQ_SEL 0x01 #define KQ_SLEEP 0x02 diff --git a/freebsd/sys/sys/sysproto.h b/freebsd/sys/sys/sysproto.h index 1c1891de..8e915185 100644 --- a/freebsd/sys/sys/sysproto.h +++ b/freebsd/sys/sys/sysproto.h @@ -2133,9 +2133,7 @@ int sys_extattr_delete_file(struct thread *, struct extattr_delete_file_args *); int sys_aio_waitcomplete(struct thread *, struct aio_waitcomplete_args *); int sys_getresuid(struct thread *, struct getresuid_args *); int sys_getresgid(struct thread *, struct getresgid_args *); -#endif /* __rtems__ */ int sys_kqueue(struct thread *, struct kqueue_args *); -#ifndef __rtems__ int sys_extattr_set_fd(struct thread *, struct extattr_set_fd_args *); int sys_extattr_get_fd(struct thread *, struct extattr_get_fd_args *); int sys_extattr_delete_fd(struct thread *, struct extattr_delete_fd_args *); @@ -2298,9 +2296,7 @@ int sys_fstatfs(struct thread *, struct fstatfs_args *); int sys_getfsstat(struct thread *, struct getfsstat_args *); int sys_fhstatfs(struct thread *, struct fhstatfs_args *); int sys_mknodat(struct thread *, struct mknodat_args *); -#endif /* __rtems__ */ int sys_kevent(struct thread *, struct kevent_args *); -#ifndef __rtems__ int sys_cpuset_getdomain(struct thread *, struct cpuset_getdomain_args *); int sys_cpuset_setdomain(struct thread *, struct cpuset_setdomain_args *); int sys_getrandom(struct thread *, struct getrandom_args *); diff --git a/rtemsbsd/rtems/rtems-bsd-syscall-api.c b/rtemsbsd/rtems/rtems-bsd-syscall-api.c index ba8a6b60..8a60afc1 100644 --- a/rtemsbsd/rtems/rtems-bsd-syscall-api.c +++ b/rtemsbsd/rtems/rtems-bsd-syscall-api.c @@ -383,54 +383,6 @@ getsockopt(int socket, int level, int option_name, return rtems_bsd_error_to_status_and_errno(error); } -int -kqueue(void) -{ - struct thread *td = rtems_bsd_get_curthread_or_null(); - struct kqueue_args ua = {}; - int error; - if (RTEMS_BSD_SYSCALL_TRACE) { - printf("bsd: sys: kqueue:\n"); - } - if (td == NULL) { - return rtems_bsd_error_to_status_and_errno(ENOMEM); - } - error = sys_kqueue(td, &ua); - if (error != 0) { - return rtems_bsd_error_to_status_and_errno(error); - } - return (td->td_retval[0]); -} - -__weak_reference(kevent, _kevent); - -int -kevent(int kq, const struct kevent *changelist, int nchanges, - struct kevent *eventlist, int nevents, const struct timespec *timeout) -{ - struct thread *td = rtems_bsd_get_curthread_or_null(); - struct kevent_args ua; - int ffd; - int error; - if (RTEMS_BSD_SYSCALL_TRACE) { - printf("bsd: sys: kevent: %d\n", kq); - } - if (td == NULL) { - return rtems_bsd_error_to_status_and_errno(ENOMEM); - } - ua.fd = kq; - ua.changelist = changelist; - ua.nchanges = nchanges; - ua.eventlist = eventlist; - ua.nevents = nevents; - ua.timeout = timeout; - error = sys_kevent(td, &ua); - if (error != 0) { - return rtems_bsd_error_to_status_and_errno(error); - } - return td->td_retval[0]; -} - int listen(int socket, int backlog) { diff --git a/testsuite/syscalls01/test_main.c b/testsuite/syscalls01/test_main.c index 3cfda667..dd2caebc 100644 --- a/testsuite/syscalls01/test_main.c +++ b/testsuite/syscalls01/test_main.c @@ -1598,12 +1598,12 @@ test_kqueue_unsupported_ops(void) errno = 0; n = read(kq, &buf[0], sizeof(buf)); assert(n == -1); - assert(errno == EOPNOTSUPP); + assert(errno == ENOTSUP); errno = 0; n = write(kq, &buf[0], sizeof(buf)); assert(n == -1); - assert(errno == EOPNOTSUPP); + assert(errno == ENOTSUP); errno = 0; rv = ioctl(kq, 0); @@ -1643,8 +1643,7 @@ no_mem_kqueue_fstat(int fd) int rv; rv = fstat(fd, &st); - assert(rv == -1); - assert(errno == ENOMEM); + assert(rv == 0); } static void -- 2.35.3 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel