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
pgpoU5lft9Vld.pgp
Description: PGP signature