On Sun, Mar 20, 2022 at 09:57:03PM +0100, Sven M. Hallberg wrote:
> >Synopsis: Kernel page fault in iwm (related to suspend?)
> >Category: kernel
> >Environment:
> System : OpenBSD 7.1
> Details : OpenBSD 7.1-beta (GENERIC.MP) #422: Tue Mar 15 11:28:22
> MDT 2022
>
> [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>
> Architecture: OpenBSD.amd64
> Machine : amd64
> >Description:
> A few minutes into regular use after resume, the kernel panicked with
> a page fault. The machine is a Thinkpad X250, running a recent snapshol.
> I was using X with two xterms open (running radare2 and vim). The wifi
> interface was enabled but not connected to any network, as far as I am
> aware. I was riding a public bus at the time, so any kind of network
> could have been passing by. I recall similar crashes in the past and it
> *seems* that they like to happen after a suspend (close lid) and resume,
> though suspend usually works fine.
>
> Screenshots of ddb output are attached.
The important bit from the screenshots is:
Stopped at _rb_insert+0x27d: cmpq %r12,0x8(%rcx)
We get to _rb_insert via ieee80211_setup_node() when a beacon is received
and we want to create a new entry for this node in the nodes tree.
Reading objdump -S output, to me it looks like the crash happens here:
static inline void
rbe_insert_color(const struct rb_type *t, struct rb_tree *rbt,
struct rb_entry *rbe)
{
struct rb_entry *parent, *gparent, *tmp;
while ((parent = RBE_PARENT(rbe)) != NULL &&
RBE_COLOR(parent) == RB_RED) {
gparent = RBE_PARENT(parent);
if (parent == RBE_LEFT(gparent)) { <-- crash
If my assumption is correct, the failing memory access would be
gparent->rbt_left which matches offset 0x8 of the failing instruction.
It seems the RB tree is in an invalid state. If the parent is red then
there should be a grand-parent. I don't know how this can happen.
Does anyone have an idea?