tcg: Do not elide memory barriers for !CF_PARALLEL in system mode
The virtio devices require proper memory ordering between the vcpus and the iothreads. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
f6ff4923b9
commit
c914d46d0a
14
tcg/tcg-op.c
14
tcg/tcg-op.c
@ -102,7 +102,19 @@ void tcg_gen_br(TCGLabel *l)
|
||||
|
||||
void tcg_gen_mb(TCGBar mb_type)
|
||||
{
|
||||
if (tcg_ctx->gen_tb->cflags & CF_PARALLEL) {
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
bool parallel = tcg_ctx->gen_tb->cflags & CF_PARALLEL;
|
||||
#else
|
||||
/*
|
||||
* It is tempting to elide the barrier in a uniprocessor context.
|
||||
* However, even with a single cpu we have i/o threads running in
|
||||
* parallel, and lack of memory order can result in e.g. virtio
|
||||
* queue entries being read incorrectly.
|
||||
*/
|
||||
bool parallel = true;
|
||||
#endif
|
||||
|
||||
if (parallel) {
|
||||
tcg_gen_op1(INDEX_op_mb, mb_type);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user