[net] protecting interfaces from races between control and data ?
Scott Long
scott4long at yahoo.com
Wed Aug 7 20:13:44 UTC 2013
On Aug 7, 2013, at 2:00 PM, Andre Oppermann <andre at freebsd.org> wrote:
> On 07.08.2013 09:18, Luigi Rizzo wrote:
>> On Wed, Aug 7, 2013 at 5:26 AM, Mike Karels <mike at karels.net <mailto:mike at karels.net>> wrote:
>> Jumping to (near) the end of the thread, I like most of Andre's proposal.
>> Running with minimal locks at this layer is an admirable goal, and I agree
>> with most of what was said. I have a few observations on the general changes,
>> or related issues:
>>
>> There was mention of taskqueues. I think that with MSI-X, taskqueues
>> should not be needed or used. More specifically, having separate ithreads
>> and taskqueues, with ithreads deferring to taskqueues after some limit, makes
>> sense only for MSI and legacy interrupts. With MSI-X, an interrupt thread
>> should be able to process packets indefinitely with sufficient CPU resources,
>> and there is no reason to context switch to a different thread periodically.
>> A periodic "yield" might be reasonable, but if it is necessary, small packet
>> performance will suffer. However, most of this is internal to the driver.
>>
>>
>> i am not completely clear on what is the difference between ithreads and taskqueues.
>
> The difference between ithreads and taskqueues is actually very small and mostly in
> name and how they're set up and kicked off when work is to be done. Both are real
> kernel threads. Most of the confusion, also in Mikes response, seems to come from
> the name ithreads for interrupt-threads. However an ithread is not running in
> interrupt context, only the interrupt handler (called filter) does. Scheduling a
> taskqueue from an ithread is a bit round-about but commonly done. The bus_setup_intr(9)
> man page isn't helping to clear up the confusion.
>
I think it might still be the case that threads are not allowed to sleep. That means
no sx locks and no malloc(M_WAITOK), along with the obvious tsleep/msleep. Taskqueues
have no such restriction.
An even rore relevant difference is that taskqueues have a much stronger
management API. Ithreads can only be scheduled by generating a hardware interrupt,
can only be drained by calling bus_teardown_intr(), and cannot be paused. Taskqueues
give you direct access to this control.
Scott
More information about the freebsd-net
mailing list