git: e30621d58fa1 - main - mqueue: Introduce kern_kmq_timedreceive & kern_kmq_timedsend
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 23 May 2024 19:42:14 UTC
The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=e30621d58fa10d82f3d4a89bb6b5572e2517b024 commit e30621d58fa10d82f3d4a89bb6b5572e2517b024 Author: Ricardo Branco <rbranco@suse.de> AuthorDate: 2024-05-18 15:19:39 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2024-05-23 19:40:46 +0000 mqueue: Introduce kern_kmq_timedreceive & kern_kmq_timedsend Reviewed by: imp, kib Pull Request: https://github.com/freebsd/freebsd-src/pull/1248 --- sys/kern/uipc_mqueue.c | 106 ++++++++++++++++++++++++------------------------- sys/sys/mqueue.h | 6 --- sys/sys/syscallsubr.h | 10 +++++ 3 files changed, 63 insertions(+), 59 deletions(-) diff --git a/sys/kern/uipc_mqueue.c b/sys/kern/uipc_mqueue.c index b48abf8788f6..c0948d40c47b 100644 --- a/sys/kern/uipc_mqueue.c +++ b/sys/kern/uipc_mqueue.c @@ -2275,58 +2275,77 @@ sys_kmq_setattr(struct thread *td, struct kmq_setattr_args *uap) } int -sys_kmq_timedreceive(struct thread *td, struct kmq_timedreceive_args *uap) +kern_kmq_timedreceive(struct thread *td, int mqd, char *msg_ptr, + size_t msg_len, unsigned int *msg_prio, const struct timespec *abs_timeout) { struct mqueue *mq; struct file *fp; + int error, waitok; + + AUDIT_ARG_FD(mqd); + error = getmq_read(td, mqd, &fp, NULL, &mq); + if (error != 0) + return (error); + waitok = (fp->f_flag & O_NONBLOCK) == 0; + error = mqueue_receive(mq, msg_ptr, msg_len, msg_prio, waitok, + abs_timeout); + fdrop(fp, td); + return (error); +} + +int +sys_kmq_timedreceive(struct thread *td, struct kmq_timedreceive_args *uap) +{ struct timespec *abs_timeout, ets; int error; - int waitok; - AUDIT_ARG_FD(uap->mqd); - error = getmq_read(td, uap->mqd, &fp, NULL, &mq); - if (error) - return (error); if (uap->abs_timeout != NULL) { error = copyin(uap->abs_timeout, &ets, sizeof(ets)); if (error != 0) - goto out; + return (error); abs_timeout = &ets; } else abs_timeout = NULL; - waitok = !(fp->f_flag & O_NONBLOCK); - error = mqueue_receive(mq, uap->msg_ptr, uap->msg_len, - uap->msg_prio, waitok, abs_timeout); -out: - fdrop(fp, td); - return (error); + + return (kern_kmq_timedreceive(td, uap->mqd, uap->msg_ptr, uap->msg_len, + uap->msg_prio, abs_timeout)); } int -sys_kmq_timedsend(struct thread *td, struct kmq_timedsend_args *uap) +kern_kmq_timedsend(struct thread *td, int mqd, const char *msg_ptr, + size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout) { struct mqueue *mq; struct file *fp; - struct timespec *abs_timeout, ets; int error, waitok; - AUDIT_ARG_FD(uap->mqd); - error = getmq_write(td, uap->mqd, &fp, NULL, &mq); - if (error) + AUDIT_ARG_FD(mqd); + error = getmq_write(td, mqd, &fp, NULL, &mq); + if (error != 0) return (error); + waitok = (fp->f_flag & O_NONBLOCK) == 0; + error = mqueue_send(mq, msg_ptr, msg_len, msg_prio, waitok, + abs_timeout); + fdrop(fp, td); + return (error); +} + +int +sys_kmq_timedsend(struct thread *td, struct kmq_timedsend_args *uap) +{ + struct timespec *abs_timeout, ets; + int error; + if (uap->abs_timeout != NULL) { error = copyin(uap->abs_timeout, &ets, sizeof(ets)); if (error != 0) - goto out; + return (error); abs_timeout = &ets; } else abs_timeout = NULL; - waitok = !(fp->f_flag & O_NONBLOCK); - error = mqueue_send(mq, uap->msg_ptr, uap->msg_len, - uap->msg_prio, waitok, abs_timeout); -out: - fdrop(fp, td); - return (error); + + return (kern_kmq_timedsend(td, uap->mqd, uap->msg_ptr, uap->msg_len, + uap->msg_prio, abs_timeout)); } int @@ -2801,63 +2820,44 @@ int freebsd32_kmq_timedsend(struct thread *td, struct freebsd32_kmq_timedsend_args *uap) { - struct mqueue *mq; - struct file *fp; struct timespec32 ets32; struct timespec *abs_timeout, ets; int error; - int waitok; - AUDIT_ARG_FD(uap->mqd); - error = getmq_write(td, uap->mqd, &fp, NULL, &mq); - if (error) - return (error); if (uap->abs_timeout != NULL) { error = copyin(uap->abs_timeout, &ets32, sizeof(ets32)); if (error != 0) - goto out; + return (error); CP(ets32, ets, tv_sec); CP(ets32, ets, tv_nsec); abs_timeout = &ets; } else abs_timeout = NULL; - waitok = !(fp->f_flag & O_NONBLOCK); - error = mqueue_send(mq, uap->msg_ptr, uap->msg_len, - uap->msg_prio, waitok, abs_timeout); -out: - fdrop(fp, td); - return (error); + + return (kern_kmq_timedsend(td, uap->mqd, uap->msg_ptr, uap->msg_len, + uap->msg_prio, abs_timeout)); } int freebsd32_kmq_timedreceive(struct thread *td, struct freebsd32_kmq_timedreceive_args *uap) { - struct mqueue *mq; - struct file *fp; struct timespec32 ets32; struct timespec *abs_timeout, ets; - int error, waitok; + int error; - AUDIT_ARG_FD(uap->mqd); - error = getmq_read(td, uap->mqd, &fp, NULL, &mq); - if (error) - return (error); if (uap->abs_timeout != NULL) { error = copyin(uap->abs_timeout, &ets32, sizeof(ets32)); if (error != 0) - goto out; + return (error); CP(ets32, ets, tv_sec); CP(ets32, ets, tv_nsec); abs_timeout = &ets; } else abs_timeout = NULL; - waitok = !(fp->f_flag & O_NONBLOCK); - error = mqueue_receive(mq, uap->msg_ptr, uap->msg_len, - uap->msg_prio, waitok, abs_timeout); -out: - fdrop(fp, td); - return (error); + + return (kern_kmq_timedreceive(td, uap->mqd, uap->msg_ptr, uap->msg_len, + uap->msg_prio, abs_timeout)); } int diff --git a/sys/sys/mqueue.h b/sys/sys/mqueue.h index 78f34c197c7e..50f6681ce218 100644 --- a/sys/sys/mqueue.h +++ b/sys/sys/mqueue.h @@ -38,14 +38,8 @@ struct mq_attr { }; #ifdef _KERNEL -struct sigevent; struct thread; struct file; extern void (*mq_fdclose)(struct thread *td, int fd, struct file *fp); -int kern_kmq_notify(struct thread *, int, struct sigevent *); -int kern_kmq_open(struct thread *, const char *, int, mode_t, - const struct mq_attr *); -int kern_kmq_setattr(struct thread *, int, const struct mq_attr *, - struct mq_attr *); #endif #endif diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index 6652619287ad..8ac3f55596e6 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -49,6 +49,7 @@ struct kevent_copyops; struct kld_file_stat; struct ksiginfo; struct mbuf; +struct mq_attr; struct msghdr; struct msqid_ds; struct pollfd; @@ -385,6 +386,15 @@ int kern_writev(struct thread *td, int fd, struct uio *auio); int kern_socketpair(struct thread *td, int domain, int type, int protocol, int *rsv); int kern_unmount(struct thread *td, const char *path, int flags); +int kern_kmq_notify(struct thread *, int, struct sigevent *); +int kern_kmq_open(struct thread *, const char *, int, mode_t, + const struct mq_attr *); +int kern_kmq_setattr(struct thread *, int, const struct mq_attr *, + struct mq_attr *); +int kern_kmq_timedreceive(struct thread *, int, char *, + size_t, unsigned int *, const struct timespec *); +int kern_kmq_timedsend(struct thread *td, int, const char *, + size_t, unsigned int, const struct timespec *); /* flags for kern_sigaction */ #define KSA_OSIGSET 0x0001 /* uses osigact_t */