On Mon, Jul 04, 2016 at 04:50:04PM +0000, Prerna Saxena wrote:
> Hi Michael,
> Thank you for taking a look.
> 
> 
> 
> 
> 
> On 04/07/16 5:29 pm, "Michael S. Tsirkin" <m...@redhat.com> wrote:
> 
> >On Fri, Jul 01, 2016 at 02:46:20AM -0700, Prerna Saxena wrote:
> >> From: Prerna Saxena <prerna.sax...@nutanix.com>
> >> 
> >> The current vhost-user protocol requires the client to send responses to 
> >> only a
> >> few commands. For the remaining commands, it is impossible for QEMU to 
> >> know the
> >> status of the requested operation -- ie, did it succeed? If so, by what 
> >> time?
> >> 
> >> This is inconvenient, and can also lead to races. As an example:
> >> 
> >> (1) Qemu sends a SET_MEM_TABLE to the backend (eg, a vhost-user net 
> >> application).
> >> Note that SET_MEM_TABLE does not require a reply according to the spec.
> >> (2) Qemu commits the memory to the guest.
> >> (3) Guest issues an I/O operation over a new memory region which was 
> >> configured on (1).
> >> (4) The application hasn't yet remapped the memory, but it sees the I/O 
> >> request.
> >> (5) The application cannot satisfy the request because it does not know 
> >> about those GPAs.
> >> 
> >> Note that the kernel implementation does not suffer from this limitation 
> >> since messages are sent via an ioctl(). The ioctl() blocks until the 
> >> backend (eg. vhost-net) completes the command and returns (with an error 
> >> code).
> >> 
> >> Changing the behaviour of current vhost-user commands would break existing 
> >> applications. 
> >> To work around this race, Patch 1 adds a get_features command to be sent 
> >> before returning from set_mem_table. While this is not a complete fix, it 
> >> will help client applications that strictly process messages in order.
> >> 
> >> The second patch introduces a protocol extension, 
> >> VHOST_USER_PROTOCOL_F_REPLY_ACK. This feature, if negotiated, allows QEMU 
> >> to request a response to any message by setting the newly introduced 
> >> "need_response" flag. The application must then respond to qemu by 
> >> providing a status about the requested operation.
> >
> >
> >OK this all looks very reasonable (and I do like patch 1 too)
> >but there's one source of waste here: we do not need to
> >synchronize when we set up device the first time
> >when hdev->memory_changed is false.
> >
> >I think we should test that and skip synch in both patches
> >unless  hdev->memory_changed is set.
> 
> I do not entirely agree with that. The first set_mem_table command is not 
> much different from subsequent set_mem_table calls.
> For all cases, there is a fair chance that the vhost-user application may, 
> for some reason, not be able to map the guest memory.
> This protocol extension provides a mechanism for such errors to be propagated 
> back to QEMU. It is upto QEMU to acknowledge the failure (by terminating 
> itself or failing the device) or ignore it. However, in the absence of such a 
> mechanism, it would be really bad for QEMU to believe that the vhost 
> application is all set to process guest requests when reality is quite the 
> opposite.


Same applies to any other request in theory.
Backend can disconnect if it can not handle a request,
this seems sufficient to me.



> Also, as pointed out before, QEMU needs to have a notion of _when_ the memory 
> mapping was finished, so that it may proceed to pass on actual requests to 
> the vhost user application. The race described in the covering letter (above) 
> can potentially happen even at first-time initialization.
> 
> This protocol extension is an attempt to bridge the subtle behavioural 
> difference between vhost-user and vhost-kernel. Patch 1, in my opinion, makes 
> the code less intuitive. This is because we are calling a GET_FEATURES vhost 
> message from inside the handler for another vhost command— SET_MEM_TABLE. 
> However, if you think it better to have both Patch 1 & 2, I’ll be happy to 
> post both.
> 
> Regards,
> Prerna
> 
> >
> >
> >> Changelog:
> >> ---------
> >> Changes since v1:
> >> Patch 1 : Ask for get_features before returning from set_mem_table(new). 
> >> Patch 2 : * Improve documentation. 
> >>           * Abstract out commonly used operations in the form of a 
> >> function, process_message_response(). Also implement this only for 
> >> SET_MEM_TABLE.
> >> 
> >> Prerna Saxena (2):
> >>   vhost-user: Attempt to prevent a race on set_mem_table.
> >>   vhost-user : Introduce a new feature VHOST_USER_PROTOCOL_F_REPLY_ACK.
> >> 
> >>  docs/specs/vhost-user.txt |  40 ++++++++++++
> >>  hw/virtio/vhost-user.c    | 157 
> >> ++++++++++++++++++++++++++++++++--------------
> >>  2 files changed, 150 insertions(+), 47 deletions(-)
> >> 
> >> -- 
> >> 1.8.1.2

Reply via email to