ok

> On 4 Dec 2015, at 8:48 PM, Martin Pieuchot <[email protected]> wrote:
> 
> Now that if_start() will take the KERNEL_LOCK itself if the driver is
> not marked as IFXF_MPSAFE if_enqueue() is almost mpsafe. 
> 
> The missing piece is addressed by the diff below.  We want to ensure
> bridge_output() is called with the KERNEL_LOCK() held.
> 
> ok?
> 
> Index: net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.420
> diff -u -p -r1.420 if.c
> --- net/if.c  3 Dec 2015 16:27:32 -0000       1.420
> +++ net/if.c  4 Dec 2015 10:28:30 -0000
> @@ -626,8 +626,12 @@ if_enqueue(struct ifnet *ifp, struct mbu
>       unsigned short mflags;
> 
> #if NBRIDGE > 0
> -     if (ifp->if_bridgeport && (m->m_flags & M_PROTO1) == 0)
> -             return (bridge_output(ifp, m, NULL, NULL));
> +     if (ifp->if_bridgeport && (m->m_flags & M_PROTO1) == 0) {
> +             KERNEL_LOCK();
> +             error = bridge_output(ifp, m, NULL, NULL);
> +             KERNEL_UNLOCK();
> +             return (error);
> +     }
> #endif
> 
>       length = m->m_pkthdr.len;
> 

Reply via email to