[PATCH 0/2] 9p/trans_virtio: handle request cancellation

From: Greg Kurz
Date: Wed Dec 20 2017 - 14:02:35 EST

The 9p protocol mostly relies on a request/reply dialog between the
client and the server. A notable exception to this rule is request
cancellation (ie, flush in 9p wording): when the client requests an
in-flight request to be flushed, the server should only reply to the
flush request and not to the flushed in-flight request (otherwise it
considers the in-flight request to have completed just like it has
never been flushed).

It is up to the client to inform the transport that the in-flight request
has been flushed and won't receive a reply. This is achieved with the
'cancelled' operation of the struct p9_trans_module.

This operation isn't currently implemented with the virtio transport.
As a consequence, flushed requests leave buffers in the used list
forever and the virtqueue ends up in being able to process only one
request at a time.

This issue never popped up because the 9p server in QEMU had a bug
and would always reply to flushed requests. But this will be fixed
soon, so it is time to implement the 'cancelled' operation in the
9p virtio transport.



Greg Kurz (2):
virtio: allow to detach a buffer from the virtqueue
9p/trans_virtio: implement cancelled callback

drivers/virtio/virtio_ring.c | 28 ++++++++++++++++++++++++++++
include/linux/virtio.h | 1 +
net/9p/trans_virtio.c | 18 ++++++++++++++++++
3 files changed, 47 insertions(+)