qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC PATCH 19/26] cpu-exec: reset exit flag before call


From: Pavel Dovgalyuk
Subject: Re: [Qemu-devel] [RFC PATCH 19/26] cpu-exec: reset exit flag before calling cpu_exec_nocache
Date: Thu, 2 Nov 2017 14:24:34 +0300

> From: Paolo Bonzini [mailto:address@hidden
> On 31/10/2017 12:26, Pavel Dovgalyuk wrote:
> > This patch resets icount_decr.u32.high before calling cpu_exec_nocache
> > when exception is pending. Exception is caused by the first instruction
> > in the block and it cannot be executed without resetting the flag.
> >
> > Signed-off-by: Maria Klimushenkova <address@hidden>
> > Signed-off-by: Pavel Dovgalyuk <address@hidden>
> >
> > ---
> >  accel/tcg/cpu-exec.c |    1 +
> >  1 file changed, 1 insertion(+)
> >
> > diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
> > index 35d0240..aaa9c2d 100644
> > --- a/accel/tcg/cpu-exec.c
> > +++ b/accel/tcg/cpu-exec.c
> > @@ -500,6 +500,7 @@ static inline bool cpu_handle_exception(CPUState *cpu, 
> > int *ret)
> >      } else if (replay_has_exception()
> >                 && cpu->icount_decr.u16.low + cpu->icount_extra == 0) {
> >          /* try to cause an exception pending in the log */
> > +        atomic_set(&cpu->icount_decr.u16.high, 0);
> >          cpu_exec_nocache(cpu, 1, tb_find(cpu, NULL, 0, curr_cflags()), 
> > true);
> >          *ret = -1;
> >          return true;
> >
> 
> I am not sure about this.  I think if instead you should return false
> from here and EXCP_INTERRUPT from cpu_exec.

The problem is inside the TB. It checks cpu->icount_decr.u16.high which is -1.
And we have to enter the TB to cause an exception (because it exists in replay 
log).
That is why we reset this flag and try to execute the TB.

> More important: there is still a race, because high can be set to -1
> right after your atomic_set.

I'm not sure about it. But even the race exists, exec_nocache attempt will be 
repeated
after failed try.

Returning true is ok here, because we know that exception will happen (because 
it is
recorded in the log).

Pavel Dovgalyuk




reply via email to

[Prev in Thread] Current Thread [Next in Thread]