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 --- 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(+)