Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F161542964
D31577.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D31577.diff
View Options
diff --git a/sys/cam/ctl/ctl_frontend_iscsi.c b/sys/cam/ctl/ctl_frontend_iscsi.c
--- a/sys/cam/ctl/ctl_frontend_iscsi.c
+++ b/sys/cam/ctl/ctl_frontend_iscsi.c
@@ -917,7 +917,7 @@
cfiscsi_session_terminate(cs);
return;
}
- cdw->cdw_datasn++;
+ cdw->cdw_datasn += request->ip_additional_pdus + 1;
io = cdw->cdw_ctl_io;
KASSERT((io->io_hdr.flags & CTL_FLAG_DATA_MASK) != CTL_FLAG_DATA_IN,
diff --git a/sys/dev/cxgbe/cxgbei/cxgbei.h b/sys/dev/cxgbe/cxgbei/cxgbei.h
--- a/sys/dev/cxgbe/cxgbei/cxgbei.h
+++ b/sys/dev/cxgbe/cxgbei/cxgbei.h
@@ -58,7 +58,6 @@
uint32_t tt; /* Transfer tag. */
- uint32_t next_datasn;
uint32_t next_buffer_offset;
uint32_t last_datasn;
};
diff --git a/sys/dev/cxgbe/cxgbei/cxgbei.c b/sys/dev/cxgbe/cxgbei/cxgbei.c
--- a/sys/dev/cxgbe/cxgbei/cxgbei.c
+++ b/sys/dev/cxgbe/cxgbei/cxgbei.c
@@ -583,10 +583,12 @@
cmp->next_buffer_offset;
if (prev_seg_len != 0) {
+ uint32_t orig_datasn;
+
/*
- * Since cfiscsi doesn't know about previous
- * headers, pretend that the entire r2t data
- * length was received in this single segment.
+ * Return a "large" PDU representing the burst
+ * of PDUs. Adjust the offset and length of
+ * this PDU to represent the entire burst.
*/
ip->ip_data_len += prev_seg_len;
bhsdo->bhsdo_data_segment_len[2] = ip->ip_data_len;
@@ -595,17 +597,19 @@
bhsdo->bhsdo_buffer_offset =
htobe32(cmp->next_buffer_offset);
- npdus = htobe32(bhsdo->bhsdo_datasn) - cmp->last_datasn;
+ orig_datasn = htobe32(bhsdo->bhsdo_datasn);
+ npdus = orig_datasn - cmp->last_datasn;
+ bhsdo->bhsdo_datasn = htobe32(cmp->last_datasn + 1);
+ cmp->last_datasn = orig_datasn;
+ ip->ip_additional_pdus = npdus - 1;
} else {
MPASS(htobe32(bhsdo->bhsdo_datasn) ==
cmp->last_datasn + 1);
npdus = 1;
+ cmp->last_datasn = htobe32(bhsdo->bhsdo_datasn);
}
cmp->next_buffer_offset += ip->ip_data_len;
- cmp->last_datasn = htobe32(bhsdo->bhsdo_datasn);
- bhsdo->bhsdo_datasn = htobe32(cmp->next_datasn);
- cmp->next_datasn++;
toep->ofld_rxq->rx_iscsi_ddp_pdus += npdus;
toep->ofld_rxq->rx_iscsi_ddp_octets += ip->ip_data_len;
} else {
diff --git a/sys/dev/cxgbe/cxgbei/icl_cxgbei.c b/sys/dev/cxgbe/cxgbei/icl_cxgbei.c
--- a/sys/dev/cxgbe/cxgbei/icl_cxgbei.c
+++ b/sys/dev/cxgbe/cxgbei/icl_cxgbei.c
@@ -1346,7 +1346,6 @@
prsv->prsv_tag &= ~pr->pr_alias_mask;
prsv->prsv_tag |= alias << pr->pr_alias_shift & pr->pr_alias_mask;
- ddp->cmp.next_datasn = 0;
ddp->cmp.last_datasn = -1;
cxgbei_insert_cmp(icc, &ddp->cmp, prsv->prsv_tag);
*tttp = htobe32(prsv->prsv_tag);
diff --git a/sys/dev/iscsi/icl.h b/sys/dev/iscsi/icl.h
--- a/sys/dev/iscsi/icl.h
+++ b/sys/dev/iscsi/icl.h
@@ -75,6 +75,14 @@
size_t ip_data_len;
struct mbuf *ip_data_mbuf;
+ /*
+ * When a "large" received PDU represents multiple on-the-wire
+ * PDUs, this is the count of additional on-the-wire PDUs.
+ * For PDUs that match on-the-wire PDUs, this should be set to
+ * zero.
+ */
+ u_int ip_additional_pdus;
+
/*
* User (initiator or provider) private fields.
*/
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Jul 5, 5:05 PM (3 h, 11 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34718040
Default Alt Text
D31577.diff (3 KB)
Attached To
Mode
D31577: iscsi: Teach the iSCSI stack about "large" PDUs.
Attached
Detach File
Event Timeline
Log In to Comment