svn commit: r260083 - head/sys/dev/iscsi
Edward Tomasz Napierala
trasz at FreeBSD.org
Mon Dec 30 12:18:07 UTC 2013
Author: trasz
Date: Mon Dec 30 12:18:06 2013
New Revision: 260083
URL: http://svnweb.freebsd.org/changeset/base/260083
Log:
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
Modified:
head/sys/dev/iscsi/icl.c
Modified: head/sys/dev/iscsi/icl.c
==============================================================================
--- head/sys/dev/iscsi/icl.c Mon Dec 30 09:04:06 2013 (r260082)
+++ head/sys/dev/iscsi/icl.c Mon Dec 30 12:18:06 2013 (r260083)
@@ -239,7 +239,7 @@ icl_pdu_size(const struct icl_pdu *respo
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
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;
More information about the svn-src-all
mailing list