On Tue, 2015-09-22 at 15:35 -0500, Scott Wood wrote:
On Tue, 2015-09-22 at 20:32 +0000, Joakim Tjernlund wrote:Semantics :)
On Tue, 2015-09-22 at 15:14 -0500, Scott Wood wrote:Yes.
On Tue, 2015-09-22 at 19:55 +0000, Joakim Tjernlund wrote:I just said why?
On Tue, 2015-09-22 at 14:42 -0500, Scott Wood wrote:No, I mean why bother special casing this at all?
On Tue, 2015-09-22 at 19:34 +0000, Joakim Tjernlund wrote:I usally find it better to dela with special cases upfront så the rest
On Tue, 2015-09-22 at 13:58 -0500, Scott Wood wrote:Why bother?
On Tue, 2015-09-22 at 18:12 +0000, Joakim Tjernlund wrote:Yes.
On Tue, 2015-09-22 at 18:51 +0200, Christophe Leroy wrote:If you mean the "if (i)", yes, that looks odd.
flush/clean/invalidate _dcache_range() functions are all veryThis feels optimized for the uncommon case when there is no
similar and are quite short. They are mainly used in
__dma_sync()
perf_event locate them in the top 3 consumming functions
during
heavy ethernet activity
They are good candidate for inlining, as __dma_sync() does
almost nothing but calling them
Signed-off-by: Christophe Leroy <christophe.leroy@xxxxxx>
---
New in v2
arch/powerpc/include/asm/cacheflush.h | 55
+++++++++++++++++++++++++++--
arch/powerpc/kernel/misc_32.S | 65 ------------------
----
----
----
-----
arch/powerpc/kernel/ppc_ksyms.c | 2 ++
3 files changed, 54 insertions(+), 68 deletions(-)
diff --git a/arch/powerpc/include/asm/cacheflush.h
b/arch/powerpc/include/asm/cacheflush.h
index 6229e6b..6169604 100644
--- a/arch/powerpc/include/asm/cacheflush.h
+++ b/arch/powerpc/include/asm/cacheflush.h
@@ -47,12 +47,61 @@ static inline void
__flush_dcache_icache_phys(unsigned long physaddr)
}
#endif
-extern void flush_dcache_range(unsigned long start, unsigned
long
stop);
#ifdef CONFIG_PPC32
-extern void clean_dcache_range(unsigned long start, unsigned
long
stop);
-extern void invalidate_dcache_range(unsigned long start,
unsigned
long
stop);
+/*
+ * Write any modified data cache blocks out to memory and
invalidate
them.
+ * Does not invalidate the corresponding instruction cache
blocks.
+ */
+static inline void flush_dcache_range(unsigned long start,
unsigned
long
stop)
+{
+ void *addr = (void *)(start & ~(L1_CACHE_BYTES - 1));
+ unsigned int size = stop - (unsigned long)addr +
(L1_CACHE_BYTES -
1);
+ unsigned int i;
+
+ for (i = 0; i < size >> L1_CACHE_SHIFT; i++, addr +=
L1_CACHE_BYTES)
+ dcbf(addr);
+ if (i)
+ mb(); /* sync */
+}
invalidation.
test for "i = 0" and return.I THINK it would be better to bail earlyBail under what conditions?
doesn't need to
bother. i=0 is a NOP and it is clearer to show that upfront.
You to found the if(i) mb() a bit odd and it took a little time to see why
it was there.
Ahh, you mean just skip the if(i) and have mb() unconditionally?
That changes the semantics a little from the ASM version but perhaps thatAdding more barriers than strictly necessary is a performance concern, not a
doesn't matter?
semantic change.
How often are we really calling this function over an emptyNever hopefully, it does not make much sense.
range?
Not that it matters much one way or another...probably not.