You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
3.1 KiB
92 lines
3.1 KiB
6 years ago
|
From a54966e121ef5deaee2e113d1c912a7dd85aca86 Mon Sep 17 00:00:00 2001
|
||
|
From: Chris Leech <cleech@redhat.com>
|
||
|
Date: Wed, 20 Jun 2018 22:09:35 -0700
|
||
|
Subject: [PATCH 1/1] enable MaxOutstandingR2T negotiation
|
||
|
|
||
|
The iscsi_tcp kernel side R2T handling is in libiscsi_tcp and is shared
|
||
|
with at least cxgbi3, and the drivers claim CAP_MULTI_R2T. But the
|
||
|
iscsid login parameter negotiation code never enabled MaxOutstandingR2T.
|
||
|
|
||
|
I've tested this against an LIO target, negotiating to 2 and 4 R2Ts.
|
||
|
The network traces looked good, with the initiator keeping track of
|
||
|
multiple outstanding R2Ts and using the correct next identifier.
|
||
|
Throughput of bulk write data was improved, even over low latency virtio
|
||
|
links.
|
||
|
|
||
|
Signed-off-by: Chris Leech <cleech@redhat.com>
|
||
|
---
|
||
|
usr/initiator.h | 1 +
|
||
|
usr/initiator_common.c | 3 ++-
|
||
|
usr/login.c | 14 +++++---------
|
||
|
3 files changed, 8 insertions(+), 10 deletions(-)
|
||
|
|
||
|
diff --git a/usr/initiator.h b/usr/initiator.h
|
||
|
index 4f96d6b6e2c5..3ee1454b6de2 100644
|
||
|
--- a/usr/initiator.h
|
||
|
+++ b/usr/initiator.h
|
||
|
@@ -212,6 +212,7 @@ typedef struct iscsi_session {
|
||
|
int erl;
|
||
|
uint32_t imm_data_en;
|
||
|
uint32_t initial_r2t_en;
|
||
|
+ uint32_t max_r2t;
|
||
|
uint32_t fast_abort;
|
||
|
uint32_t first_burst;
|
||
|
uint32_t max_burst;
|
||
|
diff --git a/usr/initiator_common.c b/usr/initiator_common.c
|
||
|
index 191e779bb942..d00bd9e7469b 100644
|
||
|
--- a/usr/initiator_common.c
|
||
|
+++ b/usr/initiator_common.c
|
||
|
@@ -173,6 +173,7 @@ iscsi_copy_operational_params(struct iscsi_conn *conn,
|
||
|
|
||
|
/* session's operational parameters */
|
||
|
session->initial_r2t_en = session_conf->InitialR2T;
|
||
|
+ session->max_r2t = session_conf->MaxOutstandingR2T;
|
||
|
session->imm_data_en = session_conf->ImmediateData;
|
||
|
session->first_burst = align_32_down(session_conf->FirstBurstLength);
|
||
|
/*
|
||
|
@@ -375,7 +376,7 @@ int iscsi_session_set_neg_params(struct iscsi_conn *conn)
|
||
|
.conn_only = 0,
|
||
|
}, {
|
||
|
.param = ISCSI_PARAM_MAX_R2T,
|
||
|
- .value = &one, /* FIXME: session->max_r2t */
|
||
|
+ .value = &session->max_r2t,
|
||
|
.type = ISCSI_INT,
|
||
|
.conn_only = 0,
|
||
|
}, {
|
||
|
diff --git a/usr/login.c b/usr/login.c
|
||
|
index 294ad0bf73fd..d7dad21180cf 100644
|
||
|
--- a/usr/login.c
|
||
|
+++ b/usr/login.c
|
||
|
@@ -524,14 +524,9 @@ get_op_params_text_keys(iscsi_session_t *session, int cid,
|
||
|
text = value_end;
|
||
|
} else if (iscsi_find_key_value("MaxOutstandingR2T", text, end, &value,
|
||
|
&value_end)) {
|
||
|
- if (session->type == ISCSI_SESSION_TYPE_NORMAL) {
|
||
|
- if (strcmp(value, "1")) {
|
||
|
- log_error("Login negotiation "
|
||
|
- "failed, can't accept Max"
|
||
|
- "OutstandingR2T %s", value);
|
||
|
- return LOGIN_NEGOTIATION_FAILED;
|
||
|
- }
|
||
|
- } else
|
||
|
+ if (session->type == ISCSI_SESSION_TYPE_NORMAL)
|
||
|
+ session->max_r2t = strtoul(value, NULL, 0);
|
||
|
+ else
|
||
|
session->irrelevant_keys_bitmap |=
|
||
|
IRRELEVANT_MAXOUTSTANDINGR2T;
|
||
|
text = value_end;
|
||
|
@@ -810,8 +805,9 @@ add_params_normal_session(iscsi_session_t *session, struct iscsi_hdr *pdu,
|
||
|
return 0;
|
||
|
|
||
|
/* these we must have */
|
||
|
+ sprintf(value, "%d", session->max_r2t);
|
||
|
if (!iscsi_add_text(pdu, data, max_data_length,
|
||
|
- "MaxOutstandingR2T", "1"))
|
||
|
+ "MaxOutstandingR2T", value))
|
||
|
return 0;
|
||
|
if (!iscsi_add_text(pdu, data, max_data_length,
|
||
|
"MaxConnections", "1"))
|
||
|
--
|
||
|
2.14.4
|
||
|
|