[Xenomai-git] Gilles Chanteperdrix : cobalt/spinlocks: rebase on linux spinlocks

2014-10-30 Thread git repository hosting
Module: xenomai-3
Branch: master
Commit: 2380aa45a1060217795a6dc4b3e8ad60abbf10ba
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2380aa45a1060217795a6dc4b3e8ad60abbf10ba

Author: Gilles Chanteperdrix 
Date:   Sun Oct 19 21:43:37 2014 +0200

cobalt/spinlocks: rebase on linux spinlocks

---

 include/cobalt/kernel/lock.h |   35 ++-
 kernel/cobalt/debug.c|2 +-
 kernel/cobalt/lock.c |   15 ---
 3 files changed, 19 insertions(+), 33 deletions(-)

diff --git a/include/cobalt/kernel/lock.h b/include/cobalt/kernel/lock.h
index b0c34bf..e590b85 100644
--- a/include/cobalt/kernel/lock.h
+++ b/include/cobalt/kernel/lock.h
@@ -66,7 +66,8 @@ typedef unsigned long spl_t;
 #if XENO_DEBUG(LOCKING)
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
const char *file;
const char *function;
unsigned int line;
@@ -84,7 +85,8 @@ struct xnlockinfo {
 };
 
 #define XNARCH_LOCK_UNLOCKED (struct xnlock) { \
-   { ~0 }, \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
NULL,   \
NULL,   \
0,  \
@@ -117,10 +119,15 @@ DECLARE_PER_CPU(struct xnlockinfo, xnlock_stats);
 #else /* !XENO_DEBUG(LOCKING) */
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
 };
 
-#define XNARCH_LOCK_UNLOCKED   (struct xnlock) { { ~0 } }
+#define XNARCH_LOCK_UNLOCKED   \
+   (struct xnlock) {   \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
+   }
 
 #define XNLOCK_DBG_CONTEXT
 #define XNLOCK_DBG_CONTEXT_ARGS
@@ -175,20 +182,18 @@ static inline void xnlock_init (struct xnlock *lock)
 #define DEFINE_XNLOCK(lock)struct xnlock lock = 
XNARCH_LOCK_UNLOCKED
 #define DEFINE_PRIVATE_XNLOCK(lock)static DEFINE_XNLOCK(lock)
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS);
-
 static inline int xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
int cpu = ipipe_processor_id();
unsigned long long start;
 
-   if (atomic_read(&lock->owner) == cpu)
+   if (lock->owner == cpu)
return 2;
 
xnlock_dbg_prepare_acquire(&start);
 
