[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [Patch RFC 13/13] vt-d: Set the IF bit in Invalidation Wait Descriptor When submit Device-TLB
invalidataion requests. If the IF bit is Set, the interrupt based mechanism will be used to track the Device-TLB invalidation requests. Do not do polling to detect whether hardware completes the Device-TLB invalidation during Device- TLB invalidation. Signed-off-by: Quan Xu <quan.xu@xxxxxxxxx> --- xen/drivers/passthrough/vtd/qinval.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/xen/drivers/passthrough/vtd/qinval.c b/xen/drivers/passthrough/vtd/qinval.c index 0d85ce7..b330d02 100644 --- a/xen/drivers/passthrough/vtd/qinval.c +++ b/xen/drivers/passthrough/vtd/qinval.c @@ -176,7 +176,15 @@ static int queue_invalidate_wait(struct iommu *iommu, qinval_update_qtail(iommu, index); spin_unlock_irqrestore(&iommu->register_lock, flags); - /* Now we don't support interrupt method */ + /* + * If the iflag is Set, the interrupt based mechanism will be used to track + * the Device-TLB invalidation status. Do not do polling to detect whether + * hardware completes the Device-TLB invalidation during submitting Device-TLB + * invalidation requests. + */ + if ( iflag ) + return 0; + if ( sw ) { /* In case all wait descriptor writes to same addr with same data */ @@ -322,6 +330,15 @@ static int flush_context_qi( return ret; } +static int invalidate_async(struct iommu *iommu, u16 device_id) +{ + struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu); + + if ( qi_ctrl->qinval_maddr ) + return queue_invalidate_wait(iommu, 1, 1, 1, device_id); + return 0; +} + static int flush_iotlb_qi( void *_iommu, u16 did, u64 addr, unsigned int size_order, u64 type, @@ -360,8 +377,13 @@ static int flush_iotlb_qi( type >> DMA_TLB_FLUSH_GRANU_OFFSET, dr, dw, did, size_order, 0, addr); if ( flush_dev_iotlb ) + { ret = dev_invalidate_iotlb(iommu, did, addr, size_order, type); - rc = invalidate_sync(iommu); + rc = invalidate_async(iommu, did); + } else { + rc = invalidate_sync(iommu); + } + if ( !ret ) ret = rc; } -- 1.8.3.2 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |