Module: xenomai-forge Branch: next Commit: 017fbd8b90e3878e4be98940f65f6b0027210e8c URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=017fbd8b90e3878e4be98940f65f6b0027210e8c
Author: Philippe Gerum <r...@xenomai.org> Date: Thu May 29 15:40:51 2014 +0200 drivers/ipc: cleanup atomic blocks --- kernel/drivers/ipc/bufp.c | 37 ++++++++++++++++--------------------- kernel/drivers/ipc/iddp.c | 19 ++++++++----------- kernel/drivers/ipc/internal.h | 2 -- kernel/drivers/ipc/xddp.c | 33 ++++++++++++++++----------------- 4 files changed, 40 insertions(+), 51 deletions(-) diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c index bf37ac0..78e88f4 100644 --- a/kernel/drivers/ipc/bufp.c +++ b/kernel/drivers/ipc/bufp.c @@ -28,8 +28,6 @@ #include <rtdm/ipc.h> #include "internal.h" -#define trace(m,a...) printk(KERN_WARNING "%s: " m "\n", __FUNCTION__, ##a) - #define BUFP_SOCKET_MAGIC 0xa61a61a6 struct bufp_socket { @@ -61,7 +59,6 @@ struct bufp_wait_context { struct rtipc_wait_context wc; size_t len; struct bufp_socket *sk; - rtdm_lockctx_t lockctx; }; static struct sockaddr_ipc nullsa = { @@ -135,13 +132,12 @@ static void bufp_close(struct rtipc_private *priv, struct rtdm_fd *fd) { struct bufp_socket *sk = priv->state; + rtdm_lockctx_t s; rtdm_event_destroy(&sk->i_event); rtdm_event_destroy(&sk->o_event); if (sk->name.sipc_port > -1) { - spl_t s; - cobalt_atomic_enter(s); xnmap_remove(portmap, sk->name.sipc_port); cobalt_atomic_leave(s); @@ -166,6 +162,7 @@ static ssize_t __bufp_readbuf(struct bufp_socket *sk, rtdm_toseq_t toseq; ssize_t len, ret; size_t rbytes, n; + rtdm_lockctx_t s; u_long rdtoken; off_t rdoff; @@ -173,8 +170,7 @@ static ssize_t __bufp_readbuf(struct bufp_socket *sk, rtdm_toseq_init(&toseq, sk->rx_timeout); - rtipc_enter_atomic(wait.lockctx); - + cobalt_atomic_enter(s); redo: for (;;) { /* @@ -203,12 +199,12 @@ redo: * Release the lock while retrieving the data * to keep latency low. */ - rtipc_leave_atomic(wait.lockctx); + cobalt_atomic_leave(s); ret = xnbufd_copy_from_kmem(bufd, sk->bufmem + rdoff, n); if (ret < 0) return ret; - rtipc_enter_atomic(wait.lockctx); + cobalt_atomic_enter(s); /* * In case we were preempted while retrieving * the message, we have to re-read the whole @@ -279,7 +275,7 @@ redo: break; } out: - rtipc_leave_atomic(wait.lockctx); + cobalt_atomic_leave(s); return ret; } @@ -409,6 +405,7 @@ static ssize_t __bufp_writebuf(struct bufp_socket *rsk, struct rtipc_wait_context *wc; struct xnthread *waiter; rtdm_toseq_t toseq; + rtdm_lockctx_t s; ssize_t len, ret; size_t wbytes, n; u_long wrtoken; @@ -418,8 +415,7 @@ static ssize_t __bufp_writebuf(struct bufp_socket *rsk, rtdm_toseq_init(&toseq, sk->rx_timeout); - rtipc_enter_atomic(wait.lockctx); - + cobalt_atomic_enter(s); redo: for (;;) { /* @@ -448,11 +444,11 @@ redo: * Release the lock while copying the data to * keep latency low. */ - rtipc_leave_atomic(wait.lockctx); + cobalt_atomic_leave(s); ret = xnbufd_copy_to_kmem(rsk->bufmem + wroff, bufd, n); if (ret < 0) return ret; - rtipc_enter_atomic(wait.lockctx); + cobalt_atomic_enter(s); /* * In case we were preempted while copying the * message, we have to write the whole thing @@ -511,7 +507,7 @@ redo: break; } out: - rtipc_leave_atomic(wait.lockctx); + cobalt_atomic_leave(s); return ret; } @@ -525,8 +521,8 @@ static ssize_t __bufp_sendmsg(struct rtipc_private *priv, ssize_t len, rdlen, vlen, ret = 0; struct rtdm_fd *rfd; struct xnbufd bufd; + rtdm_lockctx_t s; int nvec; - spl_t s; len = rtipc_get_iov_flatlen(iov, iovlen); if (len == 0) @@ -583,7 +579,6 @@ static ssize_t __bufp_sendmsg(struct rtipc_private *priv, rtdm_fd_unlock(rfd); return len - rdlen; - fail: rtdm_fd_unlock(rfd); @@ -662,7 +657,7 @@ static int __bufp_bind_socket(struct rtipc_private *priv, struct bufp_socket *sk = priv->state; int ret = 0, port; struct rtdm_fd *fd; - spl_t s; + rtdm_lockctx_t s; if (sa->sipc_family != AF_RTIPC) return -EINVAL; @@ -735,9 +730,9 @@ static int __bufp_connect_socket(struct bufp_socket *sk, struct sockaddr_ipc *sa) { struct bufp_socket *rsk; + rtdm_lockctx_t s; xnhandle_t h; int ret; - spl_t s; if (sa == NULL) { sa = &nullsa; @@ -804,9 +799,9 @@ static int __bufp_setsockopt(struct bufp_socket *sk, struct _rtdm_setsockopt_args sopt; struct rtipc_port_label plabel; struct timeval tv; + rtdm_lockctx_t s; int ret = 0; size_t len; - spl_t s; if (rtipc_get_arg(fd, &sopt, arg, sizeof(sopt))) return -EFAULT; @@ -899,9 +894,9 @@ static int __bufp_getsockopt(struct bufp_socket *sk, struct _rtdm_getsockopt_args sopt; struct rtipc_port_label plabel; struct timeval tv; + rtdm_lockctx_t s; socklen_t len; int ret = 0; - spl_t s; if (rtipc_get_arg(fd, &sopt, arg, sizeof(sopt))) return -EFAULT; diff --git a/kernel/drivers/ipc/iddp.c b/kernel/drivers/ipc/iddp.c index 9e14de6..e0e6244 100644 --- a/kernel/drivers/ipc/iddp.c +++ b/kernel/drivers/ipc/iddp.c @@ -28,8 +28,6 @@ #include <rtdm/ipc.h> #include "internal.h" -#define trace(m,a...) printk(KERN_WARNING "%s: " m "\n", __FUNCTION__, ##a) - #define IDDP_SOCKET_MAGIC 0xa37a37a8 struct iddp_message { @@ -115,8 +113,8 @@ __iddp_alloc_mbuf(struct iddp_socket *sk, size_t len, { struct iddp_message *mbuf = NULL; rtdm_toseq_t timeout_seq; + rtdm_lockctx_t s; int ret = 0; - spl_t s; rtdm_toseq_init(&timeout_seq, timeout); @@ -195,10 +193,9 @@ static void iddp_close(struct rtipc_private *priv, { struct iddp_socket *sk = priv->state; struct iddp_message *mbuf; + rtdm_lockctx_t s; if (sk->name.sipc_port > -1) { - spl_t s; - cobalt_atomic_enter(s); xnmap_remove(portmap, sk->name.sipc_port); cobalt_atomic_leave(s); @@ -239,7 +236,7 @@ static ssize_t __iddp_recvmsg(struct rtipc_private *priv, struct iddp_message *mbuf; nanosecs_rel_t timeout; struct xnbufd bufd; - spl_t s; + rtdm_lockctx_t s; if (!test_bit(_IDDP_BOUND, &sk->status)) return -EAGAIN; @@ -387,7 +384,7 @@ static ssize_t __iddp_sendmsg(struct rtipc_private *priv, struct rtdm_fd *rfd; int nvec, wroff, ret; struct xnbufd bufd; - spl_t s; + rtdm_lockctx_t s; len = rtipc_get_iov_flatlen(iov, iovlen); if (len == 0) @@ -529,9 +526,9 @@ static int __iddp_bind_socket(struct rtipc_private *priv, struct iddp_socket *sk = priv->state; int ret = 0, port; struct rtdm_fd *fd; + rtdm_lockctx_t s; void *poolmem; size_t poolsz; - spl_t s; if (sa->sipc_family != AF_RTIPC) return -EINVAL; @@ -617,9 +614,9 @@ static int __iddp_connect_socket(struct iddp_socket *sk, struct sockaddr_ipc *sa) { struct iddp_socket *rsk; + rtdm_lockctx_t s; xnhandle_t h; int ret; - spl_t s; if (sa == NULL) { sa = &nullsa; @@ -686,9 +683,9 @@ static int __iddp_setsockopt(struct iddp_socket *sk, struct _rtdm_setsockopt_args sopt; struct rtipc_port_label plabel; struct timeval tv; + rtdm_lockctx_t s; int ret = 0; size_t len; - spl_t s; if (rtipc_get_arg(fd, &sopt, arg, sizeof(sopt))) return -EFAULT; @@ -781,9 +778,9 @@ static int __iddp_getsockopt(struct iddp_socket *sk, struct _rtdm_getsockopt_args sopt; struct rtipc_port_label plabel; struct timeval tv; + rtdm_lockctx_t s; socklen_t len; int ret = 0; - spl_t s; if (rtipc_get_arg(fd, &sopt, arg, sizeof(sopt))) return -EFAULT; diff --git a/kernel/drivers/ipc/internal.h b/kernel/drivers/ipc/internal.h index ed14e3d..d388b73 100644 --- a/kernel/drivers/ipc/internal.h +++ b/kernel/drivers/ipc/internal.h @@ -114,7 +114,5 @@ extern struct xnptree rtipc_ptree; #define rtipc_get_wait_context xnthread_get_wait_context #define rtipc_peek_wait_head(obj) xnsynch_peek_pendq(&(obj)->synch_base) -#define rtipc_enter_atomic(lockctx) xnlock_get_irqsave(&nklock, (lockctx)) -#define rtipc_leave_atomic(lockctx) xnlock_put_irqrestore(&nklock, (lockctx)) #endif /* !_RTIPC_INTERNAL_H */ diff --git a/kernel/drivers/ipc/xddp.c b/kernel/drivers/ipc/xddp.c index 5190661..5b16314 100644 --- a/kernel/drivers/ipc/xddp.c +++ b/kernel/drivers/ipc/xddp.c @@ -150,7 +150,7 @@ static int __xddp_resize_streambuf(struct xddp_socket *sk) /* sk->lock held */ static void __xddp_free_handler(void *buf, void *skarg) /* nklock free */ { struct xddp_socket *sk = skarg; - rtdm_lockctx_t lockctx; + rtdm_lockctx_t s; if (buf != sk->buffer) { xnheap_free(sk->bufpool, buf); @@ -159,7 +159,7 @@ static void __xddp_free_handler(void *buf, void *skarg) /* nklock free */ /* Reset the streaming buffer. */ - rtdm_lock_get_irqsave(&sk->lock, lockctx); + rtdm_lock_get_irqsave(&sk->lock, s); sk->fillsz = 0; sk->buffer_port = -1; @@ -173,7 +173,7 @@ static void __xddp_free_handler(void *buf, void *skarg) /* nklock free */ if (unlikely(sk->curbufsz != sk->reqbufsz)) __xddp_resize_streambuf(sk); - rtdm_lock_put_irqrestore(&sk->lock, lockctx); + rtdm_lock_put_irqrestore(&sk->lock, s); } static void __xddp_output_handler(struct xnpipe_mh *mh, void *skarg) /* nklock held */ @@ -241,7 +241,7 @@ static void xddp_close(struct rtipc_private *priv, struct rtdm_fd *fd) { struct xddp_socket *sk = priv->state; - spl_t s; + rtdm_lockctx_t s; sk->monitor = NULL; @@ -381,7 +381,7 @@ static ssize_t __xddp_stream(struct xddp_socket *sk, { struct xddp_message *mbuf; size_t fillptr, rembytes; - rtdm_lockctx_t lockctx; + rtdm_lockctx_t s; ssize_t outbytes; int ret; @@ -390,7 +390,7 @@ static ssize_t __xddp_stream(struct xddp_socket *sk, * the nklock directly or indirectly, so holding our socket * lock across those calls is fine. */ - rtdm_lock_get_irqsave(&sk->lock, lockctx); + rtdm_lock_get_irqsave(&sk->lock, s); /* * There are two cases in which we must remove the cork @@ -416,10 +416,10 @@ static ssize_t __xddp_stream(struct xddp_socket *sk, fillptr = sk->fillsz; sk->fillsz += outbytes; - rtdm_lock_put_irqrestore(&sk->lock, lockctx); + rtdm_lock_put_irqrestore(&sk->lock, s); ret = xnbufd_copy_to_kmem(mbuf->data + fillptr, bufd, outbytes); - rtdm_lock_get_irqsave(&sk->lock, lockctx); + rtdm_lock_get_irqsave(&sk->lock, s); if (ret < 0) { outbytes = ret; @@ -445,7 +445,7 @@ static ssize_t __xddp_stream(struct xddp_socket *sk, } out: - rtdm_lock_put_irqrestore(&sk->lock, lockctx); + rtdm_lock_put_irqrestore(&sk->lock, s); return outbytes; } @@ -462,7 +462,7 @@ static ssize_t __xddp_sendmsg(struct rtipc_private *priv, struct rtdm_fd *rfd; int nvec, to, from; struct xnbufd bufd; - spl_t s; + rtdm_lockctx_t s; len = rtipc_get_iov_flatlen(iov, iovlen); if (len == 0) @@ -663,10 +663,10 @@ static int __xddp_bind_socket(struct rtipc_private *priv, { struct xddp_socket *sk = priv->state; struct xnpipe_operations ops; + rtdm_lockctx_t s; size_t poolsz; void *poolmem; int ret = 0; - spl_t s; if (sa->sipc_family != AF_RTIPC) return -EINVAL; @@ -767,9 +767,9 @@ static int __xddp_connect_socket(struct xddp_socket *sk, struct sockaddr_ipc *sa) { struct xddp_socket *rsk; + rtdm_lockctx_t s; xnhandle_t h; int ret; - spl_t s; if (sa == NULL) { sa = &nullsa; @@ -836,11 +836,10 @@ static int __xddp_setsockopt(struct xddp_socket *sk, int (*monitor)(struct rtdm_fd *fd, int event, long arg); struct _rtdm_setsockopt_args sopt; struct rtipc_port_label plabel; - rtdm_lockctx_t lockctx; struct timeval tv; + rtdm_lockctx_t s; int ret = 0; size_t len; - spl_t s; if (rtipc_get_arg(fd, &sopt, arg, sizeof(sopt))) return -EFAULT; @@ -882,13 +881,13 @@ static int __xddp_setsockopt(struct xddp_socket *sk, return -EINVAL; } } - rtdm_lock_get_irqsave(&sk->lock, lockctx); + rtdm_lock_get_irqsave(&sk->lock, s); sk->reqbufsz = len; if (len != sk->curbufsz && !test_bit(_XDDP_SYNCWAIT, &sk->status) && test_bit(_XDDP_BOUND, &sk->status)) ret = __xddp_resize_streambuf(sk); - rtdm_lock_put_irqrestore(&sk->lock, lockctx); + rtdm_lock_put_irqrestore(&sk->lock, s); break; case XDDP_POOLSZ: @@ -951,9 +950,9 @@ static int __xddp_getsockopt(struct xddp_socket *sk, struct _rtdm_getsockopt_args sopt; struct rtipc_port_label plabel; struct timeval tv; + rtdm_lockctx_t s; socklen_t len; int ret = 0; - spl_t s; if (rtipc_get_arg(fd, &sopt, arg, sizeof(sopt))) return -EFAULT; _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git