virtio-iommu: Store memory region in endpoint struct
Store the memory region associated to each endpoint into the endpoint structure, to allow efficient memory notification on map/unmap. Acked-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> Message-Id: <20201030180510.747225-3-jean-philippe@linaro.org> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
				
					committed by
					
						
						Michael S. Tsirkin
					
				
			
			
				
	
			
			
			
						parent
						
							bfe7a96173
						
					
				
				
					commit
					31aa323fb9
				
			@@ -49,6 +49,7 @@ typedef struct VirtIOIOMMUDomain {
 | 
			
		||||
typedef struct VirtIOIOMMUEndpoint {
 | 
			
		||||
    uint32_t id;
 | 
			
		||||
    VirtIOIOMMUDomain *domain;
 | 
			
		||||
    IOMMUMemoryRegion *iommu_mr;
 | 
			
		||||
    QLIST_ENTRY(VirtIOIOMMUEndpoint) next;
 | 
			
		||||
} VirtIOIOMMUEndpoint;
 | 
			
		||||
 | 
			
		||||
@@ -137,16 +138,19 @@ static VirtIOIOMMUEndpoint *virtio_iommu_get_endpoint(VirtIOIOMMU *s,
 | 
			
		||||
                                                      uint32_t ep_id)
 | 
			
		||||
{
 | 
			
		||||
    VirtIOIOMMUEndpoint *ep;
 | 
			
		||||
    IOMMUMemoryRegion *mr;
 | 
			
		||||
 | 
			
		||||
    ep = g_tree_lookup(s->endpoints, GUINT_TO_POINTER(ep_id));
 | 
			
		||||
    if (ep) {
 | 
			
		||||
        return ep;
 | 
			
		||||
    }
 | 
			
		||||
    if (!virtio_iommu_mr(s, ep_id)) {
 | 
			
		||||
    mr = virtio_iommu_mr(s, ep_id);
 | 
			
		||||
    if (!mr) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    ep = g_malloc0(sizeof(*ep));
 | 
			
		||||
    ep->id = ep_id;
 | 
			
		||||
    ep->iommu_mr = mr;
 | 
			
		||||
    trace_virtio_iommu_get_endpoint(ep_id);
 | 
			
		||||
    g_tree_insert(s->endpoints, GUINT_TO_POINTER(ep_id), ep);
 | 
			
		||||
    return ep;
 | 
			
		||||
@@ -910,9 +914,14 @@ static gboolean reconstruct_endpoints(gpointer key, gpointer value,
 | 
			
		||||
    VirtIOIOMMU *s = (VirtIOIOMMU *)data;
 | 
			
		||||
    VirtIOIOMMUDomain *d = (VirtIOIOMMUDomain *)value;
 | 
			
		||||
    VirtIOIOMMUEndpoint *iter;
 | 
			
		||||
    IOMMUMemoryRegion *mr;
 | 
			
		||||
 | 
			
		||||
    QLIST_FOREACH(iter, &d->endpoint_list, next) {
 | 
			
		||||
        mr = virtio_iommu_mr(s, iter->id);
 | 
			
		||||
        assert(mr);
 | 
			
		||||
 | 
			
		||||
        iter->domain = d;
 | 
			
		||||
        iter->iommu_mr = mr;
 | 
			
		||||
        g_tree_insert(s->endpoints, GUINT_TO_POINTER(iter->id), iter);
 | 
			
		||||
    }
 | 
			
		||||
    return false; /* continue the domain traversal */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user