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

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.com


Reviewed-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
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
		  value for this parameter is 62. The lowest supported value
		  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
Date:		January 2, 2006
+10 −0
Original line number Diff line number Diff line
@@ -3414,6 +3414,7 @@ enum {
	SRP_OPT_IP_SRC		= 1 << 15,
	SRP_OPT_IP_DEST		= 1 << 16,
	SRP_OPT_TARGET_CAN_QUEUE= 1 << 17,
	SRP_OPT_MAX_IT_IU_SIZE  = 1 << 18,
};

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_IP_SRC,		"src=%s"		},
	{ SRP_OPT_IP_DEST,		"dest=%s"		},
	{ SRP_OPT_MAX_IT_IU_SIZE,	"max_it_iu_size=%d"	},
	{ SRP_OPT_ERR,			NULL 			}
};

@@ -3739,6 +3741,14 @@ static int srp_parse_options(struct net *net, const char *buf,
			target->tl_retry_count = token;
			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:
			pr_warn("unknown parameter or missing value '%s' in target creation request\n",
				p);
+1 −0
Original line number Diff line number Diff line
@@ -210,6 +210,7 @@ struct srp_target_port {
	u32			ch_count;
	u32			lkey;
	enum srp_target_state	state;
	uint32_t		max_it_iu_size;
	unsigned int		cmd_sg_cnt;
	unsigned int		indirect_size;
	bool			allow_ext_sg;