On 07/07/2015 18:17, Alex Bennée wrote:
fred.kon...@greensocs.com writes:
From: KONRAD Frederic <fred.kon...@greensocs.com>
This changes just the tb_flush called from tb_alloc.
TODO:
* changes the other tb_flush.
Signed-off-by: KONRAD Frederic <fred.kon...@greensocs.com>
---
translate-all.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/translate-all.c b/translate-all.c
index 8bd8fe8..9adaffa 100644
--- a/translate-all.c
+++ b/translate-all.c
@@ -1147,7 +1147,7 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
tb = tb_alloc(pc);
if (!tb) {
/* flush must be done */
- tb_flush(env);
+ tb_flush_safe(env);
Hold on this is async right? What stops us rolling on and then getting
flushed when the other vCPUs come to a halt?
It deserves a comment at least.
not this need some synchronization when the CPUs are halted.
There is crap here spotted by Paolo though.
In the case of tb_flush.. We do an async_safe_work because all VCPUs thread
must be outside cpu_exec.
Are you suggesting to just exiting everybody and wait here that all
VCPUs exit?
This is possible as well here but is not possible for the other case..
That's why I
prefered a "generic" mechanism.
Fred
/* cannot fail at this point */
tb = tb_alloc(pc);
/* Don't forget to invalidate previous TB info. */