Author: wma
Date: Mon Apr  4 07:16:43 2016
New Revision: 297538
URL: https://svnweb.freebsd.org/changeset/base/297538

Log:
  arm64: pagezero improvement
  
  This change has been provided to improve pagezero call performance.
  
  Submitted by:          Dominik Ermel <d...@semihalf.com>
  Obtained from:         Semihalf
  Sponsored by:          Cavium
  Reviewed by:           kib
  Differential Revision: https://reviews.freebsd.org/D5741

Modified:
  head/sys/arm64/arm64/machdep.c
  head/sys/arm64/arm64/pmap.c
  head/sys/arm64/arm64/support.S
  head/sys/arm64/include/machdep.h

Modified: head/sys/arm64/arm64/machdep.c
==============================================================================
--- head/sys/arm64/arm64/machdep.c      Mon Apr  4 07:11:33 2016        
(r297537)
+++ head/sys/arm64/arm64/machdep.c      Mon Apr  4 07:16:43 2016        
(r297538)
@@ -110,6 +110,13 @@ int64_t icache_line_size;  /* The minimum
 int64_t idcache_line_size;     /* The minimum cache line size */
 int64_t dczva_line_size;       /* The size of cache line the dc zva zeroes */
 
+/* pagezero_* implementations are provided in support.S */
+void pagezero_simple(void *);
+void pagezero_cache(void *);
+
+/* pagezero_simple is default pagezero */
+void (*pagezero)(void *p) = pagezero_simple;
+
 static void
 cpu_startup(void *dummy)
 {
@@ -817,6 +824,9 @@ cache_setup(void)
                /* Same as with above calculations */
                dczva_line_shift = DCZID_BS_SIZE(dczid_el0);
                dczva_line_size = sizeof(int) << dczva_line_shift;
+
+               /* Change pagezero function */
+               pagezero = pagezero_cache;
        }
 }
 

Modified: head/sys/arm64/arm64/pmap.c
==============================================================================
--- head/sys/arm64/arm64/pmap.c Mon Apr  4 07:11:33 2016        (r297537)
+++ head/sys/arm64/arm64/pmap.c Mon Apr  4 07:16:43 2016        (r297538)
@@ -271,13 +271,6 @@ pagecopy(void *s, void *d)
        memcpy(d, s, PAGE_SIZE);
 }
 
-static __inline void
-pagezero(void *p)
-{
-
-       bzero(p, PAGE_SIZE);
-}
-
 #define        pmap_l0_index(va)       (((va) >> L0_SHIFT) & L0_ADDR_MASK)
 #define        pmap_l1_index(va)       (((va) >> L1_SHIFT) & Ln_ADDR_MASK)
 #define        pmap_l2_index(va)       (((va) >> L2_SHIFT) & Ln_ADDR_MASK)

Modified: head/sys/arm64/arm64/support.S
==============================================================================
--- head/sys/arm64/arm64/support.S      Mon Apr  4 07:11:33 2016        
(r297537)
+++ head/sys/arm64/arm64/support.S      Mon Apr  4 07:16:43 2016        
(r297538)
@@ -33,6 +33,7 @@
 __FBSDID("$FreeBSD$");
 
 #include <machine/setjmp.h>
+#include <machine/param.h>
 
 #include "assym.s"
 
@@ -290,3 +291,38 @@ ENTRY(longjmp)
        mov     x0, x1
        ret
 END(longjmp)
+
+/*
+ * pagezero, simple implementation
+ */
+ENTRY(pagezero_simple)
+       add     x1, x0, #PAGE_SIZE
+
+1:
+       stp     xzr, xzr, [x0], #0x10
+       stp     xzr, xzr, [x0], #0x10
+       stp     xzr, xzr, [x0], #0x10
+       stp     xzr, xzr, [x0], #0x10
+       cmp     x0, x1
+       b.ne    1b
+       ret
+
+END(pagezero_simple)
+
+/*
+ * pagezero, cache assisted
+ */
+ENTRY(pagezero_cache)
+       add     x1, x0, #PAGE_SIZE
+
+       ldr     x2, =dczva_line_size
+       ldr     x2, [x2]
+
+1:
+       dc      zva, x0
+       add     x0, x0, x2
+       cmp     x0, x1
+       b.ne    1b
+       ret
+
+END(pagezero_cache)

Modified: head/sys/arm64/include/machdep.h
==============================================================================
--- head/sys/arm64/include/machdep.h    Mon Apr  4 07:11:33 2016        
(r297537)
+++ head/sys/arm64/include/machdep.h    Mon Apr  4 07:16:43 2016        
(r297538)
@@ -41,5 +41,6 @@ extern vm_paddr_t physmap[];
 extern u_int physmap_idx;
 
 void initarm(struct arm64_bootparams *);
+extern void (*pagezero)(void *);
 
 #endif /* _MACHINE_MACHDEP_H_ */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to