| From foo@baz Sun Aug 26 09:13:00 CEST 2018 |
| From: Varun Prakash <varun@chelsio.com> |
| Date: Wed, 11 Jul 2018 22:03:43 +0530 |
| Subject: scsi: target: iscsi: cxgbit: fix max iso npdu calculation |
| |
| From: Varun Prakash <varun@chelsio.com> |
| |
| [ Upstream commit 1b350ea0c2f4df9aa30426614c8eb755a8c32814 ] |
| |
| - rounddown CXGBIT_MAX_ISO_PAYLOAD by csk->emss before calculating |
| max_iso_npdu to get max TCP payload in multiple of mss. |
| |
| - call cxgbit_set_digest() before cxgbit_set_iso_npdu() to set |
| csk->submode, it is used in calculating number of iso pdus. |
| |
| Signed-off-by: Varun Prakash <varun@chelsio.com> |
| Reviewed-by: Mike Christie <mchristi@redhat.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/target/iscsi/cxgbit/cxgbit_target.c | 16 +++++++++------- |
| 1 file changed, 9 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/target/iscsi/cxgbit/cxgbit_target.c |
| +++ b/drivers/target/iscsi/cxgbit/cxgbit_target.c |
| @@ -652,6 +652,7 @@ static int cxgbit_set_iso_npdu(struct cx |
| struct iscsi_param *param; |
| u32 mrdsl, mbl; |
| u32 max_npdu, max_iso_npdu; |
| + u32 max_iso_payload; |
| |
| if (conn->login->leading_connection) { |
| param = iscsi_find_param_from_key(MAXBURSTLENGTH, |
| @@ -670,8 +671,10 @@ static int cxgbit_set_iso_npdu(struct cx |
| mrdsl = conn_ops->MaxRecvDataSegmentLength; |
| max_npdu = mbl / mrdsl; |
| |
| - max_iso_npdu = CXGBIT_MAX_ISO_PAYLOAD / |
| - (ISCSI_HDR_LEN + mrdsl + |
| + max_iso_payload = rounddown(CXGBIT_MAX_ISO_PAYLOAD, csk->emss); |
| + |
| + max_iso_npdu = max_iso_payload / |
| + (ISCSI_HDR_LEN + mrdsl + |
| cxgbit_digest_len[csk->submode]); |
| |
| csk->max_iso_npdu = min(max_npdu, max_iso_npdu); |
| @@ -741,6 +744,9 @@ static int cxgbit_set_params(struct iscs |
| if (conn_ops->MaxRecvDataSegmentLength > cdev->mdsl) |
| conn_ops->MaxRecvDataSegmentLength = cdev->mdsl; |
| |
| + if (cxgbit_set_digest(csk)) |
| + return -1; |
| + |
| if (conn->login->leading_connection) { |
| param = iscsi_find_param_from_key(ERRORRECOVERYLEVEL, |
| conn->param_list); |
| @@ -764,7 +770,7 @@ static int cxgbit_set_params(struct iscs |
| if (is_t5(cdev->lldi.adapter_type)) |
| goto enable_ddp; |
| else |
| - goto enable_digest; |
| + return 0; |
| } |
| |
| if (test_bit(CDEV_ISO_ENABLE, &cdev->flags)) { |
| @@ -781,10 +787,6 @@ enable_ddp: |
| } |
| } |
| |
| -enable_digest: |
| - if (cxgbit_set_digest(csk)) |
| - return -1; |
| - |
| return 0; |
| } |
| |