From: Anton Blanchard <anton@samba.org>
To: benh@kernel.crashing.org, paulus@samba.org, olof@lixom.net,
michael@ellerman.id.au
Cc: linuxppc-dev@lists.ozlabs.org
Subject: [PATCH 3/5] powerpc: iommu: Reduce spinlock coverage in iommu_free
Date: Mon, 4 Jun 2012 15:43:44 +1000 [thread overview]
Message-ID: <20120604154344.4cadd299@kryten> (raw)
In-Reply-To: <20120604154213.173feecb@kryten>
This patch moves tce_free outside of the lock in iommu_free.
Some performance numbers were obtained with a Chelsio T3 adapter on
two POWER7 boxes, running a 100 session TCP round robin test.
Performance improved 25% with this patch applied.
Signed-off-by: Anton Blanchard <anton@samba.org>
---
Index: linux-build/arch/powerpc/kernel/iommu.c
===================================================================
--- linux-build.orig/arch/powerpc/kernel/iommu.c 2012-06-04 10:38:41.461284266 +1000
+++ linux-build/arch/powerpc/kernel/iommu.c 2012-06-04 10:38:43.813334034 +1000
@@ -190,10 +190,7 @@ static dma_addr_t iommu_alloc(struct dev
* not altered.
*/
if (unlikely(build_fail)) {
- spin_lock_irqsave(&(tbl->it_lock), flags);
__iommu_free(tbl, ret, npages);
- spin_unlock_irqrestore(&(tbl->it_lock), flags);
-
return DMA_ERROR_CODE;
}
@@ -207,8 +204,8 @@ static dma_addr_t iommu_alloc(struct dev
return ret;
}
-static void __iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
- unsigned int npages)
+static bool iommu_free_check(struct iommu_table *tbl, dma_addr_t dma_addr,
+ unsigned int npages)
{
unsigned long entry, free_entry;
@@ -228,21 +225,53 @@ static void __iommu_free(struct iommu_ta
printk(KERN_INFO "\tindex = 0x%llx\n", (u64)tbl->it_index);
WARN_ON(1);
}
- return;
+
+ return false;
}
+ return true;
+}
+
+static void __iommu_free_locked(struct iommu_table *tbl, dma_addr_t dma_addr,
+ unsigned int npages)
+{
+ unsigned long entry, free_entry;
+
+ BUG_ON(!spin_is_locked(&tbl->it_lock));
+
+ entry = dma_addr >> IOMMU_PAGE_SHIFT;
+ free_entry = entry - tbl->it_offset;
+
+ if (!iommu_free_check(tbl, dma_addr, npages))
+ return;
+
ppc_md.tce_free(tbl, entry, npages);
bitmap_clear(tbl->it_map, free_entry, npages);
}
-static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
- unsigned int npages)
+static void __iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
+ unsigned int npages)
{
+ unsigned long entry, free_entry;
unsigned long flags;
+ entry = dma_addr >> IOMMU_PAGE_SHIFT;
+ free_entry = entry - tbl->it_offset;
+
+ if (!iommu_free_check(tbl, dma_addr, npages))
+ return;
+
+ ppc_md.tce_free(tbl, entry, npages);
+
spin_lock_irqsave(&(tbl->it_lock), flags);
- __iommu_free(tbl, dma_addr, npages);
+ bitmap_clear(tbl->it_map, free_entry, npages);
spin_unlock_irqrestore(&(tbl->it_lock), flags);
+}
+
+static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
+ unsigned int npages)
+{
+ __iommu_free(tbl, dma_addr, npages);
/* Make sure TLB cache is flushed if the HW needs it. We do
* not do an mb() here on purpose, it is not needed on any of
@@ -390,7 +419,7 @@ int iommu_map_sg(struct device *dev, str
vaddr = s->dma_address & IOMMU_PAGE_MASK;
npages = iommu_num_pages(s->dma_address, s->dma_length,
IOMMU_PAGE_SIZE);
- __iommu_free(tbl, vaddr, npages);
+ __iommu_free_locked(tbl, vaddr, npages);
s->dma_address = DMA_ERROR_CODE;
s->dma_length = 0;
}
@@ -425,7 +454,7 @@ void iommu_unmap_sg(struct iommu_table *
break;
npages = iommu_num_pages(dma_handle, sg->dma_length,
IOMMU_PAGE_SIZE);
- __iommu_free(tbl, dma_handle, npages);
+ __iommu_free_locked(tbl, dma_handle, npages);
sg = sg_next(sg);
}
next prev parent reply other threads:[~2012-06-04 5:43 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-04 5:42 [PATCH 1/5] powerpc/pseries: Disable interrupts around IOMMU percpu data accesses Anton Blanchard
2012-06-04 5:43 ` [PATCH 2/5] powerpc: iommu: Reduce spinlock coverage in iommu_alloc and iommu_free Anton Blanchard
2012-06-04 5:43 ` Anton Blanchard [this message]
2012-06-04 5:44 ` [PATCH 4/5] powerpc: iommu: Push spinlock into iommu_range_alloc and __iommu_free Anton Blanchard
2012-06-04 5:45 ` [PATCH 5/5] powerpc: iommu: Implement IOMMU pools to improve multiqueue adapter performance Anton Blanchard
2012-06-08 2:43 ` Michael Ellerman
2012-06-08 4:02 ` Anton Blanchard
2012-06-08 4:03 ` Michael Ellerman
2012-06-08 4:14 ` Anton Blanchard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120604154344.4cadd299@kryten \
--to=anton@samba.org \
--cc=benh@kernel.crashing.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=michael@ellerman.id.au \
--cc=olof@lixom.net \
--cc=paulus@samba.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.