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] commit882981f4a4
("RDMA/srp: Add support for immediate data") [2] commit5dabcd0456
("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:
committed by
Jason Gunthorpe
parent
909624d8db
commit
547ed331bb
@@ -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 {
|
|||||||
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);
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user