mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-31 12:07:31 +00:00 
			
		
		
		
	 08f2030a2e
			
		
	
	
		08f2030a2e
		
	
	
	
	
		
			
			When switching address space with mutex lock hold, mapping will be replayed for assigned device. This will trigger relock deadlock. Also release the mutex resource in unrealize routine. Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Message-Id: <20220613061010.2674054-3-zhenzhong.duan@intel.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * virtio-iommu device
 | |
|  *
 | |
|  * Copyright (c) 2020 Red Hat, Inc.
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify it
 | |
|  * under the terms and conditions of the GNU General Public License,
 | |
|  * version 2 or later, as published by the Free Software Foundation.
 | |
|  *
 | |
|  * This program is distributed in the hope it will be useful, but WITHOUT
 | |
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | |
|  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | |
|  * more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License along with
 | |
|  * this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef QEMU_VIRTIO_IOMMU_H
 | |
| #define QEMU_VIRTIO_IOMMU_H
 | |
| 
 | |
| #include "standard-headers/linux/virtio_iommu.h"
 | |
| #include "hw/virtio/virtio.h"
 | |
| #include "hw/pci/pci.h"
 | |
| #include "qom/object.h"
 | |
| 
 | |
| #define TYPE_VIRTIO_IOMMU "virtio-iommu-device"
 | |
| #define TYPE_VIRTIO_IOMMU_PCI "virtio-iommu-pci"
 | |
| OBJECT_DECLARE_SIMPLE_TYPE(VirtIOIOMMU, VIRTIO_IOMMU)
 | |
| 
 | |
| #define TYPE_VIRTIO_IOMMU_MEMORY_REGION "virtio-iommu-memory-region"
 | |
| 
 | |
| typedef struct IOMMUDevice {
 | |
|     void         *viommu;
 | |
|     PCIBus       *bus;
 | |
|     int           devfn;
 | |
|     IOMMUMemoryRegion  iommu_mr;
 | |
|     AddressSpace  as;
 | |
|     MemoryRegion root;          /* The root container of the device */
 | |
|     MemoryRegion bypass_mr;     /* The alias of shared memory MR */
 | |
| } IOMMUDevice;
 | |
| 
 | |
| typedef struct IOMMUPciBus {
 | |
|     PCIBus       *bus;
 | |
|     IOMMUDevice  *pbdev[]; /* Parent array is sparse, so dynamically alloc */
 | |
| } IOMMUPciBus;
 | |
| 
 | |
| struct VirtIOIOMMU {
 | |
|     VirtIODevice parent_obj;
 | |
|     VirtQueue *req_vq;
 | |
|     VirtQueue *event_vq;
 | |
|     struct virtio_iommu_config config;
 | |
|     uint64_t features;
 | |
|     GHashTable *as_by_busptr;
 | |
|     IOMMUPciBus *iommu_pcibus_by_bus_num[PCI_BUS_MAX];
 | |
|     PCIBus *primary_bus;
 | |
|     ReservedRegion *reserved_regions;
 | |
|     uint32_t nb_reserved_regions;
 | |
|     GTree *domains;
 | |
|     QemuRecMutex mutex;
 | |
|     GTree *endpoints;
 | |
|     bool boot_bypass;
 | |
| };
 | |
| 
 | |
| #endif
 |