diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index 465af8be3..5902d1db4 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -2977,6 +2977,7 @@ first_burst_length | Optional | number | Session specific paramete immediate_data | Optional | boolean | Session specific parameter, ImmediateData (default: `true`) error_recovery_level | Optional | number | Session specific parameter, ErrorRecoveryLevel (default: 0) allow_duplicated_isid | Optional | boolean | Allow duplicated initiator session ID (default: `false`) +max_large_datain_per_connection | Optional | number | Max number of outstanding split read I/Os per connection (default: 64) To load CHAP shared secret file, its path is required to specify explicitly in the parameter `auth_file`. @@ -3061,7 +3062,8 @@ Example response: "auth_file": "/usr/local/etc/spdk/auth.conf", "disable_chap": true, "default_time2wait": 2, - "require_chap": false + "require_chap": false, + "max_large_datain_per_connection": 64 } } ~~~ diff --git a/lib/iscsi/iscsi.h b/lib/iscsi/iscsi.h index a8c096db6..f8096d01b 100644 --- a/lib/iscsi/iscsi.h +++ b/lib/iscsi/iscsi.h @@ -320,6 +320,7 @@ struct spdk_iscsi_opts { bool ImmediateData; uint32_t ErrorRecoveryLevel; bool AllowDuplicateIsid; + uint32_t MaxLargeDataInPerConnection; }; struct spdk_iscsi_globals { diff --git a/lib/iscsi/iscsi_rpc.c b/lib/iscsi/iscsi_rpc.c index df9338b92..94e897f31 100644 --- a/lib/iscsi/iscsi_rpc.c +++ b/lib/iscsi/iscsi_rpc.c @@ -1716,6 +1716,7 @@ static const struct spdk_json_object_decoder rpc_set_iscsi_opts_decoders[] = { {"immediate_data", offsetof(struct spdk_iscsi_opts, ImmediateData), spdk_json_decode_bool, true}, {"error_recovery_level", offsetof(struct spdk_iscsi_opts, ErrorRecoveryLevel), spdk_json_decode_uint32, true}, {"allow_duplicated_isid", offsetof(struct spdk_iscsi_opts, AllowDuplicateIsid), spdk_json_decode_bool, true}, + {"max_large_datain_per_connection", offsetof(struct spdk_iscsi_opts, MaxLargeDataInPerConnection), spdk_json_decode_uint32, true}, }; static void diff --git a/lib/iscsi/iscsi_subsystem.c b/lib/iscsi/iscsi_subsystem.c index dfc2a7884..d24cbcc37 100644 --- a/lib/iscsi/iscsi_subsystem.c +++ b/lib/iscsi/iscsi_subsystem.c @@ -401,6 +401,7 @@ iscsi_opts_init(struct spdk_iscsi_opts *opts) opts->chap_group = 0; opts->authfile = NULL; opts->nodebase = NULL; + opts->MaxLargeDataInPerConnection = DEFAULT_MAX_LARGE_DATAIN_PER_CONNECTION; } struct spdk_iscsi_opts * @@ -473,6 +474,7 @@ iscsi_opts_copy(struct spdk_iscsi_opts *src) dst->require_chap = src->require_chap; dst->mutual_chap = src->mutual_chap; dst->chap_group = src->chap_group; + dst->MaxLargeDataInPerConnection = src->MaxLargeDataInPerConnection; return dst; } @@ -697,6 +699,11 @@ iscsi_opts_verify(struct spdk_iscsi_opts *opts) return -EINVAL; } + if (opts->MaxLargeDataInPerConnection == 0) { + SPDK_ERRLOG("0 is invalid. MaxLargeDataInPerConnection must be more than 0\n"); + return -EINVAL; + } + return 0; } @@ -770,7 +777,7 @@ iscsi_set_global_params(struct spdk_iscsi_opts *opts) g_iscsi.require_chap = opts->require_chap; g_iscsi.mutual_chap = opts->mutual_chap; g_iscsi.chap_group = opts->chap_group; - g_iscsi.MaxLargeDataInPerConnection = DEFAULT_MAX_LARGE_DATAIN_PER_CONNECTION; + g_iscsi.MaxLargeDataInPerConnection = opts->MaxLargeDataInPerConnection; iscsi_log_globals(); @@ -1487,6 +1494,9 @@ iscsi_opts_info_json(struct spdk_json_write_ctx *w) spdk_json_write_named_bool(w, "mutual_chap", g_iscsi.mutual_chap); spdk_json_write_named_int32(w, "chap_group", g_iscsi.chap_group); + spdk_json_write_named_uint32(w, "max_large_datain_per_connection", + g_iscsi.MaxLargeDataInPerConnection); + spdk_json_write_object_end(w); } diff --git a/scripts/rpc.py b/scripts/rpc.py index 0e0ee9bc1..388ca898d 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -852,7 +852,8 @@ if __name__ == "__main__": first_burst_length=args.first_burst_length, immediate_data=args.immediate_data, error_recovery_level=args.error_recovery_level, - allow_duplicated_isid=args.allow_duplicated_isid) + allow_duplicated_isid=args.allow_duplicated_isid, + max_large_datain_per_connection=args.max_large_datain_per_connection) p = subparsers.add_parser('iscsi_set_options', aliases=['set_iscsi_options'], help="""Set options of iSCSI subsystem""") @@ -876,6 +877,7 @@ if __name__ == "__main__": p.add_argument('-i', '--immediate-data', help='Negotiated parameter, ImmediateData.', action='store_true') p.add_argument('-l', '--error-recovery-level', help='Negotiated parameter, ErrorRecoveryLevel', type=int) p.add_argument('-p', '--allow-duplicated-isid', help='Allow duplicated initiator session ID.', action='store_true') + p.add_argument('-x', '--max-large-datain-per-connection', help='Max number of outstanding split read I/Os per connection', type=int) p.set_defaults(func=iscsi_set_options) def iscsi_set_discovery_auth(args): diff --git a/scripts/rpc/iscsi.py b/scripts/rpc/iscsi.py index ff5b65818..4474e818d 100644 --- a/scripts/rpc/iscsi.py +++ b/scripts/rpc/iscsi.py @@ -20,7 +20,8 @@ def iscsi_set_options( first_burst_length=None, immediate_data=None, error_recovery_level=None, - allow_duplicated_isid=None): + allow_duplicated_isid=None, + max_large_datain_per_connection=None): """Set iSCSI target options. Args: @@ -41,6 +42,7 @@ def iscsi_set_options( immediate_data: Negotiated parameter, ImmediateData error_recovery_level: Negotiated parameter, ErrorRecoveryLevel allow_duplicated_isid: Allow duplicated initiator session ID + max_large_datain_per_connection: Max number of outstanding split read I/Os per connection (optional) Returns: True or False @@ -81,6 +83,8 @@ def iscsi_set_options( params['error_recovery_level'] = error_recovery_level if allow_duplicated_isid: params['allow_duplicated_isid'] = allow_duplicated_isid + if max_large_datain_per_connection: + params['max_large_datain_per_connection'] = max_large_datain_per_connection return client.call('iscsi_set_options', params) diff --git a/test/spdkcli/match_files/spdkcli_iscsi.test.match b/test/spdkcli/match_files/spdkcli_iscsi.test.match index ffb314921..08cce600a 100644 --- a/test/spdkcli/match_files/spdkcli_iscsi.test.match +++ b/test/spdkcli/match_files/spdkcli_iscsi.test.match @@ -16,6 +16,7 @@ o- iscsi ....................................................................... | o- first_burst_length: 8192 .............................................................................................. [...] | o- immediate_data: True .................................................................................................. [...] | o- max_connections_per_session: 2 ........................................................................................ [...] + | o- max_large_datain_per_connection: 64 ................................................................................... [...] | o- max_queue_depth: 64 ................................................................................................... [...] | o- max_sessions: 128 ..................................................................................................... [...] | o- mutual_chap: False .................................................................................................... [...]