Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 Apr 2017 03:13:04 -0700
From:      Mark Millard <markmi@dsl-only.net>
To:        Tom Vijlbrief <tvijlbrief@gmail.com>
Cc:        ronald-lists@klop.ws, FreeBSD Current <freebsd-current@freebsd.org>, freebsd-arm <freebsd-arm@freebsd.org>, sobomax@freebsd.org
Subject:   Re: Sendmail eats CPU on r317039 [after -r316874 it may be -r316951 and -r316973 are not enough to fix everything]
Message-ID:  <56DF611E-E797-4D48-ADA4-0CFED35F2B2E@dsl-only.net>
In-Reply-To: <CAOQrpVf1_35UZTe19JQ3hUKgGVPkcy1uaEmz%2BgTeeFK9jCbpSA@mail.gmail.com>
References:  <CAOQrpVcMaJMdumOKGkUxMHPD-rGWQHbaLm3EsWagJp2wt_8KWg@mail.gmail.com> <91A4570B-69EE-4462-9C60-205C66267599@dsl-only.net> <7AD329E1-2828-42EB-9A14-B44E357CC199@dsl-only.net> <CAOQrpVeFFuFxwPjR93Uw7BkmmXu=u=E_2T0gNfd8ZidNW173VA@mail.gmail.com> <CAOQrpVf1_35UZTe19JQ3hUKgGVPkcy1uaEmz%2BgTeeFK9jCbpSA@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2017-Apr-20, at 2:31 AM, Tom Vijlbrief <tvijlbrief at gmail.com> =
wrote:

>> Op wo 19 apr. 2017 09:11 schreef Tom Vijlbrief <tvijlbrief at =
gmail.com>:
>> I'm currently rebuilding world and kernel on a just completed SVN =
checkout.
>>=20
>> Note that the normal sendmail daemon which listens for incoming =
traffic does NOT loop.
>>=20
>> The sendmail instance which tries local delivery (echo Hi | mail =
root) or the msp_queue instance is looping.
>>=20
>> It might be an arm64 specific issue, but a few weeks ago this was not =
an issue.
>>=20
> I just completed a full rebuild on the Pine64 and I cannot reproduce =
the problem, so there is probably no issue anymore...
>=20
> (Except the spurious interrupts issue)

FYI:

I've not seen a spurious interrupts notification on
arm64/aarch64.

I have seen such on cortex-a7 (the armv6/7 examples
that I have access to are this: so just armv7).


For cortex-a7 I build with the following local experiment
for information gathering:

# svnlite diff /usr/src/sys/arm/arm/gic.c
Index: /usr/src/sys/arm/arm/gic.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- /usr/src/sys/arm/arm/gic.c	(revision 317015)
+++ /usr/src/sys/arm/arm/gic.c	(working copy)
@@ -672,9 +672,13 @@
=20
 	if (irq >=3D sc->nirqs) {
 #ifdef GIC_DEBUG_SPURIOUS
+#define EXPECTED_SPURIOUS_IRQ 1023
+	    if (irq !=3D EXPECTED_SPURIOUS_IRQ) {
 		device_printf(sc->gic_dev,
-		    "Spurious interrupt detected: last irq: %d on =
CPU%d\n",
+		    "Spurious interrupt %d detected of %d: last irq: %d =
on CPU%d\n",
+		    irq, sc->nirqs,
 		    sc->last_irq[PCPU_GET(cpuid)], PCPU_GET(cpuid));
+            }
 #endif
 		return (FILTER_HANDLED);
 	}
@@ -720,6 +724,16 @@
 	if (irq < sc->nirqs)
 		goto dispatch_irq;
=20
+	if (irq !=3D EXPECTED_SPURIOUS_IRQ) {
+#undef EXPECTED_SPURIOUS_IRQ
+#ifdef GIC_DEBUG_SPURIOUS
+		device_printf(sc->gic_dev,
+		    "Spurious end interrupt %d detected of %d: last irq: =
%d on CPU%d\n",
+		    irq, sc->nirqs,
+		    sc->last_irq[PCPU_GET(cpuid)], PCPU_GET(cpuid));
+#endif
+	}
+
 	return (FILTER_HANDLED);
 }

It has never reported a non-1023 IRQ.

Quoting arm_gic_architecture_specification.pdf (various places about the =
1023 IRQ figure):

	=E2=80=A2 A processor reads the GICC_IAR and obtains the =
interrupt ID 1023, indicating a spurious interrupt. The processor can =
return from its interrupt service routine without writing to its =
GICC_EOIR.

The spurious interrupt ID indicates that the original interrupt is no =
longer pending, typically because another target processor is handling =
it.

and . . .

	=E2=80=A2 1023  This value is returned to a processor, in =
response to an interrupt acknowledge, if there is no pending interrupt =
with sufficient priority for it to be signaled to the processor.

and . . .

                                                GICC_IAR read  =
GICC_CTLR.AckCtl  Returned interrupt ID
Highest priority pending interrupt^a is Group 0 Non-secure     x         =
        Interrupt ID 1023

No pending interrupts^a                         x              x         =
        Interrupt ID 1023

Interrupt signaling of the required interrupt group by CPU interface =
disabled
                                                x              x         =
        Interrupt ID 1023

^a. Of sufficient priority to be signaled to the processor if signaling =
by the CPU interface is enabled.

=3D=3D=3D
Mark Millard
markmi at dsl-only.net




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?56DF611E-E797-4D48-ADA4-0CFED35F2B2E>