On 06.04.22 17:56, Philippe Gerum via Xenomai wrote: > From: Philippe Gerum <r...@xenomai.org> > > 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 <r...@xenomai.org> > --- > 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,
Picked this one as logically unrelated for next already. Thanks, Jan -- Siemens AG, Technology Competence Center Embedded Linux