Skip to content

Commit

Permalink
virtio-iommu: Record whether a probe request has been issued
Browse files Browse the repository at this point in the history
Add an IOMMUDevice 'probe_done' flag to record that the driver
already issued a probe request on that device.

This will be useful to double check host reserved regions aren't
notified after the probe and hence are not taken into account
by the driver.

Signed-off-by: Eric Auger <eric.auger@redhat.com>
Suggested-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Reviewed-by: "Michael S. Tsirkin" <mst@redhat.com>
Tested-by: Yanghang Liu <yanghliu@redhat.com>
Signed-off-by: Cédric Le Goater <clg@redhat.com>
  • Loading branch information
eauger authored and legoater committed Nov 3, 2023
1 parent b439595 commit 09b4c3d
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 9 deletions.
20 changes: 11 additions & 9 deletions hw/virtio/virtio-iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -639,19 +639,13 @@ static int virtio_iommu_unmap(VirtIOIOMMU *s,
return ret;
}

static ssize_t virtio_iommu_fill_resv_mem_prop(VirtIOIOMMU *s, uint32_t ep,
static ssize_t virtio_iommu_fill_resv_mem_prop(IOMMUDevice *sdev, uint32_t ep,
uint8_t *buf, size_t free)
{
struct virtio_iommu_probe_resv_mem prop = {};
size_t size = sizeof(prop), length = size - sizeof(prop.head), total;
IOMMUDevice *sdev;
GList *l;

sdev = container_of(virtio_iommu_mr(s, ep), IOMMUDevice, iommu_mr);
if (!sdev) {
return -EINVAL;
}

total = size * g_list_length(sdev->resv_regions);
if (total > free) {
return -ENOSPC;
Expand Down Expand Up @@ -688,19 +682,27 @@ static int virtio_iommu_probe(VirtIOIOMMU *s,
uint8_t *buf)
{
uint32_t ep_id = le32_to_cpu(req->endpoint);
IOMMUMemoryRegion *iommu_mr = virtio_iommu_mr(s, ep_id);
size_t free = VIOMMU_PROBE_SIZE;
IOMMUDevice *sdev;
ssize_t count;

if (!virtio_iommu_mr(s, ep_id)) {
if (!iommu_mr) {
return VIRTIO_IOMMU_S_NOENT;
}

count = virtio_iommu_fill_resv_mem_prop(s, ep_id, buf, free);
sdev = container_of(iommu_mr, IOMMUDevice, iommu_mr);
if (!sdev) {
return -EINVAL;
}

count = virtio_iommu_fill_resv_mem_prop(sdev, ep_id, buf, free);
if (count < 0) {
return VIRTIO_IOMMU_S_INVAL;
}
buf += count;
free -= count;
sdev->probe_done = true;

return VIRTIO_IOMMU_S_OK;
}
Expand Down
1 change: 1 addition & 0 deletions include/hw/virtio/virtio-iommu.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ typedef struct IOMMUDevice {
MemoryRegion root; /* The root container of the device */
MemoryRegion bypass_mr; /* The alias of shared memory MR */
GList *resv_regions;
bool probe_done;
} IOMMUDevice;

typedef struct IOMMUPciBus {
Expand Down

0 comments on commit 09b4c3d

Please sign in to comment.