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