Module: xenomai-2.6
Branch: master
Commit: 94903a4a314fd8a27bff03f179ac3b68aecf00d9
URL:    
http://git.xenomai.org/?p=xenomai-2.6.git;a=commit;h=94903a4a314fd8a27bff03f179ac3b68aecf00d9

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Fri Jun 17 15:39:54 2016 +0200

nucleus/shadow: avoid tasklist_lock for find_task_by_pid

Since 2.6.18 holding rcu_read_lock() is sufficient to call
find_task_by_pid(). Add wrappers to wrap the necessary locking.

---

 include/asm-generic/wrappers.h |   22 ++++++++++++++++++++++
 ksrc/nucleus/shadow.c          |    4 ++--
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/include/asm-generic/wrappers.h b/include/asm-generic/wrappers.h
index fa5a42a..6d50c95 100644
--- a/include/asm-generic/wrappers.h
+++ b/include/asm-generic/wrappers.h
@@ -564,6 +564,17 @@ static inline void *kzalloc(size_t size, int flags)
 
 #include <linux/semaphore.h>
 #include <linux/pid.h>
+#include <linux/rcupdate.h>
+
+static inline void wrap_lock_tasklist(void)
+{
+       rcu_read_lock();
+}
+
+static inline void wrap_unlock_tasklist(void)
+{
+       rcu_read_unlock();
+}
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
 
@@ -584,8 +595,19 @@ static inline struct task_struct 
*wrap_find_task_by_pid(pid_t nr)
 
 #else /* LINUX_VERSION_CODE < 2.6.27 */
 
+#include <linux/spinlock.h>
 #include <asm/semaphore.h>
 
+static inline void wrap_lock_tasklist(void)
+{
+       read_lock(&tasklist_lock);
+}
+
+static inline void wrap_unlock_tasklist(void)
+{
+       read_unlock(&tasklist_lock);
+}
+
 #define wrap_find_task_by_pid(nr)  find_task_by_pid(nr)
 
 #endif /* LINUX_VERSION_CODE < 2.6.27 */
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index 28aaae7..f6f7ca2 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -1954,14 +1954,14 @@ void xnshadow_signal_completion(xncompletion_t __user 
*u_completion, int err)
        if (pid == -1)
                return;
 
-       read_lock(&tasklist_lock);
+       wrap_lock_tasklist();
 
        p = wrap_find_task_by_pid(completion.pid);
 
        if (p)
                wake_up_process(p);
 
-       read_unlock(&tasklist_lock);
+       wrap_unlock_tasklist();
 }
 EXPORT_SYMBOL_GPL(xnshadow_signal_completion);
 


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

Reply via email to