From 260f9a77c3b3f320b62f26b5b6c58dd4c3763dd7 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Fri, 8 Feb 2019 10:06:45 +0900 Subject: [PATCH] bdev/nvme: Set per-controller PRCHK options by JSON RPC Add prchk_reftag and prchk_guard to construct_nvme_bdev RPC. In spdk_rpc_construct_nvme_bdev, create prchk_flags based on them and pass it to spdk_bdev_nvme_create, and in spdk_bdev_nvme_create, pass it to create_ctrlr. A single option enable_prchk may be enough but add separate options for reftag and guard to clarify that apptag is not supported yet. The next patch will make per-controller PRCHK options configurable by .INI config file. Change-Id: I370ebbe984ee83d133b7f50bdc648ea746c8d42d Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/c/443833 Tested-by: SPDK CI Jenkins Reviewed-by: Darek Stojaczyk Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Changpeng Liu --- doc/jsonrpc.md | 2 ++ lib/bdev/nvme/bdev_nvme.c | 9 +++++++-- lib/bdev/nvme/bdev_nvme.h | 3 ++- lib/bdev/nvme/bdev_nvme_rpc.c | 18 ++++++++++++++++-- scripts/rpc.py | 8 +++++++- scripts/rpc/bdev.py | 12 +++++++++++- 6 files changed, 45 insertions(+), 7 deletions(-) diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index 0482f0636..b6782f8bf 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -1459,6 +1459,8 @@ subnqn | Optional | string | NVMe-oF target subnqn hostnqn | Optional | string | NVMe-oF target hostnqn hostaddr | Optional | string | NVMe-oF host address: ip address hostsvcid | Optional | string | NVMe-oF host trsvcid: port number +prchk_reftag | Optional | bool | Enable checking of PI reference tag for I/O processing +prchk_guard | Optional | bool | Enable checking of PI guard for I/O processing ### Example diff --git a/lib/bdev/nvme/bdev_nvme.c b/lib/bdev/nvme/bdev_nvme.c index 9fcdd10c6..61480a5f4 100644 --- a/lib/bdev/nvme/bdev_nvme.c +++ b/lib/bdev/nvme/bdev_nvme.c @@ -1216,7 +1216,8 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid, struct spdk_nvme_host_id *hostid, const char *base_name, const char **names, size_t *count, - const char *hostnqn) + const char *hostnqn, + uint32_t prchk_flags) { struct spdk_nvme_ctrlr_opts opts; struct spdk_nvme_ctrlr *ctrlr; @@ -1255,7 +1256,7 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid, return -1; } - if (create_ctrlr(ctrlr, base_name, trid, 0)) { + if (create_ctrlr(ctrlr, base_name, trid, prchk_flags)) { SPDK_ERRLOG("Failed to create new device\n"); return -1; } @@ -1912,6 +1913,10 @@ bdev_nvme_config_json(struct spdk_json_write_ctx *w) spdk_json_write_named_object_begin(w, "params"); spdk_json_write_named_string(w, "name", nvme_ctrlr->name); spdk_bdev_nvme_dump_trid_json(trid, w); + spdk_json_write_named_bool(w, "prchk_reftag", + (nvme_ctrlr->prchk_flags & SPDK_NVME_IO_FLAGS_PRCHK_REFTAG) != 0); + spdk_json_write_named_bool(w, "prchk_guard", + (nvme_ctrlr->prchk_flags & SPDK_NVME_IO_FLAGS_PRCHK_GUARD) != 0); spdk_json_write_object_end(w); diff --git a/lib/bdev/nvme/bdev_nvme.h b/lib/bdev/nvme/bdev_nvme.h index f004540c2..f92ec9edf 100644 --- a/lib/bdev/nvme/bdev_nvme.h +++ b/lib/bdev/nvme/bdev_nvme.h @@ -100,7 +100,8 @@ int spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid, struct spdk_nvme_host_id *hostid, const char *base_name, const char **names, size_t *count, - const char *hostnqn); + const char *hostnqn, + uint32_t prchk_flags); struct spdk_nvme_ctrlr *spdk_bdev_nvme_get_ctrlr(struct spdk_bdev *bdev); /** diff --git a/lib/bdev/nvme/bdev_nvme_rpc.c b/lib/bdev/nvme/bdev_nvme_rpc.c index 97d7579ab..084d867da 100644 --- a/lib/bdev/nvme/bdev_nvme_rpc.c +++ b/lib/bdev/nvme/bdev_nvme_rpc.c @@ -167,6 +167,8 @@ struct rpc_construct_nvme { char *hostnqn; char *hostaddr; char *hostsvcid; + bool prchk_reftag; + bool prchk_guard; }; static void @@ -193,8 +195,10 @@ static const struct spdk_json_object_decoder rpc_construct_nvme_decoders[] = { {"subnqn", offsetof(struct rpc_construct_nvme, subnqn), spdk_json_decode_string, true}, {"hostnqn", offsetof(struct rpc_construct_nvme, hostnqn), spdk_json_decode_string, true}, {"hostaddr", offsetof(struct rpc_construct_nvme, hostaddr), spdk_json_decode_string, true}, - {"hostsvcid", offsetof(struct rpc_construct_nvme, hostsvcid), spdk_json_decode_string, true} + {"hostsvcid", offsetof(struct rpc_construct_nvme, hostsvcid), spdk_json_decode_string, true}, + {"prchk_reftag", offsetof(struct rpc_construct_nvme, prchk_reftag), spdk_json_decode_bool, true}, + {"prchk_guard", offsetof(struct rpc_construct_nvme, prchk_guard), spdk_json_decode_bool, true} }; #define NVME_MAX_BDEVS_PER_RPC 128 @@ -210,6 +214,7 @@ spdk_rpc_construct_nvme_bdev(struct spdk_jsonrpc_request *request, const char *names[NVME_MAX_BDEVS_PER_RPC]; size_t count; size_t i; + uint32_t prchk_flags = 0; int rc; if (spdk_json_decode_object(params, rpc_construct_nvme_decoders, @@ -256,8 +261,17 @@ spdk_rpc_construct_nvme_bdev(struct spdk_jsonrpc_request *request, snprintf(hostid.hostsvcid, sizeof(hostid.hostsvcid), "%s", req.hostsvcid); } + if (req.prchk_reftag) { + prchk_flags |= SPDK_NVME_IO_FLAGS_PRCHK_REFTAG; + } + + if (req.prchk_guard) { + prchk_flags |= SPDK_NVME_IO_FLAGS_PRCHK_GUARD; + } + count = NVME_MAX_BDEVS_PER_RPC; - if (spdk_bdev_nvme_create(&trid, &hostid, req.name, names, &count, req.hostnqn)) { + if (spdk_bdev_nvme_create(&trid, &hostid, req.name, names, &count, req.hostnqn, + prchk_flags)) { goto invalid; } diff --git a/scripts/rpc.py b/scripts/rpc.py index 7e3880ab8..b880d03e7 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -291,7 +291,9 @@ if __name__ == "__main__": subnqn=args.subnqn, hostnqn=args.hostnqn, hostaddr=args.hostaddr, - hostsvcid=args.hostsvcid)) + hostsvcid=args.hostsvcid, + prchk_reftag=args.prchk_reftag, + prchk_guard=args.prchk_guard)) p = subparsers.add_parser('construct_nvme_bdev', help='Add bdevs with nvme backend') @@ -310,6 +312,10 @@ if __name__ == "__main__": help='NVMe-oF host address: e.g., an ip address') p.add_argument('-c', '--hostsvcid', help='NVMe-oF host svcid: e.g., a port number') + p.add_argument('-r', '--prchk-reftag', + help='Enable checking of PI reference tag for I/O processing.', action='store_true') + p.add_argument('-g', '--prchk-guard', + help='Enable checking of PI guard for I/O processing.', action='store_true') p.set_defaults(func=construct_nvme_bdev) def get_nvme_controllers(args): diff --git a/scripts/rpc/bdev.py b/scripts/rpc/bdev.py index d5d57b68d..0e55c4368 100644 --- a/scripts/rpc/bdev.py +++ b/scripts/rpc/bdev.py @@ -276,7 +276,9 @@ def set_bdev_nvme_hotplug(client, enable, period_us=None): return client.call('set_bdev_nvme_hotplug', params) -def construct_nvme_bdev(client, name, trtype, traddr, adrfam=None, trsvcid=None, subnqn=None, hostnqn=None, hostaddr=None, hostsvcid=None): +def construct_nvme_bdev(client, name, trtype, traddr, adrfam=None, trsvcid=None, + subnqn=None, hostnqn=None, hostaddr=None, hostsvcid=None, + prchk_reftag=None, prchk_guard=None): """Construct NVMe namespace block devices. Args: @@ -289,6 +291,8 @@ def construct_nvme_bdev(client, name, trtype, traddr, adrfam=None, trsvcid=None, hostnqn: NQN to connect from (optional) hostaddr: host transport address (IP address for IP-based transports, NULL for PCIe or FC; optional) hostsvcid: host transport service ID (port number for IP-based transports, NULL for PCIe or FC; optional) + prchk_reftag: Enable checking of PI reference tag for I/O processing (optional) + prchk_guard: Enable checking of PI guard for I/O processing (optional) Returns: Names of created block devices. @@ -315,6 +319,12 @@ def construct_nvme_bdev(client, name, trtype, traddr, adrfam=None, trsvcid=None, if subnqn: params['subnqn'] = subnqn + if prchk_reftag: + params['prchk_reftag'] = prchk_reftag + + if prchk_guard: + params['prchk_guard'] = prchk_guard + return client.call('construct_nvme_bdev', params)