Freeze CAM SIM when request is postponed due to MaxCmdSN.
This allows to avoid resource allocation (especially offload) for requests that can not be executed at this time any way. MFC after: 2 weeks
This commit is contained in:
parent
eb89b3878c
commit
d24ded19b4
@ -231,14 +231,16 @@ iscsi_session_send_postponed(struct iscsi_session *is)
|
||||
|
||||
ISCSI_SESSION_LOCK_ASSERT(is);
|
||||
|
||||
while (!STAILQ_EMPTY(&is->is_postponed)) {
|
||||
request = STAILQ_FIRST(&is->is_postponed);
|
||||
if (STAILQ_EMPTY(&is->is_postponed))
|
||||
return;
|
||||
while ((request = STAILQ_FIRST(&is->is_postponed)) != NULL) {
|
||||
postpone = iscsi_pdu_prepare(request);
|
||||
if (postpone)
|
||||
break;
|
||||
return;
|
||||
STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next);
|
||||
icl_pdu_queue(request);
|
||||
}
|
||||
xpt_release_simq(is->is_sim, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -252,6 +254,8 @@ iscsi_pdu_queue_locked(struct icl_pdu *request)
|
||||
iscsi_session_send_postponed(is);
|
||||
postpone = iscsi_pdu_prepare(request);
|
||||
if (postpone) {
|
||||
if (STAILQ_EMPTY(&is->is_postponed))
|
||||
xpt_freeze_simq(is->is_sim, 1);
|
||||
STAILQ_INSERT_TAIL(&is->is_postponed, request, ip_next);
|
||||
return;
|
||||
}
|
||||
@ -339,8 +343,9 @@ iscsi_session_cleanup(struct iscsi_session *is, bool destroy_sim)
|
||||
/*
|
||||
* Remove postponed PDUs.
|
||||
*/
|
||||
while (!STAILQ_EMPTY(&is->is_postponed)) {
|
||||
pdu = STAILQ_FIRST(&is->is_postponed);
|
||||
if (!STAILQ_EMPTY(&is->is_postponed))
|
||||
xpt_release_simq(is->is_sim, 1);
|
||||
while ((pdu = STAILQ_FIRST(&is->is_postponed)) != NULL) {
|
||||
STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next);
|
||||
icl_pdu_free(pdu);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user