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

Re: [Xen-devel] [PATCH v4 16/17] x86/hvm: always re-emulate I/O from a buffer



> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
> Sent: 25 June 2015 11:50
> To: Paul Durrant
> Cc: Andrew Cooper; xen-devel@xxxxxxxxxxxxxxxxxxxx; Keir (Xen.org)
> Subject: RE: [PATCH v4 16/17] x86/hvm: always re-emulate I/O from a buffer
> 
> >>> On 25.06.15 at 12:32, <Paul.Durrant@xxxxxxxxxx> wrote:
> >>  -----Original Message-----
> >> From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
> >> Sent: 25 June 2015 10:58
> >> To: Paul Durrant
> >> Cc: Andrew Cooper; xen-devel@xxxxxxxxxxxxxxxxxxxx; Keir (Xen.org)
> >> Subject: Re: [PATCH v4 16/17] x86/hvm: always re-emulate I/O from a
> buffer
> >>
> >> >>> On 24.06.15 at 13:24, <paul.durrant@xxxxxxxxxx> wrote:
> >> > If memory mapped I/O is 'chunked' then the I/O must be re-emulated,
> >> > otherwise only the first chunk will be processed. This patch makes
> >> > sure all I/O from a buffer is re-emulated regardless of whether it
> >> > is a read or a write.
> >>
> >> I'm not sure I understand this: Isn't the reason for treating reads
> >> and writes differently due to the fact that MMIO reads may have
> >> side effects, and hence can't be re-issued (whereas writes are
> >> always the last thing an instruction does, and hence can't hold up
> >> retiring of it, and hence don't need retrying)?
> >
> > Read were always re-issued, which is why handle_mmio() is called in
> > hvm_io_assit(). If the underlying MMIO is deferred to QEMU then this is
> the
> > only way for Xen to pick up the result. This patch adds completion for
> > writes.
> > If the I/O has been broken down in the underlying hvmemul_write() and a
> > 'chunk' deferred to QEMU then there is actually need to re-emulate
> otherwise
> > any remaining chunks will not be handled.
> >
> >>
> >> Furthermore, doesn't "only the first chunk" get represented correctly
> >> already by informing the caller that only a single iteration of a
> >> repeated instruction was done, such that further repeats will get
> >> carried out anyway (resulting in another, fresh cycle through the
> >> emulator)?
> >>
> >
> > No, because we're talking about 'chunks' here and not 'reps'. If a single
> > non-rep I/O is broken down into, say, two chunks then we:
> >
> > - Issue the I/O for the first chunk to QEMU
> > - Say we did nothing by returning RETRY
> > - Re-issue the emulation from hvm_io_assist()
> > - Pick up the result of the first chunk from the ioreq, add it to the cache,
> > and issue the second chunk to QEMU
> > - Say we did nothing by returning RETRY
> > - Re-issue the emulation from hvm_io_assist()
> > - Pick up the result of the first chunk from the cache and pick up the 
> > result
> > of the second chunk from the ioreq
> > - Say we completed the I/O by returning OKAY
> >
> > I agree it's not nice, and bouncing would have been preferable, but that's
> > the way 'wide I/O' works.
> 
> I see. Which means
> Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
> 

Thanks.

  Paul

> Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.