> > +                           desc_current =
> > +                                   vq->avail->ring[(vq->last_used_idx)
> &
> > +                                   (vq->size - 1)];
> > +                           desc_chain_head = desc_current;
> > +                           desc = &vq->desc[desc_current];
> > +                           desc_addr = gpa_to_vva(dev, desc->addr);
> > +                           if (unlikely(!desc_addr))
> > +                                   goto error;
> >
> > -                   desc = &vq->desc[desc->next];
> > -                   desc_addr = gpa_to_vva(dev, desc->addr);
> > -                   if (unlikely(!desc_addr))
> > -                           return -1;
> > -
> > -                   desc_offset = 0;
> > -                   desc_avail  = desc->len;
> > +                           desc_chain_len = 0;
> > +                           desc_offset = 0;
> As I commented on v3, there is code duplication between next flag, and
> mrg buf cases:
> desc_offset = 0;
> 
> and:
> 
> desc = &vq->desc[desc_current];
> desc_addr = gpa_to_vva(dev, desc->addr);
> if (unlikely(!desc_addr))
>      goto error;
> 

Do you mean to add something like:

static inline int __attribute__((always_inline))
get_desc(struct virtio_net *dev, struct vhost_virtqueue *vq,
                uint32_t desc_idx, struct vring_desc **desc,
                uint64_t *desc_addr)
{
        *desc = &vq->desc[desc_idx];
        *desc_addr = gpa_to_vva(dev, (*desc)->addr);
        if (unlikely(!(*desc_addr)))
                return -1;

        return 0;
}


> Regards,
> Maxime

Reply via email to