Fix extremely slow operation with data digests enabled. This was caused

by receive code waiting for data digest even when the data segment was
empty.  It didn't actually read it, but it waited until those four bytes
become available in the socket buffer, i.e. until any other PDU (such as NOP)
came in.

PR:		kern/185240
MFC after:	2 weeks
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Edward Tomasz Napierala 2013-12-30 12:18:06 +00:00
parent 3dc8dee92e
commit 68ca2e2ebb

View File

@ -239,7 +239,7 @@ icl_pdu_size(const struct icl_pdu *response)
icl_pdu_padding(response);
if (response->ip_conn->ic_header_crc32c)
len += ISCSI_HEADER_DIGEST_SIZE;
if (response->ip_conn->ic_data_crc32c)
if (response->ip_data_len != 0 && response->ip_conn->ic_data_crc32c)
len += ISCSI_DATA_DIGEST_SIZE;
return (len);
@ -615,7 +615,7 @@ icl_conn_receive_pdu(struct icl_conn *ic, size_t *availablep)
break;
ic->ic_receive_state = ICL_CONN_STATE_DATA_DIGEST;
if (ic->ic_data_crc32c == false)
if (request->ip_data_len == 0 || ic->ic_data_crc32c == false)
ic->ic_receive_len = 0;
else
ic->ic_receive_len = ISCSI_DATA_DIGEST_SIZE;