From: Babu Moger Date: Wed, 18 Jan 2017 01:21:44 +0000 (-0800) Subject: arch/sparc: Add a dedicated clear_page and clear_user_page for M7 X-Git-Tag: v4.1.12-92~1^2~15 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=b96a3766a473d0ed72ac544830600ccb827961f6;p=users%2Fjedix%2Flinux-maple.git arch/sparc: Add a dedicated clear_page and clear_user_page for M7 Adding a dedicated clear_page and clear_user_page for M7. Avoids multiple checks which are really not required. This eliminates about 30 instructions for each call. Seen about 3 to 4 percent latency reduction in some cases. Orabug: 25456049 Signed-off-by: Babu Moger Reviewed-by: Rob Gardner Signed-off-by: Allen Pais --- diff --git a/arch/sparc/lib/M7clear_page.S b/arch/sparc/lib/M7clear_page.S new file mode 100644 index 0000000000000..1215ed7d661ae --- /dev/null +++ b/arch/sparc/lib/M7clear_page.S @@ -0,0 +1,36 @@ +/* + * M7clear_page.S: SPARC M7 optimized clear_page and clear_user_page. + * + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + */ + +#include +#include + +#define ASI_STBI_P ASI_BLK_INIT_QUAD_LDD_P + + .text + .register %g3, #scratch + .align 32 + .globl M7clear_page + .globl M7clear_user_page +M7clear_page: /* %o0=dest */ +M7clear_user_page: /* %o0=dest */ + set PAGE_SIZE, %o2 + +.wrzero_loop: + + mov 64, %g3 + stxa %g0, [%o0]ASI_STBI_P + subcc %o2, 256, %o2 + stxa %g0, [%o0+%g3]ASI_STBI_P + add %o0, 256, %o0 + sub %g3, 192, %g3 + stxa %g0, [%o0+%g3]ASI_STBI_P + add %g3, 64, %g3 + bg,pt %ncc, .wrzero_loop + stxa %g0, [%o0+%g3]ASI_STBI_P + retl + membar #StoreStore ! required by use of Block Store Init + .size M7clear_page,.-M7clear_page + .size M7clear_user_page,.-M7clear_user_page diff --git a/arch/sparc/lib/M7memset.S b/arch/sparc/lib/M7memset.S index e880bfc2227bb..1a431cda40597 100644 --- a/arch/sparc/lib/M7memset.S +++ b/arch/sparc/lib/M7memset.S @@ -98,20 +98,6 @@ .globl M7memop_enable M7memop_enable: .word 15 -/* - * Define clear_page(dest) as memset(dest, 0, PAGE_SIZE) - * (can create a more optimized version later.) - */ - .globl M7clear_page - .globl M7clear_user_page -M7clear_page: /* clear_page(dest) */ -M7clear_user_page: - set PAGE_SIZE, %o1 - /* fall through into bzero code */ - - .size M7clear_page,.-M7clear_page - .size M7clear_user_page,.-M7clear_user_page - /* * Define bzero(dest, n) as memset(dest, 0, n) * (can create a more optimized version later.) diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile index c4db9e1ebe04e..62501c25eeb8d 100644 --- a/arch/sparc/lib/Makefile +++ b/arch/sparc/lib/Makefile @@ -35,7 +35,7 @@ lib-$(CONFIG_SPARC64) += NG2patch.o lib-$(CONFIG_SPARC64) += NG4memcpy.o NG4copy_from_user.o NG4copy_to_user.o lib-$(CONFIG_SPARC64) += NG4patch.o NG4copy_page.o NG4clear_page.o NG4memset.o -lib-$(CONFIG_SPARC64) += M7memcpy.o M7memset.o M7copy_to_user.o M7copy_from_user.o M7patch.o +lib-$(CONFIG_SPARC64) += M7memcpy.o M7memset.o M7copy_to_user.o M7copy_from_user.o M7patch.o M7clear_page.o lib-$(CONFIG_SPARC64) += GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o