nvmf: rename subsystem poll group's num_channels to num_ns

Array channels in the subsystem's poll group are indexed by
nsid - 1, so rename the previous num_channels to num_ms
makes more sense.  Also embed the channels into a namespace
data structure here, and this can be reused in the following
patch.

Change-Id: If5d9aab4b1d5bcf7a3c22f29fa58d84752f0d4cc
Signed-off-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/446211
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Changpeng Liu 2019-02-28 23:21:37 -05:00 committed by Jim Harris
parent 237260f6a1
commit 2099401e94
3 changed files with 55 additions and 51 deletions

View File

@ -2116,7 +2116,7 @@ spdk_nvmf_ctrlr_process_io_cmd(struct spdk_nvmf_request *req)
bdev = ns->bdev;
desc = ns->desc;
ch = group->sgroups[ctrlr->subsys->id].channels[nsid - 1];
ch = group->sgroups[ctrlr->subsys->id].ns_info[nsid - 1].channel;
switch (cmd->opc) {
case SPDK_NVME_OPC_READ:
return spdk_nvmf_bdev_ctrlr_read_cmd(bdev, desc, ch, req);

View File

@ -162,14 +162,14 @@ spdk_nvmf_tgt_destroy_poll_group(void *io_device, void *ctx_buf)
for (sid = 0; sid < group->num_sgroups; sid++) {
sgroup = &group->sgroups[sid];
for (nsid = 0; nsid < sgroup->num_channels; nsid++) {
if (sgroup->channels[nsid]) {
spdk_put_io_channel(sgroup->channels[nsid]);
sgroup->channels[nsid] = NULL;
for (nsid = 0; nsid < sgroup->num_ns; nsid++) {
if (sgroup->ns_info[nsid].channel) {
spdk_put_io_channel(sgroup->ns_info[nsid].channel);
sgroup->ns_info[nsid].channel = NULL;
}
}
free(sgroup->channels);
free(sgroup->ns_info);
}
free(group->sgroups);
@ -864,7 +864,7 @@ poll_group_update_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem)
{
struct spdk_nvmf_subsystem_poll_group *sgroup;
uint32_t new_num_channels, old_num_channels;
uint32_t new_num_ns, old_num_ns;
uint32_t i;
struct spdk_nvmf_ns *ns;
@ -875,72 +875,72 @@ poll_group_update_subsystem(struct spdk_nvmf_poll_group *group,
sgroup = &group->sgroups[subsystem->id];
/* Make sure the array of channels is the correct size */
new_num_channels = subsystem->max_nsid;
old_num_channels = sgroup->num_channels;
/* Make sure the array of namespace information is the correct size */
new_num_ns = subsystem->max_nsid;
old_num_ns = sgroup->num_ns;
if (old_num_channels == 0) {
if (new_num_channels > 0) {
if (old_num_ns == 0) {
if (new_num_ns > 0) {
/* First allocation */
sgroup->channels = calloc(new_num_channels, sizeof(sgroup->channels[0]));
if (!sgroup->channels) {
sgroup->ns_info = calloc(new_num_ns, sizeof(struct spdk_nvmf_subsystem_pg_ns_info));
if (!sgroup->ns_info) {
return -ENOMEM;
}
}
} else if (new_num_channels > old_num_channels) {
} else if (new_num_ns > old_num_ns) {
void *buf;
/* Make the array larger */
buf = realloc(sgroup->channels, new_num_channels * sizeof(sgroup->channels[0]));
buf = realloc(sgroup->ns_info, new_num_ns * sizeof(struct spdk_nvmf_subsystem_pg_ns_info));
if (!buf) {
return -ENOMEM;
}
sgroup->channels = buf;
sgroup->ns_info = buf;
/* Null out the new channels slots */
for (i = old_num_channels; i < new_num_channels; i++) {
sgroup->channels[i] = NULL;
/* Null out the new namespace information slots */
for (i = old_num_ns; i < new_num_ns; i++) {
memset(&sgroup->ns_info[i], 0, sizeof(struct spdk_nvmf_subsystem_pg_ns_info));
}
} else if (new_num_channels < old_num_channels) {
} else if (new_num_ns < old_num_ns) {
void *buf;
/* Free the extra I/O channels */
for (i = new_num_channels; i < old_num_channels; i++) {
if (sgroup->channels[i]) {
spdk_put_io_channel(sgroup->channels[i]);
sgroup->channels[i] = NULL;
for (i = new_num_ns; i < old_num_ns; i++) {
if (sgroup->ns_info[i].channel) {
spdk_put_io_channel(sgroup->ns_info[i].channel);
sgroup->ns_info[i].channel = NULL;
}
}
/* Make the array smaller */
if (new_num_channels > 0) {
buf = realloc(sgroup->channels, new_num_channels * sizeof(sgroup->channels[0]));
if (new_num_ns > 0) {
buf = realloc(sgroup->ns_info, new_num_ns * sizeof(struct spdk_nvmf_subsystem_pg_ns_info));
if (!buf) {
return -ENOMEM;
}
sgroup->channels = buf;
sgroup->ns_info = buf;
} else {
free(sgroup->channels);
sgroup->channels = NULL;
free(sgroup->ns_info);
sgroup->ns_info = NULL;
}
}
sgroup->num_channels = new_num_channels;
sgroup->num_ns = new_num_ns;
/* Detect bdevs that were added or removed */
for (i = 0; i < sgroup->num_channels; i++) {
for (i = 0; i < sgroup->num_ns; i++) {
ns = subsystem->ns[i];
if (ns == NULL && sgroup->channels[i] == NULL) {
if (ns == NULL && sgroup->ns_info[i].channel == NULL) {
/* Both NULL. Leave empty */
} else if (ns == NULL && sgroup->channels[i] != NULL) {
} else if (ns == NULL && sgroup->ns_info[i].channel != NULL) {
/* There was a channel here, but the namespace is gone. */
spdk_put_io_channel(sgroup->channels[i]);
sgroup->channels[i] = NULL;
} else if (ns != NULL && sgroup->channels[i] == NULL) {
spdk_put_io_channel(sgroup->ns_info[i].channel);
sgroup->ns_info[i].channel = NULL;
} else if (ns != NULL && sgroup->ns_info[i].channel == NULL) {
/* A namespace appeared but there is no channel yet */
sgroup->channels[i] = spdk_bdev_get_io_channel(ns->desc);
if (sgroup->channels[i] == NULL) {
sgroup->ns_info[i].channel = spdk_bdev_get_io_channel(ns->desc);
if (sgroup->ns_info[i].channel == NULL) {
SPDK_ERRLOG("Could not allocate I/O channel.\n");
return -ENOMEM;
}
@ -1005,16 +1005,16 @@ _nvmf_poll_group_remove_subsystem_cb(void *ctx, int status)
goto fini;
}
for (nsid = 0; nsid < sgroup->num_channels; nsid++) {
if (sgroup->channels[nsid]) {
spdk_put_io_channel(sgroup->channels[nsid]);
sgroup->channels[nsid] = NULL;
for (nsid = 0; nsid < sgroup->num_ns; nsid++) {
if (sgroup->ns_info[nsid].channel) {
spdk_put_io_channel(sgroup->ns_info[nsid].channel);
sgroup->ns_info[nsid].channel = NULL;
}
}
sgroup->num_channels = 0;
free(sgroup->channels);
sgroup->channels = NULL;
sgroup->num_ns = 0;
free(sgroup->ns_info);
sgroup->ns_info = NULL;
fini:
free(qpair_ctx);
if (cpl_fn) {

View File

@ -112,14 +112,18 @@ struct spdk_nvmf_transport_poll_group {
TAILQ_ENTRY(spdk_nvmf_transport_poll_group) link;
};
struct spdk_nvmf_subsystem_pg_ns_info {
struct spdk_io_channel *channel;
};
struct spdk_nvmf_subsystem_poll_group {
/* Array of channels for each namespace indexed by nsid - 1 */
struct spdk_io_channel **channels;
uint32_t num_channels;
/* Array of namespace information for each namespace indexed by nsid - 1 */
struct spdk_nvmf_subsystem_pg_ns_info *ns_info;
uint32_t num_ns;
enum spdk_nvmf_subsystem_state state;
enum spdk_nvmf_subsystem_state state;
TAILQ_HEAD(, spdk_nvmf_request) queued;
TAILQ_HEAD(, spdk_nvmf_request) queued;
};
struct spdk_nvmf_poll_group {