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>
                  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
 
        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[] = {
        { 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                    }
 };
 
                        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);
 
        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;