[Xenomai-git] Philippe Gerum : drivers/ipc: reduce stack footprint of I/O vectors

2017-04-15 Thread git repository hosting
Module: xenomai-3
Branch: master
Commit: 1ba2fc8ef98d927f07a8d7465fe9ea541f501e39
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1ba2fc8ef98d927f07a8d7465fe9ea541f501e39

Author: Philippe Gerum 
Date:   Sun Mar 12 11:37:20 2017 +0100

drivers/ipc: reduce stack footprint of I/O vectors

Resort to dynamic allocation of the I/O vector when more than 16
entries are needed, otherwise stick to a stack-based fast vector as
previously.

As a by-product of this change, we can now align on the regular
UIO_MAXIOV limit for all RTIPC protocols.

---

 kernel/drivers/ipc/bufp.c |   24 +-
 kernel/drivers/ipc/iddp.c |   24 +-
 kernel/drivers/ipc/internal.h |   20 +-
 kernel/drivers/ipc/rtipc.c|   45 +
 kernel/drivers/ipc/xddp.c |   24 +-
 5 files changed, 89 insertions(+), 48 deletions(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 2e7f5ad..3b565bd 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -359,7 +359,7 @@ static ssize_t __bufp_recvmsg(struct rtdm_fd *fd,
 static ssize_t bufp_recvmsg(struct rtdm_fd *fd,
struct user_msghdr *msg, int flags)
 {
-   struct iovec iov[RTIPC_IOV_MAX];
+   struct iovec iov_fast[RTIPC_IOV_FASTMAX], *iov;
struct sockaddr_ipc saddr;
ssize_t ret;
 
@@ -372,20 +372,22 @@ static ssize_t bufp_recvmsg(struct rtdm_fd *fd,
} else if (msg->msg_namelen != 0)
return -EINVAL;
 
-   if (msg->msg_iovlen >= RTIPC_IOV_MAX)
+   if (msg->msg_iovlen >= UIO_MAXIOV)
return -EINVAL;
 
/* Copy I/O vector in */
-   ret = rtipc_get_iovec(fd, iov, msg);
+   ret = rtipc_get_iovec(fd, &iov, msg, iov_fast);
if (ret)
return ret;
 
ret = __bufp_recvmsg(fd, iov, msg->msg_iovlen, flags, &saddr);
-   if (ret <= 0)
+   if (ret <= 0) {
+   rtipc_drop_iovec(iov, iov_fast);
return ret;
+   }
 
/* Copy the updated I/O vector back */
-   if (rtipc_put_iovec(fd, iov, msg))
+   if (rtipc_put_iovec(fd, iov, msg, iov_fast))
return -EFAULT;
 
/* Copy the source address if required. */
@@ -607,8 +609,8 @@ static ssize_t bufp_sendmsg(struct rtdm_fd *fd,
const struct user_msghdr *msg, int flags)
 {
struct rtipc_private *priv = rtdm_fd_to_private(fd);
+   struct iovec iov_fast[RTIPC_IOV_FASTMAX], *iov;
struct bufp_socket *sk = priv->state;
-   struct iovec iov[RTIPC_IOV_MAX];
struct sockaddr_ipc daddr;
ssize_t ret;
 
@@ -634,20 +636,22 @@ static ssize_t bufp_sendmsg(struct rtdm_fd *fd,
return -EDESTADDRREQ;
}
 
-   if (msg->msg_iovlen >= RTIPC_IOV_MAX)
+   if (msg->msg_iovlen >= UIO_MAXIOV)
return -EINVAL;
 
/* Copy I/O vector in */
-   ret = rtipc_get_iovec(fd, iov, msg);
+   ret = rtipc_get_iovec(fd, &iov, msg, iov_fast);
if (ret)
return ret;
 
ret = __bufp_sendmsg(fd, iov, msg->msg_iovlen, flags, &daddr);
-   if (ret <= 0)
+   if (ret <= 0) {
+   rtipc_drop_iovec(iov, iov_fast);
return ret;
+   }
 
/* Copy updated I/O vector back */
-   return rtipc_put_iovec(fd, iov, msg) ?: ret;
+   return rtipc_put_iovec(fd, iov, msg, iov_fast) ?: ret;
 }
 
 static ssize_t bufp_write(struct rtdm_fd *fd,
diff --git a/kernel/drivers/ipc/iddp.c b/kernel/drivers/ipc/iddp.c
index 6d3da57..5e2a2a1 100644
--- a/kernel/drivers/ipc/iddp.c
+++ b/kernel/drivers/ipc/iddp.c
@@ -326,7 +326,7 @@ static ssize_t __iddp_recvmsg(struct rtdm_fd *fd,
 static ssize_t iddp_recvmsg(struct rtdm_fd *fd,
struct user_msghdr *msg, int flags)
 {
-   struct iovec iov[RTIPC_IOV_MAX];
+   struct iovec iov_fast[RTIPC_IOV_FASTMAX], *iov;
struct sockaddr_ipc saddr;
ssize_t ret;
 
@@ -339,20 +339,22 @@ static ssize_t iddp_recvmsg(struct rtdm_fd *fd,
} else if (msg->msg_namelen != 0)
return -EINVAL;
 
-   if (msg->msg_iovlen >= RTIPC_IOV_MAX)
+   if (msg->msg_iovlen >= UIO_MAXIOV)
return -EINVAL;
 
/* Copy I/O vector in */
-   ret = rtipc_get_iovec(fd, iov, msg);
+   ret = rtipc_get_iovec(fd, &iov, msg, iov_fast);
if (ret)
return ret;
 
ret = __iddp_recvmsg(fd, iov, msg->msg_iovlen, flags, &saddr);
-   if (ret <= 0)
+   if (ret <= 0) {
+   rtipc_drop_iovec(iov, iov_fast);
return ret;
+   }
 
/* Copy the updated I/O vector back */
-   if (rtipc_put_iovec(fd, iov, msg))
+   if (rtipc_put_iovec(fd, iov, msg, iov_fast))
return -EFAULT;
 
/* Copy the source address if required. */
@@ -468,8 +470,8 @@ static ssize_t iddp_send

[Xenomai-git] Philippe Gerum : drivers/ipc: reduce stack footprint of I/O vectors

2017-03-13 Thread git repository hosting
Module: xenomai-3
Branch: next
Commit: 1ba2fc8ef98d927f07a8d7465fe9ea541f501e39
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1ba2fc8ef98d927f07a8d7465fe9ea541f501e39

Author: Philippe Gerum 
Date:   Sun Mar 12 11:37:20 2017 +0100

drivers/ipc: reduce stack footprint of I/O vectors

Resort to dynamic allocation of the I/O vector when more than 16
entries are needed, otherwise stick to a stack-based fast vector as
previously.

As a by-product of this change, we can now align on the regular
UIO_MAXIOV limit for all RTIPC protocols.

---

 kernel/drivers/ipc/bufp.c |   24 +-
 kernel/drivers/ipc/iddp.c |   24 +-
 kernel/drivers/ipc/internal.h |   20 +-
 kernel/drivers/ipc/rtipc.c|   45 +
 kernel/drivers/ipc/xddp.c |   24 +-
 5 files changed, 89 insertions(+), 48 deletions(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 2e7f5ad..3b565bd 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -359,7 +359,7 @@ static ssize_t __bufp_recvmsg(struct rtdm_fd *fd,
 static ssize_t bufp_recvmsg(struct rtdm_fd *fd,
struct user_msghdr *msg, int flags)
 {
-   struct iovec iov[RTIPC_IOV_MAX];
+   struct iovec iov_fast[RTIPC_IOV_FASTMAX], *iov;
struct sockaddr_ipc saddr;
ssize_t ret;
 
@@ -372,20 +372,22 @@ static ssize_t bufp_recvmsg(struct rtdm_fd *fd,
} else if (msg->msg_namelen != 0)
return -EINVAL;
 
-   if (msg->msg_iovlen >= RTIPC_IOV_MAX)
+   if (msg->msg_iovlen >= UIO_MAXIOV)
return -EINVAL;
 
/* Copy I/O vector in */
-   ret = rtipc_get_iovec(fd, iov, msg);
+   ret = rtipc_get_iovec(fd, &iov, msg, iov_fast);
if (ret)
return ret;
 
ret = __bufp_recvmsg(fd, iov, msg->msg_iovlen, flags, &saddr);
-   if (ret <= 0)
+   if (ret <= 0) {
+   rtipc_drop_iovec(iov, iov_fast);
return ret;
+   }
 
/* Copy the updated I/O vector back */
-   if (rtipc_put_iovec(fd, iov, msg))
+   if (rtipc_put_iovec(fd, iov, msg, iov_fast))
return -EFAULT;
 
/* Copy the source address if required. */
@@ -607,8 +609,8 @@ static ssize_t bufp_sendmsg(struct rtdm_fd *fd,
const struct user_msghdr *msg, int flags)
 {
struct rtipc_private *priv = rtdm_fd_to_private(fd);
+   struct iovec iov_fast[RTIPC_IOV_FASTMAX], *iov;
struct bufp_socket *sk = priv->state;
-   struct iovec iov[RTIPC_IOV_MAX];
struct sockaddr_ipc daddr;
ssize_t ret;
 
@@ -634,20 +636,22 @@ static ssize_t bufp_sendmsg(struct rtdm_fd *fd,
return -EDESTADDRREQ;
}
 
-   if (msg->msg_iovlen >= RTIPC_IOV_MAX)
+   if (msg->msg_iovlen >= UIO_MAXIOV)
return -EINVAL;
 
/* Copy I/O vector in */
-   ret = rtipc_get_iovec(fd, iov, msg);
+   ret = rtipc_get_iovec(fd, &iov, msg, iov_fast);
if (ret)
return ret;
 
ret = __bufp_sendmsg(fd, iov, msg->msg_iovlen, flags, &daddr);
-   if (ret <= 0)
+   if (ret <= 0) {
+   rtipc_drop_iovec(iov, iov_fast);
return ret;
+   }
 
/* Copy updated I/O vector back */
-   return rtipc_put_iovec(fd, iov, msg) ?: ret;
+   return rtipc_put_iovec(fd, iov, msg, iov_fast) ?: ret;
 }
 
 static ssize_t bufp_write(struct rtdm_fd *fd,
diff --git a/kernel/drivers/ipc/iddp.c b/kernel/drivers/ipc/iddp.c
index 6d3da57..5e2a2a1 100644
--- a/kernel/drivers/ipc/iddp.c
+++ b/kernel/drivers/ipc/iddp.c
@@ -326,7 +326,7 @@ static ssize_t __iddp_recvmsg(struct rtdm_fd *fd,
 static ssize_t iddp_recvmsg(struct rtdm_fd *fd,
struct user_msghdr *msg, int flags)
 {
-   struct iovec iov[RTIPC_IOV_MAX];
+   struct iovec iov_fast[RTIPC_IOV_FASTMAX], *iov;
struct sockaddr_ipc saddr;
ssize_t ret;
 
@@ -339,20 +339,22 @@ static ssize_t iddp_recvmsg(struct rtdm_fd *fd,
} else if (msg->msg_namelen != 0)
return -EINVAL;
 
-   if (msg->msg_iovlen >= RTIPC_IOV_MAX)
+   if (msg->msg_iovlen >= UIO_MAXIOV)
return -EINVAL;
 
/* Copy I/O vector in */
-   ret = rtipc_get_iovec(fd, iov, msg);
+   ret = rtipc_get_iovec(fd, &iov, msg, iov_fast);
if (ret)
return ret;
 
ret = __iddp_recvmsg(fd, iov, msg->msg_iovlen, flags, &saddr);
-   if (ret <= 0)
+   if (ret <= 0) {
+   rtipc_drop_iovec(iov, iov_fast);
return ret;
+   }
 
/* Copy the updated I/O vector back */
-   if (rtipc_put_iovec(fd, iov, msg))
+   if (rtipc_put_iovec(fd, iov, msg, iov_fast))
return -EFAULT;
 
/* Copy the source address if required. */
@@ -468,8 +470,8 @@ static ssize_t iddp_sendms

[Xenomai-git] Philippe Gerum : drivers/ipc: reduce stack footprint of I/O vectors

2017-03-12 Thread git repository hosting
Module: xenomai-3
Branch: stable-3.0.x
Commit: 1ba2fc8ef98d927f07a8d7465fe9ea541f501e39
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1ba2fc8ef98d927f07a8d7465fe9ea541f501e39

Author: Philippe Gerum 
Date:   Sun Mar 12 11:37:20 2017 +0100

drivers/ipc: reduce stack footprint of I/O vectors

Resort to dynamic allocation of the I/O vector when more than 16
entries are needed, otherwise stick to a stack-based fast vector as
previously.

As a by-product of this change, we can now align on the regular
UIO_MAXIOV limit for all RTIPC protocols.

---

 kernel/drivers/ipc/bufp.c |   24 +-
 kernel/drivers/ipc/iddp.c |   24 +-
 kernel/drivers/ipc/internal.h |   20 +-
 kernel/drivers/ipc/rtipc.c|   45 +
 kernel/drivers/ipc/xddp.c |   24 +-
 5 files changed, 89 insertions(+), 48 deletions(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 2e7f5ad..3b565bd 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -359,7 +359,7 @@ static ssize_t __bufp_recvmsg(struct rtdm_fd *fd,
 static ssize_t bufp_recvmsg(struct rtdm_fd *fd,
struct user_msghdr *msg, int flags)
 {
-   struct iovec iov[RTIPC_IOV_MAX];
+   struct iovec iov_fast[RTIPC_IOV_FASTMAX], *iov;
struct sockaddr_ipc saddr;
ssize_t ret;
 
@@ -372,20 +372,22 @@ static ssize_t bufp_recvmsg(struct rtdm_fd *fd,
} else if (msg->msg_namelen != 0)
return -EINVAL;
 
-   if (msg->msg_iovlen >= RTIPC_IOV_MAX)
+   if (msg->msg_iovlen >= UIO_MAXIOV)
return -EINVAL;
 
/* Copy I/O vector in */
-   ret = rtipc_get_iovec(fd, iov, msg);
+   ret = rtipc_get_iovec(fd, &iov, msg, iov_fast);
if (ret)
return ret;
 
ret = __bufp_recvmsg(fd, iov, msg->msg_iovlen, flags, &saddr);
-   if (ret <= 0)
+   if (ret <= 0) {
+   rtipc_drop_iovec(iov, iov_fast);
return ret;
+   }
 
/* Copy the updated I/O vector back */
-   if (rtipc_put_iovec(fd, iov, msg))
+   if (rtipc_put_iovec(fd, iov, msg, iov_fast))
return -EFAULT;
 
/* Copy the source address if required. */
@@ -607,8 +609,8 @@ static ssize_t bufp_sendmsg(struct rtdm_fd *fd,
const struct user_msghdr *msg, int flags)
 {
struct rtipc_private *priv = rtdm_fd_to_private(fd);
+   struct iovec iov_fast[RTIPC_IOV_FASTMAX], *iov;
struct bufp_socket *sk = priv->state;
-   struct iovec iov[RTIPC_IOV_MAX];
struct sockaddr_ipc daddr;
ssize_t ret;
 
@@ -634,20 +636,22 @@ static ssize_t bufp_sendmsg(struct rtdm_fd *fd,
return -EDESTADDRREQ;
}
 
-   if (msg->msg_iovlen >= RTIPC_IOV_MAX)
+   if (msg->msg_iovlen >= UIO_MAXIOV)
return -EINVAL;
 
/* Copy I/O vector in */
-   ret = rtipc_get_iovec(fd, iov, msg);
+   ret = rtipc_get_iovec(fd, &iov, msg, iov_fast);
if (ret)
return ret;
 
ret = __bufp_sendmsg(fd, iov, msg->msg_iovlen, flags, &daddr);
-   if (ret <= 0)
+   if (ret <= 0) {
+   rtipc_drop_iovec(iov, iov_fast);
return ret;
+   }
 
/* Copy updated I/O vector back */
-   return rtipc_put_iovec(fd, iov, msg) ?: ret;
+   return rtipc_put_iovec(fd, iov, msg, iov_fast) ?: ret;
 }
 
 static ssize_t bufp_write(struct rtdm_fd *fd,
diff --git a/kernel/drivers/ipc/iddp.c b/kernel/drivers/ipc/iddp.c
index 6d3da57..5e2a2a1 100644
--- a/kernel/drivers/ipc/iddp.c
+++ b/kernel/drivers/ipc/iddp.c
@@ -326,7 +326,7 @@ static ssize_t __iddp_recvmsg(struct rtdm_fd *fd,
 static ssize_t iddp_recvmsg(struct rtdm_fd *fd,
struct user_msghdr *msg, int flags)
 {
-   struct iovec iov[RTIPC_IOV_MAX];
+   struct iovec iov_fast[RTIPC_IOV_FASTMAX], *iov;
struct sockaddr_ipc saddr;
ssize_t ret;
 
@@ -339,20 +339,22 @@ static ssize_t iddp_recvmsg(struct rtdm_fd *fd,
} else if (msg->msg_namelen != 0)
return -EINVAL;
 
-   if (msg->msg_iovlen >= RTIPC_IOV_MAX)
+   if (msg->msg_iovlen >= UIO_MAXIOV)
return -EINVAL;
 
/* Copy I/O vector in */
-   ret = rtipc_get_iovec(fd, iov, msg);
+   ret = rtipc_get_iovec(fd, &iov, msg, iov_fast);
if (ret)
return ret;
 
ret = __iddp_recvmsg(fd, iov, msg->msg_iovlen, flags, &saddr);
-   if (ret <= 0)
+   if (ret <= 0) {
+   rtipc_drop_iovec(iov, iov_fast);
return ret;
+   }
 
/* Copy the updated I/O vector back */
-   if (rtipc_put_iovec(fd, iov, msg))
+   if (rtipc_put_iovec(fd, iov, msg, iov_fast))
return -EFAULT;
 
/* Copy the source address if required. */
@@ -468,8 +470,8 @@ static ssize_t idd