From 77ff21039814a055ed336f46a7b8d237ef228427 Mon Sep 17 00:00:00 2001 From: trasz Date: Tue, 11 Feb 2014 11:58:54 +0000 Subject: [PATCH] MFC r260083: 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 (e.g. NOP) came in. Sponsored by: The FreeBSD Foundation git-svn-id: svn://svn.freebsd.org/base/stable/10@261770 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/dev/iscsi/icl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/dev/iscsi/icl.c b/sys/dev/iscsi/icl.c index f29f0d2cf..e0e11791b 100644 --- a/sys/dev/iscsi/icl.c +++ b/sys/dev/iscsi/icl.c @@ -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; -- 2.45.0