Module: xenomai-gch
Branch: for-forge
Commit: dc5822c60b1c7f48239791acaef86a1aa5046af9
URL:    
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=dc5822c60b1c7f48239791acaef86a1aa5046af9

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Tue Feb  4 21:43:40 2014 +0100

drivers/ipc: adapt BUFP after RTDM changes

---

 kernel/drivers/ipc/bufp.c |  114 +++++++++++++++++++++++----------------------
 1 file changed, 58 insertions(+), 56 deletions(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 233d86a..b3cfcc4 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -113,7 +113,7 @@ static struct xnpnode_link __bufp_pnode = {
 #endif /* !CONFIG_XENO_OPT_VFILE */
 
 static int bufp_socket(struct rtipc_private *priv,
-                      rtdm_user_info_t *user_info)
+                      struct xnfd *context)
 {
        struct bufp_socket *sk = priv->state;
 
@@ -139,8 +139,8 @@ static int bufp_socket(struct rtipc_private *priv,
        return 0;
 }
 
-static int bufp_close(struct rtipc_private *priv,
-                     rtdm_user_info_t *user_info)
+static void bufp_close(struct rtipc_private *priv,
+               struct xnfd *context)
 {
        struct bufp_socket *sk = priv->state;
 
@@ -148,7 +148,9 @@ static int bufp_close(struct rtipc_private *priv,
        rtdm_event_destroy(&sk->o_event);
 
        if (sk->name.sipc_port > -1)
-               xnmap_remove(portmap, sk->name.sipc_port);
+               RTDM_EXECUTE_ATOMICALLY(
+                       xnmap_remove(portmap, sk->name.sipc_port);
+               );
 
        if (sk->handle)
                xnregistry_remove(sk->handle);
@@ -157,8 +159,6 @@ static int bufp_close(struct rtipc_private *priv,
                free_pages_exact(sk->bufmem, sk->bufsz);
 
        kfree(sk);
-
-       return 0;
 }
 
 static ssize_t __bufp_readbuf(struct bufp_socket *sk,
@@ -290,7 +290,7 @@ out:
 }
 
 static ssize_t __bufp_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)
 {
@@ -321,7 +321,7 @@ static ssize_t __bufp_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 = __bufp_readbuf(sk, &bufd, flags);
                        xnbufd_unmap_uread(&bufd);
@@ -352,7 +352,7 @@ static ssize_t __bufp_recvmsg(struct rtipc_private *priv,
 }
 
 static ssize_t bufp_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];
@@ -372,23 +372,23 @@ static ssize_t bufp_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 = __bufp_recvmsg(priv, user_info,
+       ret = __bufp_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);
@@ -398,11 +398,11 @@ static ssize_t bufp_recvmsg(struct rtipc_private *priv,
 }
 
 static ssize_t bufp_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 __bufp_recvmsg(priv, user_info, &iov, 1, 0, NULL);
+       return __bufp_recvmsg(priv, context, &iov, 1, 0, NULL);
 }
 
 static ssize_t __bufp_writebuf(struct bufp_socket *rsk,
@@ -522,26 +522,25 @@ out:
 }
 
 static ssize_t __bufp_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 bufp_socket *sk = priv->state, *rsk;
-       struct rtdm_dev_context *rcontext;
        ssize_t len, rdlen, vlen, ret = 0;
+       struct xnfd *rcontext;
        struct xnbufd bufd;
        int nvec;
-       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;
 
@@ -569,7 +568,7 @@ static ssize_t __bufp_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 = __bufp_writebuf(rsk, sk, &bufd, flags);
                        xnbufd_unmap_uread(&bufd);
@@ -596,7 +595,7 @@ fail:
 }
 
 static ssize_t bufp_sendmsg(struct rtipc_private *priv,
-                           rtdm_user_info_t *user_info,
+                           struct xnfd *context,
                            const struct msghdr *msg, int flags)
 {
        struct bufp_socket *sk = priv->state;
@@ -612,7 +611,7 @@ static ssize_t bufp_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;
 
@@ -631,17 +630,17 @@ static ssize_t bufp_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 = __bufp_sendmsg(priv, user_info, iov,
+       ret = __bufp_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;
 
@@ -649,7 +648,7 @@ static ssize_t bufp_sendmsg(struct rtipc_private *priv,
 }
 
 static ssize_t bufp_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 };
@@ -658,14 +657,15 @@ static ssize_t bufp_write(struct rtipc_private *priv,
        if (sk->peer.sipc_port < 0)
                return -EDESTADDRREQ;
 
-       return __bufp_sendmsg(priv, user_info, &iov, 1, 0, &sk->peer);
+       return __bufp_sendmsg(priv, context, &iov, 1, 0, &sk->peer);
 }
 
 static int __bufp_bind_socket(struct rtipc_private *priv,
                              struct sockaddr_ipc *sa)
 {
        struct bufp_socket *sk = priv->state;
-       int ret = 0, port, fd;
+       int ret = 0, port;
+       struct xnfd *fd;
 
        if (sa->sipc_family != AF_RTIPC)
                return -EINVAL;
@@ -684,8 +684,10 @@ static int __bufp_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;
 
@@ -797,7 +799,7 @@ set_assoc:
 }
 
 static int __bufp_setsockopt(struct bufp_socket *sk,
-                            rtdm_user_info_t *user_info,
+                            struct xnfd *context,
                             void *arg)
 {
        struct _rtdm_setsockopt_args sopt;
@@ -806,7 +808,7 @@ static int __bufp_setsockopt(struct bufp_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) {
@@ -815,7 +817,7 @@ static int __bufp_setsockopt(struct bufp_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);
@@ -824,7 +826,7 @@ static int __bufp_setsockopt(struct bufp_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);
@@ -845,7 +847,7 @@ static int __bufp_setsockopt(struct bufp_socket *sk,
        case BUFP_BUFSZ:
                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)
@@ -866,7 +868,7 @@ static int __bufp_setsockopt(struct bufp_socket *sk,
        case BUFP_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(
@@ -891,7 +893,7 @@ static int __bufp_setsockopt(struct bufp_socket *sk,
 }
 
 static int __bufp_getsockopt(struct bufp_socket *sk,
-                            rtdm_user_info_t *user_info,
+                            struct xnfd *context,
                             void *arg)
 {
        struct _rtdm_getsockopt_args sopt;
@@ -900,10 +902,10 @@ static int __bufp_getsockopt(struct bufp_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) {
@@ -913,7 +915,7 @@ static int __bufp_getsockopt(struct bufp_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;
@@ -922,7 +924,7 @@ static int __bufp_getsockopt(struct bufp_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;
@@ -945,7 +947,7 @@ static int __bufp_getsockopt(struct bufp_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;
@@ -958,7 +960,7 @@ static int __bufp_getsockopt(struct bufp_socket *sk,
 }
 
 static int __bufp_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;
@@ -968,14 +970,14 @@ static int __bufp_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 = __bufp_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)
@@ -984,19 +986,19 @@ static int __bufp_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 = __bufp_setsockopt(sk, user_info, arg);
+               ret = __bufp_setsockopt(sk, context, arg);
                break;
 
        case _RTIOC_GETSOCKOPT:
-               ret = __bufp_getsockopt(sk, user_info, arg);
+               ret = __bufp_getsockopt(sk, context, arg);
                break;
 
        case _RTIOC_LISTEN:
@@ -1016,13 +1018,13 @@ static int __bufp_ioctl(struct rtipc_private *priv,
 }
 
 static int bufp_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 __bufp_ioctl(priv, user_info, request, arg);
+       return __bufp_ioctl(priv, context, request, arg);
 }
 
 static int bufp_init(void)


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to