| |
NAME : HCPQSEBK
DESCRIPTION: EQDIO HCPQSEND Queue Management Block
DSECT : QSEBK
FUNCTION : The QSEBK is an extension to the NICBK that is used for
managing HCPQSEND SEND_REQUESTs. HCPQSEND is used only for
EQDIO while the NICBK is used for both EQDIO and non-EQDIO
NICs. Keeping this information in a separate extension
avoids a large extension to the main NICBK when the NIC
is not EQDIO.
This control block is used in conjunction with the HCPQSEND
portion of the NICBK.
LOCATED BY : NICBK field NICQSEBK of the associated NICBK.
SLMBK field SLMQSEHD for QSEBK Mgt Queue.
QSEBK fields QSSEPREV/QSENEXT for QSEBK Mgt Queue.
CREATED BY : HCPIQHAP when a EQDIO adapter is added to a vSwitch.
DELETED BY : HCPIQHDP when a EQDIO adapter is deleted from a vSwitch.
REFERENCES : Requires GALPL
- an instance of GALPL is contained in this block.
SERIALIZED : NICQSLCK in the HCPQSEND portion of the associated NICBK
serializes the creation and destruction of this block
and updates to its pointer at NICQSEBK in the NICBK.
Updates to the QSEBK chain at SLMQSEHD in the SLMBK require
SLMQSLCK and NICQSLCK exclusive. Locking hierarchy requires
SLMQSLCK to be acquired first.
The incrementing of counters in this block could be
done using interlocked update and a share of NICQSLCK
if NICQSLCK exclusive isn't required for other reasons.
Therefore, all counter updates are done using interlocked
update even when NICQSLCK is held exclusive.
Updates to the SREBK chain pointers QSESRNXT and QSESRPRV,
and initialization and destruction of the hash table at
QSEHSHTB, are serialized by NICQSLCK.
QSEHSHTB hash table operations are serialized by GALLOCK,
which is defined as part of the hash table GALPL structure.
Addition or removal of an SREBK to/from the SREBK queue
and the hash table must be done under a single hold of
NICQSLCK exclusive. This is necessary to prevent an
opening for a deactivate event or timeout processing from
running between those steps.
RELOCATION CONSIDERATIONS : None
COMPATIBILITY AND MIGRATION CONCERNS : None
NOTES : NICQSLCK is in the destroyed state when NICQSEBK=0, there
is no QSEBK. NICQSEBK=0 indicates that the port is not
activated for HCPQSEND.
At the time this block is created and initialized, the
HCPQSEND section of the NICBK is also initialized.
This includes initializing NICQSLCK for use.
When this block is destroyed, HCPQSEND section of the NICBK
is also cleaned up. This includes destroying NICQSLCK.
Timeout checks by HCPIQHTC find the SREBK chains in the
QSEBKs by following a chain of registered QSEBKs anchored
in the SLMBK (SLMQSEHD). Timeout check processing holds
SLMQSLCK exclusive to protect the chain while it runs.
It acquires NICQSLCK exclusive for the processing of each
NIC's SREBK chain.
See HCPIQHAP prolog for a description of the QSEBK chain
anchored at SLMQSEHD of the SLMBK.
If a task holds SLMQSLCK, then it can safely traverse the
QSEBK chain. At each QSEBK it can safely traverse from
the QSEBK to NICBK using QSENICBK because it holds the
SLMQSLCK. This allows it to acquire NICQSLCK safely.
NICRFCTR is incremented in the associated NICBK while
the QSEBK is in the chain ensuring the structures remain
intact while the port is activated for HCPQSEND.
The sequence number NICQSSEQ is used to set a unique IPCSEQ
value for every SEND and SEND_REQUEST to the adapter
associated with the activated port. The sequence number
is also used to form the key for the hash table QSEHSHTB.
| |