[DTrace-devel] [PATCH 17/61] test: Fix race condition in many-fire tests

Kris Van Hees kris.van.hees at oracle.com
Thu Jul 28 14:20:57 UTC 2022


Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

... queued for dev

On Fri, Jul 08, 2022 at 10:45:01AM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> Some tests that expect probes to fire many times had been using tick-*
> for this purpose.  Unfortunately, tick-* quality can be poor, depending
> on how the kernel is configured.  Therefore, commit 80a539ae8653
> ("test: Account for unreliable tick firing") addressed this problem
> by replacing tick-* probes with syscall::ioctl:entry probes and with
> bogus-ioctl as a trigger.
> 
> The problem with this solution is that the actions also involved some
> global variables.  The ioctl:entry probes could fire on multiple CPUs
> concurrently, overwriting each other.  Test runs were erratic.
> 
> Add "pid==$target" to the probe predicates.  This includes both the
> the tests in the aforementioned patch but also two rand() tests.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
> ---
>  test/unittest/aggs/tst.llquantincr.d      |  3 ++-
>  test/unittest/aggs/tst.llquantize.d       |  3 ++-
>  test/unittest/aggs/tst.llquantneg.d       |  6 +++---
>  test/unittest/aggs/tst.llquantstep.d      |  3 ++-
>  test/unittest/funcs/tst.rand_inter.sh     |  3 ++-
>  test/unittest/funcs/tst.rand_intra.sh     |  3 ++-
>  test/unittest/speculation/tst.SingleCPU.d | 12 ++++++------
>  7 files changed, 19 insertions(+), 14 deletions(-)
> 
> diff --git a/test/unittest/aggs/tst.llquantincr.d b/test/unittest/aggs/tst.llquantincr.d
> index 27755050..5b02d1d3 100644
> --- a/test/unittest/aggs/tst.llquantincr.d
> +++ b/test/unittest/aggs/tst.llquantincr.d
> @@ -15,12 +15,13 @@
>  #pragma D option quiet
>  
>  syscall::ioctl:entry
> +/pid == $target/
>  {
>  	@ = llquantize(i++, 10, 0, 6, 20, 2);
>  }
>  
>  syscall::ioctl:entry
> -/i == 1500/
> +/pid == $target && i == 1500/
>  {
>  	exit(0);
>  }
> diff --git a/test/unittest/aggs/tst.llquantize.d b/test/unittest/aggs/tst.llquantize.d
> index 3161ac97..352f937d 100644
> --- a/test/unittest/aggs/tst.llquantize.d
> +++ b/test/unittest/aggs/tst.llquantize.d
> @@ -15,12 +15,13 @@
>  #pragma D option quiet
>  
>  syscall::ioctl:entry
> +/pid == $target/
>  {
>  	@ = llquantize(i++, 10, 0, 6, 20);
>  }
>  
>  syscall::ioctl:entry
> -/i == 1500/
> +/pid == $target && i == 1500/
>  {
>  	exit(0);
>  }
> diff --git a/test/unittest/aggs/tst.llquantneg.d b/test/unittest/aggs/tst.llquantneg.d
> index 61d6686c..5070ad63 100644
> --- a/test/unittest/aggs/tst.llquantneg.d
> +++ b/test/unittest/aggs/tst.llquantneg.d
> @@ -15,19 +15,19 @@
>  #pragma D option quiet
>  
>  syscall::ioctl:entry
> -/i % 2 == 0/
> +/pid == $target && i % 2 == 0/
>  {
>  	@ = llquantize(i++, 10, 0, 6, 20);
>  }
>  
>  syscall::ioctl:entry
> -/i % 2 != 0/
> +/pid == $target && i % 2 != 0/
>  {
>  	@ = llquantize(i++, 10, 0, 6, 20, -1);
>  }
>  
>  syscall::ioctl:entry
> -/i == 1500/
> +/pid == $target && i == 1500/
>  {
>  	exit(0);
>  }
> diff --git a/test/unittest/aggs/tst.llquantstep.d b/test/unittest/aggs/tst.llquantstep.d
> index 1420ebe4..0b8594d3 100644
> --- a/test/unittest/aggs/tst.llquantstep.d
> +++ b/test/unittest/aggs/tst.llquantstep.d
> @@ -16,12 +16,13 @@
>  #pragma D option quiet
>  
>  syscall::ioctl:entry
> +/pid == $target/
>  {
>  	@ = llquantize(i++, 3, 3, 5, 27);
>  }
>  
>  syscall::ioctl:entry
> -/i == 1500/
> +/pid == $target && i == 1500/
>  {
>  	exit(0);
>  }
> diff --git a/test/unittest/funcs/tst.rand_inter.sh b/test/unittest/funcs/tst.rand_inter.sh
> index 973d4a8e..4a66e488 100755
> --- a/test/unittest/funcs/tst.rand_inter.sh
> +++ b/test/unittest/funcs/tst.rand_inter.sh
> @@ -21,6 +21,7 @@ BEGIN
>  	x = rand();
>  }
>  syscall::ioctl:entry
> +/pid == $target/
>  {
>  	y = rand();
>  
> @@ -50,7 +51,7 @@ syscall::ioctl:entry
>  	n++;
>  }
>  syscall::ioctl:entry
> -/n >= '$niter'/
> +/pid == $target && n >= '$niter'/
>  {
>  	printf("number of iterations: %d\n", n);
>  	exit(0);
> diff --git a/test/unittest/funcs/tst.rand_intra.sh b/test/unittest/funcs/tst.rand_intra.sh
> index 70a318f9..0d263fd5 100755
> --- a/test/unittest/funcs/tst.rand_intra.sh
> +++ b/test/unittest/funcs/tst.rand_intra.sh
> @@ -16,6 +16,7 @@ niter=25000
>  $dtrace $dt_flags -q -o $tmpfile -c test/triggers/bogus-ioctl -n '
>  BEGIN { nuperr = n = 0 }
>  syscall::ioctl:entry
> +/pid == $target/
>  {
>  	x = rand();
>  
> @@ -32,7 +33,7 @@ syscall::ioctl:entry
>  	n++;
>  }
>  syscall::ioctl:entry
> -/n >= '$niter'/
> +/pid == $target && n >= '$niter'/
>  {
>  	printf("# of upper-bit errors: %d out of %d\n", nuperr, n);
>  	exit(0);
> diff --git a/test/unittest/speculation/tst.SingleCPU.d b/test/unittest/speculation/tst.SingleCPU.d
> index 0a96b47d..81a5afa1 100644
> --- a/test/unittest/speculation/tst.SingleCPU.d
> +++ b/test/unittest/speculation/tst.SingleCPU.d
> @@ -28,39 +28,39 @@ BEGIN
>   */
>  
>  syscall::ioctl:entry
> -/ (n & 3) == 0 /
> +/ pid == $target && (n & 3) == 0 /
>  {
>  	i = speculation();
>  }
>  
>  syscall::ioctl:entry
> -/ (n & 3) == 1 /
> +/ pid == $target && (n & 3) == 1 /
>  {
>  	speculate(i);
>  	printf("%4d %4d", n, i);
>  }
>  
>  syscall::ioctl:entry
> -/ (n & 3) == 2 /
> +/ pid == $target && (n & 3) == 2 /
>  {
>  	speculate(i);
>  	printf("%4d hello world\n", n);
>  }
>  
>  syscall::ioctl:entry
> -/ (n & 3) == 3 && (n & 63) == 3 /
> +/ pid == $target && (n & 3) == 3 && (n & 63) == 3 /
>  {
>  	commit(i);
>  }
>  
>  syscall::ioctl:entry
> -/ (n & 3) == 3 && (n & 63) != 3 /
> +/ pid == $target && (n & 3) == 3 && (n & 63) != 3 /
>  {
>  	discard(i);
>  }
>  
>  syscall::ioctl:entry
> -/ n++ >= 1000 /
> +/ pid == $target && n++ >= 1000 /
>  {
>  	exit(0);
>  }
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list