]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
valgrind: Fix nlcontrolc.vgtest
authorYi Fan Yu <yifan.yu@windriver.com>
Mon, 8 Mar 2021 21:56:08 +0000 (16:56 -0500)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 10 Mar 2021 10:29:44 +0000 (10:29 +0000)
Backport a recent upstream patch
that redesigned the test.

It's now enabled for both x86-64 and arm.

[YOCTO #14223]

Signed-off-by: Yi Fan Yu <yifan.yu@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/recipes-devtools/valgrind/valgrind/0001-Fix-nlcontrolc.vgtest-hanging-on-newer-glibc-and-or-.patch [new file with mode: 0644]
meta/recipes-devtools/valgrind/valgrind/0001-gdbserver_tests-Disable-nlcontrolc.vgtest-for-x86-64.patch [deleted file]
meta/recipes-devtools/valgrind/valgrind_3.16.1.bb

diff --git a/meta/recipes-devtools/valgrind/valgrind/0001-Fix-nlcontrolc.vgtest-hanging-on-newer-glibc-and-or-.patch b/meta/recipes-devtools/valgrind/valgrind/0001-Fix-nlcontrolc.vgtest-hanging-on-newer-glibc-and-or-.patch
new file mode 100644 (file)
index 0000000..98cbcd1
--- /dev/null
@@ -0,0 +1,200 @@
+From 83c24e31df6932a6d4fced179050c6d8d8c6f3b5 Mon Sep 17 00:00:00 2001
+From: Philippe Waroquiers <philippe.waroquiers@skynet.be>
+Date: Sun, 7 Mar 2021 22:29:27 +0100
+Subject: [PATCH] Fix nlcontrolc.vgtest hanging on newer glibc and/or arm64
+
+This test verifies that GDB can interrupt a process with all threads
+blocked in a long select syscall.
+The test used to terminate by having GDB modifying the select argument.
+However, modifying the select argument works only for specific arch
+and/or specific versions of glibc.
+The test then blocks on other architectures/glibc versions.
+
+The previous version of the test was:
+  * first launching sleepers so as to have all threads blocked in long select
+  * interrupting these threads
+  * changing the select time arg so that the threads burn cpu
+  * and then change variables to have the program exit.
+
+The new version does:
+  * first launches sleepers so that all threads are burning cpu.
+  * interrupting these threads
+  * change the local variables of sleepers so that the threads will
+    block in a long select syscall
+  * interrupt these threads
+  * kill the program.
+
+With this new version, we still check the behaviour of gdb+vgdbserver
+for both burning and sleep threads, but without having the termination
+depending on modifying select syscall argument.
+
+Tested on debian amd64 and on ubuntu arm64 (to check the test does not hang
+on an arm64 platform).
+
+Upstream-Status: Backport
+
+From commit on master:
+c79180a3afcf65902e578646c3b716cc749db406
+
+Signed-off-by: Yi Fan Yu <yifan.yu@windriver.com>
+---
+ gdbserver_tests/nlcontrolc.stderr.exp  |  4 +-
+ gdbserver_tests/nlcontrolc.stdinB.gdb  | 57 +++++++++++++++-----------
+ gdbserver_tests/nlcontrolc.stdoutB.exp | 25 ++++++-----
+ gdbserver_tests/nlcontrolc.vgtest      | 12 +++---
+ 4 files changed, 56 insertions(+), 42 deletions(-)
+
+diff --git a/gdbserver_tests/nlcontrolc.stderr.exp b/gdbserver_tests/nlcontrolc.stderr.exp
+index ac75bb3da..b63a9a988 100644
+--- a/gdbserver_tests/nlcontrolc.stderr.exp
++++ b/gdbserver_tests/nlcontrolc.stderr.exp
+@@ -3,9 +3,9 @@ Nulgrind, the minimal Valgrind tool
+ (action at startup) vgdb me ... 
+-loops/sleep_ms/burn/threads_spec/affinity:  1000000000 1000000000 1000000000 BSBSBSBS 1
++loops/sleep_ms/burn/threads_spec/affinity:  1000000000 0 100000 BSBSBSBS 1
+ Brussels ready to sleep and/or burn
+ London ready to sleep and/or burn
+ Petaouchnok ready to sleep and/or burn
+ main ready to sleep and/or burn
+-
++Gdb request to kill this process
+diff --git a/gdbserver_tests/nlcontrolc.stdinB.gdb b/gdbserver_tests/nlcontrolc.stdinB.gdb
+index 667ece18d..ea4fcd530 100644
+--- a/gdbserver_tests/nlcontrolc.stdinB.gdb
++++ b/gdbserver_tests/nlcontrolc.stdinB.gdb
+@@ -9,32 +9,43 @@ shell ./simulate_control_c --vgdb-prefix=./vgdb-prefix-nlcontrolc 1 grep main nl
+ #
+ continue
+ #
+-# Here, all tasks should be blocked in a loooonnnng select, all in WaitSys
+-info threads
+-# We will unblock them by changing their timeout argument
+-# To avoid going into the frame where the timeval arg is,
+-# it has been defined as global variables, as the nr
+-# of calls on the stack differs between 32bits and 64bits,
+-# and/or between OS.
+-# ensure select finishes in a few milliseconds max:
+-p t[0].tv_sec = 0
+-p t[1].tv_sec = 0
+-p t[2].tv_sec = 0
+-p t[3].tv_sec = 0
+-#
+-# We will change the burning parameters in a few  seconds
++# Threads are burning cpu now
++# We would like to fully test info threads here, but which thread are Runnable
++# or Yielding is unpredictable. With a recent enough gdb, check the nr of
++# threads by state using pipe commands and grep/wc.
++init-if-undefined $_gdb_major = 0
++init-if-undefined $_gdb_minor = 0
++if $_gdb_major >= 9
++  | info threads | grep VgTs_Runnable | wc -l
++  | info threads | grep VgTs_Yielding | wc -l
++else
++  echo 1\n
++  echo 3\n
++end
++# We change the variables so that all the threads are blocked in a syscall
++p burn = 0
++p sleepms = 1000000
++#
++#
+ shell ./simulate_control_c --vgdb-prefix=./vgdb-prefix-nlcontrolc 1 grep changed nlcontrolc.stdoutB.out
+ #
+-echo changed burning parameters\n
++echo changed burning parameters to sleeping parameters\n
+ continue
++# Here, all tasks should be blocked in a loooonnnng select, all in WaitSys
++info threads
++# We reset the sleepms to 0. The threads should still be blocked in the syscall
++p sleepms = 0
++shell ./simulate_control_c --vgdb-prefix=./vgdb-prefix-nlcontrolc 1 grep reset nlcontrolc.stdoutB.out
+ #
+-# Threads are burning cpu now
+-# We would like to test info threads here, but which thread are Runnable or Yielding
+-# is unpredictable.
+-# info threads
+-p burn = 0
+-p loops = 0
+-p report_finished = 0
++echo reset to sleeping parameters\n
+ continue
+-# and the process should stop very quickly now
++# threads should still be blocked in a loooonnnng select, all in WaitSys
++info threads
++if $_gdb_major >= 9
++  | info threads | grep VgTs_WaitSys | wc -l
++else
++  echo 4\n
++end
++# Make the process die.
++kill
+ quit
+diff --git a/gdbserver_tests/nlcontrolc.stdoutB.exp b/gdbserver_tests/nlcontrolc.stdoutB.exp
+index e8a5ff8ba..2e8dc8498 100644
+--- a/gdbserver_tests/nlcontrolc.stdoutB.exp
++++ b/gdbserver_tests/nlcontrolc.stdoutB.exp
+@@ -1,18 +1,21 @@
+ Continuing.
+ Program received signal SIGTRAP, Trace/breakpoint trap.
++do_burn () at sleepers.c:41
++41       for (i = 0; i < burn; i++) loopnr++;
++ > > > > > >1
++3
++$1 = 0
++$2 = 1000000
++changed burning parameters to sleeping parameters
++Continuing.
++Program received signal SIGTRAP, Trace/breakpoint trap.
+ 0x........ in syscall ...
+ * 1 Thread .... (tid 1 VgTs_WaitSys)  0x........ in syscall ...
+-$1 = 0
+-$2 = 0
+ $3 = 0
+-$4 = 0
+-changed burning parameters
++reset to sleeping parameters
+ Continuing.
+ Program received signal SIGTRAP, Trace/breakpoint trap.
+-do_burn () at sleepers.c:41
+-41       for (i = 0; i < burn; i++) loopnr++;
+-$5 = 0
+-$6 = 0
+-$7 = 0
+-Continuing.
+-Program exited normally.
++0x........ in syscall ...
++* 1 Thread .... (tid 1 VgTs_WaitSys)  0x........ in syscall ...
++ > > > >4
++Kill the program being debugged? (y or n) [answered Y; input not from terminal]
+diff --git a/gdbserver_tests/nlcontrolc.vgtest b/gdbserver_tests/nlcontrolc.vgtest
+index bb5308403..09edfcaba 100644
+--- a/gdbserver_tests/nlcontrolc.vgtest
++++ b/gdbserver_tests/nlcontrolc.vgtest
+@@ -4,16 +4,16 @@
+ #          and modify some variables
+ #   the user can control-c an process with all threads in Running/Yielding
+ #          and modify some variables
+-# sleepers is started with argument so that it will compute during ages.
+-# The variable modifications means it will exit in a reasonable time.
+-# This test is disabled on Solaris because modifying select/poll/ppoll timeout
+-# has no effect if a thread is already blocked in that syscall.
++# sleepers is started so that it burns CPU.
++# We then interrupt the process.
++# We modify variables so that instead of burning cpu, sleepers blocks
++# all threads in a select syscall.
+ prog: sleepers
+-args: 1000000000 1000000000 1000000000 BSBSBSBS 1
++args: 1000000000 0 100000 BSBSBSBS 1
+ vgopts: --tool=none --vgdb=yes --vgdb-error=0 --vgdb-prefix=./vgdb-prefix-nlcontrolc
+ stderr_filter: filter_stderr
+ # Bug 338633 nlcontrol hangs on arm64 currently.
+-prereq: test -e gdb -a -f vgdb.invoker && ! ../tests/arch_test arm64 && ! ../tests/os_test solaris
++prereq: test -e gdb -a -f vgdb.invoker && ! ../tests/os_test solaris
+ progB: gdb
+ argsB: --quiet -l 60 --nx ./sleepers
+ stdinB: nlcontrolc.stdinB.gdb
+-- 
+2.29.2
+
diff --git a/meta/recipes-devtools/valgrind/valgrind/0001-gdbserver_tests-Disable-nlcontrolc.vgtest-for-x86-64.patch b/meta/recipes-devtools/valgrind/valgrind/0001-gdbserver_tests-Disable-nlcontrolc.vgtest-for-x86-64.patch
deleted file mode 100644 (file)
index 0bd8273..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-From d8c19e0bb9ca2fd48f223e1fdeffcafeb0aa1745 Mon Sep 17 00:00:00 2001
-From: Yi Fan Yu <yifan.yu@windriver.com>
-Date: Wed, 17 Feb 2021 14:53:44 -0500
-Subject: [PATCH] gdbserver_tests: Disable nlcontrolc.vgtest for x86-64
-
-Test hangs after glibc 2.33 uprev
-
-Using gdb to modify the timeout argument no longer
-affects how long `select` wait.
-
-https://bugs.kde.org/show_bug.cgi?id=432870
-Upstream-Status: Pending
-Waiting for upstream to take action.
-
-Signed-off-by: Yi Fan Yu <yifan.yu@windriver.com>
----
- gdbserver_tests/nlcontrolc.vgtest | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/gdbserver_tests/nlcontrolc.vgtest b/gdbserver_tests/nlcontrolc.vgtest
-index bb5308403..96d2b52bb 100644
---- a/gdbserver_tests/nlcontrolc.vgtest
-+++ b/gdbserver_tests/nlcontrolc.vgtest
-@@ -13,7 +13,8 @@ args: 1000000000 1000000000 1000000000 BSBSBSBS 1
- vgopts: --tool=none --vgdb=yes --vgdb-error=0 --vgdb-prefix=./vgdb-prefix-nlcontrolc
- stderr_filter: filter_stderr
- # Bug 338633 nlcontrol hangs on arm64 currently.
--prereq: test -e gdb -a -f vgdb.invoker && ! ../tests/arch_test arm64 && ! ../tests/os_test solaris
-+# Bug 432870 nlcontrolc hangs on x86-64 starting with glibc 2.33
-+prereq: test -e gdb -a -f vgdb.invoker && ! ../tests/arch_test arm64 && ! ../tests/os_test solaris && ! ../tests/arch_test amd64
- progB: gdb
- argsB: --quiet -l 60 --nx ./sleepers
- stdinB: nlcontrolc.stdinB.gdb
--- 
-2.29.2
-
index d0aefdf39af9297a2ff8b5063f6dbd98232dffa6..9dbd9f74c412f2b430e51ae45e89d567b2a93630 100644 (file)
@@ -45,7 +45,7 @@ SRC_URI = "https://sourceware.org/pub/valgrind/valgrind-${PV}.tar.bz2 \
            file://0001-drd-Port-to-Fedora-33.patch \
            file://0001-drd-musl-fix.patch \
            file://0001-helgrind-Intercept-libc-functions.patch \
-           file://0001-gdbserver_tests-Disable-nlcontrolc.vgtest-for-x86-64.patch \
+           file://0001-Fix-nlcontrolc.vgtest-hanging-on-newer-glibc-and-or-.patch \
            "
 SRC_URI[md5sum] = "d1b153f1ab17cf1f311705e7a83ef589"
 SRC_URI[sha256sum] = "c91f3a2f7b02db0f3bc99479861656154d241d2fdb265614ba918cc6720a33ca"