]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
RDMA/srp: Add parse function for maximum initiator to target IU size
authorHonggang Li <honli@redhat.com>
Fri, 27 Sep 2019 17:43:51 +0000 (01:43 +0800)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 8 Oct 2019 18:17:32 +0000 (15:17 -0300)
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 882981f4a411 ("RDMA/srp: Add support for immediate data")
[2] commit 5dabcd0456d7 ("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>
Documentation/ABI/stable/sysfs-driver-ib_srp
drivers/infiniband/ulp/srp/ib_srp.c
drivers/infiniband/ulp/srp/ib_srp.h

index 7049a2b5035950f3d08dc9e8595a7d40e73036e6..84972a57caaeb9cfdab006648303fc4db5f56c7f 100644 (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
                  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
index 6fddd14b6bd9e39e0a367d635958f0d941d397ff..c46d2799d1928de8d82337a286c8baf67be6f44b 100644 (file)
@@ -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);
index f38fbb00d0e8c2157fdbca0cfc15efb98fb0b3fb..5359ece561cad8d8985ea8ad16e4a5f74a0b661c 100644 (file)
@@ -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;