include/fpu/softfloat.h | 1 + include/qemu/osdep.h | 15 + accel/tcg/translate-all.c | 7 +- hw/semihosting/console.c | 4 +- linux-user/elfload.c | 10 +- linux-user/syscall.c | 15 +- softmmu/vl.c | 5 +- target/i386/fpu_helper.c | 426 +++++++++++++------------- util/oslib-posix.c | 15 + util/oslib-win32.c | 11 + .shippable.yml | 2 +- python/qemu/console_socket.py | 137 +++++---- python/qemu/machine.py | 14 +- python/qemu/pylintrc | 2 +- tests/docker/Makefile.include | 2 +- tests/docker/docker.py | 13 +- tests/docker/dockerfiles/debian-bootstrap.pre | 7 + tests/vm/basevm.py | 15 +- 18 files changed, 390 insertions(+), 311 deletions(-)
The following changes since commit 194f8ca825854abef3aceca1ed7eb5a53b08751f: Merge remote-tracking branch 'remotes/rth/tags/pull-tcg-20200725' into staging (2020-07-26 17:17:58 +0100) are available in the Git repository at: https://github.com/stsquad/qemu.git tags/pull-fixes-for-rc2-270720-1 for you to fetch changes up to 4a70232b1d26b0d73e1bce60b2c3bdb7e4279d16: tests/vm: add shutdown timeout in basevm.py (2020-07-27 09:41:58 +0100) ---------------------------------------------------------------- Various fixes for rc2: - get shippable working again - semihosting bug fixes - tweak tb-size handling for low memory machines - i386 compound literal float fix - linux-user MAP_FIXED->MAP_NOREPLACE on fallback - docker binfmt_misc fixes - linux-user nanosleep fix - tests/vm drain console fixes ---------------------------------------------------------------- Alex Bennée (8): shippable: add one more qemu to registry url util: add qemu_get_host_physmem utility function util/oslib-win32: add qemu_get_host_physmem implementation accel/tcg: better handle memory constrained systems linux-user: don't use MAP_FIXED in pgd_find_hole_fallback tests/docker: fix update command due to python3 str/bytes distinction tests/docker: fix binfmt_misc image building tests/docker: add support for DEB_KEYRING KONRAD Frederic (2): semihosting: defer connect_chardevs a little more to use serialx semihosting: don't send the trailing '\0' Laszlo Ersek (1): target/i386: floatx80: avoid compound literals in static initializers Laurent Vivier (2): linux-user: fix clock_nanosleep() linux-user, ppc: fix clock_nanosleep() for linux-user-ppc Robert Foley (3): python/qemu: Cleanup changes to ConsoleSocket python/qemu: Change ConsoleSocket to optionally drain socket. tests/vm: add shutdown timeout in basevm.py include/fpu/softfloat.h | 1 + include/qemu/osdep.h | 15 + accel/tcg/translate-all.c | 7 +- hw/semihosting/console.c | 4 +- linux-user/elfload.c | 10 +- linux-user/syscall.c | 15 +- softmmu/vl.c | 5 +- target/i386/fpu_helper.c | 426 +++++++++++++------------- util/oslib-posix.c | 15 + util/oslib-win32.c | 11 + .shippable.yml | 2 +- python/qemu/console_socket.py | 137 +++++---- python/qemu/machine.py | 14 +- python/qemu/pylintrc | 2 +- tests/docker/Makefile.include | 2 +- tests/docker/docker.py | 13 +- tests/docker/dockerfiles/debian-bootstrap.pre | 7 + tests/vm/basevm.py | 15 +- 18 files changed, 390 insertions(+), 311 deletions(-) -- 2.20.1
On Mon, 27 Jul 2020 at 13:23, Alex Bennée <alex.bennee@linaro.org> wrote: > > The following changes since commit 194f8ca825854abef3aceca1ed7eb5a53b08751f: > > Merge remote-tracking branch 'remotes/rth/tags/pull-tcg-20200725' into staging (2020-07-26 17:17:58 +0100) > > are available in the Git repository at: > > https://github.com/stsquad/qemu.git tags/pull-fixes-for-rc2-270720-1 > > for you to fetch changes up to 4a70232b1d26b0d73e1bce60b2c3bdb7e4279d16: > > tests/vm: add shutdown timeout in basevm.py (2020-07-27 09:41:58 +0100) > > ---------------------------------------------------------------- > Various fixes for rc2: > > - get shippable working again > - semihosting bug fixes > - tweak tb-size handling for low memory machines > - i386 compound literal float fix > - linux-user MAP_FIXED->MAP_NOREPLACE on fallback > - docker binfmt_misc fixes > - linux-user nanosleep fix > - tests/vm drain console fixes Applied, thanks. Please update the changelog at https://wiki.qemu.org/ChangeLog/5.1 for any user-visible changes. -- PMM
The registry url is <project>/<repo>/qemu/<image> Perhaps we should rationalise that some day but for now. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20200724064509.331-2-alex.bennee@linaro.org> diff --git a/.shippable.yml b/.shippable.yml index f6b742432e5..89d8be4291b 100644 --- a/.shippable.yml +++ b/.shippable.yml @@ -27,7 +27,7 @@ env: TARGET_LIST=ppc64-softmmu,ppc64-linux-user,ppc64abi32-linux-user build: pre_ci_boot: - image_name: registry.gitlab.com/qemu-project/qemu/${IMAGE} + image_name: registry.gitlab.com/qemu-project/qemu/qemu/${IMAGE} image_tag: latest pull: true options: "-e HOME=/root" -- 2.20.1
From: KONRAD Frederic <frederic.konrad@adacore.com> With that we can just use -semihosting-config chardev=serial0. [AJB: tweak commit message] Signed-off-by: KONRAD Frederic <frederic.konrad@adacore.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <1592215252-26742-1-git-send-email-frederic.konrad@adacore.com> Message-Id: <20200724064509.331-3-alex.bennee@linaro.org> diff --git a/softmmu/vl.c b/softmmu/vl.c index 660537a7098..4eb9d1f7fd5 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -4127,8 +4127,6 @@ void qemu_init(int argc, char **argv, char **envp) qemu_opts_foreach(qemu_find_opts("chardev"), chardev_init_func, NULL, &error_fatal); - /* now chardevs have been created we may have semihosting to connect */ - qemu_semihosting_connect_chardevs(); #ifdef CONFIG_VIRTFS qemu_opts_foreach(qemu_find_opts("fsdev"), @@ -4279,6 +4277,9 @@ void qemu_init(int argc, char **argv, char **envp) if (foreach_device_config(DEV_DEBUGCON, debugcon_parse) < 0) exit(1); + /* now chardevs have been created we may have semihosting to connect */ + qemu_semihosting_connect_chardevs(); + /* If no default VGA is requested, the default is "none". */ if (default_vga) { vga_model = get_default_vga_model(machine_class); -- 2.20.1
From: KONRAD Frederic <frederic.konrad@adacore.com> Don't send the trailing 0 from the string. Signed-off-by: KONRAD Frederic <frederic.konrad@adacore.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <1592215252-26742-2-git-send-email-frederic.konrad@adacore.com> Message-Id: <20200724064509.331-4-alex.bennee@linaro.org> diff --git a/hw/semihosting/console.c b/hw/semihosting/console.c index 22e7827824a..9b4fee92602 100644 --- a/hw/semihosting/console.c +++ b/hw/semihosting/console.c @@ -52,7 +52,9 @@ static GString *copy_user_string(CPUArchState *env, target_ulong addr) do { if (cpu_memory_rw_debug(cpu, addr++, &c, 1, 0) == 0) { - s = g_string_append_c(s, c); + if (c) { + s = g_string_append_c(s, c); + } } else { qemu_log_mask(LOG_GUEST_ERROR, "%s: passed inaccessible address " TARGET_FMT_lx, -- 2.20.1
Compile tested only. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Stefan Weil <sw@weilnetz.de> Message-Id: <20200724064509.331-6-alex.bennee@linaro.org> diff --git a/util/oslib-win32.c b/util/oslib-win32.c index 31030463cc9..c654dafd937 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -831,6 +831,11 @@ char *qemu_get_host_name(Error **errp) size_t qemu_get_host_physmem(void) { - /* currently unimplemented */ + MEMORYSTATUSEX statex; + statex.dwLength = sizeof(statex); + + if (GlobalMemoryStatusEx(&statex)) { + return statex.ullTotalPhys; + } return 0; } -- 2.20.1
It turns out there are some 64 bit systems that have relatively low amounts of physical memory available to them (typically CI system). Even with swapping available a 1GB translation buffer that fills up can put the machine under increased memory pressure. Detect these low memory situations and reduce tb_size appropriately. Fixes: 600e17b2615 ("accel/tcg: increase default code gen buffer size for 64 bit") Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Robert Foley <robert.foley@linaro.org> Cc: BALATON Zoltan <balaton@eik.bme.hu> Cc: Christian Ehrhardt <christian.ehrhardt@canonical.com> Message-Id: <20200724064509.331-7-alex.bennee@linaro.org> diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index 2afa46bd2b1..2d83013633b 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -976,7 +976,12 @@ static inline size_t size_code_gen_buffer(size_t tb_size) { /* Size the buffer. */ if (tb_size == 0) { - tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE; + size_t phys_mem = qemu_get_host_physmem(); + if (phys_mem == 0) { + tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE; + } else { + tb_size = MIN(DEFAULT_CODE_GEN_BUFFER_SIZE, phys_mem / 8); + } } if (tb_size < MIN_CODE_GEN_BUFFER_SIZE) { tb_size = MIN_CODE_GEN_BUFFER_SIZE; -- 2.20.1
On Mon, Jul 27, 2020 at 2:24 PM Alex Bennée <alex.bennee@linaro.org> wrote: > It turns out there are some 64 bit systems that have relatively low > amounts of physical memory available to them (typically CI system). > Even with swapping available a 1GB translation buffer that fills up > can put the machine under increased memory pressure. Detect these low > memory situations and reduce tb_size appropriately. > > Fixes: 600e17b2615 ("accel/tcg: increase default code gen buffer size for > 64 bit") > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > Reviewed-by: Richard Henderson <richard.henderson@linaro.org> > Reviewed-by: Robert Foley <robert.foley@linaro.org> > Cc: BALATON Zoltan <balaton@eik.bme.hu> > Cc: Christian Ehrhardt <christian.ehrhardt@canonical.com> > Message-Id: <20200724064509.331-7-alex.bennee@linaro.org> > I beg your pardon for the late reply, but I was out a week. I see this is already the pull request and my former feedback was included - thanks. Never the less I took the chance to test it in the context that I found and reported the initial bug. If only to show that I didn't fire&forget this case :-) We know there is quite some noise/deviation, but I only ran single tests as the problem was easily visible despite the noise. Amount of memory qemu settles on: Host 32G, Guest 512M 4.2 633M 5.0 1672M 5.0+ Fix 1670M Host 1.5G, Guest 512M 4.2 692M 5.0 16xxM (OOM) 5.0+ Fix 766M So we seem to have achieved that small environments no more break (a very small amount of very densely sized systems might still) but at the same time get the bigger cache for any normal/large system. Tested-by: Christian Ehrhardt <christian.ehrhardt@canonical.com> Reviewed-by: Christian Ehrhardt <christian.ehrhardt@canonical.com> > diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c > index 2afa46bd2b1..2d83013633b 100644 > --- a/accel/tcg/translate-all.c > +++ b/accel/tcg/translate-all.c > @@ -976,7 +976,12 @@ static inline size_t size_code_gen_buffer(size_t > tb_size) > { > /* Size the buffer. */ > if (tb_size == 0) { > - tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE; > + size_t phys_mem = qemu_get_host_physmem(); > + if (phys_mem == 0) { > + tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE; > + } else { > + tb_size = MIN(DEFAULT_CODE_GEN_BUFFER_SIZE, phys_mem / 8); > + } > } > if (tb_size < MIN_CODE_GEN_BUFFER_SIZE) { > tb_size = MIN_CODE_GEN_BUFFER_SIZE; > -- > 2.20.1 > > -- Christian Ehrhardt Staff Engineer, Ubuntu Server Canonical Ltd
Does this seem convoluted to you? It feels a little complicated to me. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20200724064509.331-10-alex.bennee@linaro.org> diff --git a/tests/docker/docker.py b/tests/docker/docker.py index c9f20d8d093..356d7618f1a 100755 --- a/tests/docker/docker.py +++ b/tests/docker/docker.py @@ -24,7 +24,7 @@ import tempfile import re import signal from tarfile import TarFile, TarInfo -from io import StringIO +from io import StringIO, BytesIO from shutil import copy, rmtree from pwd import getpwuid from datetime import datetime, timedelta @@ -541,13 +541,14 @@ class UpdateCommand(SubCommand): # Create a Docker buildfile df = StringIO() - df.write("FROM %s\n" % args.tag) - df.write("ADD . /\n") - df.seek(0) + df.write(u"FROM %s\n" % args.tag) + df.write(u"ADD . /\n") + + df_bytes = BytesIO(bytes(df.getvalue(), "UTF-8")) df_tar = TarInfo(name="Dockerfile") - df_tar.size = len(df.buf) - tmp_tar.addfile(df_tar, fileobj=df) + df_tar.size = df_bytes.getbuffer().nbytes + tmp_tar.addfile(df_tar, fileobj=df_bytes) tmp_tar.close() -- 2.20.1
When we updated the arguments for docker.py we missed a bit. Fixes: dfae628459 ("docker.py/build: support -t and -f arguments") Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20200724064509.331-11-alex.bennee@linaro.org> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include index a104e9df281..9119dff97de 100644 --- a/tests/docker/Makefile.include +++ b/tests/docker/Makefile.include @@ -78,7 +78,7 @@ docker-binfmt-image-debian-%: $(DOCKER_FILES_DIR)/debian-bootstrap.docker DEB_ARCH=$(DEB_ARCH) \ DEB_TYPE=$(DEB_TYPE) \ $(if $(DEB_URL),DEB_URL=$(DEB_URL),) \ - $(DOCKER_SCRIPT) build qemu/debian-$* $< \ + $(DOCKER_SCRIPT) build -t qemu/debian-$* -f $< \ $(if $V,,--quiet) $(if $(NOCACHE),--no-cache) \ $(if $(NOUSER),,--add-current-user) \ $(if $(EXTRA_FILES),--extra-files $(EXTRA_FILES)) \ -- 2.20.1
For installing stuff from sid or ports you may need to manually specify the location of the keyring. You can even import keys into your personal keyring and point it there, e.g.: gpg --keyserver keyring.debian.org --recv-keys 84C573CD4E1AFD6C make docker-binfmt-image-debian-sid-hppa DEB_TYPE=sid DEB_ARCH=hppa \ DEB_URL=http://ftp.ports.debian.org/debian-ports/ \ EXECUTABLE=./hppa-linux-user/qemu-hppa V=1 \ DEB_KEYRING=${HOME}/.gnupg/pubring.kbx Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20200724064509.331-12-alex.bennee@linaro.org> diff --git a/tests/docker/dockerfiles/debian-bootstrap.pre b/tests/docker/dockerfiles/debian-bootstrap.pre index c164778c302..35c85f7db8a 100755 --- a/tests/docker/dockerfiles/debian-bootstrap.pre +++ b/tests/docker/dockerfiles/debian-bootstrap.pre @@ -79,6 +79,13 @@ else fi fi +# +# Add optional args +# +if [ -n "${DEB_KEYRING}" ]; then + DEBOOTSTRAP="${DEBOOTSTRAP} --keyring=${DEB_KEYRING}" +fi + # # Finally check to see if any qemu's are installed # -- 2.20.1
From: Laurent Vivier <laurent@vivier.eu> If the call is interrupted by a signal handler, it fails with error EINTR and if "remain" is not NULL and "flags" is not TIMER_ABSTIME, it returns the remaining unslept time in "remain". Update linux-user to not overwrite the "remain" structure if there is no error. Found with "make check-tcg", linux-test fails on nanosleep test: TEST linux-test on x86_64 .../tests/tcg/multiarch/linux-test.c:242: nanosleep Reported-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20200722174612.2917566-2-laurent@vivier.eu> Message-Id: <20200724064509.331-13-alex.bennee@linaro.org> diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 1211e759c26..43a6e283961 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -11831,8 +11831,14 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, target_to_host_timespec(&ts, arg3); ret = get_errno(safe_clock_nanosleep(arg1, arg2, &ts, arg4 ? &ts : NULL)); - if (arg4) + /* + * if the call is interrupted by a signal handler, it fails + * with error -TARGET_EINTR and if arg4 is not NULL and arg2 is not + * TIMER_ABSTIME, it returns the remaining unslept time in arg4. + */ + if (ret == -TARGET_EINTR && arg4 && arg2 != TIMER_ABSTIME) { host_to_target_timespec(arg4, &ts); + } #if defined(TARGET_PPC) /* clock_nanosleep is odd in that it returns positive errno values. -- 2.20.1
From: Laurent Vivier <laurent@vivier.eu> Our safe_clock_nanosleep() returns -1 and updates errno. We don't need to update the CRF bit in syscall.c because it will be updated in ppc/cpu_loop.c as the return value is negative. Signed-off-by: Laurent Vivier <laurent@vivier.eu> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20200722174612.2917566-3-laurent@vivier.eu> Message-Id: <20200724064509.331-14-alex.bennee@linaro.org> diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 43a6e283961..f5c4f6b95db 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -11840,13 +11840,6 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, host_to_target_timespec(arg4, &ts); } -#if defined(TARGET_PPC) - /* clock_nanosleep is odd in that it returns positive errno values. - * On PPC, CR0 bit 3 should be set in such a situation. */ - if (ret && ret != -TARGET_ERESTARTSYS) { - ((CPUPPCState *)cpu_env)->crf[0] |= 1; - } -#endif return ret; } #endif -- 2.20.1
From: Robert Foley <robert.foley@linaro.org> We are adding the shutdown timeout to solve an issue we now see where the aarch64 VMs timeout on shutdown under TCG. There is a new 3 second timeout in machine.py, which we override in basevm.py when shutting down. Signed-off-by: Robert Foley <robert.foley@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20200717203041.9867-4-robert.foley@linaro.org> Message-Id: <20200724064509.331-17-alex.bennee@linaro.org> diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py index 7acb48b8761..3fac20e929a 100644 --- a/tests/vm/basevm.py +++ b/tests/vm/basevm.py @@ -80,6 +80,8 @@ class BaseVM(object): arch = "#arch" # command to halt the guest, can be overridden by subclasses poweroff = "poweroff" + # Time to wait for shutdown to finish. + shutdown_timeout_default = 30 # enable IPv6 networking ipv6 = True # This is the timeout on the wait for console bytes. @@ -87,7 +89,7 @@ class BaseVM(object): # Scale up some timeouts under TCG. # 4 is arbitrary, but greater than 2, # since we found we need to wait more than twice as long. - tcg_ssh_timeout_multiplier = 4 + tcg_timeout_multiplier = 4 def __init__(self, args, config=None): self._guest = None self._genisoimage = args.genisoimage @@ -141,9 +143,12 @@ class BaseVM(object): if args.jobs and args.jobs > 1: self._args += ["-smp", "%d" % args.jobs] if kvm_available(self.arch): + self._shutdown_timeout = self.shutdown_timeout_default self._args += ["-enable-kvm"] else: logging.info("KVM not available, not using -enable-kvm") + self._shutdown_timeout = \ + self.shutdown_timeout_default * self.tcg_timeout_multiplier self._data_args = [] if self._config['qemu_args'] != None: @@ -423,7 +428,7 @@ class BaseVM(object): def wait_ssh(self, wait_root=False, seconds=300, cmd="exit 0"): # Allow more time for VM to boot under TCG. if not kvm_available(self.arch): - seconds *= self.tcg_ssh_timeout_multiplier + seconds *= self.tcg_timeout_multiplier starttime = datetime.datetime.now() endtime = starttime + datetime.timedelta(seconds=seconds) cmd_success = False @@ -441,14 +446,14 @@ class BaseVM(object): raise Exception("Timeout while waiting for guest ssh") def shutdown(self): - self._guest.shutdown() + self._guest.shutdown(timeout=self._shutdown_timeout) def wait(self): - self._guest.wait() + self._guest.wait(timeout=self._shutdown_timeout) def graceful_shutdown(self): self.ssh_root(self.poweroff) - self._guest.wait() + self._guest.wait(timeout=self._shutdown_timeout) def qmp(self, *args, **kwargs): return self._guest.qmp(*args, **kwargs) -- 2.20.1
© 2016 - 2024 Red Hat, Inc.