Date: Thu, 18 Sep 2003 14:40:17 +0300 (EET DST) From: Aaro Koskinen <akoskine@cc.helsinki.fi> To: gallatin@cs.duke.edu Cc: freebsd-hackers@freebsd.org Subject: Re: PCI interrupts passing DMA Message-ID: <Pine.OSF.4.58.0309181412540.10256@sirppi.helsinki.fi>
next in thread | raw e-mail | index | archive | help
Hello, > I was toying with a programmable PCI card and wrote some code > which DMAs a small block of data to the host, and then interrupts the > host. The host checks the end of the block, and sees if it gets the > value it expects. > On an SMP P4 (hyperthreaded, with ServerWorks chipset) FreeBSD 4.8 UP, > and on Linux 2.4.18, there is a huge delay between the interrupt being > handled, and the DMA finally completing (from the host's perspective). > Time enough for the interrupt handler to be triggered 3 or 4 times, > and to print "foo" to a serial console line each time it notices > that the DMA has not completed. > > The interesting thing is that on FreeBSD 4.8SMP, and FreeBSD > 5.1-current (SMP), the data has arrived by the time the interrupt > handler is called. [...] > My question is: What the heck could the SMP kernel be doing which > causes the DMA to "complete" faster? The chipset probably uses PCI bus (MSI-like mechanism) to deliver the interrupt from the IO APIC to the local APIC, which means that the PCI bridge(s) must complete the DMA transfer before the interrupt is delivered to preserve the write order. In PIC mode, the interrupt is delivered by the wire and it has no effect on pending writes. A common solution is that the interrupt handler must perform a read from the device to the force flushing of buffers. A. -- Aaro Koskinen E-mail: aaro@iki.fi "I'm the ocean, I'm the giant undertow." http://www.iki.fi/aaro
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.OSF.4.58.0309181412540.10256>