powerpc/64s: Improve RFI L1-D cache flush fallback
Nicholas Piggin
reviewerPATCH 1/1 powerpc/64s: Improve RFI L1-D cache flush fallback
The fallback RFI flush is used when firmware does not provide a way to flush the cache. It's a "displacement flush" that evicts useful data by displacing it with an uninteresting buffer.
The flush has to take care to work with implementation specific cache replacment policies, so the recipe has been in flux. The initial slow but conservative approach is to touch all lines of a congruence class, with dependencies between each load. It has since been determined that a linear pattern of loads without dependencies is sufficient, and is significantly faster.
Measuring the speed of a null syscall with RFI fallback flush enabled gives the relative improvement:
P8 - 1.83x
P9 - 1.75x
The flush also becomes simpler and more adaptable to different cache geometries.
--- arch/powerpc/include/asm/paca.h | 3 +- arch/powerpc/kernel/asm-offsets.c | 3 +- arch/powerpc/kernel/exceptions-64s.S | 76 +++++++++++++++++------------------- arch/powerpc/kernel/setup_64.c | 13 +----- 4 files changed, 39 insertions(+), 56 deletions(-)
arch/powerpc/include/asm/paca.h +1 -2
@@ -239,8 +239,7 @@ struct paca_struct {*/ u64 exrfi[EX_SIZE ]__aligned(0x80) ;void *rfi_flush_fallback_area; -u64 l1d_flush_congruence; -u64 l1d_flush_sets; +u64 l1d_flush_size;#endif };
arch/powerpc/kernel/asm-offsets.c +1 -2
@@ -239,8 +239,7 @@ int main(void)OFFSET (PACA_IN_NMI , paca_struct, in_nmi);OFFSET (PACA_RFI_FLUSH_FALLBACK_AREA , paca_struct, rfi_flush_fallback_area);OFFSET (PACA_EXRFI , paca_struct, exrfi); -OFFSET (PACA_L1D_FLUSH_CONGRUENCE , paca_struct, l1d_flush_congruence); -OFFSET (PACA_L1D_FLUSH_SETS , paca_struct, l1d_flush_sets); +OFFSET (PACA_L1D_FLUSH_SIZE , paca_struct, l1d_flush_size);#endif OFFSET (PACAHWCPUID , paca_struct, hw_cpu_id);
arch/powerpc/kernel/exceptions-64s.S +36 -40
114 lines not on this page · raw message
arch/powerpc/kernel/setup_64.c +1 -12
@@ -867,19 +867,8 @@ static void init_fallback_flush(void)memset (l1d_flush_fallback_area,0 , l1d_size *2 );for_each_possible_cpu (cpu) { -/* -* The fallback flush is currently coded for 8-way -* associativity. Different associativity is possible, but it -* will be treated as 8-way and may not evict the lines as -* effectively. -* -* 128 byte lines are mandatory. -*/ -u64 c = l1d_size /8 ; - paca[cpu].rfi_flush_fallback_area = l1d_flush_fallback_area; - paca[cpu].l1d_flush_congruence = c; - paca[cpu].l1d_flush_sets = c /128 ; + paca[cpu].l1d_flush_size = l1d_size; } }
Signature · 1 line
2.15.1
Michael Ellerman
AppliedQuoted 14 lines · Nicholas Piggin
The fallback RFI flush is used when firmware does not provide a way to flush the cache. It's a "displacement flush" that evicts useful data by displacing it with an uninteresting buffer.
The flush has to take care to work with implementation specific cache replacment policies, so the recipe has been in flux. The initial slow but conservative approach is to touch all lines of a congruence class, with dependencies between each load. It has since been determined that a linear pattern of loads without dependencies is sufficient, and is significantly faster.
Measuring the speed of a null syscall with RFI fallback flush enabled gives the relative improvement:
Quoted 7 lines
P8 - 1.83x
P9 - 1.75xThe flush also becomes simpler and more adaptable to different cache geometries.
Signed-off-by Nicholas Piggin <[email protected]>
Applied to powerpc next, thanks.
https://git.kernel.org/powerpc/c/bdcb1aefc5b3f7d0f1dc8b02673602
cheers