On Wed, Jun 03, 2015 at 01:15:34PM +0300, Catalin Vasile wrote:
> If I send to the backend out buffers using multiple sgs, what should I
> expect when the user sends me back the result? What should I expect to
> get when I do a virtqueue_get_buf()?
> Do I need to make multiple calls to virtqueue_get_buf() in order to
> get all my out buffers? Or it returns with the first buffer and then I
> somehow have to guess the other buffers from the data received in the
> first buffer?

virtqueue_add_sgs() only adds one "buffer" to the virtqueue.  I'm using
"buffer" in the virtio spec sense here, don't confuse a buffer with
scatterlist descriptors.  So exactly one virtqueue_get_buf() must be
used to harvest the completed buffer.

One buffer may consist of multiple descriptors (i.e. struct scatterlist
elements), some of them read-only ("in") and/or some of them write-only
("out").

The way to correlate a submitted buffer with the completed buffer from
virtqueue_get_buf() is the virtqueue_add_sgs(..., void *data, ...)
argument.  You get the data value back as the return value from
virtqueue_get_buf().  Typically some sort of request pointer is passed
as the data value which identifies the network packet, disk I/O request,
etc.

Stefan

Attachment: pgpoU5lft9Vld.pgp
Description: PGP signature

Reply via email to