Re: [(RT RFC) PATCH v2 7/9] adaptive mutexes

2008-02-25 Thread Gregory Haskins
>>> On Mon, Feb 25, 2008 at  5:09 PM, in message
<[EMAIL PROTECTED]>, Pavel Machek <[EMAIL PROTECTED]> wrote: 
> Hi!
> 
>> From: Peter W.Morreale <[EMAIL PROTECTED]>
>> 
>> This patch adds the adaptive spin lock busywait to rtmutexes.  It adds
>> a new tunable: rtmutex_timeout, which is the companion to the
>> rtlock_timeout tunable.
>> 
>> Signed-off-by: Peter W. Morreale <[EMAIL PROTECTED]>
> 
> Not signed off by you?

I wasn't sure if this was appropriate for me to do.  This is the first time I 
was acting as "upstream" to someone.  If that is what I am expected to do, 
consider this an "ack" for your remaining comments related to this.

> 
>> diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
>> index ac1cbad..864bf14 100644
>> --- a/kernel/Kconfig.preempt
>> +++ b/kernel/Kconfig.preempt
>> @@ -214,6 +214,43 @@ config RTLOCK_DELAY
>>   tunable at runtime via a sysctl.  A setting of 0 (zero) disables
>>   the adaptive algorithm entirely.
>>  
>> +config ADAPTIVE_RTMUTEX
>> +bool "Adaptive real-time mutexes"
>> +default y
>> +depends on ADAPTIVE_RTLOCK
>> +help
>> + This option adds the adaptive rtlock spin/sleep algorithm to
>> + rtmutexes.  In rtlocks, a significant gain in throughput
>> + can be seen by allowing rtlocks to spin for a distinct
>> + amount of time prior to going to sleep for deadlock avoidence.
>> + 
>> + Typically, mutexes are used when a critical section may need to
>> + sleep due to a blocking operation.  In the event the critical 
>> + section does not need to sleep, an additional gain in throughput 
>> + can be seen by avoiding the extra overhead of sleeping.
> 
> Watch the whitespace. ... and do we need yet another config options?
> 
>> +config RTMUTEX_DELAY
>> +int "Default delay (in loops) for adaptive mutexes"
>> +range 0 1000
>> +depends on ADAPTIVE_RTMUTEX
>> +default "3000"
>> +help
>> + This allows you to specify the maximum delay a task will use
>> + to wait for a rt mutex before going to sleep.  Note that that
>> + although the delay is implemented as a preemptable loop, tasks
>> + of like priority cannot preempt each other and this setting can
>> + result in increased latencies.
>> + 
>> + The value is tunable at runtime via a sysctl.  A setting of 0
>> + (zero) disables the adaptive algorithm entirely.
> 
> Ouch.

?  Is this reference to whitespace damage, or does the content need addressing?

> 
>> +#ifdef CONFIG_ADAPTIVE_RTMUTEX
>> +
>> +#define mutex_adaptive_wait adaptive_wait
>> +#define mutex_prepare_adaptive_wait prepare_adaptive_wait
>> +
>> +extern int rtmutex_timeout;
>> +
>> +#define DECLARE_ADAPTIVE_MUTEX_WAITER(name) \
>> + struct adaptive_waiter name = { .owner = NULL,   \
>> + .timeout = rtmutex_timeout, }
>> +
>> +#else
>> +
>> +#define DECLARE_ADAPTIVE_MUTEX_WAITER(name)
>> +
>> +#define mutex_adaptive_wait(lock, intr, waiter, busy) 1
>> +#define mutex_prepare_adaptive_wait(lock, busy) {}
> 
> More evil macros. Macro does not behave like a function, make it
> inline function if you are replacing a function.

Ok


>   Pavel



--
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/


Re: [(RT RFC) PATCH v2 7/9] adaptive mutexes

2008-02-25 Thread Pavel Machek
Hi!

> From: Peter W.Morreale <[EMAIL PROTECTED]>
> 
> This patch adds the adaptive spin lock busywait to rtmutexes.  It adds
> a new tunable: rtmutex_timeout, which is the companion to the
> rtlock_timeout tunable.
> 
> Signed-off-by: Peter W. Morreale <[EMAIL PROTECTED]>

Not signed off by you?

> diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
> index ac1cbad..864bf14 100644
> --- a/kernel/Kconfig.preempt
> +++ b/kernel/Kconfig.preempt
> @@ -214,6 +214,43 @@ config RTLOCK_DELAY
>tunable at runtime via a sysctl.  A setting of 0 (zero) disables
>the adaptive algorithm entirely.
>  
> +config ADAPTIVE_RTMUTEX
> +bool "Adaptive real-time mutexes"
> +default y
> +depends on ADAPTIVE_RTLOCK
> +help
> + This option adds the adaptive rtlock spin/sleep algorithm to
> + rtmutexes.  In rtlocks, a significant gain in throughput
> + can be seen by allowing rtlocks to spin for a distinct
> + amount of time prior to going to sleep for deadlock avoidence.
> + 
> + Typically, mutexes are used when a critical section may need to
> + sleep due to a blocking operation.  In the event the critical 
> +  section does not need to sleep, an additional gain in throughput 
> +  can be seen by avoiding the extra overhead of sleeping.

Watch the whitespace. ... and do we need yet another config options?

> +config RTMUTEX_DELAY
> +int "Default delay (in loops) for adaptive mutexes"
> +range 0 1000
> +depends on ADAPTIVE_RTMUTEX
> +default "3000"
> +help
> + This allows you to specify the maximum delay a task will use
> +  to wait for a rt mutex before going to sleep.  Note that that
> +  although the delay is implemented as a preemptable loop, tasks
> +  of like priority cannot preempt each other and this setting can
> +  result in increased latencies.
> +  
> + The value is tunable at runtime via a sysctl.  A setting of 0
> +  (zero) disables the adaptive algorithm entirely.

Ouch.

> +#ifdef CONFIG_ADAPTIVE_RTMUTEX
> +
> +#define mutex_adaptive_wait adaptive_wait
> +#define mutex_prepare_adaptive_wait prepare_adaptive_wait
> +
> +extern int rtmutex_timeout;
> +
> +#define DECLARE_ADAPTIVE_MUTEX_WAITER(name) \
> + struct adaptive_waiter name = { .owner = NULL,   \
> + .timeout = rtmutex_timeout, }
> +
> +#else
> +
> +#define DECLARE_ADAPTIVE_MUTEX_WAITER(name)
> +
> +#define mutex_adaptive_wait(lock, intr, waiter, busy) 1
> +#define mutex_prepare_adaptive_wait(lock, busy) {}

More evil macros. Macro does not behave like a function, make it
inline function if you are replacing a function.
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
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/


[(RT RFC) PATCH v2 7/9] adaptive mutexes

2008-02-25 Thread Gregory Haskins
From: Peter W.Morreale <[EMAIL PROTECTED]>

This patch adds the adaptive spin lock busywait to rtmutexes.  It adds
a new tunable: rtmutex_timeout, which is the companion to the
rtlock_timeout tunable.

Signed-off-by: Peter W. Morreale <[EMAIL PROTECTED]>
---

 kernel/Kconfig.preempt|   37 ++
 kernel/rtmutex.c  |   76 +
 kernel/rtmutex_adaptive.h |   32 ++-
 kernel/sysctl.c   |   10 ++
 4 files changed, 119 insertions(+), 36 deletions(-)

diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
index ac1cbad..864bf14 100644
--- a/kernel/Kconfig.preempt
+++ b/kernel/Kconfig.preempt
@@ -214,6 +214,43 @@ config RTLOCK_DELAY
 tunable at runtime via a sysctl.  A setting of 0 (zero) disables
 the adaptive algorithm entirely.
 
+config ADAPTIVE_RTMUTEX
+bool "Adaptive real-time mutexes"
+default y
+depends on ADAPTIVE_RTLOCK
+help
+ This option adds the adaptive rtlock spin/sleep algorithm to
+ rtmutexes.  In rtlocks, a significant gain in throughput
+ can be seen by allowing rtlocks to spin for a distinct
+ amount of time prior to going to sleep for deadlock avoidence.
+ 
+ Typically, mutexes are used when a critical section may need to
+ sleep due to a blocking operation.  In the event the critical 
+section does not need to sleep, an additional gain in throughput 
+can be seen by avoiding the extra overhead of sleeping.
+ 
+ This option alters the rtmutex code to use an adaptive
+ spin/sleep algorithm.  It will spin unless it determines it must
+ sleep to avoid deadlock.  This offers a best of both worlds
+ solution since we achieve both high-throughput and low-latency.
+ 
+ If unsure, say Y
+ 
+config RTMUTEX_DELAY
+int "Default delay (in loops) for adaptive mutexes"
+range 0 1000
+depends on ADAPTIVE_RTMUTEX
+default "3000"
+help
+ This allows you to specify the maximum delay a task will use
+to wait for a rt mutex before going to sleep.  Note that that
+although the delay is implemented as a preemptable loop, tasks
+of like priority cannot preempt each other and this setting can
+result in increased latencies.
+
+ The value is tunable at runtime via a sysctl.  A setting of 0
+(zero) disables the adaptive algorithm entirely.
+
 config SPINLOCK_BKL
