Re: [PATCH 5/5] drivers: ipc: enable non-blocking write from regular threads

2022-04-13 Thread Jan Kiszka via Xenomai
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

2022-04-07 Thread Philippe Gerum via Xenomai


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

2022-04-07 Thread Jan Kiszka via Xenomai
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

2022-04-06 Thread Philippe Gerum via Xenomai
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