nvmf: Update poll group channel maps when a new namespace is added.
There isn't a way to remove a namespace just yet, but at least adding one works. Change-Id: I99416d1bc9cbc0e2303c16040d2311a07829cbea Signed-off-by: Ben Walker <benjamin.walker@intel.com> Reviewed-on: https://review.gerrithub.io/388293 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
48aced6ebc
commit
c3080c5aa6
@ -416,11 +416,18 @@ spdk_nvmf_poll_group_add_subsystem(struct spdk_nvmf_poll_group *group,
|
|||||||
if (subsystem->id >= group->num_sgroups) {
|
if (subsystem->id >= group->num_sgroups) {
|
||||||
void *buf;
|
void *buf;
|
||||||
|
|
||||||
group->num_sgroups = subsystem->id + 1;
|
|
||||||
buf = realloc(group->sgroups, group->num_sgroups * sizeof(*sgroup));
|
buf = realloc(group->sgroups, (subsystem->id + 1) * sizeof(*sgroup));
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Zero out the newly allocated memory */
|
||||||
|
memset(&group->sgroups[group->num_sgroups],
|
||||||
|
0,
|
||||||
|
(subsystem->id + 1 - group->num_sgroups) * sizeof(struct spdk_io_channel *));
|
||||||
|
|
||||||
|
group->num_sgroups = subsystem->id + 1;
|
||||||
group->sgroups = buf;
|
group->sgroups = buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -468,6 +475,50 @@ spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
spdk_nvmf_poll_group_add_ns(struct spdk_nvmf_poll_group *group,
|
||||||
|
struct spdk_nvmf_subsystem *subsystem,
|
||||||
|
struct spdk_nvmf_ns *ns)
|
||||||
|
{
|
||||||
|
struct spdk_nvmf_subsystem_poll_group *sgroup;
|
||||||
|
uint32_t ns_idx;
|
||||||
|
|
||||||
|
sgroup = &group->sgroups[subsystem->id];
|
||||||
|
|
||||||
|
/* The index into the channels array is (nsid - 1) */
|
||||||
|
ns_idx = ns->id - 1;
|
||||||
|
|
||||||
|
if (ns_idx >= sgroup->num_channels) {
|
||||||
|
void *buf;
|
||||||
|
|
||||||
|
buf = realloc(sgroup->channels,
|
||||||
|
ns->id * sizeof(struct spdk_io_channel *));
|
||||||
|
if (!buf) {
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Zero out the newly allocated memory */
|
||||||
|
memset(&sgroup->channels[sgroup->num_channels],
|
||||||
|
0,
|
||||||
|
(ns->id - sgroup->num_channels) * sizeof(struct spdk_io_channel *));
|
||||||
|
|
||||||
|
sgroup->num_channels = ns->id;
|
||||||
|
sgroup->channels = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The channel could have been created in response to a subsystem creation
|
||||||
|
* event already propagating through the system */
|
||||||
|
if (sgroup->channels[ns_idx] == NULL) {
|
||||||
|
sgroup->channels[ns_idx] = spdk_bdev_get_io_channel(ns->desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sgroup->channels[ns_idx] == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
SPDK_TRACE_REGISTER_FN(nvmf_trace)
|
SPDK_TRACE_REGISTER_FN(nvmf_trace)
|
||||||
{
|
{
|
||||||
spdk_trace_register_object(OBJECT_NVMF_IO, 'r');
|
spdk_trace_register_object(OBJECT_NVMF_IO, 'r');
|
||||||
|
@ -223,6 +223,9 @@ int spdk_nvmf_poll_group_add_subsystem(struct spdk_nvmf_poll_group *group,
|
|||||||
struct spdk_nvmf_subsystem *subsystem);
|
struct spdk_nvmf_subsystem *subsystem);
|
||||||
int spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
|
int spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
|
||||||
struct spdk_nvmf_subsystem *subsystem);
|
struct spdk_nvmf_subsystem *subsystem);
|
||||||
|
int spdk_nvmf_poll_group_add_ns(struct spdk_nvmf_poll_group *group,
|
||||||
|
struct spdk_nvmf_subsystem *subsystem,
|
||||||
|
struct spdk_nvmf_ns *ns);
|
||||||
|
|
||||||
void spdk_nvmf_request_exec(struct spdk_nvmf_request *req);
|
void spdk_nvmf_request_exec(struct spdk_nvmf_request *req);
|
||||||
int spdk_nvmf_request_complete(struct spdk_nvmf_request *req);
|
int spdk_nvmf_request_complete(struct spdk_nvmf_request *req);
|
||||||
|
@ -393,11 +393,36 @@ spdk_nvmf_listener_get_trid(struct spdk_nvmf_listener *listener)
|
|||||||
return &listener->trid;
|
return &listener->trid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct spdk_nvmf_subsystem_add_ns_ctx {
|
||||||
|
struct spdk_nvmf_subsystem *subsystem;
|
||||||
|
struct spdk_nvmf_ns *ns;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
spdk_nvmf_subsystem_add_ns_done(void *io_device, void *ctx, int status)
|
||||||
|
{
|
||||||
|
free(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
spdk_nvmf_subsystem_ns_update_poll_group(void *io_device,
|
||||||
|
struct spdk_io_channel *ch,
|
||||||
|
void *c)
|
||||||
|
{
|
||||||
|
struct spdk_nvmf_poll_group *group;
|
||||||
|
struct spdk_nvmf_subsystem_add_ns_ctx *ctx = c;
|
||||||
|
|
||||||
|
group = spdk_io_channel_get_ctx(ch);
|
||||||
|
|
||||||
|
return spdk_nvmf_poll_group_add_ns(group, ctx->subsystem, ctx->ns);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bdev *bdev,
|
spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bdev *bdev,
|
||||||
uint32_t nsid)
|
uint32_t nsid)
|
||||||
{
|
{
|
||||||
struct spdk_nvmf_ns *ns;
|
struct spdk_nvmf_ns *ns;
|
||||||
|
struct spdk_nvmf_subsystem_add_ns_ctx *ctx;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@ -473,6 +498,25 @@ spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bd
|
|||||||
|
|
||||||
subsystem->max_nsid = spdk_max(subsystem->max_nsid, nsid);
|
subsystem->max_nsid = spdk_max(subsystem->max_nsid, nsid);
|
||||||
subsystem->num_allocated_nsid++;
|
subsystem->num_allocated_nsid++;
|
||||||
|
|
||||||
|
ctx = calloc(1, sizeof(*ctx));
|
||||||
|
if (!ctx) {
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
ctx->subsystem = subsystem;
|
||||||
|
ctx->ns = ns;
|
||||||
|
|
||||||
|
/* Send a message to each poll group to notify it that a new namespace
|
||||||
|
* is available.
|
||||||
|
* TODO: This call does not currently allow the user to wait for these
|
||||||
|
* messages to propagate. It also does not protect against two calls
|
||||||
|
* to this function overlapping
|
||||||
|
*/
|
||||||
|
spdk_for_each_channel(subsystem->tgt,
|
||||||
|
spdk_nvmf_subsystem_ns_update_poll_group,
|
||||||
|
ctx,
|
||||||
|
spdk_nvmf_subsystem_add_ns_done);
|
||||||
|
|
||||||
return nsid;
|
return nsid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,6 +136,14 @@ spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
spdk_nvmf_poll_group_add_ns(struct spdk_nvmf_poll_group *group,
|
||||||
|
struct spdk_nvmf_subsystem *subsystem,
|
||||||
|
struct spdk_nvmf_ns *ns)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
spdk_nvmf_subsystem_bdev_attach(struct spdk_nvmf_subsystem *subsystem)
|
spdk_nvmf_subsystem_bdev_attach(struct spdk_nvmf_subsystem *subsystem)
|
||||||
{
|
{
|
||||||
|
@ -109,6 +109,14 @@ spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
spdk_nvmf_poll_group_add_ns(struct spdk_nvmf_poll_group *group,
|
||||||
|
struct spdk_nvmf_subsystem *subsystem,
|
||||||
|
struct spdk_nvmf_ns *ns)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
spdk_nvme_transport_id_parse_trtype(enum spdk_nvme_transport_type *trtype, const char *str)
|
spdk_nvme_transport_id_parse_trtype(enum spdk_nvme_transport_type *trtype, const char *str)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user