Hi, On 09/14/2016 10:20 AM, Wang, Zhihong wrote: >>> + 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; > }
I meant, move this code after the if/else. You can do it in a function if it is done elsewhere in the file.