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
This commit is contained in:
Jeff Roberson 2018-03-22 19:11:43 +00:00
parent cdfeced8ff
commit 9a4b4cd3bc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=331368
3 changed files with 38 additions and 11 deletions

View File

@ -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
@ -751,28 +751,46 @@ fixup_filename(const char *file)
return (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)

View File

@ -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. */

View File

@ -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__)
/*