From 81c4edc39e550efd639f7730dd94029e04cf7b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Thu, 27 May 2021 17:03:14 +0100 Subject: [PATCH 1/8] tests/tcg: add a multiarch signals test to stress test signal delivery MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds a simple signal test that combines the POSIX timer_create with signal delivery across multiple threads. The aim is to provide a bit more of a stress test to flush out signal handling issues for easily than the occasional random crash we sometimes see in linux-test or threadcount. Signed-off-by: Alex Bennée Reviewed-by: Richard Henderson Message-Id: <20210527160319.19834-2-alex.bennee@linaro.org> --- tests/tcg/multiarch/Makefile.target | 2 + tests/tcg/multiarch/signals.c | 149 ++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 tests/tcg/multiarch/signals.c diff --git a/tests/tcg/multiarch/Makefile.target b/tests/tcg/multiarch/Makefile.target index a3a751723d..3f283eabe6 100644 --- a/tests/tcg/multiarch/Makefile.target +++ b/tests/tcg/multiarch/Makefile.target @@ -30,6 +30,8 @@ testthread: LDFLAGS+=-lpthread threadcount: LDFLAGS+=-lpthread +signals: LDFLAGS+=-lrt -lpthread + # We define the runner for test-mmap after the individual # architectures have defined their supported pages sizes. If no # additional page sizes are defined we only run the default test. diff --git a/tests/tcg/multiarch/signals.c b/tests/tcg/multiarch/signals.c new file mode 100644 index 0000000000..998c8fdefd --- /dev/null +++ b/tests/tcg/multiarch/signals.c @@ -0,0 +1,149 @@ +/* + * linux-user signal handling tests. + * + * Copyright (c) 2021 Linaro Ltd + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void error1(const char *filename, int line, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d: ", filename, line); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(1); +} + +static int __chk_error(const char *filename, int line, int ret) +{ + if (ret < 0) { + error1(filename, line, "%m (ret=%d, errno=%d/%s)", + ret, errno, strerror(errno)); + } + return ret; +} + +#define error(fmt, ...) error1(__FILE__, __LINE__, fmt, ## __VA_ARGS__) + +#define chk_error(ret) __chk_error(__FILE__, __LINE__, (ret)) + +/* + * Thread handling + */ +typedef struct ThreadJob ThreadJob; + +struct ThreadJob { + int number; + int sleep; + int count; +}; + +static pthread_t *threads; +static int max_threads = 10; +__thread int signal_count; +int total_signal_count; + +static void *background_thread_func(void *arg) +{ + ThreadJob *job = (ThreadJob *) arg; + + printf("thread%d: started\n", job->number); + while (total_signal_count < job->count) { + usleep(job->sleep); + } + printf("thread%d: saw %d alarms from %d\n", job->number, + signal_count, total_signal_count); + return NULL; +} + +static void spawn_threads(void) +{ + int i; + threads = calloc(sizeof(pthread_t), max_threads); + + for (i = 0; i < max_threads; i++) { + ThreadJob *job = calloc(sizeof(ThreadJob), 1); + job->number = i; + job->sleep = i * 1000; + job->count = i * 100; + pthread_create(threads + i, NULL, background_thread_func, job); + } +} + +static void close_threads(void) +{ + int i; + for (i = 0; i < max_threads; i++) { + pthread_join(threads[i], NULL); + } + free(threads); + threads = NULL; +} + +static void sig_alarm(int sig, siginfo_t *info, void *puc) +{ + if (sig != SIGRTMIN) { + error("unexpected signal"); + } + signal_count++; + __atomic_fetch_add(&total_signal_count, 1, __ATOMIC_SEQ_CST); +} + +static void test_signals(void) +{ + struct sigaction act; + struct itimerspec it; + timer_t tid; + struct sigevent sev; + + /* Set up SIG handler */ + act.sa_sigaction = sig_alarm; + sigemptyset(&act.sa_mask); + act.sa_flags = SA_SIGINFO; + chk_error(sigaction(SIGRTMIN, &act, NULL)); + + /* Create POSIX timer */ + sev.sigev_notify = SIGEV_SIGNAL; + sev.sigev_signo = SIGRTMIN; + sev.sigev_value.sival_ptr = &tid; + chk_error(timer_create(CLOCK_REALTIME, &sev, &tid)); + + it.it_interval.tv_sec = 0; + it.it_interval.tv_nsec = 1000000; + it.it_value.tv_sec = 0; + it.it_value.tv_nsec = 1000000; + chk_error(timer_settime(tid, 0, &it, NULL)); + + spawn_threads(); + + do { + usleep(1000); + } while (total_signal_count < 2000); + + printf("shutting down after: %d signals\n", total_signal_count); + + close_threads(); + + chk_error(timer_delete(tid)); +} + +int main(int argc, char **argv) +{ + test_signals(); + return 0; +} From 63de93530fe7d56dc0ba8b95f1dc8ba43ec237f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Thu, 27 May 2021 17:03:15 +0100 Subject: [PATCH 2/8] meson.build: fix cosmetics of compiler display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If you specify something like --cc="ccache gcc" on your configure line the summary output misses the rest of the cmd_array. Do some string joining to make it complete. Signed-off-by: Alex Bennée Tested-by: Thomas Huth Reviewed-by: Philippe Mathieu-Daudé Reviewed-by: Richard Henderson Message-Id: <20210527160319.19834-3-alex.bennee@linaro.org> --- meson.build | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index 626cf932c1..d2a9ce91f5 100644 --- a/meson.build +++ b/meson.build @@ -2537,15 +2537,15 @@ summary(summary_info, bool_yn: true, section: 'Configurable features') summary_info = {} summary_info += {'host CPU': cpu} summary_info += {'host endianness': build_machine.endian()} -summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]} -summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]} +summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())} +summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())} if link_language == 'cpp' - summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]} + summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())} else summary_info += {'C++ compiler': false} endif if targetos == 'darwin' - summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]} + summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())} endif if targetos == 'windows' if 'WIN_SDK' in config_host From 31fa83bd2b3293227c50a646ee74ded6b70b87f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Thu, 27 May 2021 17:03:16 +0100 Subject: [PATCH 3/8] tests/tcg/configure.sh: tweak quoting of target_compiler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If you configure the host compiler with a multi-command stanza like: --cc="ccache gcc" then the configure.sh machinery falls over with confusion. Work around this by ensuring we correctly quote so where we need a complete evaluation we get it. Of course the has() check needs single variable so we need to unquote that. This does mean it essentially checks that just the ccache command exits but if we got past that step we still check the compiler actually does something. Signed-off-by: Alex Bennée Reviewed-by: Thomas Huth Cc: Thomas Huth Message-Id: <20210527160319.19834-4-alex.bennee@linaro.org> --- tests/tcg/configure.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/tcg/configure.sh b/tests/tcg/configure.sh index ed6492ce59..aa7c24328a 100755 --- a/tests/tcg/configure.sh +++ b/tests/tcg/configure.sh @@ -222,10 +222,10 @@ for target in $target_list; do got_cross_cc=no - if eval test "x\${cross_cc_$arch}" != xyes; then - eval "target_compiler=\${cross_cc_$arch}" + if eval test "x\"\${cross_cc_$arch}\"" != xyes; then + eval "target_compiler=\"\${cross_cc_$arch}\"" - if has "$target_compiler"; then + if has $target_compiler; then if test "$supress_clang" = yes && $target_compiler --version | grep -qi "clang"; then got_cross_cc=no From e2ff831462d8783d5ba822db971c0d91380cc7c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Thu, 27 May 2021 17:03:19 +0100 Subject: [PATCH 4/8] tests/acceptance: tag various arm tests as TCG only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We should never be trying to run most of these models under a KVM environment. Signed-off-by: Alex Bennée Tested-by: Willian Rampazzo Message-Id: <20210527160319.19834-7-alex.bennee@linaro.org> --- tests/acceptance/boot_linux_console.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/acceptance/boot_linux_console.py b/tests/acceptance/boot_linux_console.py index 276a53f146..cded547d1d 100644 --- a/tests/acceptance/boot_linux_console.py +++ b/tests/acceptance/boot_linux_console.py @@ -333,6 +333,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:aarch64 :avocado: tags=machine:virt + :avocado: tags=accel:tcg """ kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' '/linux/releases/29/Everything/aarch64/os/images/pxeboot' @@ -343,7 +344,9 @@ class BootLinuxConsole(LinuxKernelTest): self.vm.set_console() kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyAMA0') + self.require_accelerator("tcg") self.vm.add_args('-cpu', 'cortex-a53', + '-accel', 'tcg', '-kernel', kernel_path, '-append', kernel_command_line) self.vm.launch() @@ -356,6 +359,7 @@ class BootLinuxConsole(LinuxKernelTest): :avocado: tags=machine:xlnx-versal-virt :avocado: tags=device:pl011 :avocado: tags=device:arm_gicv3 + :avocado: tags=accel:tcg """ images_url = ('http://ports.ubuntu.com/ubuntu-ports/dists/' 'bionic-updates/main/installer-arm64/' @@ -370,6 +374,7 @@ class BootLinuxConsole(LinuxKernelTest): self.vm.set_console() self.vm.add_args('-m', '2G', + '-accel', 'tcg', '-kernel', kernel_path, '-initrd', initrd_path) self.vm.launch() @@ -379,6 +384,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:virt + :avocado: tags=accel:tcg """ kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' '/linux/releases/29/Everything/armhfp/os/images/pxeboot' @@ -401,6 +407,7 @@ class BootLinuxConsole(LinuxKernelTest): :avocado: tags=machine:emcraft-sf2 :avocado: tags=endian:little :avocado: tags=u-boot + :avocado: tags=accel:tcg """ uboot_url = ('https://raw.githubusercontent.com/' 'Subbaraya-Sundeep/qemu-test-binaries/' @@ -429,6 +436,8 @@ class BootLinuxConsole(LinuxKernelTest): def do_test_arm_raspi2(self, uart_id): """ + :avocado: tags=accel:tcg + The kernel can be rebuilt using the kernel source referenced and following the instructions on the on: https://www.raspberrypi.org/documentation/linux/kernel/building.md @@ -464,6 +473,7 @@ class BootLinuxConsole(LinuxKernelTest): :avocado: tags=arch:arm :avocado: tags=machine:raspi2 :avocado: tags=device:pl011 + :avocado: tags=accel:tcg """ self.do_test_arm_raspi2(0) @@ -471,6 +481,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:smdkc210 + :avocado: tags=accel:tcg """ deb_url = ('https://snapshot.debian.org/archive/debian/' '20190928T224601Z/pool/main/l/linux/' @@ -511,6 +522,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:cubieboard + :avocado: tags=accel:tcg """ deb_url = ('https://apt.armbian.com/pool/main/l/' 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') @@ -551,6 +563,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:cubieboard + :avocado: tags=accel:tcg """ deb_url = ('https://apt.armbian.com/pool/main/l/' 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') @@ -595,6 +608,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:quanta-gsj + :avocado: tags=accel:tcg """ # 25 MiB compressed, 32 MiB uncompressed. image_url = ( @@ -642,6 +656,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:quanta-gsj + :avocado: tags=accel:tcg """ initrd_url = ( 'https://github.com/hskinnemoen/openbmc/releases/download/' @@ -678,6 +693,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:orangepi-pc + :avocado: tags=accel:tcg """ deb_url = ('https://apt.armbian.com/pool/main/l/' 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') @@ -702,6 +718,7 @@ class BootLinuxConsole(LinuxKernelTest): def test_arm_orangepi_initrd(self): """ :avocado: tags=arch:arm + :avocado: tags=accel:tcg :avocado: tags=machine:orangepi-pc """ deb_url = ('https://apt.armbian.com/pool/main/l/' @@ -744,6 +761,7 @@ class BootLinuxConsole(LinuxKernelTest): def test_arm_orangepi_sd(self): """ :avocado: tags=arch:arm + :avocado: tags=accel:tcg :avocado: tags=machine:orangepi-pc :avocado: tags=device:sd """ From b114a0b94338ea36be2e3a8efb36a82c7b298cc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Wed, 2 Jun 2021 16:32:47 +0100 Subject: [PATCH 5/8] gitlab: work harder to avoid false positives in checkpatch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This copies the behaviour of patchew's configuration to make the diff algorithm generate a minimal diff. Signed-off-by: Alex Bennée Reviewed-by: Philippe Mathieu-Daudé Reviewed-by: Wainer dos Santos Moschetta Message-Id: <20210602153247.27651-1-alex.bennee@linaro.org> --- .gitlab-ci.d/static_checks.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.d/static_checks.yml b/.gitlab-ci.d/static_checks.yml index 8e30872164..7e685c6a65 100644 --- a/.gitlab-ci.d/static_checks.yml +++ b/.gitlab-ci.d/static_checks.yml @@ -3,7 +3,11 @@ check-patch: image: $CI_REGISTRY_IMAGE/qemu/centos8:latest needs: job: amd64-centos8-container - script: .gitlab-ci.d/check-patch.py + script: + - git config --local diff.renamelimit 0 + - git config --local diff.renames True + - git config --local diff.algorithm histogram + - .gitlab-ci.d/check-patch.py variables: GIT_DEPTH: 1000 rules: From e2d301780953dea5f0065bcfccf261c2bf3f7e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Date: Tue, 25 May 2021 10:25:53 +0200 Subject: [PATCH 6/8] gitlab-ci: Split gprof-gcov job MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This job is hitting the 70min limit, so split it in 2 tasks. Signed-off-by: Philippe Mathieu-Daudé Signed-off-by: Alex Bennée Reviewed-by: Willian Rampazzo Message-Id: <20210525082556.4011380-7-f4bug@amsat.org> --- .gitlab-ci.d/buildtest.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.d/buildtest.yml b/.gitlab-ci.d/buildtest.yml index b72c57e4df..d9b834c848 100644 --- a/.gitlab-ci.d/buildtest.yml +++ b/.gitlab-ci.d/buildtest.yml @@ -558,16 +558,27 @@ check-deprecated: allow_failure: true # gprof/gcov are GCC features -gprof-gcov: +build-gprof-gcov: extends: .native_build_job_template needs: job: amd64-ubuntu2004-container variables: IMAGE: ubuntu2004 CONFIGURE_ARGS: --enable-gprof --enable-gcov - MAKE_CHECK_ARGS: check TARGETS: aarch64-softmmu ppc64-softmmu s390x-softmmu x86_64-softmmu - timeout: 70m + artifacts: + expire_in: 1 days + paths: + - build + +check-gprof-gcov: + extends: .native_test_job_template + needs: + - job: build-gprof-gcov + artifacts: true + variables: + IMAGE: ubuntu2004 + MAKE_CHECK_ARGS: check after_script: - ${CI_PROJECT_DIR}/scripts/ci/coverage-summary.sh From 7bb17a9263665c7cb0b93e6889e66bb62b9f71c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Wed, 2 Jun 2021 11:35:27 +0100 Subject: [PATCH 7/8] tests/vm: expose --source-path to scripts to find extra files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently the centos8 image expects to run an in-src build to find the kick starter file. Fix this. Signed-off-by: Alex Bennée Message-Id: <20210602103527.32021-1-alex.bennee@linaro.org> --- tests/vm/Makefile.include | 1 + tests/vm/basevm.py | 4 ++++ tests/vm/centos.aarch64 | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/vm/Makefile.include b/tests/vm/Makefile.include index e94d95ec54..f3a3a1c751 100644 --- a/tests/vm/Makefile.include +++ b/tests/vm/Makefile.include @@ -84,6 +84,7 @@ $(IMAGES_DIR)/%.img: $(SRC_PATH)/tests/vm/% \ $(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \ $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \ $(if $(LOG_CONSOLE),--log-console) \ + --source-path $(SRC_PATH) \ --image "$@" \ --force \ --build-image $@, \ diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py index 0f2e436ed3..254e11c932 100644 --- a/tests/vm/basevm.py +++ b/tests/vm/basevm.py @@ -96,6 +96,7 @@ class BaseVM(object): self._genisoimage = args.genisoimage self._build_path = args.build_path self._efi_aarch64 = args.efi_aarch64 + self._source_path = args.source_path # Allow input config to override defaults. self._config = DEFAULT_CONFIG.copy() if config != None: @@ -591,6 +592,9 @@ def parse_args(vmcls): parser.add_argument("--build-path", default=None, help="Path of build directory, "\ "for using build tree QEMU binary. ") + parser.add_argument("--source-path", default=None, + help="Path of source directory, "\ + "for finding additional files. ") parser.add_argument("--interactive", "-I", action="store_true", help="Interactively run command") parser.add_argument("--snapshot", "-s", action="store_true", diff --git a/tests/vm/centos.aarch64 b/tests/vm/centos.aarch64 index e687b93e52..81c3004c3c 100755 --- a/tests/vm/centos.aarch64 +++ b/tests/vm/centos.aarch64 @@ -64,7 +64,7 @@ class CentosAarch64VM(basevm.BaseVM): def create_kickstart(self): """Generate the kickstart file used to generate the centos image.""" # Start with the template for the kickstart. - ks_file = "../tests/vm/centos-8-aarch64.ks" + ks_file = self._source_path + "/tests/vm/centos-8-aarch64.ks" subprocess.check_call("cp {} ./ks.cfg".format(ks_file), shell=True) # Append the ssh keys to the kickstart file # as the post processing phase of installation. From 72205289a0799c6d0a73107198098b830dbea2f9 Mon Sep 17 00:00:00 2001 From: Matheus Ferst Date: Thu, 20 May 2021 16:51:42 -0300 Subject: [PATCH 8/8] scripts/checkpatch.pl: process .c.inc and .h.inc files as C source MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change the regex used to determine whether a file should be processed as C source to include .c.inc and .h.inc extensions. Signed-off-by: Matheus Ferst Reviewed-by: Luis Pires Message-Id: <20210520195142.941261-1-matheus.ferst@eldorado.org.br> Signed-off-by: Alex Bennée --- scripts/checkpatch.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 3d185cceac..bbcd25ae05 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -12,7 +12,7 @@ use Term::ANSIColor qw(:constants); my $P = $0; $P =~ s@.*/@@g; -our $SrcFile = qr{\.(?:h|c|cpp|s|S|pl|py|sh)$}; +our $SrcFile = qr{\.(?:(h|c)(\.inc)?|cpp|s|S|pl|py|sh)$}; my $V = '0.31'; @@ -1671,7 +1671,7 @@ sub process { } # check we are in a valid C source file if not then ignore this hunk - next if ($realfile !~ /\.(h|c|cpp)$/); + next if ($realfile !~ /\.((h|c)(\.inc)?|cpp)$/); # Block comment styles