Commit 547ed331 authored by Honggang Li's avatar Honggang Li Committed by Jason Gunthorpe

RDMA/srp: Add parse function for maximum initiator to target IU size

According to SRP specifications 'srp-r16a' and 'srp2r06',
IOControllerProfile attributes for SRP target port include the maximum
initiator to target IU size.

SRP connection daemons, such as srp_daemon, can get the value from the
subnet manager. The SRP connection daemon can pass this value to kernel.

This patch adds a parse function for it.

Upstream commit [1] enables the kernel parameter, 'use_imm_data', by
default. [1] also use (8 * 1024) as the default value for kernel parameter
'max_imm_data'. With those default values, the maximum initiator to target
IU size will be 8260.

In case the SRPT modules, which include the in-tree 'ib_srpt.ko' module,
do not support SRP-2 'immediate data' feature, the default maximum
initiator to target IU size is significantly smaller than 8260. For
'ib_srpt.ko' module, which built from source before [2], the default
maximum initiator to target IU is 2116.

[1] introduces a regression issue for old srp targets with default kernel
parameters, as the connection will be rejected because of a too large
maximum initiator to target IU size.

[1] commit 882981f4 ("RDMA/srp: Add support for immediate data")
[2] commit 5dabcd04 ("RDMA/srpt: Add support for immediate data")

Link: https://lore.kernel.org/r/20190927174352.7800-1-honli@redhat.comReviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarHonggang Li <honli@redhat.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 909624d8
...@@ -67,6 +67,8 @@ Description: Interface for making ib_srp connect to a new target. ...@@ -67,6 +67,8 @@ Description: Interface for making ib_srp connect to a new target.
initiator is allowed to queue per SCSI host. The default initiator is allowed to queue per SCSI host. The default
value for this parameter is 62. The lowest supported value value for this parameter is 62. The lowest supported value
is 2. is 2.
* max_it_iu_size, a decimal number specifying the maximum
initiator to target information unit length.
What: /sys/class/infiniband_srp/srp-<hca>-<port_number>/ibdev What: /sys/class/infiniband_srp/srp-<hca>-<port_number>/ibdev
Date: January 2, 2006 Date: January 2, 2006
......
...@@ -3414,6 +3414,7 @@ enum { ...@@ -3414,6 +3414,7 @@ enum {
SRP_OPT_IP_SRC = 1 << 15, SRP_OPT_IP_SRC = 1 << 15,
SRP_OPT_IP_DEST = 1 << 16, SRP_OPT_IP_DEST = 1 << 16,
SRP_OPT_TARGET_CAN_QUEUE= 1 << 17, SRP_OPT_TARGET_CAN_QUEUE= 1 << 17,
SRP_OPT_MAX_IT_IU_SIZE = 1 << 18,
}; };
static unsigned int srp_opt_mandatory[] = { static unsigned int srp_opt_mandatory[] = {
...@@ -3446,6 +3447,7 @@ static const match_table_t srp_opt_tokens = { ...@@ -3446,6 +3447,7 @@ static const match_table_t srp_opt_tokens = {
{ SRP_OPT_QUEUE_SIZE, "queue_size=%d" }, { SRP_OPT_QUEUE_SIZE, "queue_size=%d" },
{ SRP_OPT_IP_SRC, "src=%s" }, { SRP_OPT_IP_SRC, "src=%s" },
{ SRP_OPT_IP_DEST, "dest=%s" }, { SRP_OPT_IP_DEST, "dest=%s" },
{ SRP_OPT_MAX_IT_IU_SIZE, "max_it_iu_size=%d" },
{ SRP_OPT_ERR, NULL } { SRP_OPT_ERR, NULL }
}; };
...@@ -3739,6 +3741,14 @@ static int srp_parse_options(struct net *net, const char *buf, ...@@ -3739,6 +3741,14 @@ static int srp_parse_options(struct net *net, const char *buf,
target->tl_retry_count = token; target->tl_retry_count = token;
break; break;
case SRP_OPT_MAX_IT_IU_SIZE:
if (match_int(args, &token) || token < 0) {
pr_warn("bad maximum initiator to target IU size '%s'\n", p);
goto out;
}
target->max_it_iu_size = token;
break;
default: default:
pr_warn("unknown parameter or missing value '%s' in target creation request\n", pr_warn("unknown parameter or missing value '%s' in target creation request\n",
p); p);
......
...@@ -210,6 +210,7 @@ struct srp_target_port { ...@@ -210,6 +210,7 @@ struct srp_target_port {
u32 ch_count; u32 ch_count;
u32 lkey; u32 lkey;
enum srp_target_state state; enum srp_target_state state;
uint32_t max_it_iu_size;
unsigned int cmd_sg_cnt; unsigned int cmd_sg_cnt;
unsigned int indirect_size; unsigned int indirect_size;
bool allow_ext_sg; bool allow_ext_sg;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment