I'm submitting this fast-track for Cathy Zhou. The timer is set for
April 14th, 2008.
Data Fast-Path for Softmac
==========================
Release binding: Patch
Summary
=======
This case introduces a GLDv3 fast-path architecture for softmac devices.
The softmac architecture defined by PSARC/2006/499 initially contained
a fast-path which was not delivered with Clearview UV as discussed in
section 2.1 of PSARC/2008/002. PSARC/2008/002 states that an alternative
fast-path architecture would be defined in a future case, and that is
this case.
Details
=======
- Data fast-path and slow-path
Currently, the softmac module discovers each legacy network device
and registers (soft)MACs to the GLDv3 framework on behalf of these
legacy devices. Whenever a softMAC is used, the softmac module opens
a DLIOCRAW stream over the legacy device, and enables DL_PROMISC_SAP
promiscuous mode on the stream. This DLIOCRAW stream is then shared
by all data packets sent and received over this softMAC. We call this
DLIOCRAW stream "shared lower stream".
Although the above is consistent with the existing GLDv3 model and
requires less changes to the GLDv3 framework, it introduces
unacceptable performance regression over legacy devices, because of
the extra data demultiplexing and filtering processing in the GLDv3
DLS/MAC layer.
Therefore, this case proposes a softmac data fast-path architecture
which is less intrusive to the current Solaris network architecture
and will address the performance issue of the above approach:
Specifically, when the fast-path is used, a dedicated lower-stream
will be opened over the legacy device for each IP/ARP (upper-)stream
over the softMAC, and all DLPI messages (including control messages
and data messages) will be exchanged between the upper-stream and
the corresponding lower-stream directly. Therefore, the data
demultiplexing, filtering and classification processing will be done
by the lower-stream, and the GLDv3 DLS/MAC layer processing will be
no longer needed.
Note that some GLDv3 features requires the GLDv3 DLS/MAC layer
processing to not be bypassed to assure its function correctness.
For example, softmac fast-path must be disabled to support GLDv3
VNIC functionality. As the result, we propose: By default, the
softmac fast-path mode will be used to assure the performance; MAC
clients will be able to request to disable the softmac fast-path
mode to support certain features, and if that succeeds, the system
will fallback to the existing softmac data-path model (called slow-path).
The details of the new softmac data fast-path model is stated as below
(note that the softmac fast-path will only be used for the IP/ARP
streams over softMACs, which is the case performance matters most):
1. When a stream (including a VLAN stream) is opened on a softMAC,
the softmac module will takes over the DLPI processing on this
stream;
2. For IP/ARP streams over a softMAC, softmac data fast-path will be
used by default, unless fast-path is disabled by any MAC client
explicitly. The softmac module first identifies an IP/ARP stream
by seeing whether there is a SIOCSLIFNAME ioctl sent from upstream,
if there is one, this stream is either an IP or an ARP stream
and will use fast-path potentially;
3. When the softmac fast-path is used, an dedicated lower-stream will
be setup for each IP/ARP stream (1-1 mapping). From that point on,
all control and data messages will be exchanged between the IP/ARP
upper-stream and the legacy device through this dedicated
lower-stream. As a result, the DLS/MAC layer processing in GLDv3
will be skipped, and this greatly improves the performance;
4. When the softmac data fast-path is disabled by a MAC client (e.g.,
by a VNIC), all the IP/ARP upper streams will try to switch from
the fast-path to the slow-path. The dedicated lower-stream will be
destroyed, and all the control and data-messages will go through
the existing GLDv3 code path and (in the end) the shared
lower-stream;
5. On the other hand, when the last MAC client cancels its fast-path
disable request, all the IP/ARP streams will try to switch back to
the fast-path mode;
Step 5 and 6 both rely on the data-path mode switching process
described below:
1) To switch the softmac data-path mode (between fast-path and
slow-path), softmac will first send a DL_NOTE_REPLUMB
DL_NOTIFY_IND message upstream over each IP/ARP streams that
needs data-path mode switching;
2) When IP receives this DL_NOTE_REPLUMB message, it will bring
down all the IP interfaces on the corresponding ill (IP Lower
level structure), and bring up those interfaces over again;
this will in turn cause the ARP to "replumb" the interface.
During the replumb process, both IP and ARP will send
downstream the necessary DL_DISABMULTI_REQ and DL_UNBIND_REQ
messages and cleanup the old state of the underlying softMAC,
following with the necessary DL_BIND_REQ and DL_ENABMULTI_REQ
messages to setup the new state. Between the cleanup and re-setup
process, IP/ARP will also send down a DL_NOTE_REPLUMB_DONE
DL_NOTIFY_CONF messages to the softMAC to indicate the
*switching point*;
3) When softmac receives the DL_NOTE_REPLUMB_DONE message, it
either creates or destroys the dedicated lower-stream (depending
on which data-path mode the softMAC switches to), and change
the softmac data-path mode. From then on, softmac will process
all the succeeding control messages (including the DL_BIND_REQ and
DL_ENABMULTI_REQ messages) and data messages based on new
data-path mode.
Interfaces
==========
- mac_fastpath_disable()/mac_fastpath_enable() (Consolidation Private)
Two MAC client interfaces will be added:
int mac_fastpath_disable(mac_handle_t);
This function will be called when a mac client requires to disable
the softmac data fast-path over a specific mac. It will return errno
in case that the fast-path is failed to be disabled. If the given mac
is a mac over a GLDv3 device, 0 (success) will be directly returned.
void mac_fastpath_enable(mac_handle_t);
The mac_fastpath_enable() function will be called when a mac client
cancels its softmac fast-path disabling requests over a specific mac.
When the last fast-path disabling request is canceled, the underlying
softmac will try to reenable the data fast-path. It is not considered
as a failure if fast-path fails to be reenabled, as that will only
have performance impact.
- dld_str_open()/dld_str_close()/dld_str_private() (Project Private)
Three new dls interfaces will be added:
int dld_str_open(queue_t *, dev_t *, void *opaque);
This function will be called by softmac to setup the dld stream
related structures, which will be used when softmac fast-path is
not used. An opaque pointer will be passed into this function
to keep softmac specific state associated with the given stream.
int dld_str_close(queue_t *);
This function will be called by softmac to finish up the dld stream
operation and destroy dld related structures.
void *dld_str_private(queue_t *);
This function will be called to query the opaque pointer associated
with the given stream.
- the mac_capab_legacy_t structure (Project Private)
The mac_capab_legacy_t structure was introduced by PSARC/2008/002,
it is the data pointer of the MAC_CAPAB_LEGACY MAC capability.
This case proposes to add the following fields to the data structure:
/*
* Info and callbacks of legacy devices.
*/
typedef struct mac_capab_legacy_s {
...
int (*ml_fastpath_disable)(void *);
void (*ml_fastpath_enable)(void *);
boolean_t (*ml_active_set)(void *);
void (*ml_active_clear)(void *);
} mac_capab_legacy_t;
The ml_fastpath_enable() and ml_fastpath_disable() callbacks will be
called as the result of first mac_fastpath_disable() and last
mac_fastpath_enable() request on a particular softMAC.
Further, to assure there is at most one exclusive active MAC consumer
at a time (see [3]), we must prevent other exclusive active MAC
consumers when there is already IP/ARP stream on a softMAC, and prevent
IP/ARP streams if there is already exclusive active MAC consumers.
This is done by the mac module calling the ml_active_set() and
ml_active_clear() callbacks to inform softmac the existence and
disappearance of an exclusive active MAC consumer.
- the DL_NOTIFY_CONF primitive (M_PROTO type) (Project Private)
The DL_NOTIFY_CONF primitive is similar to DL_NOTIFY_IND, but it is
notification sent from upstream (from a DLPI consumer to a DLPI
provider).
DL_NOTIFY_CONF is a M_PROTO message with the following payload:
typedef struct {
t_uscalar_t dl_primitive; /* set to DL_NOTIFY_CONF */
uint32_t dl_notification; /* Which notification? */
} dl_notify_conf_t;
The only dl_notification type we will support is DL_NOTE_REPLUMB_DONE.
- the DL_NOTE_REPLUMB DL_NOTIFY_IND message (Project Private)
As described above, the DL_NOTE_REPLUMB message is sent by softmac
to inform the IP/ARP upstream to "replumb" the stream.
References
==========
[1] PSARC 2006/499 Clearview Nemo unification and vanity naming -
http://sac.sfbay/PSARC/2006/499/
[2] PSARC 2008/002 Clearview UV Updates - http://sac.sfbay/PSARC/2008/002/
[3] PSARC 2005/207 Clearview for Nemo - http://sac.sfbay/PSARC/2005/207/