Index | Thread | Search

From:
Mike Larkin <mlarkin@nested.page>
Subject:
Re: sys/octeon: cleanup all interrupts
To:
tech@openbsd.org, visa@openbsd.org
Date:
Thu, 16 Apr 2026 09:03:14 -0700

Download raw body.

Thread
On Thu, Apr 16, 2026 at 01:04:23PM +0200, Kirill A. Korinsky wrote:
> tech@, visa@,
>
> I think I finally figured out why my small octen is hangs randomly under
> load, it was very long week of printf-based debugin.
>
> So, octciu_next_irq() operates on a uint64_t pending interrupt bitmap, and
> irq spans the full 0..63 range. Using 1u << irq therefore builds a 32 bit
> mask for a 64 bit word; once irq >= 32, the selected pending bit is no
> longer cleared correctly.
>
> The immediate consequence is loss of forward progress in the dispatcher
> loop: the same interrupt can remain logically pending in the local copy of
> isr, the loop can revisit it indefinitely, and the CPU can remain trapped in
> interrupt handling.
>
> After I applied that, I can't hang it anymore on my tests.
>
> Ok? Probably it worth to include into 7.9
>

THANKS for finding this. I hope this fixes my USG as well which also randomly
hangs. I'll apply and do some builds.

> Index: sys/arch/octeon/dev/octciu.c
> ===================================================================
> RCS file: /home/cvs/src/sys/arch/octeon/dev/octciu.c,v
> diff -u -p -r1.20 octciu.c
> --- sys/arch/octeon/dev/octciu.c	4 Apr 2026 09:00:20 -0000	1.20
> +++ sys/arch/octeon/dev/octciu.c	16 Apr 2026 10:54:54 -0000
> @@ -452,7 +452,7 @@ octciu_next_irq(uint64_t *isr)
>  	: "=r" (tmp) : "0" (tmp));
>
>  	irq = 63u - tmp;
> -	*isr &= ~(1u << irq);
> +	*isr &= ~(1ULL << irq);
>  	return irq;
>  }
>
>
>
> --
> wbr, Kirill
>