mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-19 03:31:26 +00:00
srpt/session-management.txt: Document how sessions are managed by the ib_srpt driver
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@5358 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
45
srpt/session-management.txt
Normal file
45
srpt/session-management.txt
Normal file
@@ -0,0 +1,45 @@
|
||||
ib_srpt and session management
|
||||
==============================
|
||||
|
||||
The following actions related to SRP sessions can all occur concurrently:
|
||||
* IB communication manager (CM) invokes srpt_cm_handler().
|
||||
* HCA driver invokes the queue pair (QP) completion handler srpt_completion().
|
||||
* HCA driver invokes the QP async event handler srpt_qp_event().
|
||||
* HCA transfers data between initiator and target via RDMA.
|
||||
* srpt_compl_thread() polls the QP.
|
||||
* SCST core invokes one of the callback functions defined in srpt_template().
|
||||
|
||||
The actions that occur over the lifetime of a session are as follows:
|
||||
- A REQ message is received from the initiator.
|
||||
- srpt_cm_req_recv() is invoked and allocates a queue pair and creates a
|
||||
completion thread.
|
||||
- If the connection request is not accepted, a REJ message is sent and
|
||||
srpt_close_ch() is invoked. The srpt_close_ch() call causes the completion
|
||||
thread to stop and the allocated resources to be freed asynchronously.
|
||||
- If the connection request is accepted a REP message is sent to the initiator.
|
||||
- Once an RTU message is received from the initiator, srpt_cm_rtu_recv() is
|
||||
invoked. That function changes the queue pair state into RTS, the channel
|
||||
state into CH_LIVE and wakes up the completion thread.
|
||||
- RDMA communication starts and continues until either a DREQ message is
|
||||
received or sent. The function ib_send_cm_dreq() can get invoked
|
||||
either because a target port is disabled or from inside the
|
||||
srpt_close_session() function.
|
||||
- After a DREQ has been sent either a DREP will be received
|
||||
(srpt_cm_drep_recv()) or the TimeWait state will be reached and will be left
|
||||
(srpt_cm_timewait_exit()).
|
||||
- srpt_cm_dre[pq]_recv() and srpt_cm_timewait_exit() all invoke
|
||||
srpt_close_ch().
|
||||
- srpt_close_ch() changes the channel state into CH_DISCONNECTING, the
|
||||
queue pair state into IB_QPS_ERR and queues a zero-length write.
|
||||
- Upon receipt of the zero-length write completion the channel state is
|
||||
changed into CH_DISCONNECTED. This is the last work completion so once the
|
||||
channel state has reached CH_DISCONNECTED it is guaranteed that the queue
|
||||
pair completion handler won't be invoked again and also that the completion
|
||||
handler won't call wake_up_process(ch->thread) anymore.
|
||||
- That channel state change causes the polling loop in the completion thread
|
||||
to stop and also triggers a call of scst_unregister_session().
|
||||
- Once scst_unregister_session() has finished srpt_unreg_sess() is invoked.
|
||||
- srpt_unreg_sess() destroys the CM ID and decrements the channel refcount.
|
||||
- Once the channel refcount drops to zero srpt_free_ch() is invoked which
|
||||
frees the queue pair and other IB resources.
|
||||
|
||||
Reference in New Issue
Block a user