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:
parent
cdfeced8ff
commit
9a4b4cd3bc
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=331368
@ -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)
|
||||
|
@ -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. */
|
||||
|
@ -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__)
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user