On Mon, Jul 27, 2020 at 2:24 PM Alex Bennée <[email protected]> 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 <[email protected]>
> Reviewed-by: Richard Henderson <[email protected]>
> Reviewed-by: Robert Foley <[email protected]>
> Cc: BALATON Zoltan <[email protected]>
> Cc: Christian Ehrhardt <[email protected]>
> Message-Id: <[email protected]>
>
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 <[email protected]>
Reviewed-by: Christian Ehrhardt <[email protected]>
> 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