[PATCH 4/4] ARM: l2x0: Optmise the range based operations
Catalin Marinas
catalin.marinas at arm.com
Mon Sep 6 06:26:30 EDT 2010
On Sat, 2010-07-31 at 23:16 +0530, Santosh Shilimkar wrote:
> For the big buffers which are in excess of cache size, the maintaince
> operations by PA are very slow. For such buffers the maintainace
> operations can be speeded up by using the WAY based method.
>
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar at ti.com>
> Cc: Catalin Marinas <catalin.marinas at arm.com>
> ---
> arch/arm/mm/cache-l2x0.c | 95 ++++++++++++++++++++++++++++------------------
> 1 files changed, 58 insertions(+), 37 deletions(-)
>
> diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c
> index b2938d4..c0d6108 100644
> --- a/arch/arm/mm/cache-l2x0.c
> +++ b/arch/arm/mm/cache-l2x0.c
> @@ -116,6 +116,18 @@ static void l2x0_flush_all(void)
> spin_unlock_irqrestore(&l2x0_lock, flags);
> }
>
> +static void l2x0_clean_all(void)
> +{
> + unsigned long flags;
> +
> + /* clean all ways */
> + spin_lock_irqsave(&l2x0_lock, flags);
> + writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_WAY);
> + cache_wait(l2x0_base + L2X0_CLEAN_WAY, l2x0_way_mask);
In case you'll base this on top of my PL310 optimisation, you should use
cache_wait_way() as the cache_wait() becomes a no-op.
> static void l2x0_clean_range(unsigned long start, unsigned long end)
> {
> - void __iomem *base = l2x0_base;
> - unsigned long flags;
>
> - spin_lock_irqsave(&l2x0_lock, flags);
> - start &= ~(CACHE_LINE_SIZE - 1);
> - while (start < end) {
> - unsigned long blk_end = start + min(end - start, 4096UL);
> + if ((end - start) >= l2x0_size) {
> + l2x0_clean_all();
> + } else {
> + void __iomem *base = l2x0_base;
> + unsigned long flags, blk_end;
Minor thing - the patch may be cleaner if we use a 'return' instead of
'else' to avoid further indentation (same for the other functions):
if ((end - start) >= l2x0_size) {
l2x0_clean_all();
return;
}
Otherwise the patch looks fine to me.
--
Catalin
More information about the linux-arm-kernel
mailing list