Kernel Panic
Joe Jones
joe at stream-technologies.com
Tue Feb 27 14:56:00 UTC 2018
Hi,
we have a kernel panic after compiling with witness and invariant
Feb 27 13:49:33 sovapn1 kernel: lock order reversal:
Feb 27 13:49:33 sovapn1 kernel: 1st 0xfffffe000fed78b8 pf_idhash (pf_idhash) @ /usr/src/sys/netpfil/pf/pf.c:1078
Feb 27 13:49:33 sovapn1 kernel: 2nd 0xfffff8001e0474a8 pfsync (pfsync) @ /usr/src/sys/netpfil/pf/if_pfsync.c:1667
Feb 27 13:49:33 sovapn1 kernel: stack backtrace:
Feb 27 13:49:33 sovapn1 kernel: #0 0xffffffff80a9efe0 at witness_debugger+0x70
Feb 27 13:49:33 sovapn1 kernel: #1 0xffffffff80a9eed3 at witness_checkorder+0xe23
Feb 27 13:49:33 sovapn1 kernel: #2 0xffffffff80a20aad at __mtx_lock_flags+0x9d
Feb 27 13:49:33 sovapn1 kernel: #3 0xffffffff826d9f9d at pfsync_insert_state+0x7d
Feb 27 13:49:33 sovapn1 kernel: #4 0xffffffff826ea729 at pf_state_insert+0x8b9
Feb 27 13:49:33 sovapn1 kernel: #5 0xffffffff826f444c at pf_test_rule+0x2bbc
Feb 27 13:49:33 sovapn1 kernel: #6 0xffffffff826eec58 at pf_test+0x1598
Feb 27 13:49:33 sovapn1 kernel: #7 0xffffffff826ffb2d at pf_check_in+0x1d
Feb 27 13:49:33 sovapn1 kernel: #8 0xffffffff80b488c4 at pfil_run_hooks+0xa4
Feb 27 13:49:33 sovapn1 kernel: #9 0xffffffff80ba5757 at ip_tryforward+0x157
Feb 27 13:49:33 sovapn1 kernel: #10 0xffffffff80ba7a8a at ip_input+0x38a
Feb 27 13:49:33 sovapn1 kernel: #11 0xffffffff80b47a00 at netisr_dispatch_src+0x80
Feb 27 13:49:33 sovapn1 kernel: #12 0xffffffff80b309ce at ether_demux+0x15e
Feb 27 13:49:33 sovapn1 kernel: #13 0xffffffff80b317ee at ether_nh_input+0x31e
Feb 27 13:49:33 sovapn1 kernel: #14 0xffffffff80b47a00 at netisr_dispatch_src+0x80
Feb 27 13:49:33 sovapn1 kernel: #15 0xffffffff80b30d62 at ether_input+0x62
Feb 27 13:49:33 sovapn1 kernel: #16 0xffffffff82671427 at igb_rxeof+0x6e7
Feb 27 13:49:33 sovapn1 kernel: #17 0xffffffff826708fe at igb_msix_que+0xee
we compiled with
options INVARIANTS
options INVARIANT_SUPPORT
options WITNESSoptions WITNESS_SKIPSPIN
options WITNESS_KDB
we went back to the 11.1 release as the relenge branch didn't compile
for us (probably our fault).
Regards
Joe Jones
On 27/02/18 04:40, Kristof Provost wrote:
>
> On 26 Feb 2018, at 17:06, Joe Jones wrote:
>
> Hi Kristof,
>
> we are not updating rules during the test although in production
> we will reload the rule set from time to time. We are constantly
> adding and removing from tables though, using the DIOCRADDADDRS
> and DIOCRDELADDRS ioctl, also DIOCKILLSTATES is being called a
> lot. These are all in response to RADIUS events. We tried using
> pfctl shell command rather than calling ioctl directly, to check
> that it wasn't a problem with how we are calling the ioctl.
>
> That’s interesting.
>
> The panic leads me to suspect something’s wrong with the
> kt->pfrkt_ipv4->rt, which would explain why we get the unexpected NULL
> result.
> My first guess at the cause would be a race condition, where it’s
> being modified (through one of the ioctls you do) while the
> pfr_pool_get() is walking it.
>
> I don’t immediately see where that’d happen though, because both
> DIOCRADDADDRS and DIOCRDELADDRS take the rules lock (and
> pfr_pool_get() takes it too).
>
> It might be interesting to run this with these extra asserts (and be
> sure to enable INVARIANTS).
>
> |diff --git a/sys/netpfil/pf/pf_table.c b/sys/netpfil/pf/pf_table.c
> index 18342a94073..cad9b4ea89f 100644 --- a/sys/netpfil/pf/pf_table.c
> +++ b/sys/netpfil/pf/pf_table.c @@ -962,6 +962,8 @@
> pfr_unroute_kentry(struct pfr_ktable *kt, struct pfr_kentry *ke)
> struct radix_node *rn; struct radix_head *head = NULL; +
> PF_RULES_WASSERT(); + if (ke->pfrke_af == AF_INET) head =
> &kt->pfrkt_ip4->rh; else if (ke->pfrke_af == AF_INET6) @@ -1855,6
> +1859,8 @@ pfr_destroy_ktable(struct pfr_ktable *kt, int flushaddr) {
> struct pfr_kentryworkq addrq; + PF_RULES_WASSERT(); + if (flushaddr) {
> pfr_enqueue_addrs(kt, &addrq, NULL, 0); pfr_clean_node_mask(kt, &addrq); |
>
> Regards,
> Kristof
>
More information about the freebsd-pf
mailing list