Message ID | 156871404669.31913.13609976778909645749.stgit@pasha-Precision-3630-Tower (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | replay: don't synchronize memory operations in replay mode | expand |
On 17/09/19 11:54, Pavel Dovgalyuk wrote: > Commit 9458a9a1df1a4c719e24512394d548c1fc7abd22 added synchronization > of vCPU and migration operations through calling run_on_cpu operation. > However, in replay mode this synchronization is unneeded, because > I/O and vCPU threads are already synchronized. > This patch disables such synchronization for record/replay mode. > > Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru> > --- > exec.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/exec.c b/exec.c > index be8b2b7c06..a69745811f 100644 > --- a/exec.c > +++ b/exec.c > @@ -3177,8 +3177,17 @@ static void tcg_log_global_after_sync(MemoryListener *listener) > * by pushing the migration thread's memory read after the vCPU thread has > * written the memory. > */ > - cpuas = container_of(listener, CPUAddressSpace, tcg_as_listener); > - run_on_cpu(cpuas->cpu, do_nothing, RUN_ON_CPU_NULL); > + if (replay_mode == REPLAY_MODE_NONE) { > + /* > + * VGA can make calls to this function while updating the screen. > + * In record/replay mode this causes a deadlock, because > + * run_on_cpu waits for rr mutex. Therefore no races are possible > + * in this case and no need for making run_on_cpu when > + * record/replay is not enabled. > + */ > + cpuas = container_of(listener, CPUAddressSpace, tcg_as_listener); > + run_on_cpu(cpuas->cpu, do_nothing, RUN_ON_CPU_NULL); > + } > } > > static void tcg_commit(MemoryListener *listener) > Looks good. Paolo
diff --git a/exec.c b/exec.c index be8b2b7c06..a69745811f 100644 --- a/exec.c +++ b/exec.c @@ -3177,8 +3177,17 @@ static void tcg_log_global_after_sync(MemoryListener *listener) * by pushing the migration thread's memory read after the vCPU thread has * written the memory. */ - cpuas = container_of(listener, CPUAddressSpace, tcg_as_listener); - run_on_cpu(cpuas->cpu, do_nothing, RUN_ON_CPU_NULL); + if (replay_mode == REPLAY_MODE_NONE) { + /* + * VGA can make calls to this function while updating the screen. + * In record/replay mode this causes a deadlock, because + * run_on_cpu waits for rr mutex. Therefore no races are possible + * in this case and no need for making run_on_cpu when + * record/replay is not enabled. + */ + cpuas = container_of(listener, CPUAddressSpace, tcg_as_listener); + run_on_cpu(cpuas->cpu, do_nothing, RUN_ON_CPU_NULL); + } } static void tcg_commit(MemoryListener *listener)
Commit 9458a9a1df1a4c719e24512394d548c1fc7abd22 added synchronization of vCPU and migration operations through calling run_on_cpu operation. However, in replay mode this synchronization is unneeded, because I/O and vCPU threads are already synchronized. This patch disables such synchronization for record/replay mode. Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru> --- exec.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)