[Xenomai-git] Philippe Gerum : analogy/device: sanitize device release handler

2014-04-12 Thread git repository hosting
Module: xenomai-2.6
Branch: master
Commit: 0f1ae8401ceaa8af387062b1e126a66e0c7c9c1f
URL:
http://git.xenomai.org/?p=xenomai-2.6.git;a=commit;h=0f1ae8401ceaa8af387062b1e126a66e0c7c9c1f

Author: Philippe Gerum 
Date:   Fri Apr 11 15:16:02 2014 +0200

analogy/device: sanitize device release handler

The main change fixes a crash when a zero-sized private area is
specified for the driver:
http://www.xenomai.org/pipermail/xenomai/2014-April/030628.html

Signed-off-by: Andreas Glatz 

More fixups are included to sanitize this handler a bit further.

Signed-off-by: Philippe Gerum 

---

 ksrc/drivers/analogy/device.c |   27 ---
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/ksrc/drivers/analogy/device.c b/ksrc/drivers/analogy/device.c
index b93ae72..60b2977 100644
--- a/ksrc/drivers/analogy/device.c
+++ b/ksrc/drivers/analogy/device.c
@@ -278,17 +278,15 @@ int a4l_assign_driver(a4l_cxt_t * cxt,
a4l_dev_t *dev = a4l_get_dev(cxt);
 
dev->driver = drv;
+   INIT_LIST_HEAD(&dev->subdvsq);
 
if (drv->privdata_size == 0)
__a4l_dbg(1, core_dbg,
  "a4l_assign_driver: warning! "
  "the field priv will not be usable\n");
else {
-
-   INIT_LIST_HEAD(&dev->subdvsq);
-
dev->priv = rtdm_malloc(drv->privdata_size);
-   if (dev->priv == NULL && drv->privdata_size != 0) {
+   if (dev->priv == NULL) {
__a4l_err("a4l_assign_driver: "
  "call(alloc) failed\n");
ret = -ENOMEM;
@@ -325,27 +323,26 @@ out_assign_driver:
 
 int a4l_release_driver(a4l_cxt_t * cxt)
 {
-   int ret = 0;
a4l_dev_t *dev = a4l_get_dev(cxt);
+   a4l_subd_t *subd, *tmp;
+   int ret = 0;
 
if ((ret = dev->driver->detach(dev)) != 0)
goto out_release_driver;
 
-   /* Decrease module's count
-  so as to allow module unloading */
module_put(dev->driver->owner);
 
/* In case, the driver developer did not free the subdevices */
-   while (&dev->subdvsq != dev->subdvsq.next) {
-   struct list_head *this = dev->subdvsq.next;
-   a4l_subd_t *tmp = list_entry(this, a4l_subd_t, list);
-
-   list_del(this);
-   rtdm_free(tmp);
-   }
+   if (!list_empty(&dev->subdvsq))
+   list_for_each_entry_safe(subd, tmp, &dev->subdvsq, list) {
+   list_del(&subd->list);
+   rtdm_free(subd);
+   }
 
/* Free the private field */
-   rtdm_free(dev->priv);
+   if (dev->priv)
+   rtdm_free(dev->priv);
+
dev->driver = NULL;
 
 out_release_driver:


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


[Xenomai-git] Philippe Gerum : analogy/device: sanitize device release handler

2014-04-12 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: e00fedb370e914aec531abf306b43558075f5306
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=e00fedb370e914aec531abf306b43558075f5306

Author: Philippe Gerum 
Date:   Fri Apr 11 15:16:02 2014 +0200

analogy/device: sanitize device release handler

This change fixes a crash when a zero-sized private area is specified
for the driver:
http://www.xenomai.org/pipermail/xenomai/2014-April/030628.html

More fixups are included to sanitize this handler a bit further.

---

 kernel/drivers/analogy/device.c |   27 ---
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/kernel/drivers/analogy/device.c b/kernel/drivers/analogy/device.c
index b93ae72..60b2977 100644
--- a/kernel/drivers/analogy/device.c
+++ b/kernel/drivers/analogy/device.c
@@ -278,17 +278,15 @@ int a4l_assign_driver(a4l_cxt_t * cxt,
a4l_dev_t *dev = a4l_get_dev(cxt);
 
dev->driver = drv;
+   INIT_LIST_HEAD(&dev->subdvsq);
 
if (drv->privdata_size == 0)
__a4l_dbg(1, core_dbg,
  "a4l_assign_driver: warning! "
  "the field priv will not be usable\n");
else {
-
-   INIT_LIST_HEAD(&dev->subdvsq);
-
dev->priv = rtdm_malloc(drv->privdata_size);
-   if (dev->priv == NULL && drv->privdata_size != 0) {
+   if (dev->priv == NULL) {
__a4l_err("a4l_assign_driver: "
  "call(alloc) failed\n");
ret = -ENOMEM;
@@ -325,27 +323,26 @@ out_assign_driver:
 
 int a4l_release_driver(a4l_cxt_t * cxt)
 {
-   int ret = 0;
a4l_dev_t *dev = a4l_get_dev(cxt);
+   a4l_subd_t *subd, *tmp;
+   int ret = 0;
 
if ((ret = dev->driver->detach(dev)) != 0)
goto out_release_driver;
 
-   /* Decrease module's count
-  so as to allow module unloading */
module_put(dev->driver->owner);
 
/* In case, the driver developer did not free the subdevices */
-   while (&dev->subdvsq != dev->subdvsq.next) {
-   struct list_head *this = dev->subdvsq.next;
-   a4l_subd_t *tmp = list_entry(this, a4l_subd_t, list);
-
-   list_del(this);
-   rtdm_free(tmp);
-   }
+   if (!list_empty(&dev->subdvsq))
+   list_for_each_entry_safe(subd, tmp, &dev->subdvsq, list) {
+   list_del(&subd->list);
+   rtdm_free(subd);
+   }
 
/* Free the private field */
-   rtdm_free(dev->priv);
+   if (dev->priv)
+   rtdm_free(dev->priv);
+
dev->driver = NULL;
 
 out_release_driver:


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


[Xenomai-git] Philippe Gerum : boilerplate/lock: prevent FMR in safe unlock op

2014-04-12 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: ccd3bcbaa04bedfc0c71ef6fa7603d328116e7ee
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=ccd3bcbaa04bedfc0c71ef6fa7603d328116e7ee

Author: Philippe Gerum 
Date:   Fri Apr 11 16:42:45 2014 +0200

boilerplate/lock: prevent FMR in safe unlock op

Since dropping the lock may result in the memory holding the restored
cancel state to become stale, we'd better read it prior to unlocking.

Typically, this case would happen with call sites like
threadobj_unlock(), fetching the cancel state word from the TCB of a
thread which pends on its own lock, prior to finalizing. If that
thread preempts threadobj_unlock() (as a result of the lock drop) then
exits, the cancel state may become stale before threadobj_unlock()
refers to it.

---

 include/boilerplate/lock.h |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/boilerplate/lock.h b/include/boilerplate/lock.h
index dce1ff0..4819b34 100644
--- a/include/boilerplate/lock.h
+++ b/include/boilerplate/lock.h
@@ -177,9 +177,9 @@ int __check_cancel_type(const char *locktype);
 
 #define __do_unlock_safe(__lock, __state)  \
({  \
-   int __ret;  \
+   int __ret, __restored_state = __state;  \
__ret = -__RT(pthread_mutex_unlock(__lock));\
-   pthread_setcancelstate(__state, NULL);  \
+   pthread_setcancelstate(__restored_state, NULL); \
__ret;  \
})
 


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


[Xenomai-git] Philippe Gerum : rtdm: introduce lock name as RTDM_LOCK_UNLOCK() argument

2014-04-12 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 8efcdffc376d235fd699ad9ee91494e8f5a08f58
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=8efcdffc376d235fd699ad9ee91494e8f5a08f58

Author: Philippe Gerum 
Date:   Sat Apr 12 17:35:51 2014 +0200

rtdm: introduce lock name as RTDM_LOCK_UNLOCK() argument

Mapping RTDM locks over native spinlocks will require to pass the lock
name to the native spinlock initializer, so make sure we receive it
from the RTDM client code.

This change is propagated to all driver stacks concerned (i.e. analogy
and CAN).

---

 include/analogy/os_facilities.h   |5 -
 include/cobalt/kernel/rtdm/driver.h   |7 +--
 kernel/drivers/analogy/testing/fake.c |2 +-
 kernel/drivers/can/rtcan_dev.c|2 +-
 4 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/include/analogy/os_facilities.h b/include/analogy/os_facilities.h
index 0f99cbf..35f4155 100644
--- a/include/analogy/os_facilities.h
+++ b/include/analogy/os_facilities.h
@@ -85,7 +85,10 @@
 
 typedef rtdm_lock_t a4l_lock_t;
 
-#define A4L_LOCK_UNLOCKED RTDM_LOCK_UNLOCKED
+#define A4L_LOCK_UNLOCKED(__name) RTDM_LOCK_UNLOCKED(__name)
+
+#define DEFINE_A4L_LOCK(__name)\
+   a4l_lock_t __name = A4L_LOCK_UNLOCKED(__name)
 
 #define a4l_lock_init(lock) rtdm_lock_init(lock)
 #define a4l_lock(lock) rtdm_lock_get(lock)
diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index 9aa0637..3bf7f2b 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -688,7 +688,10 @@ int rtdm_select_bind(int fd, rtdm_selector_t *selector,
 /**
  * Static lock initialisation
  */
-#define RTDM_LOCK_UNLOCKED IPIPE_SPIN_LOCK_UNLOCKED
+#define RTDM_LOCK_UNLOCKED(__name) IPIPE_SPIN_LOCK_UNLOCKED
+
+#define DEFINE_RTDM_LOCK(__name)   \
+   rtdm_lock_t __name = RTDM_LOCK_UNLOCKED(__name)
 
 /** Lock variable */
 typedef ipipe_spinlock_t rtdm_lock_t;
@@ -1441,7 +1444,7 @@ int rtdm_ratelimit(struct rtdm_ratelimit_state *rs, const 
char *func);
 
 #define DEFINE_RTDM_RATELIMIT_STATE(name, interval_init, burst_init)   \
struct rtdm_ratelimit_state name = {\
-   .lock   = RTDM_LOCK_UNLOCKED,   \
+   .lock   = RTDM_LOCK_UNLOCKED((name).lock),  \
.interval   = interval_init,\
.burst  = burst_init,   \
}
diff --git a/kernel/drivers/analogy/testing/fake.c 
b/kernel/drivers/analogy/testing/fake.c
index 3871cc5..a2390aa 100644
--- a/kernel/drivers/analogy/testing/fake.c
+++ b/kernel/drivers/analogy/testing/fake.c
@@ -116,7 +116,7 @@ static inline uint16_t ai_value_output(struct ai_priv *priv)
0x8000, 0xa000, 0xc000, 0x
};
static unsigned int output_idx;
-   static a4l_lock_t output_lock = A4L_LOCK_UNLOCKED;
+   static DEFINE_A4L_LOCK(output_lock);
 
unsigned long flags;
unsigned int idx;
diff --git a/kernel/drivers/can/rtcan_dev.c b/kernel/drivers/can/rtcan_dev.c
index c3e9e5e..10d3a53 100644
--- a/kernel/drivers/can/rtcan_dev.c
+++ b/kernel/drivers/can/rtcan_dev.c
@@ -34,7 +34,7 @@
 
 
 static struct rtcan_device *rtcan_devices[RTCAN_MAX_DEVICES];
-static rtdm_lock_t rtcan_devices_rt_lock = RTDM_LOCK_UNLOCKED;
+static DEFINE_RTDM_LOCK(rtcan_devices_rt_lock);
 
 static int rtcan_global_init_done;
 


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


[Xenomai-git] Philippe Gerum : cobalt/rtdm: introduce wait queues in API

2014-04-12 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 729b1b0283e8a2d4ece7de305bb3875a990d5406
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=729b1b0283e8a2d4ece7de305bb3875a990d5406

Author: Philippe Gerum 
Date:   Thu Apr 10 11:40:15 2014 +0200

cobalt/rtdm: introduce wait queues in API

---

 include/cobalt/kernel/rtdm/driver.h |  183 +--
 1 file changed, 176 insertions(+), 7 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index 78ce5e4..9aa0637 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -603,6 +603,12 @@ static inline nanosecs_abs_t 
rtdm_clock_read_monotonic(void)
 }
 #endif /* !DOXYGEN_CPP */
 
+/* --- timeout sequences */
+
+typedef nanosecs_abs_t rtdm_toseq_t;
+
+void rtdm_toseq_init(rtdm_toseq_t *timeout_seq, nanosecs_rel_t timeout);
+
 /*!
  * @addtogroup rtdmsync
  * @{
@@ -618,7 +624,7 @@ int rtdm_select_bind(int fd, rtdm_selector_t *selector,
  */
 
 /**
- * @brief Execute code block atomically
+ * @brief Execute code block atomically (DEPRECATED)
  *
  * Generally, it is illegal to suspend the current task by calling
  * rtdm_task_sleep(), rtdm_event_wait(), etc. while holding a spinlock. In
@@ -648,6 +654,9 @@ int rtdm_select_bind(int fd, rtdm_selector_t *selector,
  * - User-space task (RT, non-RT)
  *
  * Rescheduling: possible, depends on functions called within @a code_block.
+ *
+ * @warning This construct is deprecated. Please use
+ * rtdm_atomic_enter/leave, or rtdm_waitqueue services instead.
  */
 #ifdef DOXYGEN_CPP /* Beautify doxygen output */
 #define RTDM_EXECUTE_ATOMICALLY(code_block)\
@@ -668,6 +677,7 @@ int rtdm_select_bind(int fd, rtdm_selector_t *selector,
xnlock_put_irqrestore(&nklock, __rtdm_s);   \
 }
 #endif
+
 /** @} Global Lock across Scheduler Invocation */
 
 /*!
@@ -843,8 +853,173 @@ void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, 
rtdm_lockctx_t s)
  */
 #define rtdm_lock_irqrestore(context)  \
splexit(context)
+
+/**
+ * @brief Enter atomic section
+ *
+ * This call opens a fully atomic section, serializing execution with
+ * respect to all interrupt handlers (including for real-time IRQs)
+ * and Xenomai threads running on all CPUs.
+ *
+ * @param context name of local variable to store the context in. This
+ * variable updated by the real-time core will hold the information
+ * required to leave the atomic section properly.
+ *
+ * @note Atomic sections may be nested.
+ *
+ * @note Since the strongest lock is acquired by this service, it can
+ * be used to synchronize real-time and non-real-time contexts.
+ */
+#define rtdm_atomic_enter(context) \
+   do {\
+   xnlock_get_irqsave(&nklock, (context)); \
+   __xnsched_lock();   \
+   } while (0)
+
+/**
+ * @brief Leave atomic section
+ *
+ * This call closes an atomic section previously opened by a call to
+ * rtdm_atomic_enter(), restoring the preemption and interrupt state
+ * which prevailed prior to entering the exited section.
+ *
+ * @param context name of local variable which stored the context.
+ */
+#define rtdm_atomic_leave(context) \
+   do {\
+   __xnsched_unlock(); \
+   xnlock_put_irqrestore(&nklock, (context));  \
+   } while (0)
+
 /** @} Spinlock with Preemption Deactivation */
 
+/*!
+ * @name Signal, test and wait for a condition atomically
+ * @{
+ */
+struct rtdm_waitqueue {
+   struct xnsynch wait;
+};
+typedef struct rtdm_waitqueue rtdm_waitqueue_t;
+
+#define RTDM_WAITQUEUE_INITIALIZER(__name) {\
+   .wait = XNSYNCH_WAITQUEUE_INITIALIZER((__name).wait), \
+   }
+
+#define DEFINE_RTDM_WAITQUEUE(__name)  \
+   struct rtdm_waitqueue __name = RTDM_WAITQUEUE_INITIALIZER(__name)
+
+#define DEFINE_RTDM_WAITQUEUE_ONSTACK(__name)  \
+   DEFINE_RTDM_WAITQUEUE(__name)
+
+static inline void rtdm_waitqueue_init(struct rtdm_waitqueue *wq)
+{
+   *wq = (struct rtdm_waitqueue)RTDM_WAITQUEUE_INITIALIZER(*wq);
+}
+
+static inline void rtdm_waitqueue_destroy(struct rtdm_waitqueue *wq)
+{
+   xnsynch_destroy(&wq->wait);
+}
+
+static inline int __rtdm_timedwait(struct rtdm_waitqueue *wq,
+  nanosecs_rel_t timeout, rtdm_toseq_t *toseq)
+{
+   if (toseq && timeout > 0)
+   return xnsynch_sleep_on(&wq->wait, *toseq, XN_ABSOLUTE);
+
+   return xnsynch_sleep_on(&wq->wait, timeout, XN_RELATIVE);
+}
+
+#define rtdm_timedwait_condition_locked(__wq, __cond, __timeout, __toseq) \
+   ({  \
+   int __ret = 0;  \
+   while (__ret == 0 && !(__co

[Xenomai-git] Philippe Gerum : drivers/can: move to new-style atomic sections

2014-04-12 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 3f371edf468fda08828452314d78ef69fbd6ba05
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=3f371edf468fda08828452314d78ef69fbd6ba05

Author: Philippe Gerum 
Date:   Thu Apr 10 11:41:15 2014 +0200

drivers/can: move to new-style atomic sections

---

 kernel/drivers/can/rtcan_raw.c|   13 -
 kernel/drivers/can/rtcan_socket.c |   13 ++---
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/kernel/drivers/can/rtcan_raw.c b/kernel/drivers/can/rtcan_raw.c
index 960b7a6..fc9ac16 100644
--- a/kernel/drivers/can/rtcan_raw.c
+++ b/kernel/drivers/can/rtcan_raw.c
@@ -800,6 +800,7 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_dev_context *context,
 struct rtcan_device *dev;
 int ifindex = 0;
 int ret  = 0;
+spl_t s;
 
 
 if (flags & MSG_OOB)   /* Mirror BSD error message compatibility */
@@ -912,8 +913,9 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_dev_context *context,
 /* If socket was not closed recently, register the task at the
  * socket's TX wait queue and decrement the TX semaphore. This must be
  * atomic. Finally, the task must be deregistered again (also atomic). */
-RTDM_EXECUTE_ATOMICALLY(
-   if (likely(!test_bit(RTDM_CLOSING, &context->context_flags))) {
+rtdm_atomic_enter(s);
+
+if (likely(!test_bit(RTDM_CLOSING, &context->context_flags))) {
 
list_add(&tx_wait.tx_wait_list, &sock->tx_wait_head);
 
@@ -929,10 +931,11 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_dev_context 
*context,
/* The socket was closed. */
ret = -EBADF;
 
-   } else
+} else
/* The socket was closed. */
-   ret = -EBADF;
-   );
+   ret = -EBADF;
+
+rtdm_atomic_leave(s);
 
 /* Error code returned? */
 if (ret != 0) {
diff --git a/kernel/drivers/can/rtcan_socket.c 
b/kernel/drivers/can/rtcan_socket.c
index d78d1f6..62a54a6 100644
--- a/kernel/drivers/can/rtcan_socket.c
+++ b/kernel/drivers/can/rtcan_socket.c
@@ -74,12 +74,11 @@ void rtcan_socket_cleanup(struct rtdm_dev_context *context)
 
 /* Wake up sleeping senders. This is re-entrant-safe. */
 do {
-   RTDM_EXECUTE_ATOMICALLY(
-   /* Is someone there? */
-   if (list_empty(&sock->tx_wait_head))
+   rtdm_atomic_enter(lock_ctx);
+   /* Is someone there? */
+   if (list_empty(&sock->tx_wait_head))
tx_list_empty = 1;
-
-   else {
+   else {
tx_list_empty = 0;
 
/* Get next entry pointing to a waiting task */
@@ -91,8 +90,8 @@ void rtcan_socket_cleanup(struct rtdm_dev_context *context)
 
/* Wake task up (atomic section is left implicitly) */
rtdm_task_unblock(tx_waiting->rt_task);
-   }
-   );
+   }
+   rtdm_atomic_leave(lock_ctx);
 } while (!tx_list_empty);
 
 rtdm_sem_destroy(&sock->recv_sem);


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


[Xenomai-git] Philippe Gerum : drivers/testing: move to new-style atomic sections

2014-04-12 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: beffa57f594604b9e4804a154691081a784bfdd5
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=beffa57f594604b9e4804a154691081a784bfdd5

Author: Philippe Gerum 
Date:   Thu Apr 10 11:41:22 2014 +0200

drivers/testing: move to new-style atomic sections

---

 kernel/drivers/testing/timerbench.c |   33 +++--
 1 file changed, 15 insertions(+), 18 deletions(-)

diff --git a/kernel/drivers/testing/timerbench.c 
b/kernel/drivers/testing/timerbench.c
index efb5ca2..d6f2b64 100644
--- a/kernel/drivers/testing/timerbench.c
+++ b/kernel/drivers/testing/timerbench.c
@@ -141,22 +141,19 @@ static void eval_outer_loop(struct rt_tmbench_context 
*ctx)
 static void timer_task_proc(void *arg)
 {
struct rt_tmbench_context *ctx = arg;
-   int count;
+   int count, err;
+   spl_t s;
 
/* first event: one millisecond from now. */
ctx->date = rtdm_clock_read_monotonic() + 100;
 
while (1) {
-   int err;
-
for (count = 0; count < ctx->samples_per_sec; count++) {
-   RTDM_EXECUTE_ATOMICALLY(
-   ctx->start_time = rtdm_clock_read_monotonic();
-   err =
-   rtdm_task_sleep_abs(ctx->date,
-   
RTDM_TIMERMODE_ABSOLUTE);
-   );
-
+   rtdm_atomic_enter(s);
+   ctx->start_time = rtdm_clock_read_monotonic();
+   err = rtdm_task_sleep_abs(ctx->date,
+ RTDM_TIMERMODE_ABSOLUTE);
+   rtdm_atomic_leave(s);
if (err)
return;
 
@@ -237,6 +234,7 @@ static int rt_tmbench_start(struct rtdm_dev_context 
*context,
struct rttst_tmbench_config __user *user_config)
 {
int err = 0;
+   spl_t s;
 
struct rttst_tmbench_config config_buf;
struct rttst_tmbench_config *config =
@@ -311,16 +309,15 @@ static int rt_tmbench_start(struct rtdm_dev_context 
*context,
if (!test_bit(RTDM_CLOSING, &context->context_flags)) {
ctx->mode = RTTST_TMBENCH_HANDLER;
 
-   RTDM_EXECUTE_ATOMICALLY(
-   ctx->start_time = rtdm_clock_read_monotonic();
+   rtdm_atomic_enter(s);
+   ctx->start_time = rtdm_clock_read_monotonic();
 
-   /* first event: one millisecond from now. */
-   ctx->date = ctx->start_time + 100;
+   /* first event: one millisecond from now. */
+   ctx->date = ctx->start_time + 100;
 
-   err =
-   rtdm_timer_start(&ctx->timer, ctx->date, 0,
-RTDM_TIMERMODE_ABSOLUTE);
-   );
+   err = rtdm_timer_start(&ctx->timer, ctx->date, 0,
+  RTDM_TIMERMODE_ABSOLUTE);
+   rtdm_atomic_leave(s);
}
}
 


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


[Xenomai-git] Philippe Gerum : drivers/ipc: move to new-style atomic sections

2014-04-12 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 7a6a4544459d98bf837f9a798048e8b2446f45da
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=7a6a4544459d98bf837f9a798048e8b2446f45da

Author: Philippe Gerum 
Date:   Thu Apr 10 11:41:43 2014 +0200

drivers/ipc: move to new-style atomic sections

---

 kernel/drivers/ipc/bufp.c |  105 ++-
 kernel/drivers/ipc/iddp.c |  245 +++--
 kernel/drivers/ipc/xddp.c |   92 +
 3 files changed, 227 insertions(+), 215 deletions(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 4363c68..d65f86f 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -666,6 +666,7 @@ static int __bufp_bind_socket(struct rtipc_private *priv,
 {
struct bufp_socket *sk = priv->state;
int ret = 0, port, fd;
+   spl_t s;
 
if (sa->sipc_family != AF_RTIPC)
return -EINVAL;
@@ -674,11 +675,12 @@ static int __bufp_bind_socket(struct rtipc_private *priv,
sa->sipc_port >= CONFIG_XENO_OPT_BUFP_NRPORT)
return -EINVAL;
 
-   RTDM_EXECUTE_ATOMICALLY(
-   if (test_bit(_BUFP_BOUND, &sk->status) ||
-   __test_and_set_bit(_BUFP_BINDING, &sk->status))
-   ret = -EADDRINUSE;
-   );
+   rtdm_atomic_enter(s);
+   if (test_bit(_BUFP_BOUND, &sk->status) ||
+   __test_and_set_bit(_BUFP_BINDING, &sk->status))
+   ret = -EADDRINUSE;
+   rtdm_atomic_leave(s);
+   
if (ret)
return ret;
 
@@ -718,10 +720,10 @@ static int __bufp_bind_socket(struct rtipc_private *priv,
}
}
 
-   RTDM_EXECUTE_ATOMICALLY(
-   __clear_bit(_BUFP_BINDING, &sk->status);
-   __set_bit(_BUFP_BOUND, &sk->status);
-   );
+   rtdm_atomic_enter(s);
+   __clear_bit(_BUFP_BINDING, &sk->status);
+   __set_bit(_BUFP_BOUND, &sk->status);
+   rtdm_atomic_leave(s);
 
return 0;
 fail:
@@ -737,6 +739,7 @@ static int __bufp_connect_socket(struct bufp_socket *sk,
struct bufp_socket *rsk;
xnhandle_t h;
int ret;
+   spl_t s;
 
if (sa == NULL) {
sa = &nullsa;
@@ -772,26 +775,26 @@ static int __bufp_connect_socket(struct bufp_socket *sk,
if (ret)
return ret;
 
-   RTDM_EXECUTE_ATOMICALLY(
-   rsk = xnregistry_lookup(h, NULL);
-   if (rsk == NULL || rsk->magic != BUFP_SOCKET_MAGIC)
-   ret = -EINVAL;
-   else
-   /* Fetch labeled port number. */
-   sa->sipc_port = rsk->name.sipc_port;
-   );
+   rtdm_atomic_enter(s);
+   rsk = xnregistry_lookup(h, NULL);
+   if (rsk == NULL || rsk->magic != BUFP_SOCKET_MAGIC)
+   ret = -EINVAL;
+   else
+   /* Fetch labeled port number. */
+   sa->sipc_port = rsk->name.sipc_port;
+   rtdm_atomic_leave(s);
if (ret)
return ret;
}
 
 set_assoc:
-   RTDM_EXECUTE_ATOMICALLY(
-   if (!test_bit(_BUFP_BOUND, &sk->status))
-   /* Set default name. */
-   sk->name = *sa;
-   /* Set default destination. */
-   sk->peer = *sa;
-   );
+   rtdm_atomic_enter(s);
+   if (!test_bit(_BUFP_BOUND, &sk->status))
+   /* Set default name. */
+   sk->name = *sa;
+   /* Set default destination. */
+   sk->peer = *sa;
+   rtdm_atomic_leave(s);
 
return 0;
 }
@@ -805,6 +808,7 @@ static int __bufp_setsockopt(struct bufp_socket *sk,
struct timeval tv;
int ret = 0;
size_t len;
+   spl_t s;
 
if (rtipc_get_arg(user_info, &sopt, arg, sizeof(sopt)))
return -EFAULT;
@@ -850,17 +854,17 @@ static int __bufp_setsockopt(struct bufp_socket *sk,
return -EFAULT;
if (len == 0)
return -EINVAL;
-   RTDM_EXECUTE_ATOMICALLY(
-   /*
-* We may not do this more than once, and we
-* have to do this before the first binding.
-*/
-   if (test_bit(_BUFP_BOUND, &sk->status) ||
-   test_bit(_BUFP_BINDING, &sk->status))
-   ret = -EALREADY;
-   else
-   sk->bufsz = len;
-   );
+   rtdm_atomic_enter(s);
+   /*
+* We may not do this more than once, and we have to
+* do this before the first binding.
+*/
+   if (