nvmf: allow to override KAS

Useful for transport specific layer to inform that Keep Alive is not
supported or to adjust granularity.

Signed-off-by: Jacek Kalwas <jacek.kalwas@intel.com>
Change-Id: I636fda3eadcb96cd8a4b79570fc4e3cc6a58fe93
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1545
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Jacek Kalwas 2020-03-28 01:47:16 +01:00 committed by Tomasz Zawadzki
parent 538f1354e0
commit f74fdce93d
2 changed files with 11 additions and 6 deletions

View File

@ -173,6 +173,7 @@ struct spdk_nvmf_listener {
* A subset of struct spdk_nvme_ctrlr_data that are emulated by a fabrics device. * A subset of struct spdk_nvme_ctrlr_data that are emulated by a fabrics device.
*/ */
struct spdk_nvmf_ctrlr_data { struct spdk_nvmf_ctrlr_data {
uint16_t kas;
struct spdk_nvme_cdata_nvmf_specific nvmf_specific; struct spdk_nvme_cdata_nvmf_specific nvmf_specific;
}; };

View File

@ -304,12 +304,15 @@ spdk_nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
} }
/* /*
* KAS: this field indicates the granularity of the Keep Alive Timer in 100ms units * KAS: This field indicates the granularity of the Keep Alive Timer in 100ms units.
* keep-alive timeout in milliseconds * If this field is cleared to 0h, then Keep Alive is not supported.
*/ */
if (transport->cdata.kas) {
ctrlr->feat.keep_alive_timer.bits.kato = spdk_divide_round_up(connect_cmd->kato, ctrlr->feat.keep_alive_timer.bits.kato = spdk_divide_round_up(connect_cmd->kato,
KAS_DEFAULT_VALUE * KAS_TIME_UNIT_IN_MS) * KAS_DEFAULT_VALUE * KAS_TIME_UNIT_IN_MS) *
KAS_DEFAULT_VALUE * KAS_TIME_UNIT_IN_MS; KAS_DEFAULT_VALUE * KAS_TIME_UNIT_IN_MS;
}
ctrlr->feat.async_event_configuration.bits.ns_attr_notice = 1; ctrlr->feat.async_event_configuration.bits.ns_attr_notice = 1;
ctrlr->feat.volatile_write_cache.bits.wce = 1; ctrlr->feat.volatile_write_cache.bits.wce = 1;
@ -1816,6 +1819,7 @@ nvmf_ctrlr_populate_oacs(struct spdk_nvmf_ctrlr *ctrlr,
void void
spdk_nvmf_ctrlr_data_init(struct spdk_nvmf_transport_opts *opts, struct spdk_nvmf_ctrlr_data *cdata) spdk_nvmf_ctrlr_data_init(struct spdk_nvmf_transport_opts *opts, struct spdk_nvmf_ctrlr_data *cdata)
{ {
cdata->kas = KAS_DEFAULT_VALUE;
cdata->nvmf_specific.ioccsz = sizeof(struct spdk_nvme_cmd) / 16; cdata->nvmf_specific.ioccsz = sizeof(struct spdk_nvme_cmd) / 16;
cdata->nvmf_specific.ioccsz += opts->in_capsule_data_size / 16; cdata->nvmf_specific.ioccsz += opts->in_capsule_data_size / 16;
cdata->nvmf_specific.iorcsz = sizeof(struct spdk_nvme_cpl) / 16; cdata->nvmf_specific.iorcsz = sizeof(struct spdk_nvme_cpl) / 16;
@ -1857,7 +1861,7 @@ spdk_nvmf_ctrlr_identify_ctrlr(struct spdk_nvmf_ctrlr *ctrlr, struct spdk_nvme_c
if (subsystem->subtype == SPDK_NVMF_SUBTYPE_NVME) { if (subsystem->subtype == SPDK_NVMF_SUBTYPE_NVME) {
spdk_strcpy_pad(cdata->mn, spdk_nvmf_subsystem_get_mn(subsystem), sizeof(cdata->mn), ' '); spdk_strcpy_pad(cdata->mn, spdk_nvmf_subsystem_get_mn(subsystem), sizeof(cdata->mn), ' ');
spdk_strcpy_pad(cdata->sn, spdk_nvmf_subsystem_get_sn(subsystem), sizeof(cdata->sn), ' '); spdk_strcpy_pad(cdata->sn, spdk_nvmf_subsystem_get_sn(subsystem), sizeof(cdata->sn), ' ');
cdata->kas = KAS_DEFAULT_VALUE; cdata->kas = transport->cdata.kas;
cdata->rab = 6; cdata->rab = 6;
cdata->cmic.multi_port = 1; cdata->cmic.multi_port = 1;