[ltt-dev] [PATCH v2 2/3] model optimization of the waker (selective wake)

Mathieu Desnoyers compudj at krystal.dyndns.org
Wed Aug 17 05:47:30 EDT 2011


* Paolo Bonzini (pbonzini at redhat.com) wrote:
> 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.

Merged, thanks!

Mathieu

> ---
>  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
> 
> 
> 
> _______________________________________________
> ltt-dev mailing list
> ltt-dev at lists.casi.polymtl.ca
> http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
> 

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com




More information about the lttng-dev mailing list