[Xenomai-git] Philippe Gerum : drivers/ipc: reduce stack footprint of I/O vectors
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
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
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