|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH-for-4.14] ioreq: handle pending emulation racing with ioreq server destruction
> -----Original Message-----
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: 08 June 2020 11:58
> To: Paul Durrant <paul@xxxxxxx>
> Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx; Paul Durrant <pdurrant@xxxxxxxxxx>; Marek
> Marczykowski-Górecki
> <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
> Subject: Re: [PATCH-for-4.14] ioreq: handle pending emulation racing with
> ioreq server destruction
>
> On 08.06.2020 11:46, Paul Durrant wrote:
> > From: Paul Durrant <pdurrant@xxxxxxxxxx>
> >
> > When an emulation request is initiated in hvm_send_ioreq() the guest vcpu is
> > blocked on an event channel until that request is completed. If, however,
> > the emulator is killed whilst that emulation is pending then the ioreq
> > server may be destroyed. Thus when the vcpu is awoken the code in
> > handle_hvm_io_completion() will find no pending request to wait for, but
> > will
> > leave the internal vcpu io_req.state set to IOREQ_READY and the vcpu
> > shutdown
> > deferall flag in place (because hvm_io_assist() will never be called). The
> > emulation request is then completed anyway. This means that any subsequent
> > call
> > to hvmemul_do_io() will find an unexpected value in io_req.state and will
> > return X86EMUL_UNHANDLEABLE, which in some cases will result in continuous
> > re-tries.
> >
> > This patch fixes the issue by moving the setting of io_req.state and
> > clearing
> > of shutdown deferral (as will as MSI-X write completion) out of
> > hvm_io_assist()
> > and directly into handle_hvm_io_completion().
> >
> > Reported-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
> > Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx>
>
> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
> with a question:
>
> > --- a/xen/arch/x86/hvm/ioreq.c
> > +++ b/xen/arch/x86/hvm/ioreq.c
> > @@ -109,15 +109,7 @@ static void hvm_io_assist(struct hvm_ioreq_vcpu *sv,
> > uint64_t data)
> > ioreq_t *ioreq = &v->arch.hvm.hvm_io.io_req;
> >
> > if ( hvm_ioreq_needs_completion(ioreq) )
> > - {
> > - ioreq->state = STATE_IORESP_READY;
> > ioreq->data = data;
> > - }
> > - else
> > - ioreq->state = STATE_IOREQ_NONE;
> > -
> > - msix_write_completion(v);
> > - vcpu_end_shutdown_deferral(v);
> >
> > sv->pending = false;
> > }
>
> With this, is the function worth keeping at all?
I did think about that, but it is called in more than one place. So, in the
interest of trying to make back-porting straightforward, I thought it best to
keep it simple.
>
> Also I assume the patch has your implied R-a-b?
>
Since it has your R-b now, yes :-)
Paul
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |