Source-Changes-D archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CVS commit: src/sys/net



On Sat, Apr 04, 2009 at 09:04:36PM +0900, Masao Uebayashi wrote:

> I think you have to take softnet_lock, since bridge_forward() is called from
> softint where not lock is held.

There is a minor problem with this. If you look elsewhere in the networking
code softints and callouts are usually created with flag SOFTINT_MPSAFE, and
if required the handler takes kernel_lock directly.

The main reason for this is as follows. In the socket layer and pretty much
eveywhere else we take these locks in the order softnet_lock -> kernel_lock.
It is permissible to mix ordering between adaptive mutexes/rwlocks and
kernel_lock. So you can also safely go kernel_lock -> softnet_lock. However,
this causes the deadlock detection code in mutex_onproc() to fire when there
is lock contention, leading to a context switch storm.

> > -   src_if = m->m_pkthdr.rcvif;
> > +   if ((sc->sc_if.if_flags & IFF_RUNNING) == 0)
> > +           return;
> >  
> > -   sc->sc_if.if_ipackets++;
> > -   sc->sc_if.if_ibytes += m->m_pkthdr.len;
> > +   s = splbio();
> > +   while (1) {
> > +           IFQ_POLL(&sc->sc_if.if_snd, m);
> > +           if (m == NULL)
> > +                   break;
> > +           IFQ_DEQUEUE(&sc->sc_if.if_snd, m);
> >  
> 
> Why splbio(), not splnet()???

splbio, splnet, spltty etc are aliases for splvm.


Home | Main Index | Thread Index | Old Index