From 64f98a731adaf86c9185c90436db1a6eb8e16b42 Mon Sep 17 00:00:00 2001 From: Yi Fan Yu Date: Mon, 8 Mar 2021 16:56:08 -0500 Subject: valgrind: Fix nlcontrolc.vgtest 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 Signed-off-by: Richard Purdie --- ...olc.vgtest-hanging-on-newer-glibc-and-or-.patch | 200 +++++++++++++++++++++ ...ests-Disable-nlcontrolc.vgtest-for-x86-64.patch | 36 ---- meta/recipes-devtools/valgrind/valgrind_3.16.1.bb | 2 +- 3 files changed, 201 insertions(+), 37 deletions(-) create mode 100644 meta/recipes-devtools/valgrind/valgrind/0001-Fix-nlcontrolc.vgtest-hanging-on-newer-glibc-and-or-.patch delete mode 100644 meta/recipes-devtools/valgrind/valgrind/0001-gdbserver_tests-Disable-nlcontrolc.vgtest-for-x86-64.patch 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 index 0000000000..98cbcd132c --- /dev/null +++ b/meta/recipes-devtools/valgrind/valgrind/0001-Fix-nlcontrolc.vgtest-hanging-on-newer-glibc-and-or-.patch @@ -0,0 +1,200 @@ +From 83c24e31df6932a6d4fced179050c6d8d8c6f3b5 Mon Sep 17 00:00:00 2001 +From: Philippe Waroquiers +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 +--- + 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 index 0bd8273cd8..0000000000 --- a/meta/recipes-devtools/valgrind/valgrind/0001-gdbserver_tests-Disable-nlcontrolc.vgtest-for-x86-64.patch +++ /dev/null @@ -1,36 +0,0 @@ -From d8c19e0bb9ca2fd48f223e1fdeffcafeb0aa1745 Mon Sep 17 00:00:00 2001 -From: Yi Fan Yu -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 ---- - 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 - diff --git a/meta/recipes-devtools/valgrind/valgrind_3.16.1.bb b/meta/recipes-devtools/valgrind/valgrind_3.16.1.bb index d0aefdf39a..9dbd9f74c4 100644 --- a/meta/recipes-devtools/valgrind/valgrind_3.16.1.bb +++ b/meta/recipes-devtools/valgrind/valgrind_3.16.1.bb @@ -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" -- cgit 1.2.3-korg