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
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