Author: jeff
Date: Thu Mar 22 19:11:43 2018
New Revision: 331368
URL: https://svnweb.freebsd.org/changeset/base/331368

Log:
  Start witness much earlier in boot so that we can shrink the pend list and
  make it more immune to further change.
  
  Reviewed by:  markj, imp (Part of D14707)
  Sponsored by: Netflix, Dell/EMC Isilon

Modified:
  head/sys/kern/subr_witness.c
  head/sys/sys/lock.h
  head/sys/vm/vm_page.c

Modified: head/sys/kern/subr_witness.c
==============================================================================
--- head/sys/kern/subr_witness.c        Thu Mar 22 19:06:50 2018        
(r331367)
+++ head/sys/kern/subr_witness.c        Thu Mar 22 19:11:43 2018        
(r331368)
@@ -139,7 +139,7 @@ __FBSDID("$FreeBSD$");
 #define        WITNESS_COUNT           1536
 #endif
 #define        WITNESS_HASH_SIZE       251     /* Prime, gives load factor < 2 
*/
-#define        WITNESS_PENDLIST        (2048 + (MAXCPU * 4))
+#define        WITNESS_PENDLIST        (512 + (MAXCPU * 4))
 
 /* Allocate 256 KB of stack data space */
 #define        WITNESS_LO_DATA_COUNT   2048
@@ -752,27 +752,45 @@ fixup_filename(const char *file)
 }
 
 /*
+ * Calculate the size of early witness structures.
+ */
+int
+witness_startup_count(void)
+{
+       int sz;
+
+       sz = sizeof(struct witness) * witness_count;
+       sz += sizeof(*w_rmatrix) * (witness_count + 1);
+       sz += sizeof(*w_rmatrix[0]) * (witness_count + 1) *
+           (witness_count + 1);
+
+       return (sz);
+}
+
+/*
  * The WITNESS-enabled diagnostic code.  Note that the witness code does
  * assume that the early boot is single-threaded at least until after this
  * routine is completed.
  */
-static void
-witness_initialize(void *dummy __unused)
+void
+witness_startup(void *mem)
 {
        struct lock_object *lock;
        struct witness_order_list_entry *order;
        struct witness *w, *w1;
+       uintptr_t p;
        int i;
 
-       w_data = malloc(sizeof (struct witness) * witness_count, M_WITNESS,
-           M_WAITOK | M_ZERO);
+       p = (uintptr_t)mem;
+       w_data = (void *)p;
+       p += sizeof(struct witness) * witness_count;
 
-       w_rmatrix = malloc(sizeof(*w_rmatrix) * (witness_count + 1),
-           M_WITNESS, M_WAITOK | M_ZERO);
+       w_rmatrix = (void *)p;
+       p += sizeof(*w_rmatrix) * (witness_count + 1);
 
        for (i = 0; i < witness_count + 1; i++) {
-               w_rmatrix[i] = malloc(sizeof(*w_rmatrix[i]) *
-                   (witness_count + 1), M_WITNESS, M_WAITOK | M_ZERO);
+               w_rmatrix[i] = (void *)p;
+               p += sizeof(*w_rmatrix[i]) * (witness_count + 1);
        }
        badstack_sbuf_size = witness_count * 256;
 
@@ -840,8 +858,6 @@ witness_initialize(void *dummy __unused)
 
        mtx_lock(&Giant);
 }
-SYSINIT(witness_init, SI_SUB_WITNESS, SI_ORDER_FIRST, witness_initialize,
-    NULL);
 
 void
 witness_init(struct lock_object *lock, const char *type)

Modified: head/sys/sys/lock.h
==============================================================================
--- head/sys/sys/lock.h Thu Mar 22 19:06:50 2018        (r331367)
+++ head/sys/sys/lock.h Thu Mar 22 19:11:43 2018        (r331368)
@@ -277,6 +277,8 @@ const char *witness_file(struct lock_object *);
 void   witness_thread_exit(struct thread *);
 
 #ifdef WITNESS
+int    witness_startup_count(void);
+void   witness_startup(void *);
 
 /* Flags for witness_warn(). */
 #define        WARN_GIANTOK    0x01    /* Giant is exempt from this check. */

Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c       Thu Mar 22 19:06:50 2018        (r331367)
+++ head/sys/vm/vm_page.c       Thu Mar 22 19:11:43 2018        (r331368)
@@ -539,6 +539,15 @@ vm_page_startup(vm_offset_t vaddr)
        bzero((void *)mapped, end - new_end);
        uma_startup((void *)mapped, boot_pages);
 
+#ifdef WITNESS
+       end = new_end;
+       new_end = end - round_page(witness_startup_count());
+       mapped = pmap_map(&vaddr, new_end, end,
+           VM_PROT_READ | VM_PROT_WRITE);
+       bzero((void *)mapped, end - new_end);
+       witness_startup((void *)mapped);
+#endif
+
 #if defined(__aarch64__) || defined(__amd64__) || defined(__arm__) || \
     defined(__i386__) || defined(__mips__)
        /*
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to