tech-net archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: apparently missing locking in if_bnx.c
We were able to produce the same behavior with the intel device driver (wm).
It appears this problem is in multiple drivers.
-Bev
On Mar 6, 2012, at 3:31 AM, Manuel Bouyer wrote:
> On Mon, Mar 05, 2012 at 03:45:10PM -0500, Greg Troxel wrote:
>>
>> My colleague Beverly Schwartz has found a problem in if_bnx.c where
>> bnx_start takes packets off ifp->if_snd without a mutex. bnx_start can
>> be called from multiple places (the output routine, the tx complete
>> routine, and the allocate-more-tx-buffers routine). We have in fact
>> seen calls to bnx_start while it is running, resulting in the packet
>> being queued twice and a double free. With pure netbsd-6, we can lock
>> up a machine (i386) with multiple bnx interfaces by running multiple
>> transfers in both directions on multiple interfaces at once. With the
>> following patch, it is solid. (I am pretty sure we are running with
>> only 1 core.)
>>
>> I'm sending this as early as I can, because whatever change we converge
>> on will need to be pulled up to netbsd-6 and I'd like some more eyes on
>> it.
>>
>> There are a splnet calls around ifq_enqueue. So perhaps the bug is
>> instead that bnx_start is somehow called not at splnet. But bnx_intr
>> should be running at splnet, which should serialize access.
>
> Yes, bnx_start() should be called at splnet(), or raise to splnet() itself.
> This driver runs under the KERNEL_LOCK() anyway, so no mutex is required,
> ony splnet().
>
> --
> Manuel Bouyer <bouyer%antioche.eu.org@localhost>
> NetBSD: 26 ans d'experience feront toujours la difference
> --
Home |
Main Index |
Thread Index |
Old Index