[PATCH [RT] 14/14] sysctl for runtime-control of lateral mutex stealing
From: Sven-Thorsten Dietrich <[EMAIL PROTECTED]> Add /proc/sys/kernel/lateral_steal, to allow switching on and off equal-priority mutex stealing between threads. Signed-off-by: Sven-Thorsten Dietrich <[EMAIL PROTECTED]> --- kernel/rtmutex.c |8 ++-- kernel/sysctl.c | 14 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c index da077e5..62e7af5 100644 --- a/kernel/rtmutex.c +++ b/kernel/rtmutex.c @@ -27,6 +27,9 @@ int rtlock_timeout __read_mostly = CONFIG_RTLOCK_DELAY; #ifdef CONFIG_ADAPTIVE_RTMUTEX int rtmutex_timeout __read_mostly = CONFIG_RTMUTEX_DELAY; #endif +#ifdef CONFIG_RTLOCK_LATERAL_STEAL +int rtmutex_lateral_steal __read_mostly = 1; +#endif /* * lock->owner state tracking: @@ -331,7 +334,8 @@ static inline int lock_is_stealable(struct task_struct *pendowner, int unfair) if (current->prio > pendowner->prio) return 0; - if (!unfair && (current->prio == pendowner->prio)) + if (unlikely(current->prio == pendowner->prio) && + !(unfair && rtmutex_lateral_steal)) #endif return 0; @@ -355,7 +359,7 @@ static inline int try_to_steal_lock(struct rt_mutex *lock, int unfair) return 1; spin_lock(>pi_lock); - if (!lock_is_stealable(pendowner, unfair)) { + if (!lock_is_stealable(pendowner, (unfair & rtmutex_lateral_steal))) { spin_unlock(>pi_lock); return 0; } diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 3465af2..c1a1c6d 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -179,6 +179,10 @@ extern struct ctl_table inotify_table[]; int sysctl_legacy_va_layout; #endif +#ifdef CONFIG_RTLOCK_LATERAL_STEAL +extern int rtmutex_lateral_steal; +#endif + extern int prove_locking; extern int lock_stat; @@ -986,6 +990,16 @@ static struct ctl_table kern_table[] = { .proc_handler = _dointvec, }, #endif +#ifdef CONFIG_RTLOCK_LATERAL_STEAL + { + .ctl_name = CTL_UNNUMBERED, + .procname = "rtmutex_lateral_steal", + .data = _lateral_steal, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = _dointvec, + }, +#endif #ifdef CONFIG_PROC_FS { .ctl_name = CTL_UNNUMBERED, -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH [RT] 14/14] sysctl for runtime-control of lateral mutex stealing
From: Sven-Thorsten Dietrich [EMAIL PROTECTED] Add /proc/sys/kernel/lateral_steal, to allow switching on and off equal-priority mutex stealing between threads. Signed-off-by: Sven-Thorsten Dietrich [EMAIL PROTECTED] --- kernel/rtmutex.c |8 ++-- kernel/sysctl.c | 14 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c index da077e5..62e7af5 100644 --- a/kernel/rtmutex.c +++ b/kernel/rtmutex.c @@ -27,6 +27,9 @@ int rtlock_timeout __read_mostly = CONFIG_RTLOCK_DELAY; #ifdef CONFIG_ADAPTIVE_RTMUTEX int rtmutex_timeout __read_mostly = CONFIG_RTMUTEX_DELAY; #endif +#ifdef CONFIG_RTLOCK_LATERAL_STEAL +int rtmutex_lateral_steal __read_mostly = 1; +#endif /* * lock-owner state tracking: @@ -331,7 +334,8 @@ static inline int lock_is_stealable(struct task_struct *pendowner, int unfair) if (current-prio pendowner-prio) return 0; - if (!unfair (current-prio == pendowner-prio)) + if (unlikely(current-prio == pendowner-prio) + !(unfair rtmutex_lateral_steal)) #endif return 0; @@ -355,7 +359,7 @@ static inline int try_to_steal_lock(struct rt_mutex *lock, int unfair) return 1; spin_lock(pendowner-pi_lock); - if (!lock_is_stealable(pendowner, unfair)) { + if (!lock_is_stealable(pendowner, (unfair rtmutex_lateral_steal))) { spin_unlock(pendowner-pi_lock); return 0; } diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 3465af2..c1a1c6d 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -179,6 +179,10 @@ extern struct ctl_table inotify_table[]; int sysctl_legacy_va_layout; #endif +#ifdef CONFIG_RTLOCK_LATERAL_STEAL +extern int rtmutex_lateral_steal; +#endif + extern int prove_locking; extern int lock_stat; @@ -986,6 +990,16 @@ static struct ctl_table kern_table[] = { .proc_handler = proc_dointvec, }, #endif +#ifdef CONFIG_RTLOCK_LATERAL_STEAL + { + .ctl_name = CTL_UNNUMBERED, + .procname = rtmutex_lateral_steal, + .data = rtmutex_lateral_steal, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, +#endif #ifdef CONFIG_PROC_FS { .ctl_name = CTL_UNNUMBERED, -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/