panic booting with if_tap_load="YES" in loader.conf
Mark Johnston
markj at freebsd.org
Sat May 18 14:24:40 UTC 2019
On Sat, May 18, 2019 at 11:55:46AM +0300, Konstantin Belousov wrote:
> On Sat, May 18, 2019 at 01:33:28AM -0400, Mark Johnston wrote:
> > On Fri, May 17, 2019 at 10:18:57PM -0600, Rebecca Cran wrote:
> > > I just updated from r346856 to r347950 and ran into a new panic, caused
> > > by having if_tap_load="YES" in /boot/loader.conf - because it's already
> > > built-in to the kernel:
> >
> > I think this patch should fix the panic, but I only compile-tested it.
> > I considered having the logic live in preload_delete_name() instead, but
> > the boot-time ucode code must still defer the deletion somewhat.
>
> Try this instead. I will revert r347931 after this landed, or could keep
> it alone.
I have no strong feeling either way.
> diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
> index 1cf09dc5cb7..03fe8a5d096 100644
> --- a/sys/amd64/amd64/machdep.c
> +++ b/sys/amd64/amd64/machdep.c
> @@ -1616,6 +1616,13 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
> bzero((void *)thread0.td_kstack, kstack0_sz);
> physfree += kstack0_sz;
>
> + /*
> + * Initialize enough of thread0 for delayed invalidation to
> + * work very early. Rely on thread0.td_base_pri
> + * zero-initialization, it is reset to PVM at proc0_init().
> + */
> + pmap_thread_init_invl_gen(&thread0);
> +
I think pmap_thread_init_invl_gen() also needs to initialize
invl_gen->saved_pri to 0.
> /*
> * make gdt memory segments
> */
> diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
> index 7997a9f65dc..ecd701399fc 100644
> --- a/sys/amd64/amd64/pmap.c
> +++ b/sys/amd64/amd64/pmap.c
> @@ -700,9 +700,12 @@ pmap_delayed_invl_start_u(void)
> invl_gen = &td->td_md.md_invl_gen;
> PMAP_ASSERT_NOT_IN_DI();
> lock_delay_arg_init(&lda, &di_delay);
> + pri = td->td_base_pri;
> + if (pri <= PVM)
> + goto again;
> thread_lock(td);
> pri = td->td_base_pri;
> - if (pri < PVM) {
> + if (pri <= PVM) {
> invl_gen->saved_pri = 0;
> } else {
> invl_gen->saved_pri = pri;
More information about the freebsd-current
mailing list