-   if (unlikely(atomic_cmpxchg(&lock->owner, ~0, cpu) != ~0))
-   __xnlock_spin(cpu, lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
+   arch_spin_lock(&lock->alock);
+   lock->owner = cpu;
 
xnlock_dbg_acquired(lock, cpu, &start /*, */ XNLOCK_DBG_PASS_CONTEXT);
 
@@ -200,12 +205,8 @@ static inline void xnlock_put(struct xnlock *lock /*, 
*/ XNLOCK_DBG_CONTEXT_
if (xnlock_dbg_release(lock /*, */ XNLOCK_DBG_PASS_CONTEXT))
return;
 
-   /*
-* Make sure all data written inside the lock is visible to
-* other CPUs before we release the lock.
-*/
-   mb();
-   atomic_set(&lock->owner, ~0);
+   lock->owner = ~0U;
+   arch_spin_unlock(&lock->alock);
 }
 
 #ifndef CONFIG_XENO_ARCH_OUTOFLINE_XNLOCK
@@ -250,7 +251,7 @@ static inline void __xnlock_put_irqrestore(struct xnlock 
*lock, spl_t flags
 static inline int xnlock_is_owner(struct xnlock *lock)
 {
if (__locking_active__)
-   return atomic_read(&lock->owner) == ipipe_processor_id();
+   return lock->owner == ipipe_processor_id();
 
return 1;
 }
@@ -266,7 +267,7 @@ static inline int __xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARG
 static inline void __xnlock_put(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
if (__locking_active__)
-   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT); 
+   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
 }
 
 #undef __locking_active__
diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c
index ad72a3e..ef46e0b 100644
--- a/kernel/cobalt/debug.c
+++ b/kernel/cobalt/debug.c
@@ -598,7 +598,7 @@ int xnlock_dbg_release(struct xnlock *lock,
lock->function = "invalid";
}
 
-   if (unlikely(atomic_read(&lock->owner) != cpu)) {
+   if (unlikely(lock->owner != cpu)) {
ipipe_prepare_panic();
printk(XENO_ERR "lock %p already unlocked on CPU #%d\n"
"  last owner = %s:%u (%s(), CPU 
#%d)\n",
diff --git a/kernel/cobalt/lock.c b/kernel/cobalt/lock.c
index 5c339b5..a1b2e37 100644
--- a/kernel/cobalt/lock.c
+++ b/kernel/cobalt/lock.c
@@ -42,21 +42,6 @@ DEFINE_XNLOCK(nklock);
 #if defined(CONFIG_SMP) || XENO_DEBUG(LOCKING)
 EXPORT_SYMBOL_GPL(nklock);
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ XNLOCK_DBG_CONTEXT_ARGS)
-{
-   unsigned int spin_limit;
-

[Xenomai-git] Gilles Chanteperdrix : cobalt/spinlocks: rebase on linux spinlocks

2014-10-29 Thread git repository hosting
Module: xenomai-3
Branch: next
Commit: 2380aa45a1060217795a6dc4b3e8ad60abbf10ba
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2380aa45a1060217795a6dc4b3e8ad60abbf10ba

Author: Gilles Chanteperdrix 
Date:   Sun Oct 19 21:43:37 2014 +0200

cobalt/spinlocks: rebase on linux spinlocks

---

 include/cobalt/kernel/lock.h |   35 ++-
 kernel/cobalt/debug.c|2 +-
 kernel/cobalt/lock.c |   15 ---
 3 files changed, 19 insertions(+), 33 deletions(-)

diff --git a/include/cobalt/kernel/lock.h b/include/cobalt/kernel/lock.h
index b0c34bf..e590b85 100644
--- a/include/cobalt/kernel/lock.h
+++ b/include/cobalt/kernel/lock.h
@@ -66,7 +66,8 @@ typedef unsigned long spl_t;
 #if XENO_DEBUG(LOCKING)
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
const char *file;
const char *function;
unsigned int line;
@@ -84,7 +85,8 @@ struct xnlockinfo {
 };
 
 #define XNARCH_LOCK_UNLOCKED (struct xnlock) { \
-   { ~0 }, \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
NULL,   \
NULL,   \
0,  \
@@ -117,10 +119,15 @@ DECLARE_PER_CPU(struct xnlockinfo, xnlock_stats);
 #else /* !XENO_DEBUG(LOCKING) */
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
 };
 
-#define XNARCH_LOCK_UNLOCKED   (struct xnlock) { { ~0 } }
+#define XNARCH_LOCK_UNLOCKED   \
+   (struct xnlock) {   \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
+   }
 
 #define XNLOCK_DBG_CONTEXT
 #define XNLOCK_DBG_CONTEXT_ARGS
@@ -175,20 +182,18 @@ static inline void xnlock_init (struct xnlock *lock)
 #define DEFINE_XNLOCK(lock)struct xnlock lock = 
XNARCH_LOCK_UNLOCKED
 #define DEFINE_PRIVATE_XNLOCK(lock)static DEFINE_XNLOCK(lock)
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS);
-
 static inline int xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
int cpu = ipipe_processor_id();
unsigned long long start;
 
-   if (atomic_read(&lock->owner) == cpu)
+   if (lock->owner == cpu)
return 2;
 
xnlock_dbg_prepare_acquire(&start);
 
-   if (unlikely(atomic_cmpxchg(&lock->owner, ~0, cpu) != ~0))
-   __xnlock_spin(cpu, lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
+   arch_spin_lock(&lock->alock);
+   lock->owner = cpu;
 
xnlock_dbg_acquired(lock, cpu, &start /*, */ XNLOCK_DBG_PASS_CONTEXT);
 
@@ -200,12 +205,8 @@ static inline void xnlock_put(struct xnlock *lock /*, 
*/ XNLOCK_DBG_CONTEXT_
if (xnlock_dbg_release(lock /*, */ XNLOCK_DBG_PASS_CONTEXT))
return;
 
-   /*
-* Make sure all data written inside the lock is visible to
-* other CPUs before we release the lock.
-*/
-   mb();
-   atomic_set(&lock->owner, ~0);
+   lock->owner = ~0U;
+   arch_spin_unlock(&lock->alock);
 }
 
 #ifndef CONFIG_XENO_ARCH_OUTOFLINE_XNLOCK
@@ -250,7 +251,7 @@ static inline void __xnlock_put_irqrestore(struct xnlock 
*lock, spl_t flags
 static inline int xnlock_is_owner(struct xnlock *lock)
 {
if (__locking_active__)
-   return atomic_read(&lock->owner) == ipipe_processor_id();
+   return lock->owner == ipipe_processor_id();
 
return 1;
 }
@@ -266,7 +267,7 @@ static inline int __xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARG
 static inline void __xnlock_put(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
if (__locking_active__)
-   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT); 
+   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
 }
 
 #undef __locking_active__
diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c
index ad72a3e..ef46e0b 100644
--- a/kernel/cobalt/debug.c
+++ b/kernel/cobalt/debug.c
@@ -598,7 +598,7 @@ int xnlock_dbg_release(struct xnlock *lock,
lock->function = "invalid";
}
 
-   if (unlikely(atomic_read(&lock->owner) != cpu)) {
+   if (unlikely(lock->owner != cpu)) {
ipipe_prepare_panic();
printk(XENO_ERR "lock %p already unlocked on CPU #%d\n"
"  last owner = %s:%u (%s(), CPU 
#%d)\n",
diff --git a/kernel/cobalt/lock.c b/kernel/cobalt/lock.c
index 5c339b5..a1b2e37 100644
--- a/kernel/cobalt/lock.c
+++ b/kernel/cobalt/lock.c
@@ -42,21 +42,6 @@ DEFINE_XNLOCK(nklock);
 #if defined(CONFIG_SMP) || XENO_DEBUG(LOCKING)
 EXPORT_SYMBOL_GPL(nklock);
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ XNLOCK_DBG_CONTEXT_ARGS)
-{
-   unsigned int spin_limit;
-
- 

[Xenomai-git] Gilles Chanteperdrix : cobalt/spinlocks: rebase on linux spinlocks

2014-10-28 Thread git repository hosting
Module: xenomai-gch
Branch: for-forge
Commit: e58faf9f814fff05633b6178597655ef05d2e22e
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=e58faf9f814fff05633b6178597655ef05d2e22e

Author: Gilles Chanteperdrix 
Date:   Sun Oct 19 21:43:37 2014 +0200

cobalt/spinlocks: rebase on linux spinlocks

---

 include/cobalt/kernel/lock.h |   35 ++-
 kernel/cobalt/debug.c|2 +-
 kernel/cobalt/lock.c |   15 ---
 3 files changed, 19 insertions(+), 33 deletions(-)

diff --git a/include/cobalt/kernel/lock.h b/include/cobalt/kernel/lock.h
index b0c34bf..e590b85 100644
--- a/include/cobalt/kernel/lock.h
+++ b/include/cobalt/kernel/lock.h
@@ -66,7 +66,8 @@ typedef unsigned long spl_t;
 #if XENO_DEBUG(LOCKING)
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
const char *file;
const char *function;
unsigned int line;
@@ -84,7 +85,8 @@ struct xnlockinfo {
 };
 
 #define XNARCH_LOCK_UNLOCKED (struct xnlock) { \
-   { ~0 }, \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
NULL,   \
NULL,   \
0,  \
@@ -117,10 +119,15 @@ DECLARE_PER_CPU(struct xnlockinfo, xnlock_stats);
 #else /* !XENO_DEBUG(LOCKING) */
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
 };
 
-#define XNARCH_LOCK_UNLOCKED   (struct xnlock) { { ~0 } }
+#define XNARCH_LOCK_UNLOCKED   \
+   (struct xnlock) {   \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
+   }
 
 #define XNLOCK_DBG_CONTEXT
 #define XNLOCK_DBG_CONTEXT_ARGS
@@ -175,20 +182,18 @@ static inline void xnlock_init (struct xnlock *lock)
 #define DEFINE_XNLOCK(lock)struct xnlock lock = 
XNARCH_LOCK_UNLOCKED
 #define DEFINE_PRIVATE_XNLOCK(lock)static DEFINE_XNLOCK(lock)
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS);
-
 static inline int xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
int cpu = ipipe_processor_id();
unsigned long long start;
 
-   if (atomic_read(&lock->owner) == cpu)
+   if (lock->owner == cpu)
return 2;
 
xnlock_dbg_prepare_acquire(&start);
 
-   if (unlikely(atomic_cmpxchg(&lock->owner, ~0, cpu) != ~0))
-   __xnlock_spin(cpu, lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
+   arch_spin_lock(&lock->alock);
+   lock->owner = cpu;
 
xnlock_dbg_acquired(lock, cpu, &start /*, */ XNLOCK_DBG_PASS_CONTEXT);
 
@@ -200,12 +205,8 @@ static inline void xnlock_put(struct xnlock *lock /*, 
*/ XNLOCK_DBG_CONTEXT_
if (xnlock_dbg_release(lock /*, */ XNLOCK_DBG_PASS_CONTEXT))
return;
 
-   /*
-* Make sure all data written inside the lock is visible to
-* other CPUs before we release the lock.
-*/
-   mb();
-   atomic_set(&lock->owner, ~0);
+   lock->owner = ~0U;
+   arch_spin_unlock(&lock->alock);
 }
 
 #ifndef CONFIG_XENO_ARCH_OUTOFLINE_XNLOCK
@@ -250,7 +251,7 @@ static inline void __xnlock_put_irqrestore(struct xnlock 
*lock, spl_t flags
 static inline int xnlock_is_owner(struct xnlock *lock)
 {
if (__locking_active__)
-   return atomic_read(&lock->owner) == ipipe_processor_id();
+   return lock->owner == ipipe_processor_id();
 
return 1;
 }
@@ -266,7 +267,7 @@ static inline int __xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARG
 static inline void __xnlock_put(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
if (__locking_active__)
-   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT); 
+   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
 }
 
 #undef __locking_active__
diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c
index ad72a3e..ef46e0b 100644
--- a/kernel/cobalt/debug.c
+++ b/kernel/cobalt/debug.c
@@ -598,7 +598,7 @@ int xnlock_dbg_release(struct xnlock *lock,
lock->function = "invalid";
}
 
-   if (unlikely(atomic_read(&lock->owner) != cpu)) {
+   if (unlikely(lock->owner != cpu)) {
ipipe_prepare_panic();
printk(XENO_ERR "lock %p already unlocked on CPU #%d\n"
"  last owner = %s:%u (%s(), CPU 
#%d)\n",
diff --git a/kernel/cobalt/lock.c b/kernel/cobalt/lock.c
index 5c339b5..a1b2e37 100644
--- a/kernel/cobalt/lock.c
+++ b/kernel/cobalt/lock.c
@@ -42,21 +42,6 @@ DEFINE_XNLOCK(nklock);
 #if defined(CONFIG_SMP) || XENO_DEBUG(LOCKING)
 EXPORT_SYMBOL_GPL(nklock);
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ XNLOCK_DBG_CONTEXT_ARGS)
-{
-   unsigned int spin_li

[Xenomai-git] Gilles Chanteperdrix : cobalt/spinlocks: rebase on linux spinlocks

2014-10-25 Thread git repository hosting
Module: xenomai-gch
Branch: for-forge
Commit: 75431f17f45f61425de7e4c809536f11722eb4d2
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=75431f17f45f61425de7e4c809536f11722eb4d2

Author: Gilles Chanteperdrix 
Date:   Sun Oct 19 21:43:37 2014 +0200

cobalt/spinlocks: rebase on linux spinlocks

---

 include/cobalt/kernel/lock.h |   35 ++-
 kernel/cobalt/debug.c|2 +-
 kernel/cobalt/lock.c |   15 ---
 3 files changed, 19 insertions(+), 33 deletions(-)

diff --git a/include/cobalt/kernel/lock.h b/include/cobalt/kernel/lock.h
index b0c34bf..e590b85 100644
--- a/include/cobalt/kernel/lock.h
+++ b/include/cobalt/kernel/lock.h
@@ -66,7 +66,8 @@ typedef unsigned long spl_t;
 #if XENO_DEBUG(LOCKING)
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
const char *file;
const char *function;
unsigned int line;
@@ -84,7 +85,8 @@ struct xnlockinfo {
 };
 
 #define XNARCH_LOCK_UNLOCKED (struct xnlock) { \
-   { ~0 }, \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
NULL,   \
NULL,   \
0,  \
@@ -117,10 +119,15 @@ DECLARE_PER_CPU(struct xnlockinfo, xnlock_stats);
 #else /* !XENO_DEBUG(LOCKING) */
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
 };
 
-#define XNARCH_LOCK_UNLOCKED   (struct xnlock) { { ~0 } }
+#define XNARCH_LOCK_UNLOCKED   \
+   (struct xnlock) {   \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
+   }
 
 #define XNLOCK_DBG_CONTEXT
 #define XNLOCK_DBG_CONTEXT_ARGS
@@ -175,20 +182,18 @@ static inline void xnlock_init (struct xnlock *lock)
 #define DEFINE_XNLOCK(lock)struct xnlock lock = 
XNARCH_LOCK_UNLOCKED
 #define DEFINE_PRIVATE_XNLOCK(lock)static DEFINE_XNLOCK(lock)
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS);
-
 static inline int xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
int cpu = ipipe_processor_id();
unsigned long long start;
 
-   if (atomic_read(&lock->owner) == cpu)
+   if (lock->owner == cpu)
return 2;
 
xnlock_dbg_prepare_acquire(&start);
 
-   if (unlikely(atomic_cmpxchg(&lock->owner, ~0, cpu) != ~0))
-   __xnlock_spin(cpu, lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
+   arch_spin_lock(&lock->alock);
+   lock->owner = cpu;
 
xnlock_dbg_acquired(lock, cpu, &start /*, */ XNLOCK_DBG_PASS_CONTEXT);
 
@@ -200,12 +205,8 @@ static inline void xnlock_put(struct xnlock *lock /*, 
*/ XNLOCK_DBG_CONTEXT_
if (xnlock_dbg_release(lock /*, */ XNLOCK_DBG_PASS_CONTEXT))
return;
 
-   /*
-* Make sure all data written inside the lock is visible to
-* other CPUs before we release the lock.
-*/
-   mb();
-   atomic_set(&lock->owner, ~0);
+   lock->owner = ~0U;
+   arch_spin_unlock(&lock->alock);
 }
 
 #ifndef CONFIG_XENO_ARCH_OUTOFLINE_XNLOCK
@@ -250,7 +251,7 @@ static inline void __xnlock_put_irqrestore(struct xnlock 
*lock, spl_t flags
 static inline int xnlock_is_owner(struct xnlock *lock)
 {
if (__locking_active__)
-   return atomic_read(&lock->owner) == ipipe_processor_id();
+   return lock->owner == ipipe_processor_id();
 
return 1;
 }
@@ -266,7 +267,7 @@ static inline int __xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARG
 static inline void __xnlock_put(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
if (__locking_active__)
-   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT); 
+   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
 }
 
 #undef __locking_active__
diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c
index ad72a3e..ef46e0b 100644
--- a/kernel/cobalt/debug.c
+++ b/kernel/cobalt/debug.c
@@ -598,7 +598,7 @@ int xnlock_dbg_release(struct xnlock *lock,
lock->function = "invalid";
}
 
-   if (unlikely(atomic_read(&lock->owner) != cpu)) {
+   if (unlikely(lock->owner != cpu)) {
ipipe_prepare_panic();
printk(XENO_ERR "lock %p already unlocked on CPU #%d\n"
"  last owner = %s:%u (%s(), CPU 
#%d)\n",
diff --git a/kernel/cobalt/lock.c b/kernel/cobalt/lock.c
index 5c339b5..a1b2e37 100644
--- a/kernel/cobalt/lock.c
+++ b/kernel/cobalt/lock.c
@@ -42,21 +42,6 @@ DEFINE_XNLOCK(nklock);
 #if defined(CONFIG_SMP) || XENO_DEBUG(LOCKING)
 EXPORT_SYMBOL_GPL(nklock);
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ XNLOCK_DBG_CONTEXT_ARGS)
-{
-   unsigned int spin_li

[Xenomai-git] Gilles Chanteperdrix : cobalt/spinlocks: rebase on linux spinlocks

2014-10-25 Thread git repository hosting
Module: xenomai-gch
Branch: for-forge
Commit: 7ffdec1e9b0d489a5356079f1bafe90715633870
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=7ffdec1e9b0d489a5356079f1bafe90715633870

Author: Gilles Chanteperdrix 
Date:   Sun Oct 19 21:43:37 2014 +0200

cobalt/spinlocks: rebase on linux spinlocks

---

 include/cobalt/kernel/lock.h |   35 ++-
 kernel/cobalt/debug.c|2 +-
 kernel/cobalt/lock.c |   15 ---
 3 files changed, 19 insertions(+), 33 deletions(-)

diff --git a/include/cobalt/kernel/lock.h b/include/cobalt/kernel/lock.h
index b0c34bf..e590b85 100644
--- a/include/cobalt/kernel/lock.h
+++ b/include/cobalt/kernel/lock.h
@@ -66,7 +66,8 @@ typedef unsigned long spl_t;
 #if XENO_DEBUG(LOCKING)
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
const char *file;
const char *function;
unsigned int line;
@@ -84,7 +85,8 @@ struct xnlockinfo {
 };
 
 #define XNARCH_LOCK_UNLOCKED (struct xnlock) { \
-   { ~0 }, \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
NULL,   \
NULL,   \
0,  \
@@ -117,10 +119,15 @@ DECLARE_PER_CPU(struct xnlockinfo, xnlock_stats);
 #else /* !XENO_DEBUG(LOCKING) */
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
 };
 
-#define XNARCH_LOCK_UNLOCKED   (struct xnlock) { { ~0 } }
+#define XNARCH_LOCK_UNLOCKED   \
+   (struct xnlock) {   \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
+   }
 
 #define XNLOCK_DBG_CONTEXT
 #define XNLOCK_DBG_CONTEXT_ARGS
@@ -175,20 +182,18 @@ static inline void xnlock_init (struct xnlock *lock)
 #define DEFINE_XNLOCK(lock)struct xnlock lock = 
XNARCH_LOCK_UNLOCKED
 #define DEFINE_PRIVATE_XNLOCK(lock)static DEFINE_XNLOCK(lock)
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS);
-
 static inline int xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
int cpu = ipipe_processor_id();
unsigned long long start;
 
-   if (atomic_read(&lock->owner) == cpu)
+   if (lock->owner == cpu)
return 2;
 
xnlock_dbg_prepare_acquire(&start);
 
-   if (unlikely(atomic_cmpxchg(&lock->owner, ~0, cpu) != ~0))
-   __xnlock_spin(cpu, lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
+   arch_spin_lock(&lock->alock);
+   lock->owner = cpu;
 
xnlock_dbg_acquired(lock, cpu, &start /*, */ XNLOCK_DBG_PASS_CONTEXT);
 
@@ -200,12 +205,8 @@ static inline void xnlock_put(struct xnlock *lock /*, 
*/ XNLOCK_DBG_CONTEXT_
if (xnlock_dbg_release(lock /*, */ XNLOCK_DBG_PASS_CONTEXT))
return;
 
-   /*
-* Make sure all data written inside the lock is visible to
-* other CPUs before we release the lock.
-*/
-   mb();
-   atomic_set(&lock->owner, ~0);
+   lock->owner = ~0U;
+   arch_spin_unlock(&lock->alock);
 }
 
 #ifndef CONFIG_XENO_ARCH_OUTOFLINE_XNLOCK
@@ -250,7 +251,7 @@ static inline void __xnlock_put_irqrestore(struct xnlock 
*lock, spl_t flags
 static inline int xnlock_is_owner(struct xnlock *lock)
 {
if (__locking_active__)
-   return atomic_read(&lock->owner) == ipipe_processor_id();
+   return lock->owner == ipipe_processor_id();
 
return 1;
 }
@@ -266,7 +267,7 @@ static inline int __xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARG
 static inline void __xnlock_put(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
if (__locking_active__)
-   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT); 
+   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
 }
 
 #undef __locking_active__
diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c
index ad72a3e..ef46e0b 100644
--- a/kernel/cobalt/debug.c
+++ b/kernel/cobalt/debug.c
@@ -598,7 +598,7 @@ int xnlock_dbg_release(struct xnlock *lock,
lock->function = "invalid";
}
 
-   if (unlikely(atomic_read(&lock->owner) != cpu)) {
+   if (unlikely(lock->owner != cpu)) {
ipipe_prepare_panic();
printk(XENO_ERR "lock %p already unlocked on CPU #%d\n"
"  last owner = %s:%u (%s(), CPU 
#%d)\n",
diff --git a/kernel/cobalt/lock.c b/kernel/cobalt/lock.c
index 5c339b5..a1b2e37 100644
--- a/kernel/cobalt/lock.c
+++ b/kernel/cobalt/lock.c
@@ -42,21 +42,6 @@ DEFINE_XNLOCK(nklock);
 #if defined(CONFIG_SMP) || XENO_DEBUG(LOCKING)
 EXPORT_SYMBOL_GPL(nklock);
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ XNLOCK_DBG_CONTEXT_ARGS)
-{
-   unsigned int spin_li

[Xenomai-git] Gilles Chanteperdrix : cobalt/spinlocks: rebase on linux spinlocks

2014-10-19 Thread git repository hosting
Module: xenomai-gch
Branch: for-forge
Commit: ddf709785b96115f7803fab3363fe1805323b7fa
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=ddf709785b96115f7803fab3363fe1805323b7fa

Author: Gilles Chanteperdrix 
Date:   Sun Oct 19 21:43:37 2014 +0200

cobalt/spinlocks: rebase on linux spinlocks

---

 include/cobalt/kernel/lock.h |   35 ++-
 kernel/cobalt/debug.c|2 +-
 kernel/cobalt/lock.c |   15 ---
 3 files changed, 19 insertions(+), 33 deletions(-)

diff --git a/include/cobalt/kernel/lock.h b/include/cobalt/kernel/lock.h
index b0c34bf..e590b85 100644
--- a/include/cobalt/kernel/lock.h
+++ b/include/cobalt/kernel/lock.h
@@ -66,7 +66,8 @@ typedef unsigned long spl_t;
 #if XENO_DEBUG(LOCKING)
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
const char *file;
const char *function;
unsigned int line;
@@ -84,7 +85,8 @@ struct xnlockinfo {
 };
 
 #define XNARCH_LOCK_UNLOCKED (struct xnlock) { \
-   { ~0 }, \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
NULL,   \
NULL,   \
0,  \
@@ -117,10 +119,15 @@ DECLARE_PER_CPU(struct xnlockinfo, xnlock_stats);
 #else /* !XENO_DEBUG(LOCKING) */
 
 struct xnlock {
-   atomic_t owner;
+   unsigned owner;
+   arch_spinlock_t alock;
 };
 
-#define XNARCH_LOCK_UNLOCKED   (struct xnlock) { { ~0 } }
+#define XNARCH_LOCK_UNLOCKED   \
+   (struct xnlock) {   \
+   ~0, \
+   __ARCH_SPIN_LOCK_UNLOCKED,  \
+   }
 
 #define XNLOCK_DBG_CONTEXT
 #define XNLOCK_DBG_CONTEXT_ARGS
@@ -175,20 +182,18 @@ static inline void xnlock_init (struct xnlock *lock)
 #define DEFINE_XNLOCK(lock)struct xnlock lock = 
XNARCH_LOCK_UNLOCKED
 #define DEFINE_PRIVATE_XNLOCK(lock)static DEFINE_XNLOCK(lock)
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS);
-
 static inline int xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
int cpu = ipipe_processor_id();
unsigned long long start;
 
-   if (atomic_read(&lock->owner) == cpu)
+   if (lock->owner == cpu)
return 2;
 
xnlock_dbg_prepare_acquire(&start);
 
-   if (unlikely(atomic_cmpxchg(&lock->owner, ~0, cpu) != ~0))
-   __xnlock_spin(cpu, lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
+   arch_spin_lock(&lock->alock);
+   lock->owner = cpu;
 
xnlock_dbg_acquired(lock, cpu, &start /*, */ XNLOCK_DBG_PASS_CONTEXT);
 
@@ -200,12 +205,8 @@ static inline void xnlock_put(struct xnlock *lock /*, 
*/ XNLOCK_DBG_CONTEXT_
if (xnlock_dbg_release(lock /*, */ XNLOCK_DBG_PASS_CONTEXT))
return;
 
-   /*
-* Make sure all data written inside the lock is visible to
-* other CPUs before we release the lock.
-*/
-   mb();
-   atomic_set(&lock->owner, ~0);
+   lock->owner = ~0U;
+   arch_spin_unlock(&lock->alock);
 }
 
 #ifndef CONFIG_XENO_ARCH_OUTOFLINE_XNLOCK
@@ -250,7 +251,7 @@ static inline void __xnlock_put_irqrestore(struct xnlock 
*lock, spl_t flags
 static inline int xnlock_is_owner(struct xnlock *lock)
 {
if (__locking_active__)
-   return atomic_read(&lock->owner) == ipipe_processor_id();
+   return lock->owner == ipipe_processor_id();
 
return 1;
 }
@@ -266,7 +267,7 @@ static inline int __xnlock_get(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARG
 static inline void __xnlock_put(struct xnlock *lock /*, */ 
XNLOCK_DBG_CONTEXT_ARGS)
 {
if (__locking_active__)
-   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT); 
+   ___xnlock_put(lock /*, */ XNLOCK_DBG_PASS_CONTEXT);
 }
 
 #undef __locking_active__
diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c
index ad72a3e..ef46e0b 100644
--- a/kernel/cobalt/debug.c
+++ b/kernel/cobalt/debug.c
@@ -598,7 +598,7 @@ int xnlock_dbg_release(struct xnlock *lock,
lock->function = "invalid";
}
 
-   if (unlikely(atomic_read(&lock->owner) != cpu)) {
+   if (unlikely(lock->owner != cpu)) {
ipipe_prepare_panic();
printk(XENO_ERR "lock %p already unlocked on CPU #%d\n"
"  last owner = %s:%u (%s(), CPU 
#%d)\n",
diff --git a/kernel/cobalt/lock.c b/kernel/cobalt/lock.c
index 5c339b5..a1b2e37 100644
--- a/kernel/cobalt/lock.c
+++ b/kernel/cobalt/lock.c
@@ -42,21 +42,6 @@ DEFINE_XNLOCK(nklock);
 #if defined(CONFIG_SMP) || XENO_DEBUG(LOCKING)
 EXPORT_SYMBOL_GPL(nklock);
 
-void __xnlock_spin(int cpu, struct xnlock *lock /*, */ XNLOCK_DBG_CONTEXT_ARGS)
-{
-   unsigned int spin_li