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:
Joerg Roedel 2017-06-22 12:16:33 +02:00
parent ffa080ebb5
commit 9ce3a72cd7
1 changed files with 9 additions and 3 deletions

View File

@ -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);