On 24/01/2017 13:30, Stefan Hajnoczi wrote:
> On Fri, Jan 20, 2017 at 06:07:53PM +0100, Paolo Bonzini wrote:
>> @@ -455,10 +455,18 @@ void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned 
>> int *in_bytes,
>>              goto err;
>>          }
>>  
>> -        desc_pa = vq->vring.desc;
>> -        vring_desc_read(vdev, &desc, desc_pa, i);
>> +        len = max * sizeof(VRingDesc);
>> +        desc_ptr = address_space_map(vdev->dma_as, vq->vring.desc, &len, 
>> false);
>> +        if (len < max * sizeof(VRingDesc)) {
>> +            virtio_error(vdev, "Cannot map descriptor ring");
>> +            goto err;
>> +        }
>> +
>> +        vring_desc_read(vdev, &desc, desc_ptr, i);
>>  
>>          if (desc.flags & VRING_DESC_F_INDIRECT) {
>> +            address_space_unmap(vdev->dma_as, desc_ptr, len, false, 0);
> 
> Missing "dest_ptr = NULL" to prevent double unmap if the next goto err
> is taken.
> 
>> @@ -689,18 +706,33 @@ void *virtqueue_pop(VirtQueue *vq, size_t sz)
>>      }
>>  
>>      i = head;
>> -    vring_desc_read(vdev, &desc, desc_pa, i);
>> +
>> +    len = max * sizeof(VRingDesc);
>> +    desc_ptr = address_space_map(vdev->dma_as, vq->vring.desc, &len, false);
>> +    if (len < max * sizeof(VRingDesc)) {
>> +        virtio_error(vdev, "Cannot map descriptor ring");
>> +        return NULL;
> 
> desc_ptr still needs to be unmapped if non-NULL.  The same applies
> below in virtqueue_pop().
> 

I'll redo this patch to look a lot more like 4/7.

Paolo

Reply via email to