qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-arm] [RFC v4 10/16] virtio-iommu: Implement probe request


From: Bharat Bhushan
Subject: Re: [Qemu-arm] [RFC v4 10/16] virtio-iommu: Implement probe request
Date: Wed, 27 Sep 2017 11:00:52 +0000


> -----Original Message-----
> From: Tomasz Nowicki [mailto:address@hidden
> Sent: Wednesday, September 27, 2017 4:23 PM
> To: Eric Auger <address@hidden>; address@hidden;
> address@hidden; address@hidden; address@hidden;
> address@hidden; address@hidden; jean-
> address@hidden
> Cc: address@hidden; address@hidden; address@hidden;
> address@hidden; address@hidden; address@hidden; Bharat
> Bhushan <address@hidden>; address@hidden;
> address@hidden
> Subject: Re: [RFC v4 10/16] virtio-iommu: Implement probe request
> 
> Hi Eric,
> 
> On 19.09.2017 09:46, Eric Auger wrote:
> > This patch implements the PROBE request. At the moment, no reserved
> > regions are returned.
> >
> > At the moment reserved regions are stored per device.
> >
> > Signed-off-by: Eric Auger <address@hidden>
> >
> > ---
> >
> 
> [...]
> 
> > +
> > +static int virtio_iommu_fill_property(int devid, int type,
> > +                                      viommu_property_buffer
> > +*bufstate) {
> > +    int ret = -ENOSPC;
> > +
> > +    if (bufstate->filled + 4 >= VIOMMU_PROBE_SIZE) {
> > +        bufstate->error = true;
> > +        goto out;
> > +    }
> > +
> > +    switch (type) {
> > +    case VIRTIO_IOMMU_PROBE_T_NONE:
> > +        ret = virtio_iommu_fill_none_prop(bufstate);
> > +        break;
> > +    case VIRTIO_IOMMU_PROBE_T_RESV_MEM:
> > +    {
> > +        viommu_dev *dev = bufstate->dev;
> > +
> > +        g_tree_foreach(dev->reserved_regions,
> > +                       virtio_iommu_fill_resv_mem_prop,
> > +                       bufstate);
> > +        if (!bufstate->error) {
> > +            ret = 0;
> > +        }
> > +        break;
> > +    }
> > +    default:
> > +        ret = -ENOENT;
> > +        break;
> > +    }
> > +out:
> > +    if (ret) {
> > +        error_report("%s property of type=%d could not be filled (%d),"
> > +                     " remaining size = 0x%lx",
> > +                     __func__, type, ret, bufstate->filled);
> > +    }
> > +    return ret;
> > +}
> > +
> > +static int virtio_iommu_probe(VirtIOIOMMU *s,
> > +                              struct virtio_iommu_req_probe *req,
> > +                              uint8_t *buf) {
> > +    uint32_t devid = le32_to_cpu(req->device);
> > +    int16_t prop_types = SUPPORTED_PROBE_PROPERTIES, type;
> > +    viommu_property_buffer bufstate;
> > +    viommu_dev *dev;
> > +    int ret;
> > +
> > +    dev = g_tree_lookup(s->devices, GUINT_TO_POINTER(devid));
> > +    if (!dev) {
> > +        return -EINVAL;
> > +    }
> > +
> > +    bufstate.start = buf;
> > +    bufstate.filled = 0;
> > +    bufstate.dev = dev;
> 
> bufstate.error is not initialized which may cause false alarm in
> virtio_iommu_fill_property()

I observed below prints 
         "qemu-system-aarch64: virtio_iommu_fill_property property of type=2 
could not be filled (-28), remaining size = 0x0 "

When I initialized the bufstate.error = 0,it goes.

Thanks
-Bharat

> 
> > +
> > +    while ((type = ctz32(prop_types)) != 32) {
> > +        ret = virtio_iommu_fill_property(devid, 1 << type, &bufstate);
> > +        if (ret) {
> > +            break;
> > +        }
> > +        prop_types &= ~(1 << type);
> > +    }
> > +    virtio_iommu_fill_property(devid, VIRTIO_IOMMU_PROBE_T_NONE,
> > + &bufstate);
> > +
> > +    return VIRTIO_IOMMU_S_OK;
> > +}
> > +
> >   #define get_payload_size(req) (\
> >   sizeof((req)) - sizeof(struct virtio_iommu_req_tail))
> >
> > @@ -433,6 +567,24 @@ static int
> virtio_iommu_handle_unmap(VirtIOIOMMU *s,
> >       return virtio_iommu_unmap(s, &req);
> >   }
> 
> Thanks,
> Tomasz

reply via email to

[Prev in Thread] Current Thread [Next in Thread]