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.
91 lines
3.1 KiB
91 lines
3.1 KiB
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 |
|
|
|
|