• Jiang Liu's avatar
    iommu/vt-d: Introduce a rwsem to protect global data structures · 3a5670e8
    Jiang Liu authored
    Introduce a global rwsem dmar_global_lock, which will be used to
    protect DMAR related global data structures from DMAR/PCI/memory
    device hotplug operations in process context.
    
    DMA and interrupt remapping related data structures are read most,
    and only change when memory/PCI/DMAR hotplug event happens.
    So a global rwsem solution is adopted for balance between simplicity
    and performance.
    
    For interrupt remapping driver, function intel_irq_remapping_supported(),
    dmar_table_init(), intel_enable_irq_remapping(), disable_irq_remapping(),
    reenable_irq_remapping() and enable_drhd_fault_handling() etc
    are called during booting, suspending and resuming with interrupt
    disabled, so no need to take the global lock.
    
    For interrupt remapping entry allocation, the locking model is:
    	down_read(&dmar_global_lock);
    	/* Find corresponding iommu */
    	iommu = map_hpet_to_ir(id);
    	if (iommu)
    		/*
    		 * Allocate remapping entry and mark entry busy,
    		 * the IOMMU won't be hot-removed until the
    		 * allocated entry has been released.
    		 */
    		index = alloc_irte(iommu, irq, 1);
    	up_read(&dmar_global_lock);
    
    For DMA remmaping driver, we only uses the dmar_global_lock rwsem to
    protect functions which are only called in process context. For any
    function which may be called in interrupt context, we will use RCU
    to protect them in following patches.
    Signed-off-by: default avatarJiang Liu <jiang.liu@linux.intel.com>
    Signed-off-by: default avatarJoerg Roedel <joro@8bytes.org>
    3a5670e8
dmar.c 34 KB