Module: xenomai-gch Branch: for-forge Commit: c2938b6f8b0b87023eb247815ff36363e888d9bc URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=c2938b6f8b0b87023eb247815ff36363e888d9bc
Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org> Date: Tue Feb 4 21:37:43 2014 +0100 drivers/ipc: adapt IDDP after RTDM changes --- kernel/drivers/ipc/iddp.c | 114 +++++++++++++++++++++-------------------- kernel/drivers/ipc/internal.h | 10 ---- 2 files changed, 59 insertions(+), 65 deletions(-) diff --git a/kernel/drivers/ipc/iddp.c b/kernel/drivers/ipc/iddp.c index c066d4d..7cf03bd 100644 --- a/kernel/drivers/ipc/iddp.c +++ b/kernel/drivers/ipc/iddp.c @@ -192,7 +192,7 @@ static void __iddp_flush_pool(struct xnheap *heap, } static int iddp_socket(struct rtipc_private *priv, - rtdm_user_info_t *user_info) + struct xnfd *context) { struct iddp_socket *sk = priv->state; @@ -217,14 +217,16 @@ static int iddp_socket(struct rtipc_private *priv, return 0; } -static int iddp_close(struct rtipc_private *priv, - rtdm_user_info_t *user_info) +static void iddp_close(struct rtipc_private *priv, + struct xnfd *context) { struct iddp_socket *sk = priv->state; struct iddp_message *mbuf; if (sk->name.sipc_port > -1) - xnmap_remove(portmap, sk->name.sipc_port); + RTDM_EXECUTE_ATOMICALLY( + xnmap_remove(portmap, sk->name.sipc_port); + ); rtdm_sem_destroy(&sk->insem); rtdm_event_destroy(&sk->privevt); @@ -234,7 +236,7 @@ static int iddp_close(struct rtipc_private *priv, if (sk->bufpool != &kheap) { xnheap_destroy(&sk->privpool, __iddp_flush_pool, NULL); - return 0; + return; } /* Send unread datagrams back to the system heap. */ @@ -246,11 +248,11 @@ static int iddp_close(struct rtipc_private *priv, kfree(sk); - return 0; + return; } static ssize_t __iddp_recvmsg(struct rtipc_private *priv, - rtdm_user_info_t *user_info, + struct xnfd *context, struct iovec *iov, int iovlen, int flags, struct sockaddr_ipc *saddr) { @@ -303,7 +305,7 @@ static ssize_t __iddp_recvmsg(struct rtipc_private *priv, if (iov[nvec].iov_len == 0) continue; vlen = wrlen >= iov[nvec].iov_len ? iov[nvec].iov_len : wrlen; - if (user_info) { + if (rtdm_context_user_p(context)) { xnbufd_map_uread(&bufd, iov[nvec].iov_base, vlen); ret = xnbufd_copy_from_kmem(&bufd, mbuf->data + rdoff, vlen); xnbufd_unmap_uread(&bufd); @@ -327,7 +329,7 @@ static ssize_t __iddp_recvmsg(struct rtipc_private *priv, } static ssize_t iddp_recvmsg(struct rtipc_private *priv, - rtdm_user_info_t *user_info, + struct xnfd *context, struct msghdr *msg, int flags) { struct iovec iov[RTIPC_IOV_MAX]; @@ -347,23 +349,23 @@ static ssize_t iddp_recvmsg(struct rtipc_private *priv, return -EINVAL; /* Copy I/O vector in */ - if (rtipc_get_arg(user_info, iov, msg->msg_iov, + if (rtipc_get_arg(context, iov, msg->msg_iov, sizeof(iov[0]) * msg->msg_iovlen)) return -EFAULT; - ret = __iddp_recvmsg(priv, user_info, + ret = __iddp_recvmsg(priv, context, iov, msg->msg_iovlen, flags, &saddr); if (ret <= 0) return ret; /* Copy the updated I/O vector back */ - if (rtipc_put_arg(user_info, msg->msg_iov, iov, + if (rtipc_put_arg(context, msg->msg_iov, iov, sizeof(iov[0]) * msg->msg_iovlen)) return -EFAULT; /* Copy the source address if required. */ if (msg->msg_name) { - if (rtipc_put_arg(user_info, msg->msg_name, + if (rtipc_put_arg(context, msg->msg_name, &saddr, sizeof(saddr))) return -EFAULT; msg->msg_namelen = sizeof(struct sockaddr_ipc); @@ -373,35 +375,34 @@ static ssize_t iddp_recvmsg(struct rtipc_private *priv, } static ssize_t iddp_read(struct rtipc_private *priv, - rtdm_user_info_t *user_info, + struct xnfd *context, void *buf, size_t len) { struct iovec iov = { .iov_base = buf, .iov_len = len }; - return __iddp_recvmsg(priv, user_info, &iov, 1, 0, NULL); + return __iddp_recvmsg(priv, context, &iov, 1, 0, NULL); } static ssize_t __iddp_sendmsg(struct rtipc_private *priv, - rtdm_user_info_t *user_info, + struct xnfd *context, struct iovec *iov, int iovlen, int flags, const struct sockaddr_ipc *daddr) { struct iddp_socket *sk = priv->state, *rsk; - struct rtdm_dev_context *rcontext; struct iddp_message *mbuf; ssize_t len, rdlen, vlen; + struct xnfd *rcontext; int nvec, wroff, ret; struct xnbufd bufd; - void *p; len = rtipc_get_iov_flatlen(iov, iovlen); if (len == 0) return 0; - p = xnmap_fetch_nocheck(portmap, daddr->sipc_port); - if (p == NULL) - return -ECONNRESET; - - rcontext = rtdm_context_get(rtipc_map2fd(p)); + RTDM_EXECUTE_ATOMICALLY( + rcontext = xnmap_fetch_nocheck(portmap, daddr->sipc_port); + if (rcontext && rtdm_context_lock(rcontext) < 0) + rcontext = NULL; + ); if (rcontext == NULL) return -ECONNRESET; @@ -423,7 +424,7 @@ static ssize_t __iddp_sendmsg(struct rtipc_private *priv, if (iov[nvec].iov_len == 0) continue; vlen = rdlen >= iov[nvec].iov_len ? iov[nvec].iov_len : rdlen; - if (user_info) { + if (rtdm_context_user_p(context)) { xnbufd_map_uread(&bufd, iov[nvec].iov_base, vlen); ret = xnbufd_copy_to_kmem(mbuf->data + wroff, &bufd, vlen); xnbufd_unmap_uread(&bufd); @@ -462,7 +463,7 @@ fail: } static ssize_t iddp_sendmsg(struct rtipc_private *priv, - rtdm_user_info_t *user_info, + struct xnfd *context, const struct msghdr *msg, int flags) { struct iddp_socket *sk = priv->state; @@ -478,7 +479,7 @@ static ssize_t iddp_sendmsg(struct rtipc_private *priv, return -EINVAL; /* Fetch the destination address to send to. */ - if (rtipc_get_arg(user_info, &daddr, + if (rtipc_get_arg(context, &daddr, msg->msg_name, sizeof(daddr))) return -EFAULT; @@ -497,17 +498,17 @@ static ssize_t iddp_sendmsg(struct rtipc_private *priv, return -EINVAL; /* Copy I/O vector in */ - if (rtipc_get_arg(user_info, iov, msg->msg_iov, + if (rtipc_get_arg(context, iov, msg->msg_iov, sizeof(iov[0]) * msg->msg_iovlen)) return -EFAULT; - ret = __iddp_sendmsg(priv, user_info, iov, + ret = __iddp_sendmsg(priv, context, iov, msg->msg_iovlen, flags, &daddr); if (ret <= 0) return ret; /* Copy updated I/O vector back */ - if (rtipc_put_arg(user_info, msg->msg_iov, iov, + if (rtipc_put_arg(context, msg->msg_iov, iov, sizeof(iov[0]) * msg->msg_iovlen)) return -EFAULT; @@ -515,7 +516,7 @@ static ssize_t iddp_sendmsg(struct rtipc_private *priv, } static ssize_t iddp_write(struct rtipc_private *priv, - rtdm_user_info_t *user_info, + struct xnfd *context, const void *buf, size_t len) { struct iovec iov = { .iov_base = (void *)buf, .iov_len = len }; @@ -524,14 +525,15 @@ static ssize_t iddp_write(struct rtipc_private *priv, if (sk->peer.sipc_port < 0) return -EDESTADDRREQ; - return __iddp_sendmsg(priv, user_info, &iov, 1, 0, &sk->peer); + return __iddp_sendmsg(priv, context, &iov, 1, 0, &sk->peer); } static int __iddp_bind_socket(struct rtipc_private *priv, struct sockaddr_ipc *sa) { struct iddp_socket *sk = priv->state; - int ret = 0, port, fd; + int ret = 0, port; + struct xnfd *fd; void *poolmem; size_t poolsz; @@ -552,8 +554,10 @@ static int __iddp_bind_socket(struct rtipc_private *priv, /* Will auto-select a free port number if unspec (-1). */ port = sa->sipc_port; - fd = rtdm_private_to_context(priv)->fd; - port = xnmap_enter(portmap, port, rtipc_fd2map(fd)); + fd = rtdm_private_to_context(priv); + RTDM_EXECUTE_ATOMICALLY( + port = xnmap_enter(portmap, port, fd); + ); if (port < 0) return port == -EEXIST ? -EADDRINUSE : -ENOMEM; @@ -680,7 +684,7 @@ set_assoc: } static int __iddp_setsockopt(struct iddp_socket *sk, - rtdm_user_info_t *user_info, + struct xnfd *context, void *arg) { struct _rtdm_setsockopt_args sopt; @@ -689,7 +693,7 @@ static int __iddp_setsockopt(struct iddp_socket *sk, int ret = 0; size_t len; - if (rtipc_get_arg(user_info, &sopt, arg, sizeof(sopt))) + if (rtipc_get_arg(context, &sopt, arg, sizeof(sopt))) return -EFAULT; if (sopt.level == SOL_SOCKET) { @@ -698,7 +702,7 @@ static int __iddp_setsockopt(struct iddp_socket *sk, case SO_RCVTIMEO: if (sopt.optlen != sizeof(tv)) return -EINVAL; - if (rtipc_get_arg(user_info, &tv, + if (rtipc_get_arg(context, &tv, sopt.optval, sizeof(tv))) return -EFAULT; sk->rx_timeout = rtipc_timeval_to_ns(&tv); @@ -707,7 +711,7 @@ static int __iddp_setsockopt(struct iddp_socket *sk, case SO_SNDTIMEO: if (sopt.optlen != sizeof(tv)) return -EINVAL; - if (rtipc_get_arg(user_info, &tv, + if (rtipc_get_arg(context, &tv, sopt.optval, sizeof(tv))) return -EFAULT; sk->tx_timeout = rtipc_timeval_to_ns(&tv); @@ -728,7 +732,7 @@ static int __iddp_setsockopt(struct iddp_socket *sk, case IDDP_POOLSZ: if (sopt.optlen != sizeof(len)) return -EINVAL; - if (rtipc_get_arg(user_info, &len, + if (rtipc_get_arg(context, &len, sopt.optval, sizeof(len))) return -EFAULT; if (len == 0) @@ -749,7 +753,7 @@ static int __iddp_setsockopt(struct iddp_socket *sk, case IDDP_LABEL: if (sopt.optlen < sizeof(plabel)) return -EINVAL; - if (rtipc_get_arg(user_info, &plabel, + if (rtipc_get_arg(context, &plabel, sopt.optval, sizeof(plabel))) return -EFAULT; RTDM_EXECUTE_ATOMICALLY( @@ -774,7 +778,7 @@ static int __iddp_setsockopt(struct iddp_socket *sk, } static int __iddp_getsockopt(struct iddp_socket *sk, - rtdm_user_info_t *user_info, + struct xnfd *context, void *arg) { struct _rtdm_getsockopt_args sopt; @@ -783,10 +787,10 @@ static int __iddp_getsockopt(struct iddp_socket *sk, socklen_t len; int ret = 0; - if (rtipc_get_arg(user_info, &sopt, arg, sizeof(sopt))) + if (rtipc_get_arg(context, &sopt, arg, sizeof(sopt))) return -EFAULT; - if (rtipc_get_arg(user_info, &len, sopt.optlen, sizeof(len))) + if (rtipc_get_arg(context, &len, sopt.optlen, sizeof(len))) return -EFAULT; if (sopt.level == SOL_SOCKET) { @@ -796,7 +800,7 @@ static int __iddp_getsockopt(struct iddp_socket *sk, if (len != sizeof(tv)) return -EINVAL; rtipc_ns_to_timeval(&tv, sk->rx_timeout); - if (rtipc_put_arg(user_info, sopt.optval, + if (rtipc_put_arg(context, sopt.optval, &tv, sizeof(tv))) return -EFAULT; break; @@ -805,7 +809,7 @@ static int __iddp_getsockopt(struct iddp_socket *sk, if (len != sizeof(tv)) return -EINVAL; rtipc_ns_to_timeval(&tv, sk->tx_timeout); - if (rtipc_put_arg(user_info, sopt.optval, + if (rtipc_put_arg(context, sopt.optval, &tv, sizeof(tv))) return -EFAULT; break; @@ -828,7 +832,7 @@ static int __iddp_getsockopt(struct iddp_socket *sk, RTDM_EXECUTE_ATOMICALLY( strcpy(plabel.label, sk->label); ); - if (rtipc_put_arg(user_info, sopt.optval, + if (rtipc_put_arg(context, sopt.optval, &plabel, sizeof(plabel))) return -EFAULT; break; @@ -841,7 +845,7 @@ static int __iddp_getsockopt(struct iddp_socket *sk, } static int __iddp_ioctl(struct rtipc_private *priv, - rtdm_user_info_t *user_info, + struct xnfd *context, unsigned int request, void *arg) { struct sockaddr_ipc saddr, *saddrp = &saddr; @@ -851,14 +855,14 @@ static int __iddp_ioctl(struct rtipc_private *priv, switch (request) { case _RTIOC_CONNECT: - ret = rtipc_get_sockaddr(user_info, arg, &saddrp); + ret = rtipc_get_sockaddr(context, arg, &saddrp); if (ret) return ret; ret = __iddp_connect_socket(sk, saddrp); break; case _RTIOC_BIND: - ret = rtipc_get_sockaddr(user_info, arg, &saddrp); + ret = rtipc_get_sockaddr(context, arg, &saddrp); if (ret) return ret; if (saddrp == NULL) @@ -867,19 +871,19 @@ static int __iddp_ioctl(struct rtipc_private *priv, break; case _RTIOC_GETSOCKNAME: - ret = rtipc_put_sockaddr(user_info, arg, &sk->name); + ret = rtipc_put_sockaddr(context, arg, &sk->name); break; case _RTIOC_GETPEERNAME: - ret = rtipc_put_sockaddr(user_info, arg, &sk->peer); + ret = rtipc_put_sockaddr(context, arg, &sk->peer); break; case _RTIOC_SETSOCKOPT: - ret = __iddp_setsockopt(sk, user_info, arg); + ret = __iddp_setsockopt(sk, context, arg); break; case _RTIOC_GETSOCKOPT: - ret = __iddp_getsockopt(sk, user_info, arg); + ret = __iddp_getsockopt(sk, context, arg); break; case _RTIOC_LISTEN: @@ -899,13 +903,13 @@ static int __iddp_ioctl(struct rtipc_private *priv, } static int iddp_ioctl(struct rtipc_private *priv, - rtdm_user_info_t *user_info, + struct xnfd *context, unsigned int request, void *arg) { if (rtdm_in_rt_context() && request == _RTIOC_BIND) return -ENOSYS; /* Try downgrading to NRT */ - return __iddp_ioctl(priv, user_info, request, arg); + return __iddp_ioctl(priv, context, request, arg); } static int iddp_init(void) diff --git a/kernel/drivers/ipc/internal.h b/kernel/drivers/ipc/internal.h index 4ef9a2b..75eb91c 100644 --- a/kernel/drivers/ipc/internal.h +++ b/kernel/drivers/ipc/internal.h @@ -69,16 +69,6 @@ static inline void *rtipc_context_to_state(struct xnfd *context) return p->state; } -static inline void *rtipc_fd2map(int fd) -{ - return (void *)(long)(fd + 1); -} - -static inline int rtipc_map2fd(void *p) -{ - return (long)p - 1; -} - static inline nanosecs_rel_t rtipc_timeval_to_ns(const struct timeval *tv) { nanosecs_rel_t ns = tv->tv_usec * 1000; _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git