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:
Alexander Motin 2017-02-17 04:34:17 +00:00
parent 5b338bc073
commit 4c9ea0ced9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=313852

View file

@ -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);
}