drm/radeon: Inline r100_mm_rreg, -wreg, v3
Subsystems (2)
PATCH 1/1 drm/radeon: Inline r100_mm_rreg, -wreg, v3
This was originally un-inlined by Andi Kleen in 2011 citing size concerns. Indeed, a first attempt at inlining it grew radeon.ko by 7%.
However, 2% of cpu is spent in this function. Simply inlining it gave 1% more fps in Urban Terror.
v2: We know the minimum MMIO size. Adding it to the if allows the compiler to optimize the branch out, improving both performance and size.
The v2 patch decreases radeon.ko size by 2%. I didn't re-benchmark, but common sense says perf is now more than 1% better.
v3: Also change _wreg, make the threshold a define.
Inlining _wreg increased the size a bit compared to v2, so now radeon.ko is only 1% smaller.
--- drivers/gpu/drm/radeon/r100.c | 33 --------------------------------- drivers/gpu/drm/radeon/radeon.h | 40 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 37 deletions(-)
drivers/gpu/drm/radeon/r100.c +0 -33
@@ -4086,39 +4086,6 @@ int r100_init(struct radeon_device *rdev)return 0 ; } -uint32_t r100_mm_rreg (struct radeon_device *rdev,uint32_t reg, -bool always_indirect) -{ -if (reg < rdev->rmmio_size && !always_indirect) -return readl (((void __iomem *)rdev->rmmio) + reg); -else { -unsigned long flags; -uint32_t ret; - -spin_lock_irqsave (&rdev->mmio_idx_lock, flags); -writel (reg, ((void __iomem *)rdev->rmmio) +RADEON_MM_INDEX ); - ret =readl (((void __iomem *)rdev->rmmio) +RADEON_MM_DATA ); -spin_unlock_irqrestore (&rdev->mmio_idx_lock, flags); - -return ret; - } -} - -void r100_mm_wreg (struct radeon_device *rdev,uint32_t reg,uint32_t v, -bool always_indirect) -{ -if (reg < rdev->rmmio_size && !always_indirect) -writel (v, ((void __iomem *)rdev->rmmio) + reg); -else { -unsigned long flags; - -spin_lock_irqsave (&rdev->mmio_idx_lock, flags); -writel (reg, ((void __iomem *)rdev->rmmio) +RADEON_MM_INDEX ); -writel (v, ((void __iomem *)rdev->rmmio) +RADEON_MM_DATA ); -spin_unlock_irqrestore (&rdev->mmio_idx_lock, flags); - } -} -u32 r100_io_rreg (struct radeon_device *rdev,u32 reg) {if (reg < rdev->rio_mem_size)
drivers/gpu/drm/radeon/radeon.h +36 -4
@@ -2328,10 +2328,42 @@ int radeon_device_init(struct radeon_device *rdev,void radeon_device_fini (struct radeon_device *rdev);int radeon_gpu_wait_for_idle (struct radeon_device *rdev); -uint32_t r100_mm_rreg (struct radeon_device *rdev,uint32_t reg, -bool always_indirect); -void r100_mm_wreg (struct radeon_device *rdev,uint32_t reg,uint32_t v, -bool always_indirect); +#define RADEON_MIN_MMIO_SIZE 0x10000 + +static inline uint32_t r100_mm_rreg (struct radeon_device *rdev,uint32_t reg, +bool always_indirect) +{ +/* The mmio size is 64kb at minimum. Allows the if to be optimized out. */ +if ((reg < rdev->rmmio_size || reg <RADEON_MIN_MMIO_SIZE ) && !always_indirect) +return readl (((void __iomem *)rdev->rmmio) + reg); +else { +unsigned long flags; +uint32_t ret; + +spin_lock_irqsave (&rdev->mmio_idx_lock, flags); +writel (reg, ((void __iomem *)rdev->rmmio) +RADEON_MM_INDEX ); + ret =readl (((void __iomem *)rdev->rmmio) +RADEON_MM_DATA ); +spin_unlock_irqrestore (&rdev->mmio_idx_lock, flags); + +return ret; + } +} + +static inline void r100_mm_wreg (struct radeon_device *rdev,uint32_t reg,uint32_t v, +bool always_indirect) +{ +if ((reg < rdev->rmmio_size || reg <RADEON_MIN_MMIO_SIZE ) && !always_indirect) +writel (v, ((void __iomem *)rdev->rmmio) + reg); +else { +unsigned long flags; + +spin_lock_irqsave (&rdev->mmio_idx_lock, flags); +writel (reg, ((void __iomem *)rdev->rmmio) +RADEON_MM_INDEX ); +writel (v, ((void __iomem *)rdev->rmmio) +RADEON_MM_DATA ); +spin_unlock_irqrestore (&rdev->mmio_idx_lock, flags); + } +} +u32 r100_io_rreg (struct radeon_device *rdev,u32 reg);void r100_io_wreg (struct radeon_device *rdev,u32 reg,u32 v);
Signature · 1 line
1.8.3.1
Am 20.04.2014 19:29, schrieb Lauri Kasanen:
Quoted 12 lines
This was originally un-inlined by Andi Kleen in 2011 citing size concerns. Indeed, a first attempt at inlining it grew radeon.ko by 7%.
However, 2% of cpu is spent in this function. Simply inlining it gave 1% more fps in Urban Terror.
v2: We know the minimum MMIO size. Adding it to the if allows the compiler to optimize the branch out, improving both performance and size.
The v2 patch decreases radeon.ko size by 2%. I didn't re-benchmark, but common sense says perf is now more than 1% better.
Quoted 6 lines
v3: Also change
_wreg, make the threshold a define.Inlining
_wregincreased the size a bit compared to v2, so now radeon.ko is only 1% smaller.Signed-off-by Lauri Kasanen <[email protected]>
Quoted 100 lines
--- drivers/gpu/drm/radeon/r100.c | 33 --------------------------------- drivers/gpu/drm/radeon/radeon.h | 40 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 37 deletions(-)drivers/gpu/drm/radeon/r100.c +0
-33@@ -4086,39 +4086,6 @@ int r100_init(struct radeon_device *rdev)return 0 ; } -uint32_t r100_mm_rreg (struct radeon_device *rdev,uint32_t reg, -bool always_indirect) -{ -if (reg < rdev->rmmio_size && !always_indirect) -return readl (((void __iomem *)rdev->rmmio) + reg); -else { -unsigned long flags; -uint32_t ret; - -spin_lock_irqsave (&rdev->mmio_idx_lock, flags); -writel (reg, ((void __iomem *)rdev->rmmio) +RADEON_MM_INDEX ); - ret =readl (((void __iomem *)rdev->rmmio) +RADEON_MM_DATA ); -spin_unlock_irqrestore (&rdev->mmio_idx_lock, flags); - -return ret; - } -} - -void r100_mm_wreg (struct radeon_device *rdev,uint32_t reg,uint32_t v, -bool always_indirect) -{ -if (reg < rdev->rmmio_size && !always_indirect) -writel (v, ((void __iomem *)rdev->rmmio) + reg); -else { -unsigned long flags; - -spin_lock_irqsave (&rdev->mmio_idx_lock, flags); -writel (reg, ((void __iomem *)rdev->rmmio) +RADEON_MM_INDEX ); -writel (v, ((void __iomem *)rdev->rmmio) +RADEON_MM_DATA ); -spin_unlock_irqrestore (&rdev->mmio_idx_lock, flags); - } -} -u32 r100_io_rreg (struct radeon_device *rdev,u32 reg) {if (reg < rdev->rio_mem_size)drivers/gpu/drm/radeon/radeon.h +36
-4@@ -2328,10 +2328,42 @@ int radeon_device_init(struct radeon_device *rdev,void radeon_device_fini (struct radeon_device *rdev);int radeon_gpu_wait_for_idle (struct radeon_device *rdev); -uint32_t r100_mm_rreg (struct radeon_device *rdev,uint32_t reg, -bool always_indirect); -void r100_mm_wreg (struct radeon_device *rdev,uint32_t reg,uint32_t v, -bool always_indirect); +#define RADEON_MIN_MMIO_SIZE 0x10000 + +static inline uint32_t r100_mm_rreg (struct radeon_device *rdev,uint32_t reg, +bool always_indirect) +{ +/* The mmio size is 64kb at minimum. Allows the if to be optimized out. */ +if ((reg < rdev->rmmio_size || reg <RADEON_MIN_MMIO_SIZE ) && !always_indirect) +return readl (((void __iomem *)rdev->rmmio) + reg); +else { +unsigned long flags; +uint32_t ret; + +spin_lock_irqsave (&rdev->mmio_idx_lock, flags); +writel (reg, ((void __iomem *)rdev->rmmio) +RADEON_MM_INDEX ); + ret =readl (((void __iomem *)rdev->rmmio) +RADEON_MM_DATA ); +spin_unlock_irqrestore (&rdev->mmio_idx_lock, flags); + +return ret; + } +} + +static inline void r100_mm_wreg (struct radeon_device *rdev,uint32_t reg,uint32_t v, +bool always_indirect) +{ +if ((reg < rdev->rmmio_size || reg <RADEON_MIN_MMIO_SIZE ) && !always_indirect) +writel (v, ((void __iomem *)rdev->rmmio) + reg); +else { +unsigned long flags; + +spin_lock_irqsave (&rdev->mmio_idx_lock, flags); +writel (reg, ((void __iomem *)rdev->rmmio) +RADEON_MM_INDEX ); +writel (v, ((void __iomem *)rdev->rmmio) +RADEON_MM_DATA ); +spin_unlock_irqrestore (&rdev->mmio_idx_lock, flags); + } +} +u32 r100_io_rreg (struct radeon_device *rdev,u32 reg);void r100_io_wreg (struct radeon_device *rdev,u32 reg,u32 v);
Quoted 13 lines · On Sun, 20 Apr 2014 19:41:11 +0200 Christian König <[email protected]>…
Am 20.04.2014 19:29, schrieb Lauri Kasanen:
Quoted 12 lines
This was originally un-inlined by Andi Kleen in 2011 citing size concerns. Indeed, a first attempt at inlining it grew radeon.ko by 7%.
However, 2% of cpu is spent in this function. Simply inlining it gave 1% more fps in Urban Terror.
v2: We know the minimum MMIO size. Adding it to the if allows the compiler to optimize the branch out, improving both performance and size.
The v2 patch decreases radeon.ko size by 2%. I didn't re-benchmark, but common sense says perf is now more than 1% better.
Quoted 8 lines
Quoted 6 lines
v3: Also change
_wreg, make the threshold a define.Inlining
_wregincreased the size a bit compared to v2, so now radeon.ko is only 1% smaller.Signed-off-by Lauri Kasanen <[email protected]>Reviewed-by Christian König <[email protected]>
Ping. Although reviewed in April, seems this wasn't applied to any tree?
- Lauri
Am 10.07.2014 10:48, schrieb Lauri Kasanen:
Quoted 16 lines
Quoted 13 lines · On Sun, 20 Apr 2014 19:41:11 +0200 Christian König <[email protected]>…
Am 20.04.2014 19:29, schrieb Lauri Kasanen:
Quoted 12 lines
This was originally un-inlined by Andi Kleen in 2011 citing size concerns. Indeed, a first attempt at inlining it grew radeon.ko by 7%.
However, 2% of cpu is spent in this function. Simply inlining it gave 1% more fps in Urban Terror.
v2: We know the minimum MMIO size. Adding it to the if allows the compiler to optimize the branch out, improving both performance and size.
The v2 patch decreases radeon.ko size by 2%. I didn't re-benchmark, but common sense says perf is now more than 1% better.
Quoted 8 lines
Quoted 7 lines
Quoted 6 lines
v3: Also change
_wreg, make the threshold a define.Inlining
_wregincreased the size a bit compared to v2, so now radeon.ko is only 1% smaller.Signed-off-by Lauri Kasanen <[email protected]>Reviewed-by Christian König <[email protected]>Ping. Although reviewed in April, seems this wasn't applied to any tree?
Sorry looks like I missed it. Alex can you pull that in your 3.17 branch?
Thanks,
Christian.
Quoted 2 lines
- Lauri
Alex Deucher
AppliedQuoted 28 lines · Christian König
Am 10.07.2014 10:48, schrieb Lauri Kasanen:
Quoted 26 lines
Quoted 23 lines · On Sun, 20 Apr 2014 19:41:11 +0200 Christian König <[email protected]>…
Am 20.04.2014 19:29, schrieb Lauri Kasanen:
Quoted 22 lines
This was originally un-inlined by Andi Kleen in 2011 citing size concerns.
Indeed, a first attempt at inlining it grew radeon.ko by 7%.However, 2% of cpu is spent in this function. Simply inlining it gave 1% more fps
in Urban Terror.v2: We know the minimum MMIO size. Adding it to the if allows the compiler to
optimize the branch out, improving both performance and size.The v2 patch decreases radeon.ko size by 2%. I didn't re-benchmark, but common sense
says perf is now more than 1% better.v3: Also change
_wreg, make the threshold a define.Inlining
_wregincreased the size a bit compared to v2, so now radeon.ko is only 1% smaller.
Quoted 8 lines
Quoted 5 lines
Quoted 3 lines
Quoted 1 line
Signed-off-by Lauri Kasanen <[email protected]>Reviewed-by Christian König <[email protected]>Ping. Although reviewed in April, seems this wasn't applied to any tree?
Sorry looks like I missed it. Alex can you pull that in your 3.17 branch?
Applied. thanks.
Alex
_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel