On Mon, Apr 22, 2024 at 9:41 AM Wafer <wa...@jaguarmicro.com> wrote:
>
> The virtio-1.3 specification
> <https://docs.oasis-open.org/virtio/virtio/v1.3/virtio-v1.3.html> writes:
> 2.8.6 Next Flag: Descriptor Chaining
>       Buffer ID is included in the last descriptor in the list.
>
> If the feature (_F_INDIRECT_DESC) has been negotiated, install only
> one descriptor in the virtqueue.
> Therefor the buffer id should be obtained from the first descriptor.
>
> In descriptor chaining scenarios, the buffer id should be obtained
> from the last descriptor.
>
> Fixes: 86044b24e8 ("virtio: basic packed virtqueue support")
>
> Signed-off-by: Wafer <wa...@jaguarmicro.com>
> ---
>  hw/virtio/virtio.c | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> index 871674f9be..f65d4b4161 100644
> --- a/hw/virtio/virtio.c
> +++ b/hw/virtio/virtio.c
> @@ -1739,6 +1739,11 @@ static void *virtqueue_packed_pop(VirtQueue *vq, 
> size_t sz)
>              goto err_undo_map;
>          }
>
> +        if (desc_cache != &indirect_desc_cache) {
> +            /* Buffer ID is included in the last descriptor in the list. */
> +            id = desc.id;
> +        }

It looks to me we can move this out of the loop.

Others look good.

Thanks

> +
>          rc = virtqueue_packed_read_next_desc(vq, &desc, desc_cache, max, &i,
>                                               desc_cache ==
>                                               &indirect_desc_cache);
> --
> 2.27.0
>


Reply via email to