Jan Kiszka <[email protected]> writes:
> On 06.04.22 17:56, Philippe Gerum via Xenomai wrote: >> From: Philippe Gerum <[email protected]> >> >> Regular threads should be allowed to write to RTIPC sockets provided >> MSG_DONTWAIT is implicitly set for such a request. This would match >> the existing behavior with other synchronization objects, such as >> semaphores and events, avoiding unnecessary restrictions on usage. >> >> Signed-off-by: Philippe Gerum <[email protected]> >> --- >> kernel/drivers/ipc/bufp.c | 8 ++++++-- >> kernel/drivers/ipc/iddp.c | 8 ++++++-- >> kernel/drivers/ipc/rtipc.c | 4 ++-- >> kernel/drivers/ipc/xddp.c | 6 +++++- >> 4 files changed, 19 insertions(+), 7 deletions(-) >> >> diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c >> index fd533dba27..565409dd6f 100644 >> --- a/kernel/drivers/ipc/bufp.c >> +++ b/kernel/drivers/ipc/bufp.c >> @@ -655,11 +655,15 @@ static ssize_t bufp_write(struct rtdm_fd *fd, >> struct rtipc_private *priv = rtdm_fd_to_private(fd); >> struct iovec iov = { .iov_base = (void *)buf, .iov_len = len }; >> struct bufp_socket *sk = priv->state; >> + int flags = 0; >> >> if (sk->peer.sipc_port < 0) >> return -EDESTADDRREQ; >> >> - return __bufp_sendmsg(fd, &iov, 1, 0, &sk->peer); >> + if (is_secondary_domain()) >> + flags = MSG_DONTWAIT; >> + >> + return __bufp_sendmsg(fd, &iov, 1, flags, &sk->peer); >> } >> >> static int __bufp_bind_socket(struct rtipc_private *priv, >> @@ -682,7 +686,7 @@ static int __bufp_bind_socket(struct rtipc_private *priv, >> __test_and_set_bit(_BUFP_BINDING, &sk->status)) >> ret = -EADDRINUSE; >> cobalt_atomic_leave(s); >> - >> + >> if (ret) >> return ret; >> >> diff --git a/kernel/drivers/ipc/iddp.c b/kernel/drivers/ipc/iddp.c >> index a553902326..05d0193394 100644 >> --- a/kernel/drivers/ipc/iddp.c >> +++ b/kernel/drivers/ipc/iddp.c >> @@ -255,7 +255,7 @@ static ssize_t __iddp_recvmsg(struct rtdm_fd *fd, >> } >> >> /* We want to pick one buffer from the queue. */ >> - >> + >> for (;;) { >> ret = rtdm_sem_timeddown(&sk->insem, timeout, toseq); >> if (unlikely(ret)) { >> @@ -522,11 +522,15 @@ static ssize_t iddp_write(struct rtdm_fd *fd, >> struct rtipc_private *priv = rtdm_fd_to_private(fd); >> struct iovec iov = { .iov_base = (void *)buf, .iov_len = len }; >> struct iddp_socket *sk = priv->state; >> + int flags = 0; >> >> if (sk->peer.sipc_port < 0) >> return -EDESTADDRREQ; >> >> - return __iddp_sendmsg(fd, &iov, 1, 0, &sk->peer); >> + if (is_secondary_domain()) >> + flags = MSG_DONTWAIT; >> + >> + return __iddp_sendmsg(fd, &iov, 1, flags, &sk->peer); >> } >> >> static int __iddp_bind_socket(struct rtdm_fd *fd, >> diff --git a/kernel/drivers/ipc/rtipc.c b/kernel/drivers/ipc/rtipc.c >> index 859bdab2f2..211b496ec5 100644 >> --- a/kernel/drivers/ipc/rtipc.c >> +++ b/kernel/drivers/ipc/rtipc.c >> @@ -428,7 +428,7 @@ static int rtipc_select(struct rtdm_fd *fd, struct >> xnselector *selector, >> struct xnselect *block; >> spl_t s; >> int ret; >> - >> + >> if (type != XNSELECT_READ && type != XNSELECT_WRITE) >> return -EINVAL; >> >> @@ -480,7 +480,7 @@ static struct rtdm_driver rtipc_driver = { >> .read_rt = rtipc_read, >> .read_nrt = NULL, >> .write_rt = rtipc_write, >> - .write_nrt = NULL, >> + .write_nrt = rtipc_write, /* MSG_DONTWAIT. */ >> .select = rtipc_select, >> }, >> }; >> diff --git a/kernel/drivers/ipc/xddp.c b/kernel/drivers/ipc/xddp.c >> index ae5b720c0c..2ca0da5fd4 100644 >> --- a/kernel/drivers/ipc/xddp.c >> +++ b/kernel/drivers/ipc/xddp.c >> @@ -657,11 +657,15 @@ static ssize_t xddp_write(struct rtdm_fd *fd, >> struct rtipc_private *priv = rtdm_fd_to_private(fd); >> struct iovec iov = { .iov_base = (void *)buf, .iov_len = len }; >> struct xddp_socket *sk = priv->state; >> + int flags = 0; >> >> if (sk->peer.sipc_port < 0) >> return -EDESTADDRREQ; >> >> - return __xddp_sendmsg(fd, &iov, 1, 0, &sk->peer); >> + if (is_secondary_domain()) >> + flags = MSG_DONTWAIT; >> + >> + return __xddp_sendmsg(fd, &iov, 1, flags, &sk->peer); >> } >> >> static int __xddp_bind_socket(struct rtipc_private *priv, > > Does this patch have any dependency on 1-4, or was it just bundled with > them by chance? > Not related. I'm upstreaming my patch queue indistinctly with stuff which have been in use for a few months here. -- Philippe.
