On Wed, Feb 14, 2018 at 10:37:09AM +0800, Jason Wang wrote:
[...]
> +static void set_desc_used(struct vhost_virtqueue *vq,
> +                       struct vring_desc_packed *desc, bool wrap_counter)
> +{
> +     __virtio16 flags = desc->flags;
> +
> +     if (wrap_counter) {
> +             desc->flags |= cpu_to_vhost16(vq, DESC_AVAIL);
> +             desc->flags |= cpu_to_vhost16(vq, DESC_USED);
> +     } else {
> +             desc->flags &= ~cpu_to_vhost16(vq, DESC_AVAIL);
> +             desc->flags &= ~cpu_to_vhost16(vq, DESC_USED);
> +     }
> +
> +     desc->flags = flags;

The `desc->flags` is restored after the change.

> +}
> +
> +static int vhost_get_vq_desc_packed(struct vhost_virtqueue *vq,
> +                                 struct iovec iov[], unsigned int iov_size,
> +                                 unsigned int *out_num, unsigned int *in_num,
> +                                 struct vhost_log *log,
> +                                 unsigned int *log_num)
> +{
> +     struct vring_desc_packed desc;
> +     int ret, access, i;
> +     u16 avail_idx = vq->last_avail_idx;
> +
> +     /* When we start there are none of either input nor output. */
> +     *out_num = *in_num = 0;
> +     if (unlikely(log))
> +             *log_num = 0;
> +
> +     do {
> +             unsigned int iov_count = *in_num + *out_num;
> +
> +             i = vq->last_avail_idx & (vq->num - 1);

The queue size may not be a power of 2 in packed ring.

Best regards,
Tiwei Bie

Reply via email to