Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Mar 2009 15:27:12 +0100
From:      Paolo Pisati <p.pisati@oltrelinux.com>
To:        Robert Watson <rwatson@FreeBSD.org>
Cc:        Barney Cordoba <barney_cordoba@yahoo.com>, current@freebsd.org
Subject:   Re: Interrupt routine usage not shown by top in 8.0
Message-ID:  <49BFB340.9050909@oltrelinux.com>
In-Reply-To: <alpine.BSF.2.00.0903171359590.55043@fledge.watson.org>
References:  <929422.83072.qm@web63908.mail.re1.yahoo.com> <alpine.BSF.2.00.0903171359590.55043@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Robert Watson wrote:
>
> On Fri, 13 Mar 2009, Barney Cordoba wrote:
>
>> Can you clarify the difference between using a fast irq and then 
>> launching a thread (as em does) versus using an MPSAFE interrupt as 
>> most other drivers (particularly bge and ibg) use?
>>
>> How do they differ in terms of how they are called and executed?
>
> I agree that the code there looks inconsistent in when it uses fast vs 
> regular mpsafe interrupts, Scott may be able to shed more light on 
> this.  I'm especially confused by:
>
> #if __FreeBSD_version < 700000
>         if ((error = bus_setup_intr(dev, adapter->res[0],
>             INTR_TYPE_NET | INTR_FAST, em_irq_fast, adapter,
> #else
>         if ((error = bus_setup_intr(dev, adapter->res[0],
>             INTR_TYPE_NET, em_irq_fast, NULL, adapter,
> #endif
>
> This is in what I took to be the INTR_FAST registration, so I would 
> expect also to see INTR_FAST in the mask for that second bit.
perhaps i misunderstood your question, but i'll try to explain a bit:

before 7.0, bus_setup_intr() took just one function thus you could have an INTR_FAST or an INTR_MPSAFE handler, and you choose the kind of handler via a flag (INTR_FAST in this case).

after 7.0, bus_setup_intr() took 2 functions, thus you could have:
a fast handler (aka filter), or an ithread handler (aka mpsafe), or
a fast + ithread handler (available only with INTR_FILTER turned on).

in bus_setup_intr() the first function pointer is for the filter side of the handler, while the second pointer is for the ithread part, and if you declare both you can filter events (interrupts) and call the rest of the device driver (the ithread part) after the filter has recognized and acknowledged&masked the interrupt.

-- 

bye,
P.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?49BFB340.9050909>