Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 Mar 2007 15:11:37 -0700
From:      John Polstra <jdp@polstra.com>
To:        Aniruddha Bohra <bohra@cs.rutgers.edu>
Cc:        freebsd-net@freebsd.org
Subject:   Re: ether_input question
Message-ID:  <45FC6799.2030101@polstra.com>
In-Reply-To: <45FA98DD.3080205@cs.rutgers.edu>
References:  <45FA98DD.3080205@cs.rutgers.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
Aniruddha Bohra wrote:
> Hi,
> In two drivers, fxp and em, the assumptions about entering the 
> ether_input routine are different.
>  From em_rxeof:
> 
> #ifdef DEVICE_POLLING
> EM_UNLOCK()
> (*ifp->if_input)()
> EM_UNLOCK()
> #else
>  (*ifp->if_input)()
> #endif
> 
> While in fxp:
> 
> FXP_UNLOCK()
> (*ifp->if_input)()
> FXP_LOCK()
> 
> 
> My question is :
> Does ether_input() assume it is the only thread executing the code? If 
> it is the case, what is the
> reason for dropping the lock in the DEVICE_POLLING case?

There is actually no difference between these cases.  In the 
!DEVICE_POLLING case, the em driver does not hold its driver lock when 
it calls em_rxeof.  The call is made from em_handle_rxtx, where you'll 
see that the driver has not acquired a lock when it calls em_rxeof. 
Thus, in all cases the if_input function is called without holding the 
driver lock.

John



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?45FC6799.2030101>