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