bool "Old-Style Big Kernel Lock"
depends on (PREEMPT || SMP) && !PREEMPT_RT
diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c
index 4a16b13..ea593e0 100644
--- a/kernel/rtmutex.c
+++ b/kernel/rtmutex.c
@@ -29,6 +29,10 @@ int rtmutex_lateral_steal __read_mostly = 1;
 int rtlock_timeout __read_mostly = CONFIG_RTLOCK_DELAY;
 #endif
 
+#ifdef CONFIG_ADAPTIVE_RTMUTEX
+int rtmutex_timeout __read_mostly = CONFIG_RTMUTEX_DELAY;
+#endif
+
 /*
  * lock->owner state tracking:
  *
@@ -542,34 +546,33 @@ static void wakeup_next_waiter(struct rt_mutex *lock, int 
savestate)
 * Do the wakeup before the ownership change to give any spinning
 * waiter grantees a headstart over the other threads that will
 * trigger once owner changes.
+*
+* We can skip the actual (expensive) wakeup if the
+* waiter is already running, but we have to be careful
+* of race conditions because they may be about to sleep.
+*
+* The waiter-side protocol has the following pattern:
+* 1: Set state != RUNNING
+* 2: Conditionally sleep if waiter->task != NULL;
+*
+* And the owner-side has the following:
+* A: Set waiter->task = NULL
+* B: Conditionally wake if the state != RUNNING
+*
+* As long as we ensure 1->2 order, and A->B order, we
+* will never miss a wakeup.
+*
+* Therefore, this barrier ensures that waiter->task = NULL
+* is visible before we test the pendowner->state.  The
+* corresponding barrier is in the sleep logic.
 */
