diff options
author | Anton Blanchard <anton@samba.org> | 2010-08-09 20:20:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-09 23:45:05 -0400 |
commit | e269b085175acf03fc687a7416b9fd84aa9c6c23 (patch) | |
tree | 4f07bf03153450695a1e34073413879173cdb2b4 /include/linux | |
parent | 85c9fe8fcaf630225b26047b3a7cc5167739eced (diff) |
iommu: inline iommu_num_pages
A profile of a network benchmark showed iommu_num_pages rather high up:
0.52% iommu_num_pages
Looking at the profile, an integer divide is taking almost all of the time:
%
: c000000000376ea4 <.iommu_num_pages>:
1.93 : c000000000376ea4: fb e1 ff f8 std r31,-8(r1)
0.00 : c000000000376ea8: f8 21 ff c1 stdu r1,-64(r1)
0.00 : c000000000376eac: 7c 3f 0b 78 mr r31,r1
3.86 : c000000000376eb0: 38 84 ff ff addi r4,r4,-1
0.00 : c000000000376eb4: 38 05 ff ff addi r0,r5,-1
0.00 : c000000000376eb8: 7c 84 2a 14 add r4,r4,r5
46.95 : c000000000376ebc: 7c 00 18 38 and r0,r0,r3
45.66 : c000000000376ec0: 7c 84 02 14 add r4,r4,r0
0.00 : c000000000376ec4: 7c 64 2b 92 divdu r3,r4,r5
0.00 : c000000000376ec8: 38 3f 00 40 addi r1,r31,64
0.00 : c000000000376ecc: eb e1 ff f8 ld r31,-8(r1)
1.61 : c000000000376ed0: 4e 80 00 20 blr
Since every caller of iommu_num_pages passes in a constant power of two
we can inline this such that the divide is replaced by a shift. The
entire function is only a few instructions once optimised, so it is
a good candidate for inlining overall.
Signed-off-by: Anton Blanchard <anton@samba.org>
Cc: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/iommu-helper.h | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/include/linux/iommu-helper.h b/include/linux/iommu-helper.h index 64d1b638745d..86bdeffe43ad 100644 --- a/include/linux/iommu-helper.h +++ b/include/linux/iommu-helper.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _LINUX_IOMMU_HELPER_H | 1 | #ifndef _LINUX_IOMMU_HELPER_H |
2 | #define _LINUX_IOMMU_HELPER_H | 2 | #define _LINUX_IOMMU_HELPER_H |
3 | 3 | ||
4 | #include <linux/kernel.h> | ||
5 | |||
4 | static inline unsigned long iommu_device_max_index(unsigned long size, | 6 | static inline unsigned long iommu_device_max_index(unsigned long size, |
5 | unsigned long offset, | 7 | unsigned long offset, |
6 | u64 dma_mask) | 8 | u64 dma_mask) |
@@ -20,7 +22,13 @@ extern unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, | |||
20 | unsigned long boundary_size, | 22 | unsigned long boundary_size, |
21 | unsigned long align_mask); | 23 | unsigned long align_mask); |
22 | 24 | ||
23 | extern unsigned long iommu_num_pages(unsigned long addr, unsigned long len, | 25 | static inline unsigned long iommu_num_pages(unsigned long addr, |
24 | unsigned long io_page_size); | 26 | unsigned long len, |
27 | unsigned long io_page_size) | ||
28 | { | ||
29 | unsigned long size = (addr & (io_page_size - 1)) + len; | ||
30 | |||
31 | return DIV_ROUND_UP(size, io_page_size); | ||
32 | } | ||
25 | 33 | ||
26 | #endif | 34 | #endif |