Calling ether_ifdetach after iflib_stop leads to a potential race where
a stale ifp pointer can remain in the route entry list for IPv6 traffic.
This will potentially cause a page fault or other system instability if
the ifp pointer is accessed.
Fatal trap 12: page fault while in kernel mode cpuid = 36; apic id = 52 fault virtual address = 0x10 fault code = supervisor read data, page not present instruction pointer = 0x20:0xffffffff80c84707 stack pointer = 0x28:0xfffffe2f434b7220 frame pointer = 0x28:0xfffffe2f434b7270 code segment = base 0x0, limit 0xfffff, type 0x1b = DPL 0, pres 1, long 1, def32 0, gran 1 processor eflags = interrupt enabled, resume, IOPL = 0 current process = 0 (if_io_tqg_36) trap number = 12 panic: page fault cpuid = 36 KDB: stack backtrace: db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe2f434b6ee0 vpanic() at vpanic+0x17e/frame 0xfffffe2f434b6f40 panic() at panic+0x43/frame 0xfffffe2f434b6fa0 trap_fatal() at trap_fatal+0x369/frame 0xfffffe2f434b6ff0 trap_pfault() at trap_pfault+0x62/frame 0xfffffe2f434b7040 trap() at trap+0x2b3/frame 0xfffffe2f434b7150 calltrap() at calltrap+0x8/frame 0xfffffe2f434b7150 --- trap 0xc, rip = 0xffffffff80c84707, rsp = 0xfffffe2f434b7220, rbp = 0xfffffe2f434b7270 --- in6_selecthlim() at in6_selecthlim+0x27/frame 0xfffffe2f434b7270 sctp_lowlevel_chunk_output() at sctp_lowlevel_chunk_output+0xeb2/frame 0xfffffe2f434b73b0 sctp_chunk_output() at sctp_chunk_output+0x68c/frame 0xfffffe2f434b7d30 sctp_common_input_processing() at sctp_common_input_processing+0xa2a/frame 0xfffffe2f434b7e40 sctp6_input_with_port() at sctp6_input_with_port+0x1e5/frame 0xfffffe2f434b7f20 sctp6_input() at sctp6_input+0xb/frame 0xfffffe2f434b7f30 ip6_input() at ip6_input+0xc23/frame 0xfffffe2f434b8020 netisr_dispatch_src() at netisr_dispatch_src+0x82/frame 0xfffffe2f434b8080 ether_demux() at ether_demux+0x14f/frame 0xfffffe2f434b80b0 ether_nh_input() at ether_nh_input+0x330/frame 0xfffffe2f434b80f0 netisr_dispatch_src() at netisr_dispatch_src+0x82/frame 0xfffffe2f434b8150 ether_input() at ether_input+0x62/frame 0xfffffe2f434b8180 _task_fn_rx() at _task_fn_rx+0xd33/frame 0xfffffe2f434b8270 gtaskqueue_run_locked() at gtaskqueue_run_locked+0x139/frame 0xfffffe2f434b82c0 gtaskqueue_thread_loop() at gtaskqueue_thread_loop+0x88/frame 0xfffffe2f434b82f0 fork_exit() at fork_exit+0x84/frame 0xfffffe2f434b8330 fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe2f434b8330 --- trap 0, rip = 0, rsp = 0, rbp = 0 --- KDB: enter: panic
Move both iflib_netmap_detach and ether_ifdetach to be called prior to
iflib_stop. This avoids the race above, and helps ensure that other ifp
references are removed before stopping the interface.