-   if (!savestate)
-   wake_up_process(pendowner);
-   else {
-   /*
-* We can skip the actual (expensive) wakeup if the
-* waiter is already running, but we have to be careful
-* of race conditions because they may be about to sleep.
-*
-* The waiter-side protocol has the following pattern:
-* 1: Set state != RUNNING
-* 2: Conditionally sleep if waiter->task != NULL;
-*
-* And the owner-side has the following:
-* A: Set waiter->task = NULL
-* B: Conditionally wake if the state != RUNNING
-*
-* As long as we ensure 1->2 order, and A->B order, we
-* will never miss a 

[(RT RFC) PATCH v2 7/9] adaptive mutexes

2008-02-25 Thread Gregory Haskins
From: Peter W.Morreale [EMAIL PROTECTED]

This patch adds the adaptive spin lock busywait to rtmutexes.  It adds
a new tunable: rtmutex_timeout, which is the companion to the
rtlock_timeout tunable.

Signed-off-by: Peter W. Morreale [EMAIL PROTECTED]
---

 kernel/Kconfig.preempt|   37 ++
 kernel/rtmutex.c  |   76 +
 kernel/rtmutex_adaptive.h |   32 ++-
 kernel/sysctl.c   |   10 ++
 4 files changed, 119 insertions(+), 36 deletions(-)

diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
index ac1cbad..864bf14 100644
--- a/kernel/Kconfig.preempt
+++ b/kernel/Kconfig.preempt
@@ -214,6 +214,43 @@ config RTLOCK_DELAY
 tunable at runtime via a sysctl.  A setting of 0 (zero) disables
 the adaptive algorithm entirely.
 
+config ADAPTIVE_RTMUTEX
+bool Adaptive real-time mutexes
+default y
+depends on ADAPTIVE_RTLOCK
+help
+ This option adds the adaptive rtlock spin/sleep algorithm to
+ rtmutexes.  In rtlocks, a significant gain in throughput
+ can be seen by allowing rtlocks to spin for a distinct
+ amount of time prior to going to sleep for deadlock avoidence.
+ 
+ Typically, mutexes are used when a critical section may need to
+ sleep due to a blocking operation.  In the event the critical 
+section does not need to sleep, an additional gain in throughput 
+can be seen by avoiding the extra overhead of sleeping.
+ 
+ This option alters the rtmutex code to use an adaptive
+ spin/sleep algorithm.  It will spin unless it determines it must
+ sleep to avoid deadlock.  This offers a best of both worlds
+ solution since we achieve both high-throughput and low-latency.
+ 
+ If unsure, say Y
+ 
+config RTMUTEX_DELAY
+int Default delay (in loops) for adaptive mutexes
+range 0 1000
+depends on ADAPTIVE_RTMUTEX
+default 3000
+help
+ This allows you to specify the maximum delay a task will use
+to wait for a rt mutex before going to sleep.  Note that that
+although the delay is implemented as a preemptable loop, tasks
+of like priority cannot preempt each other and this setting can
+result in increased latencies.
+
+ The value is tunable at runtime via a sysctl.  A setting of 0
+(zero) disables the adaptive algorithm entirely.
+
 config SPINLOCK_BKL
bool Old-Style Big Kernel Lock
depends on (PREEMPT || SMP)  !PREEMPT_RT
diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c
index 4a16b13..ea593e0 100644
--- a/kernel/rtmutex.c
+++ b/kernel/rtmutex.c
@@ -29,6 +29,10 @@ int rtmutex_lateral_steal __read_mostly = 1;
 int rtlock_timeout __read_mostly = CONFIG_RTLOCK_DELAY;
 #endif
 
+#ifdef CONFIG_ADAPTIVE_RTMUTEX
+int rtmutex_timeout __read_mostly = CONFIG_RTMUTEX_DELAY;
+#endif
+
 /*
  * lock-owner state tracking:
  *
@@ -542,34 +546,33 @@ static void wakeup_next_waiter(struct rt_mutex *lock, int 
savestate)
 * Do the wakeup before the ownership change to give any spinning
 * waiter grantees a headstart over the other threads that will
 * trigger once owner changes.
+*
+* We can skip the actual (expensive) wakeup if the
+* waiter is already running, but we have to be careful
+* of race conditions because they may be about to sleep.
+*
+* The waiter-side protocol has the following pattern:
+* 1: Set state != RUNNING
+* 2: Conditionally sleep if waiter-task != NULL;
+*
+* And the owner-side has the following:
+* A: Set waiter-task = NULL
+* B: Conditionally wake if the state != RUNNING
+*
+* As long as we ensure 1-2 order, and A-B order, we
+* will never miss a wakeup.
+*
+* Therefore, this barrier ensures that waiter-task = NULL
+* is visible before we test the pendowner-state.  The
+* corresponding barrier is in the sleep logic.
 */
-   if (!savestate)
-   wake_up_process(pendowner);
-   else {
-   /*
-* We can skip the actual (expensive) wakeup if the
-* waiter is already running, but we have to be careful
-* of race conditions because they may be about to sleep.
-*
-* The waiter-side protocol has the following pattern:
-* 1: Set state != RUNNING
-* 2: Conditionally sleep if waiter-task != NULL;
-*
-* And the owner-side has the following:
-* A: Set waiter-task = NULL
-* B: Conditionally wake if the state != RUNNING
-*
-* As long as we ensure 1-2 order, and A-B order, we
-* will never miss a wakeup.
-*
-   

Re: [(RT RFC) PATCH v2 7/9] adaptive mutexes

2008-02-25 Thread Pavel Machek
Hi!

 From: Peter W.Morreale [EMAIL PROTECTED]
 
 This patch adds the adaptive spin lock busywait to rtmutexes.  It adds
 a new tunable: rtmutex_timeout, which is the companion to the
 rtlock_timeout tunable.
 
 Signed-off-by: Peter W. Morreale [EMAIL PROTECTED]

Not signed off by you?

 diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
 index ac1cbad..864bf14 100644
 --- a/kernel/Kconfig.preempt
 +++ b/kernel/Kconfig.preempt
 @@ -214,6 +214,43 @@ config RTLOCK_DELAY
tunable at runtime via a sysctl.  A setting of 0 (zero) disables
the adaptive algorithm entirely.
  
 +config ADAPTIVE_RTMUTEX
 +bool Adaptive real-time mutexes
 +default y
 +depends on ADAPTIVE_RTLOCK
 +help
 + This option adds the adaptive rtlock spin/sleep algorithm to
 + rtmutexes.  In rtlocks, a significant gain in throughput
 + can be seen by allowing rtlocks to spin for a distinct
 + amount of time prior to going to sleep for deadlock avoidence.
 + 
 + Typically, mutexes are used when a critical section may need to
 + sleep due to a blocking operation.  In the event the critical 
 +  section does not need to sleep, an additional gain in throughput 
 +  can be seen by avoiding the extra overhead of sleeping.

Watch the whitespace. ... and do we need yet another config options?

 +config RTMUTEX_DELAY
 +int Default delay (in loops) for adaptive mutexes
 +range 0 1000
 +depends on ADAPTIVE_RTMUTEX
 +default 3000
 +help
 + This allows you to specify the maximum delay a task will use
 +  to wait for a rt mutex before going to sleep.  Note that that
 +  although the delay is implemented as a preemptable loop, tasks
 +  of like priority cannot preempt each other and this setting can
 +  result in increased latencies.
 +  
 + The value is tunable at runtime via a sysctl.  A setting of 0
 +  (zero) disables the adaptive algorithm entirely.

Ouch.

 +#ifdef CONFIG_ADAPTIVE_RTMUTEX
 +
 +#define mutex_adaptive_wait adaptive_wait
 +#define mutex_prepare_adaptive_wait prepare_adaptive_wait
 +
 +extern int rtmutex_timeout;
 +
 +#define DECLARE_ADAPTIVE_MUTEX_WAITER(name) \
 + struct adaptive_waiter name = { .owner = NULL,   \
 + .timeout = rtmutex_timeout, }
 +
 +#else
 +
 +#define DECLARE_ADAPTIVE_MUTEX_WAITER(name)
 +
 +#define mutex_adaptive_wait(lock, intr, waiter, busy) 1
 +#define mutex_prepare_adaptive_wait(lock, busy) {}

More evil macros. Macro does not behave like a function, make it
inline function if you are replacing a function.
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
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/


Re: [(RT RFC) PATCH v2 7/9] adaptive mutexes

2008-02-25 Thread Gregory Haskins
 On Mon, Feb 25, 2008 at  5:09 PM, in message
[EMAIL PROTECTED], Pavel Machek [EMAIL PROTECTED] wrote: 
 Hi!
 
 From: Peter W.Morreale [EMAIL PROTECTED]
 
 This patch adds the adaptive spin lock busywait to rtmutexes.  It adds
 a new tunable: rtmutex_timeout, which is the companion to the
 rtlock_timeout tunable.
 
 Signed-off-by: Peter W. Morreale [EMAIL PROTECTED]
 
 Not signed off by you?

I wasn't sure if this was appropriate for me to do.  This is the first time I 
was acting as upstream to someone.  If that is what I am expected to do, 
consider this an ack for your remaining comments related to this.

 
 diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
 index ac1cbad..864bf14 100644
 --- a/kernel/Kconfig.preempt
 +++ b/kernel/Kconfig.preempt
 @@ -214,6 +214,43 @@ config RTLOCK_DELAY
   tunable at runtime via a sysctl.  A setting of 0 (zero) disables
   the adaptive algorithm entirely.
  
 +config ADAPTIVE_RTMUTEX
 +bool Adaptive real-time mutexes
 +default y
 +depends on ADAPTIVE_RTLOCK
 +help
 + This option adds the adaptive rtlock spin/sleep algorithm to
 + rtmutexes.  In rtlocks, a significant gain in throughput
 + can be seen by allowing rtlocks to spin for a distinct
 + amount of time prior to going to sleep for deadlock avoidence.
 + 
 + Typically, mutexes are used when a critical section may need to
 + sleep due to a blocking operation.  In the event the critical 
 + section does not need to sleep, an additional gain in throughput 
 + can be seen by avoiding the extra overhead of sleeping.
 
 Watch the whitespace. ... and do we need yet another config options?
 
 +config RTMUTEX_DELAY
 +int Default delay (in loops) for adaptive mutexes
 +range 0 1000
 +depends on ADAPTIVE_RTMUTEX
 +default 3000
 +help
 + This allows you to specify the maximum delay a task will use
 + to wait for a rt mutex before going to sleep.  Note that that
 + although the delay is implemented as a preemptable loop, tasks
 + of like priority cannot preempt each other and this setting can
 + result in increased latencies.
 + 
 + The value is tunable at runtime via a sysctl.  A setting of 0
 + (zero) disables the adaptive algorithm entirely.
 
 Ouch.

?  Is this reference to whitespace damage, or does the content need addressing?

 
 +#ifdef CONFIG_ADAPTIVE_RTMUTEX
 +
 +#define mutex_adaptive_wait adaptive_wait
 +#define mutex_prepare_adaptive_wait prepare_adaptive_wait
 +
 +extern int rtmutex_timeout;
 +
 +#define DECLARE_ADAPTIVE_MUTEX_WAITER(name) \
 + struct adaptive_waiter name = { .owner = NULL,   \
 + .timeout = rtmutex_timeout, }
 +
 +#else
 +
 +#define DECLARE_ADAPTIVE_MUTEX_WAITER(name)
 +
 +#define mutex_adaptive_wait(lock, intr, waiter, busy) 1
 +#define mutex_prepare_adaptive_wait(lock, busy) {}
 
 More evil macros. Macro does not behave like a function, make it
 inline function if you are replacing a function.

Ok


   Pavel



--
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/