mirror of https://gitee.com/openkylin/linux.git
iommu/amd: Free already flushed ring-buffer entries before full-check
To benefit from IOTLB flushes on other CPUs we have to free the already flushed IOVAs from the ring-buffer before we do the queue_ring_full() check. Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
ffa080ebb5
commit
9ce3a72cd7
|
@ -1910,15 +1910,21 @@ static void queue_add(struct dma_ops_domain *dom,
|
||||||
queue = get_cpu_ptr(dom->flush_queue);
|
queue = get_cpu_ptr(dom->flush_queue);
|
||||||
spin_lock_irqsave(&queue->lock, flags);
|
spin_lock_irqsave(&queue->lock, flags);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First remove the enries from the ring-buffer that are already
|
||||||
|
* flushed to make the below queue_ring_full() check less likely
|
||||||
|
*/
|
||||||
|
queue_ring_free_flushed(dom, queue);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When ring-queue is full, flush the entries from the IOTLB so
|
* When ring-queue is full, flush the entries from the IOTLB so
|
||||||
* that we can free all entries with queue_ring_free_flushed()
|
* that we can free all entries with queue_ring_free_flushed()
|
||||||
* below.
|
* below.
|
||||||
*/
|
*/
|
||||||
if (queue_ring_full(queue))
|
if (queue_ring_full(queue)) {
|
||||||
dma_ops_domain_flush_tlb(dom);
|
dma_ops_domain_flush_tlb(dom);
|
||||||
|
queue_ring_free_flushed(dom, queue);
|
||||||
queue_ring_free_flushed(dom, queue);
|
}
|
||||||
|
|
||||||
idx = queue_ring_add(queue);
|
idx = queue_ring_add(queue);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue