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 882981f4a4 ("RDMA/srp: Add support for immediate data")
[2] commit 5dabcd0456 ("RDMA/srpt: Add support for immediate data")

Link: https://lore.kernel.org/r/20190927174352.7800-1-honli@redhat.com
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Honggang Li <honli@redhat.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
Honggang Li
2019-09-28 01:43:51 +08:00
committed by Jason Gunthorpe
parent 909624d8db
commit 547ed331bb
3 changed files with 13 additions and 0 deletions

View File

@@ -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

View File

@@ -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 = {
{ 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,
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);

View File

@@ -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;