diff --git a/CHANGELOG.md b/CHANGELOG.md index 167253114..4e67ff9db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,6 +83,10 @@ Rename a variable in the member `cmic` of the struct `spdk_nvme_ctrlr_data` from more controllers if set to 1. However `multi_host` had indicated a particular use case such that the NVM subsystem is used by multiple hosts. +A new option `disable_read_ana_log_page` was added to struct `spdk_nvme_ctrlr_opts` to disable +reading ANA log page. The upper layer is expected to read ANA log page instead if `true`. +The default value is `false`. + ### rpc New RPC `bdev_rbd_register_cluster` and `bdev_rbd_unregister_cluster` was added, it allows to create diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index be3ee6f81..7926bf691 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -256,6 +256,14 @@ struct spdk_nvme_ctrlr_opts { * this controller in microseconds. */ uint64_t fabrics_connect_timeout_us; + + /** + * Disable reading ANA log page. The upper layer should reading ANA log page instead + * if set to true. + * + * Default is `false` (ANA log page is read). + */ + bool disable_read_ana_log_page; }; /** diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index ba6bddb71..2519f1d99 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -958,11 +958,12 @@ nvme_ctrlr_opts_init(struct spdk_nvme_ctrlr_opts *opts, SET_FIELD(transport_ack_timeout); SET_FIELD(admin_queue_size); SET_FIELD(fabrics_connect_timeout_us); + SET_FIELD(disable_read_ana_log_page); /* Do not remove this statement. When you add a new field, please do update this * assert with the correct size. And do not forget to add a new SET_FIELD statement * related with your new added field. */ - SPDK_STATIC_ASSERT(sizeof(struct spdk_nvme_ctrlr_opts) == 608, "Incorrect size"); + SPDK_STATIC_ASSERT(sizeof(struct spdk_nvme_ctrlr_opts) == 616, "Incorrect size"); #undef FIELD_OK #undef SET_FIELD diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 3bd63dacb..9e34042ad 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -206,6 +206,7 @@ spdk_nvme_ctrlr_get_default_ctrlr_opts(struct spdk_nvme_ctrlr_opts *opts, size_t SET_FIELD(transport_ack_timeout, SPDK_NVME_DEFAULT_TRANSPORT_ACK_TIMEOUT); SET_FIELD(admin_queue_size, DEFAULT_ADMIN_QUEUE_SIZE); SET_FIELD(fabrics_connect_timeout_us, NVME_FABRIC_CONNECT_COMMAND_TIMEOUT); + SET_FIELD(disable_read_ana_log_page, false); #undef FIELD_OK #undef SET_FIELD @@ -722,7 +723,6 @@ nvme_ctrlr_init_ana_log_page(struct spdk_nvme_ctrlr *ctrlr) } ctrlr->ana_log_page_size = ana_log_page_size; - ctrlr->log_page_supported[SPDK_NVME_LOG_ASYMMETRIC_NAMESPACE_ACCESS] = true; return nvme_ctrlr_update_ana_log_page(ctrlr); } @@ -806,10 +806,13 @@ nvme_ctrlr_set_supported_log_pages(struct spdk_nvme_ctrlr *ctrlr) } } if (ctrlr->cdata.cmic.ana_reporting) { - rc = nvme_ctrlr_init_ana_log_page(ctrlr); - if (rc == 0) { - nvme_ctrlr_parse_ana_log_page(ctrlr, nvme_ctrlr_update_ns_ana_states, - ctrlr); + ctrlr->log_page_supported[SPDK_NVME_LOG_ASYMMETRIC_NAMESPACE_ACCESS] = true; + if (!ctrlr->opts.disable_read_ana_log_page) { + rc = nvme_ctrlr_init_ana_log_page(ctrlr); + if (rc == 0) { + nvme_ctrlr_parse_ana_log_page(ctrlr, nvme_ctrlr_update_ns_ana_states, + ctrlr); + } } } @@ -2699,11 +2702,14 @@ nvme_ctrlr_process_async_event(struct spdk_nvme_ctrlr *ctrlr, if ((event.bits.async_event_type == SPDK_NVME_ASYNC_EVENT_TYPE_NOTICE) && (event.bits.async_event_info == SPDK_NVME_ASYNC_EVENT_ANA_CHANGE)) { - rc = nvme_ctrlr_update_ana_log_page(ctrlr); - if (rc) { - return; + if (!ctrlr->opts.disable_read_ana_log_page) { + rc = nvme_ctrlr_update_ana_log_page(ctrlr); + if (rc) { + return; + } + nvme_ctrlr_parse_ana_log_page(ctrlr, nvme_ctrlr_update_ns_ana_states, + ctrlr); } - nvme_ctrlr_parse_ana_log_page(ctrlr, nvme_ctrlr_update_ns_ana_states, ctrlr); } active_proc = nvme_ctrlr_get_current_process(ctrlr); diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index c6474f616..72bee6412 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -1593,6 +1593,7 @@ hotplug_probe_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, opts->low_priority_weight = (uint8_t)g_opts.low_priority_weight; opts->medium_priority_weight = (uint8_t)g_opts.medium_priority_weight; opts->high_priority_weight = (uint8_t)g_opts.high_priority_weight; + opts->disable_read_ana_log_page = true; SPDK_DEBUGLOG(bdev_nvme, "Attaching to %s\n", trid->traddr); @@ -2619,6 +2620,7 @@ bdev_nvme_create(struct spdk_nvme_transport_id *trid, ctx->opts.transport_retry_count = g_opts.retry_count; ctx->opts.keep_alive_timeout_ms = g_opts.keep_alive_timeout_ms; + ctx->opts.disable_read_ana_log_page = true; if (hostnqn) { snprintf(ctx->opts.hostnqn, sizeof(ctx->opts.hostnqn), "%s", hostnqn);