The code for UV fastpath is mostly done and I'd like to send the code 
review request soon. Before that, I'd like to first run through the alias 
a change I am going to make regarding the 
dls_active_set()/dls_active_clear() calls.

In the current Nevada, dls_active_set() is called whenever a active 
operation is done (BIND_REQ, ENABMULTI_REQ ...), and *active* is a flag 
that will only be cleared when the stream is closed. Note that "active" 
state means that the underlying mac is started, therefore, for softmac, 
the shared-lower-stream is bound (DL_IDLE)

     dls_active_set()->dls_mac_active_set()->
         mac_unicast_primary_add()->mac_start()->softmac_m_start()->
         softmac_send_bind_req()

This would cause performance problem for UV fastpath. Assume that ce0 is 
plumbed while there is a VNIC created over ce0 (so slow-path is used). 
Then even when the VNIC is deleted and fastpath can be used, the "active" 
state will stay and the shared-lower-stream is always bound, as long as 
the interface is kept plumbed and IP/ARP stream is kept open. At that 
point, two IP/ARP dedicated-lower streams and one shared-lower stream will 
be in the DL_IDLE state, and performance will hurt because of this extra 
shared-lower stream.

Therefore, I changed the active to be a reference count instead of a flag, 
and dls will call dls_active_clear() whenever it can (for each 
DL_DISABMULTI_REQ, DL_UNBIND_REQ etc, when the request does succeed). It 
is possible that those DLPI requests will never be sent before dls_close() 
though. In that case, dls_close() will clear all the references left on 
the stream.

Let me know if you have any concern on this.

Thanks
- Cathy

Reply via email to