Re: [PATCH 5/5] drivers: ipc: enable non-blocking write from regular threads
On 06.04.22 17:56, Philippe Gerum via Xenomai wrote: > From: Philippe Gerum > > 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 > --- > 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, , 1, 0, >peer); > + if (is_secondary_domain()) > + flags = MSG_DONTWAIT; > + > + return __bufp_sendmsg(fd, , 1, flags, >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, >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(>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, , 1, 0, >peer); > + if (is_secondary_domain()) > + flags = MSG_DONTWAIT; > + > + return __iddp_sendmsg(fd, , 1, flags, >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, , 1, 0, >peer); > + if (is_secondary_domain()) > + flags = MSG_DONTWAIT; > + > + return __xddp_sendmsg(fd, , 1, flags, >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
Re: [PATCH 5/5] drivers: ipc: enable non-blocking write from regular threads
Jan Kiszka writes: > On 06.04.22 17:56, Philippe Gerum via Xenomai wrote: >> From: Philippe Gerum >> >> 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 >> --- >> 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, , 1, 0, >peer); >> +if (is_secondary_domain()) >> +flags = MSG_DONTWAIT; >> + >> +return __bufp_sendmsg(fd, , 1, flags, >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, >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(>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, , 1, 0, >peer); >> +if (is_secondary_domain()) >> +flags = MSG_DONTWAIT; >> + >> +return __iddp_sendmsg(fd, , 1, flags, >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, , 1, 0, >peer); >> +if (is_secondary_domain()) >> +flags = MSG_DONTWAIT; >> + >> +return __xddp_sendmsg(fd, , 1, flags, >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.
Re: [PATCH 5/5] drivers: ipc: enable non-blocking write from regular threads
On 06.04.22 17:56, Philippe Gerum via Xenomai wrote: > From: Philippe Gerum > > 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 > --- > 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, , 1, 0, >peer); > + if (is_secondary_domain()) > + flags = MSG_DONTWAIT; > + > + return __bufp_sendmsg(fd, , 1, flags, >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, >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(>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, , 1, 0, >peer); > + if (is_secondary_domain()) > + flags = MSG_DONTWAIT; > + > + return __iddp_sendmsg(fd, , 1, flags, >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, , 1, 0, >peer); > + if (is_secondary_domain()) > + flags = MSG_DONTWAIT; > + > + return __xddp_sendmsg(fd, , 1, flags, >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? Jan -- Siemens AG, Technology Competence Center Embedded Linux
[PATCH 5/5] drivers: ipc: enable non-blocking write from regular threads
From: Philippe Gerum 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 --- 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, , 1, 0, >peer); + if (is_secondary_domain()) + flags = MSG_DONTWAIT; + + return __bufp_sendmsg(fd, , 1, flags, >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, >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(>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, , 1, 0, >peer); + if (is_secondary_domain()) + flags = MSG_DONTWAIT; + + return __iddp_sendmsg(fd, , 1, flags, >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, , 1, 0, >peer); + if (is_secondary_domain()) + flags = MSG_DONTWAIT; + + return __xddp_sendmsg(fd, , 1, flags, >peer); } static int __xddp_bind_socket(struct rtipc_private *priv, -- 2.34.1