diff mbox series

[PULL,06/16] accel/tcg: better handle memory constrained systems

Message ID 20200727122357.31263-7-alex.bennee@linaro.org
State Accepted
Commit c83d628b7fba050e59ccf7bda050bc27af241b61
Headers show
Series various fixes for rc2 (semihosting, tcg, docker, tests/vm) | expand

Commit Message

Alex Bennée July 27, 2020, 12:23 p.m. UTC
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>

-- 
2.20.1

Comments

Christian Ehrhardt July 28, 2020, 3:35 p.m. UTC | #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
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jul 27, 2020 at 2:24 PM Alex Bennée &lt;<a href="mailto:alex.bennee@linaro.org">alex.bennee@linaro.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">It turns out there are some 64 bit systems that have relatively low<br>
amounts of physical memory available to them (typically CI system).<br>
Even with swapping available a 1GB translation buffer that fills up<br>
can put the machine under increased memory pressure. Detect these low<br>
memory situations and reduce tb_size appropriately.<br>
<br>
Fixes: 600e17b2615 (&quot;accel/tcg: increase default code gen buffer size for 64 bit&quot;)<br>
Signed-off-by: Alex Bennée &lt;<a href="mailto:alex.bennee@linaro.org" target="_blank">alex.bennee@linaro.org</a>&gt;<br>

Reviewed-by: Richard Henderson &lt;<a href="mailto:richard.henderson@linaro.org" target="_blank">richard.henderson@linaro.org</a>&gt;<br>

Reviewed-by: Robert Foley &lt;<a href="mailto:robert.foley@linaro.org" target="_blank">robert.foley@linaro.org</a>&gt;<br>

Cc: BALATON Zoltan &lt;<a href="mailto:balaton@eik.bme.hu" target="_blank">balaton@eik.bme.hu</a>&gt;<br>
Cc: Christian Ehrhardt &lt;<a href="mailto:christian.ehrhardt@canonical.com" target="_blank">christian.ehrhardt@canonical.com</a>&gt;<br>
Message-Id: &lt;<a href="mailto:20200724064509.331-7-alex.bennee@linaro.org" target="_blank">20200724064509.331-7-alex.bennee@linaro.org</a>&gt;<br></blockquote><div><br></div><div>I beg your pardon for the late reply, but I was out a week.</div><div>I see this is already the pull request and my former feedback was included - thanks.</div><div><br></div><div>Never the less I took the chance to test it in the context that I found and reported the initial bug.</div><div>If only to show that I didn&#39;t fire&amp;forget this case :-)</div><div><br></div><div>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:<br><br>Host 32G, Guest 512M<br>4.2        633M<br>5.0       1672M<br>5.0+ Fix  1670M<br><br>Host 1.5G, Guest 512M<br>4.2        692M<br>5.0       16xxM (OOM)<br>5.0+ Fix   766M<br></div><div><br></div><div>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.</div><div>Tested-by: Christian Ehrhardt &lt;<a href="mailto:christian.ehrhardt@canonical.com">christian.ehrhardt@canonical.com</a>&gt;</div><div>Reviewed-by: Christian Ehrhardt &lt;<a href="mailto:christian.ehrhardt@canonical.com">christian.ehrhardt@canonical.com</a>&gt;<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c<br>
index 2afa46bd2b1..2d83013633b 100644<br>
--- a/accel/tcg/translate-all.c<br>
+++ b/accel/tcg/translate-all.c<br>
@@ -976,7 +976,12 @@ static inline size_t size_code_gen_buffer(size_t tb_size)<br>
 {<br>
     /* Size the buffer.  */<br>
     if (tb_size == 0) {<br>
-        tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE;<br>
+        size_t phys_mem = qemu_get_host_physmem();<br>
+        if (phys_mem == 0) {<br>
+            tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE;<br>
+        } else {<br>
+            tb_size = MIN(DEFAULT_CODE_GEN_BUFFER_SIZE, phys_mem / 8);<br>
+        }<br>
     }<br>
     if (tb_size &lt; MIN_CODE_GEN_BUFFER_SIZE) {<br>
         tb_size = MIN_CODE_GEN_BUFFER_SIZE;<br>
-- <br>
2.20.1<br>
<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">Christian Ehrhardt<br>Staff Engineer, Ubuntu Server<br>Canonical Ltd</div></div>
diff mbox series

Patch

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;