[Xenomai-git] Jan Kiszka : cobalt/kernel: Fix locking for xnthread info manipulations

2015-07-27 Thread git repository hosting
Module: xenomai-3
Branch: master
Commit: 1b78d7edd374a8ea8b4a0267e898e65b776beedb
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1b78d7edd374a8ea8b4a0267e898e65b776beedb

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Fri Jun 26 15:11:42 2015 +0200

cobalt/kernel: Fix locking for xnthread info manipulations

nklock must be held when manipulating bits of xnthread::info. Not all
callsites of xnthread_set/clear_info follow this rule so far, directly
or indirectly, fix them (and possibly some other races along this).

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 kernel/cobalt/posix/syscall.c |5 +
 kernel/cobalt/synch.c |2 ++
 kernel/cobalt/thread.c|3 +++
 3 files changed, 10 insertions(+)

diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
index 74b8c18..2d7ab1e 100644
--- a/kernel/cobalt/posix/syscall.c
+++ b/kernel/cobalt/posix/syscall.c
@@ -82,6 +82,9 @@ static void prepare_for_signal(struct task_struct *p,
   int sysflags)
 {
int notify = 0;
+   spl_t s;
+
+   xnlock_get_irqsave(nklock, s);
 
if (xnthread_test_info(thread, XNKICKED)) {
if (signal_pending(p)) {
@@ -94,6 +97,8 @@ static void prepare_for_signal(struct task_struct *p,
xnthread_clear_info(thread, XNKICKED);
}
 
+   xnlock_put_irqrestore(nklock, s);
+
xnthread_test_cancel();
 
xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
diff --git a/kernel/cobalt/synch.c b/kernel/cobalt/synch.c
index 7142fd2..ae4ceef 100644
--- a/kernel/cobalt/synch.c
+++ b/kernel/cobalt/synch.c
@@ -443,7 +443,9 @@ redo:
if (likely(h == XN_NO_HANDLE)) {
xnsynch_set_owner(synch, curr);
xnthread_get_resource(curr);
+   xnlock_get_irqsave(nklock, s);
xnthread_clear_info(curr, XNRMID | XNTIMEO | XNBREAK);
+   xnlock_put_irqrestore(nklock, s);
return 0;
}
 
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index 4cec6e7..7c8cb3a 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -1989,6 +1989,7 @@ void xnthread_relax(int notify, int reason)
struct task_struct *p = current;
int cpu __maybe_unused;
siginfo_t si;
+   spl_t s;
 
primary_mode_only();
 
@@ -2045,7 +2046,9 @@ void xnthread_relax(int notify, int reason)
si.si_int = reason | sigdebug_marker;
send_sig_info(SIGDEBUG, si, p);
}
+   xnlock_get_irqsave(nklock, s);
xnsynch_detect_claimed_relax(thread);
+   xnlock_put_irqrestore(nklock, s);
}
 
/*


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


[Xenomai-git] Jan Kiszka : cobalt/kernel: Fix locking for xnthread info manipulations

2015-07-17 Thread git repository hosting
Module: xenomai-3
Branch: next
Commit: 1b78d7edd374a8ea8b4a0267e898e65b776beedb
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1b78d7edd374a8ea8b4a0267e898e65b776beedb

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Fri Jun 26 15:11:42 2015 +0200

cobalt/kernel: Fix locking for xnthread info manipulations

nklock must be held when manipulating bits of xnthread::info. Not all
callsites of xnthread_set/clear_info follow this rule so far, directly
or indirectly, fix them (and possibly some other races along this).

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 kernel/cobalt/posix/syscall.c |5 +
 kernel/cobalt/synch.c |2 ++
 kernel/cobalt/thread.c|3 +++
 3 files changed, 10 insertions(+)

diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
index 74b8c18..2d7ab1e 100644
--- a/kernel/cobalt/posix/syscall.c
+++ b/kernel/cobalt/posix/syscall.c
@@ -82,6 +82,9 @@ static void prepare_for_signal(struct task_struct *p,
   int sysflags)
 {
int notify = 0;
+   spl_t s;
+
+   xnlock_get_irqsave(nklock, s);
 
if (xnthread_test_info(thread, XNKICKED)) {
if (signal_pending(p)) {
@@ -94,6 +97,8 @@ static void prepare_for_signal(struct task_struct *p,
xnthread_clear_info(thread, XNKICKED);
}
 
+   xnlock_put_irqrestore(nklock, s);
+
xnthread_test_cancel();
 
xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
diff --git a/kernel/cobalt/synch.c b/kernel/cobalt/synch.c
index 7142fd2..ae4ceef 100644
--- a/kernel/cobalt/synch.c
+++ b/kernel/cobalt/synch.c
@@ -443,7 +443,9 @@ redo:
if (likely(h == XN_NO_HANDLE)) {
xnsynch_set_owner(synch, curr);
xnthread_get_resource(curr);
+   xnlock_get_irqsave(nklock, s);
xnthread_clear_info(curr, XNRMID | XNTIMEO | XNBREAK);
+   xnlock_put_irqrestore(nklock, s);
return 0;
}
 
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index 4cec6e7..7c8cb3a 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -1989,6 +1989,7 @@ void xnthread_relax(int notify, int reason)
struct task_struct *p = current;
int cpu __maybe_unused;
siginfo_t si;
+   spl_t s;
 
primary_mode_only();
 
@@ -2045,7 +2046,9 @@ void xnthread_relax(int notify, int reason)
si.si_int = reason | sigdebug_marker;
send_sig_info(SIGDEBUG, si, p);
}
+   xnlock_get_irqsave(nklock, s);
xnsynch_detect_claimed_relax(thread);
+   xnlock_put_irqrestore(nklock, s);
}
 
/*


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


[Xenomai-git] Jan Kiszka : cobalt/kernel: Fix locking for xnthread info manipulations

2015-07-17 Thread git repository hosting
Module: xenomai-jki
Branch: for-forge
Commit: 8f4c5dcc9e0f420757185d47695d6ef191aea3f4
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=8f4c5dcc9e0f420757185d47695d6ef191aea3f4

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Fri Jun 26 15:11:42 2015 +0200

cobalt/kernel: Fix locking for xnthread info manipulations

nklock must be held when manipulating bits of xnthread::info. Not all
callsites of xnthread_set/clear_info follow this rule so far, directly
or indirectly, fix them (and possibly some other races along this).

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 kernel/cobalt/posix/syscall.c |5 +
 kernel/cobalt/synch.c |2 ++
 kernel/cobalt/thread.c|3 +++
 3 files changed, 10 insertions(+)

diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
index 74b8c18..2d7ab1e 100644
--- a/kernel/cobalt/posix/syscall.c
+++ b/kernel/cobalt/posix/syscall.c
@@ -82,6 +82,9 @@ static void prepare_for_signal(struct task_struct *p,
   int sysflags)
 {
int notify = 0;
+   spl_t s;
+
+   xnlock_get_irqsave(nklock, s);
 
if (xnthread_test_info(thread, XNKICKED)) {
if (signal_pending(p)) {
@@ -94,6 +97,8 @@ static void prepare_for_signal(struct task_struct *p,
xnthread_clear_info(thread, XNKICKED);
}
 
+   xnlock_put_irqrestore(nklock, s);
+
xnthread_test_cancel();
 
xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
diff --git a/kernel/cobalt/synch.c b/kernel/cobalt/synch.c
index 7142fd2..ae4ceef 100644
--- a/kernel/cobalt/synch.c
+++ b/kernel/cobalt/synch.c
@@ -443,7 +443,9 @@ redo:
if (likely(h == XN_NO_HANDLE)) {
xnsynch_set_owner(synch, curr);
xnthread_get_resource(curr);
+   xnlock_get_irqsave(nklock, s);
xnthread_clear_info(curr, XNRMID | XNTIMEO | XNBREAK);
+   xnlock_put_irqrestore(nklock, s);
return 0;
}
 
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index 4cec6e7..7c8cb3a 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -1989,6 +1989,7 @@ void xnthread_relax(int notify, int reason)
struct task_struct *p = current;
int cpu __maybe_unused;
siginfo_t si;
+   spl_t s;
 
primary_mode_only();
 
@@ -2045,7 +2046,9 @@ void xnthread_relax(int notify, int reason)
si.si_int = reason | sigdebug_marker;
send_sig_info(SIGDEBUG, si, p);
}
+   xnlock_get_irqsave(nklock, s);
xnsynch_detect_claimed_relax(thread);
+   xnlock_put_irqrestore(nklock, s);
}
 
/*


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


[Xenomai-git] Jan Kiszka : cobalt/kernel: Fix locking for xnthread info manipulations

2015-07-16 Thread git repository hosting
Module: xenomai-jki
Branch: for-forge
Commit: 6fa0c3fff47375b7a4af8c16b27014b611cff188
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=6fa0c3fff47375b7a4af8c16b27014b611cff188

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Fri Jun 26 15:11:42 2015 +0200

cobalt/kernel: Fix locking for xnthread info manipulations

nklock must be held when manipulating bits of xnthread::info. Not all
callsites of xnthread_set/clear_info follow this rule so far, directly
or indirectly, fix them (and possibly some other races along this).

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 kernel/cobalt/posix/syscall.c |5 +
 kernel/cobalt/synch.c |2 ++
 kernel/cobalt/thread.c|3 +++
 3 files changed, 10 insertions(+)

diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
index 74b8c18..2d7ab1e 100644
--- a/kernel/cobalt/posix/syscall.c
+++ b/kernel/cobalt/posix/syscall.c
@@ -82,6 +82,9 @@ static void prepare_for_signal(struct task_struct *p,
   int sysflags)
 {
int notify = 0;
+   spl_t s;
+
+   xnlock_get_irqsave(nklock, s);
 
if (xnthread_test_info(thread, XNKICKED)) {
if (signal_pending(p)) {
@@ -94,6 +97,8 @@ static void prepare_for_signal(struct task_struct *p,
xnthread_clear_info(thread, XNKICKED);
}
 
+   xnlock_put_irqrestore(nklock, s);
+
xnthread_test_cancel();
 
xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
diff --git a/kernel/cobalt/synch.c b/kernel/cobalt/synch.c
index 7142fd2..ae4ceef 100644
--- a/kernel/cobalt/synch.c
+++ b/kernel/cobalt/synch.c
@@ -443,7 +443,9 @@ redo:
if (likely(h == XN_NO_HANDLE)) {
xnsynch_set_owner(synch, curr);
xnthread_get_resource(curr);
+   xnlock_get_irqsave(nklock, s);
xnthread_clear_info(curr, XNRMID | XNTIMEO | XNBREAK);
+   xnlock_put_irqrestore(nklock, s);
return 0;
}
 
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index 4cec6e7..7c8cb3a 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -1989,6 +1989,7 @@ void xnthread_relax(int notify, int reason)
struct task_struct *p = current;
int cpu __maybe_unused;
siginfo_t si;
+   spl_t s;
 
primary_mode_only();
 
@@ -2045,7 +2046,9 @@ void xnthread_relax(int notify, int reason)
si.si_int = reason | sigdebug_marker;
send_sig_info(SIGDEBUG, si, p);
}
+   xnlock_get_irqsave(nklock, s);
xnsynch_detect_claimed_relax(thread);
+   xnlock_put_irqrestore(nklock, s);
}
 
/*


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


[Xenomai-git] Jan Kiszka : cobalt/kernel: Fix locking for xnthread info manipulations

2015-07-03 Thread git repository hosting
Module: xenomai-jki
Branch: for-forge
Commit: ff297a5f132d2577866582fa1ea2e9578f5d88c7
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=ff297a5f132d2577866582fa1ea2e9578f5d88c7

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Fri Jun 26 15:11:42 2015 +0200

cobalt/kernel: Fix locking for xnthread info manipulations

nklock must be held when manipulating bits of xnthread::info. Not all
callsites of xnthread_set/clear_info follow this rule so far, directly
or indirectly, fix them (and possibly some other races along this).

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 include/cobalt/kernel/rtdm/driver.h |4 ++--
 kernel/cobalt/posix/syscall.c   |5 +
 kernel/cobalt/synch.c   |2 ++
 kernel/cobalt/thread.c  |5 +
 4 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index c14198b..5fd3199 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -566,7 +566,7 @@ static inline void rtdm_lock_get(rtdm_lock_t *lock)
 static inline void rtdm_lock_put(rtdm_lock_t *lock)
 {
spin_unlock(lock);
-   __xnsched_unlock();
+   xnsched_unlock();
 }
 
 /**
@@ -603,7 +603,7 @@ static inline
 void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, rtdm_lockctx_t context)
 {
spin_unlock(lock);
-   __xnsched_unlock();
+   xnsched_unlock();
ipipe_restore_head(context);
 }
 
diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
index abe9fea..56a99b2 100644
--- a/kernel/cobalt/posix/syscall.c
+++ b/kernel/cobalt/posix/syscall.c
@@ -81,6 +81,9 @@ static void prepare_for_signal(struct task_struct *p,
   int sysflags)
 {
int notify = 0;
+   spl_t s;
+
+   xnlock_get_irqsave(nklock, s);
 
if (xnthread_test_info(thread, XNKICKED)) {
if (signal_pending(p)) {
@@ -93,6 +96,8 @@ static void prepare_for_signal(struct task_struct *p,
xnthread_clear_info(thread, XNKICKED);
}
 
+   xnlock_put_irqrestore(nklock, s);
+
xnthread_test_cancel();
 
xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
diff --git a/kernel/cobalt/synch.c b/kernel/cobalt/synch.c
index 536e0a7..a1ea4b4 100644
--- a/kernel/cobalt/synch.c
+++ b/kernel/cobalt/synch.c
@@ -441,7 +441,9 @@ redo:
if (likely(h == XN_NO_HANDLE)) {
xnsynch_set_owner(synch, curr);
xnthread_get_resource(curr);
+   xnlock_get_irqsave(nklock, s);
xnthread_clear_info(curr, XNRMID | XNTIMEO | XNBREAK);
+   xnlock_put_irqrestore(nklock, s);
return 0;
}
 
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index a811e88..cb3df39 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -1973,6 +1973,7 @@ void xnthread_relax(int notify, int reason)
struct task_struct *p = current;
int cpu __maybe_unused;
siginfo_t si;
+   spl_t s;
 
primary_mode_only();
 
@@ -2029,7 +2030,9 @@ void xnthread_relax(int notify, int reason)
si.si_int = reason | sigdebug_marker;
send_sig_info(SIGDEBUG, si, p);
}
+   xnlock_get_irqsave(nklock, s);
xnsynch_detect_claimed_relax(thread);
+   xnlock_put_irqrestore(nklock, s);
}
 
/*
@@ -2040,7 +2043,9 @@ void xnthread_relax(int notify, int reason)
 
 #ifdef CONFIG_SMP
if (xnthread_test_info(thread, XNMOVED)) {
+   xnlock_get_irqsave(nklock, s);
xnthread_clear_info(thread, XNMOVED);
+   xnlock_put_irqrestore(nklock, s);
cpu = xnsched_cpu(thread-sched);
set_cpus_allowed(p, cpumask_of_cpu(cpu));
}


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


[Xenomai-git] Jan Kiszka : cobalt/kernel: Fix locking for xnthread info manipulations

2015-06-30 Thread git repository hosting
Module: xenomai-jki
Branch: for-forge
Commit: 48d8bfc6d056dfd7dbdb4cbd07f5e5b8d91c9db2
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=48d8bfc6d056dfd7dbdb4cbd07f5e5b8d91c9db2

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Fri Jun 26 15:11:42 2015 +0200

cobalt/kernel: Fix locking for xnthread info manipulations

nklock must be held when manipulating bits of xnthread::info. Not all
callsites of xnthread_set/clear_info follow this rule so far, directly
or indirectly, fix them (and possibly some other races along this).

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 include/cobalt/kernel/rtdm/driver.h |8 
 kernel/cobalt/posix/syscall.c   |5 +
 kernel/cobalt/synch.c   |2 ++
 kernel/cobalt/thread.c  |5 +
 4 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index c14198b..de476ca 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -553,7 +553,7 @@ static inline void rtdm_lock_get(rtdm_lock_t *lock)
 {
XENO_BUG_ON(COBALT, !spltest());
spin_lock(lock);
-   __xnsched_lock();
+   xnsched_lock();
 }
 
 /**
@@ -566,7 +566,7 @@ static inline void rtdm_lock_get(rtdm_lock_t *lock)
 static inline void rtdm_lock_put(rtdm_lock_t *lock)
 {
spin_unlock(lock);
-   __xnsched_unlock();
+   xnsched_unlock();
 }
 
 /**
@@ -584,7 +584,7 @@ static inline rtdm_lockctx_t 
__rtdm_lock_get_irqsave(rtdm_lock_t *lock)
 
context = ipipe_test_and_stall_head();
spin_lock(lock);
-   __xnsched_lock();
+   xnsched_lock();
 
return context;
 }
@@ -603,7 +603,7 @@ static inline
 void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, rtdm_lockctx_t context)
 {
spin_unlock(lock);
-   __xnsched_unlock();
+   xnsched_unlock();
ipipe_restore_head(context);
 }
 
diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
index cf93f07..e60cea8 100644
--- a/kernel/cobalt/posix/syscall.c
+++ b/kernel/cobalt/posix/syscall.c
@@ -84,6 +84,9 @@ static void prepare_for_signal(struct task_struct *p,
   int sysflags)
 {
int notify = 0;
+   spl_t s;
+
+   xnlock_get_irqsave(nklock, s);
 
if (xnthread_test_info(thread, XNKICKED)) {
if (signal_pending(p)) {
@@ -96,6 +99,8 @@ static void prepare_for_signal(struct task_struct *p,
xnthread_clear_info(thread, XNKICKED);
}
 
+   xnlock_put_irqrestore(nklock, s);
+
xnthread_test_cancel();
 
xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
diff --git a/kernel/cobalt/synch.c b/kernel/cobalt/synch.c
index 536e0a7..a1ea4b4 100644
--- a/kernel/cobalt/synch.c
+++ b/kernel/cobalt/synch.c
@@ -441,7 +441,9 @@ redo:
if (likely(h == XN_NO_HANDLE)) {
xnsynch_set_owner(synch, curr);
xnthread_get_resource(curr);
+   xnlock_get_irqsave(nklock, s);
xnthread_clear_info(curr, XNRMID | XNTIMEO | XNBREAK);
+   xnlock_put_irqrestore(nklock, s);
return 0;
}
 
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index 46aca95..caacf3e 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -1966,6 +1966,7 @@ void xnthread_relax(int notify, int reason)
struct task_struct *p = current;
int cpu __maybe_unused;
siginfo_t si;
+   spl_t s;
 
primary_mode_only();
 
@@ -2022,7 +2023,9 @@ void xnthread_relax(int notify, int reason)
si.si_int = reason | sigdebug_marker;
send_sig_info(SIGDEBUG, si, p);
}
+   xnlock_get_irqsave(nklock, s);
xnsynch_detect_claimed_relax(thread);
+   xnlock_put_irqrestore(nklock, s);
}
 
/*
@@ -2033,7 +2036,9 @@ void xnthread_relax(int notify, int reason)
 
 #ifdef CONFIG_SMP
if (xnthread_test_info(thread, XNMOVED)) {
+   xnlock_get_irqsave(nklock, s);
xnthread_clear_info(thread, XNMOVED);
+   xnlock_put_irqrestore(nklock, s);
cpu = xnsched_cpu(thread-sched);
set_cpus_allowed(p, cpumask_of_cpu(cpu));
}


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


[Xenomai-git] Jan Kiszka : cobalt/kernel: Fix locking for xnthread info manipulations

2015-06-26 Thread git repository hosting
Module: xenomai-jki
Branch: for-forge
Commit: 67a64e164b737759cc171d3b04b05770e1450cb6
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=67a64e164b737759cc171d3b04b05770e1450cb6

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Fri Jun 26 15:11:42 2015 +0200

cobalt/kernel: Fix locking for xnthread info manipulations

nklock must be held when manipulating bits of xnthread::info. Not all
callsites of xnthread_set/clear_info follow this rule so far, directly
or indirectly, fix them (and possibly some other races along this).

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 include/cobalt/kernel/rtdm/driver.h |8 
 kernel/cobalt/posix/syscall.c   |5 +
 kernel/cobalt/synch.c   |2 ++
 kernel/cobalt/thread.c  |5 +
 4 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index c14198b..de476ca 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -553,7 +553,7 @@ static inline void rtdm_lock_get(rtdm_lock_t *lock)
 {
XENO_BUG_ON(COBALT, !spltest());
spin_lock(lock);
-   __xnsched_lock();
+   xnsched_lock();
 }
 
 /**
@@ -566,7 +566,7 @@ static inline void rtdm_lock_get(rtdm_lock_t *lock)
 static inline void rtdm_lock_put(rtdm_lock_t *lock)
 {
spin_unlock(lock);
-   __xnsched_unlock();
+   xnsched_unlock();
 }
 
 /**
@@ -584,7 +584,7 @@ static inline rtdm_lockctx_t 
__rtdm_lock_get_irqsave(rtdm_lock_t *lock)
 
context = ipipe_test_and_stall_head();
spin_lock(lock);
-   __xnsched_lock();
+   xnsched_lock();
 
return context;
 }
@@ -603,7 +603,7 @@ static inline
 void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, rtdm_lockctx_t context)
 {
spin_unlock(lock);
-   __xnsched_unlock();
+   xnsched_unlock();
ipipe_restore_head(context);
 }
 
diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
index cf93f07..e60cea8 100644
--- a/kernel/cobalt/posix/syscall.c
+++ b/kernel/cobalt/posix/syscall.c
@@ -84,6 +84,9 @@ static void prepare_for_signal(struct task_struct *p,
   int sysflags)
 {
int notify = 0;
+   spl_t s;
+
+   xnlock_get_irqsave(nklock, s);
 
if (xnthread_test_info(thread, XNKICKED)) {
if (signal_pending(p)) {
@@ -96,6 +99,8 @@ static void prepare_for_signal(struct task_struct *p,
xnthread_clear_info(thread, XNKICKED);
}
 
+   xnlock_put_irqrestore(nklock, s);
+
xnthread_test_cancel();
 
xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
diff --git a/kernel/cobalt/synch.c b/kernel/cobalt/synch.c
index 536e0a7..a1ea4b4 100644
--- a/kernel/cobalt/synch.c
+++ b/kernel/cobalt/synch.c
@@ -441,7 +441,9 @@ redo:
if (likely(h == XN_NO_HANDLE)) {
xnsynch_set_owner(synch, curr);
xnthread_get_resource(curr);
+   xnlock_get_irqsave(nklock, s);
xnthread_clear_info(curr, XNRMID | XNTIMEO | XNBREAK);
+   xnlock_put_irqrestore(nklock, s);
return 0;
}
 
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index 5adf44f..22729a8 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -1978,6 +1978,7 @@ void xnthread_relax(int notify, int reason)
struct task_struct *p = current;
int cpu __maybe_unused;
siginfo_t si;
+   spl_t s;
 
primary_mode_only();
 
@@ -2034,7 +2035,9 @@ void xnthread_relax(int notify, int reason)
si.si_int = reason | sigdebug_marker;
send_sig_info(SIGDEBUG, si, p);
}
+   xnlock_get_irqsave(nklock, s);
xnsynch_detect_claimed_relax(thread);
+   xnlock_put_irqrestore(nklock, s);
}
 
/*
@@ -2045,7 +2048,9 @@ void xnthread_relax(int notify, int reason)
 
 #ifdef CONFIG_SMP
if (xnthread_test_info(thread, XNMOVED)) {
+   xnlock_get_irqsave(nklock, s);
xnthread_clear_info(thread, XNMOVED);
+   xnlock_put_irqrestore(nklock, s);
cpu = xnsched_cpu(thread-sched);
set_cpus_allowed(p, cpumask_of_cpu(cpu));
}


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