[ltt-dev] [PATCH v2 2/3] model optimization of the waker (selective wake)
Paolo Bonzini
pbonzini at redhat.com
Wed Aug 17 04:28:13 EDT 2011
This patch adds to the model an optimization, whereby threads are
told whether they are still being waited on, and skip the futex wakeup
if not.
---
futex-wakeup/futex.spin | 40 +++++++++++++++++++++++++++++++---------
1 files changed, 31 insertions(+), 9 deletions(-)
diff --git a/futex-wakeup/futex.spin b/futex-wakeup/futex.spin
index ab41a0a..44acd7e 100644
--- a/futex-wakeup/futex.spin
+++ b/futex-wakeup/futex.spin
@@ -9,9 +9,12 @@
* Waker
* while (1) {
* this.queue = gp;
- * if (gp_futex == -1) {
- * gp_futex = 0;
- * futex_wake = 1;
+ * if (this.waiting == 1) {
+ * this.waiting = 0;
+ * if (gp_futex == -1) {
+ * gp_futex = 0;
+ * futex_wake = 1;
+ * }
* }
* }
*
@@ -19,6 +22,7 @@
* in_registry = 1;
* while (1) {
* gp_futex = -1;
+ * waiting |= (queue != gp);
* in_registry &= (queue != gp);
* if (all in_registry == 0) {
* progress:
@@ -56,6 +60,7 @@
#define get_pid() (_pid)
int queue[2] = 0;
+int waiting[2] = 0;
int futex_wake = 0;
int gp_futex = 0;
int gp = 1;
@@ -69,14 +74,18 @@ active [2] proctype waker()
:: 1 ->
queue[get_pid()] = gp;
- if
- :: (gp_futex == -1) ->
- gp_futex = 0;
+ if
+ :: (waiting[get_pid()] == 1) ->
+ waiting[get_pid()] = 0;
+ if
+ :: (gp_futex == -1) ->
+ gp_futex = 0;
#ifndef INJ_QUEUE_NO_WAKE
- futex_wake = 1;
+ futex_wake = 1;
#endif
- :: else ->
- skip;
+ :: else ->
+ skip;
+ fi;
fi;
od;
}
@@ -92,6 +101,18 @@ restart:
#ifndef INJ_LATE_DEC
gp_futex = -1;
#endif
+ if
+ :: (in_registry[0] == 1 && queue[0] != gp) ->
+ waiting[0] = 1;
+ :: else ->
+ skip;
+ fi;
+ if
+ :: (in_registry[1] == 1 && queue[1] != gp) ->
+ waiting[1] = 1;
+ :: else ->
+ skip;
+ fi;
if
:: (in_registry[0] == 1 && queue[0] == gp) ->
@@ -105,6 +126,7 @@ restart:
:: else ->
skip;
fi;
+
if
:: (in_registry[0] == 0 && in_registry[1] == 0) ->
progress:
--
1.7.6
More information about the lttng-dev
mailing list