Lost interrupts on SMP systems

John Baldwin jhb at FreeBSD.org
Fri Jan 14 11:41:27 PST 2005

On Friday 14 January 2005 01:17 pm, Peter Trifonov wrote:
> Hello John,
> > > I have found two similar problem reports:
> > > http://www.freebsd.org/cgi/query-pr.cgi?pr=i386/40274
> > > http://www.freebsd.org/cgi/query-pr.cgi?pr=i386/43852
> > > Some other bug reports also mention "device timeout", but
> >
> > they seem to
> >
> > > differ considerably from my case.
> >
> > Those two bug reports tend to focus on fxp(4) though and you
> > have xl(4) cards.
> I had the same problem with fxp's.  Initially I though that it was fxp
> driver problem (because xl0 worked fine),
> so I have replaced Intel NICs with 3COM ones, but nothing has changed. From
> this I guess that the problem is not in the NIC drivers.


> > I've gone ahead and committed the fix for the MPTable global
> > entries btw.  I don't think there is a routing or edge/level
> > problem though because the devices do work until you do a
> > ping flood.  One thing we can try is that Linux has a
> IMPORTANT: I can do flood ping over either of them without any problems (at
> least, if the system is booted with -p -v, I don't know why).
> They break down ONLY if flood ping is SIMULTANEOUSLY  performed over both
> of them.

More interrupt load that way, which would indicate maybe the bug Linux tries 
to work around except that your intpins are edge triggered. :(

> > workaround for an undocumented errata in at least some older
> > I/O APICs where a level triggered interrupt can accidentally
> > be delivered as edge triggered and end up not being properly
> > acknowledged.  However, you don't have any level triggered
> > interrupts, so I'm not sure that is applicable.
> Please let me know how can I help you with this problem.

I've included a little test program below that you can run as root to do 
arbitrary port reads (inb).  Please compile it and mail me the output of:

inb 0x4d0
inb 0x4d1


#include <err.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <vis.h>

#include <machine/cpufunc.h>

main(int ac, char **av)
	char repr[5];
	char *cp;
	int fd, port, value;

	if (ac != 2)
		errx(1, "A single argument is required.");
	port = strtoul(av[1], &cp, 0);
	if (*cp != '\0' || port < 0 || port > 65535)
		errx(1, "Invalid port number %s.", av[1]);
	fd = open("/dev/io", O_RDONLY);
	if (fd < 0)
		err(1, "Failed to open /dev/io");
	value = inb(port);
	vis(repr, value, VIS_NL | VIS_NOSLASH, 0);
	printf("inb(%s) = 0x%x = %dd = '%s'\n", av[1], value, value, repr);
	return (0);

John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org

More information about the freebsd-smp mailing list