nvmf_tgt: unify subsystem config parsing code
Use the construct_nvmf_subsystem RPC call handler code from the nvmf.conf parser to factor out some of the duplicated code. Change-Id: I1b8f9af03f4a774cbb5c06dda7c57286e8968204 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
25083abc12
commit
3403d59522
@ -333,197 +333,72 @@ static int
|
|||||||
spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
|
spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp)
|
||||||
{
|
{
|
||||||
const char *nqn, *mode_str;
|
const char *nqn, *mode_str;
|
||||||
struct nvmf_tgt_subsystem *app_subsys;
|
|
||||||
struct spdk_nvmf_subsystem *subsystem;
|
|
||||||
enum spdk_nvmf_subsystem_mode mode;
|
|
||||||
int i, ret;
|
int i, ret;
|
||||||
uint64_t mask;
|
int lcore;
|
||||||
int lcore = 0;
|
int num_listen_addrs;
|
||||||
int num = spdk_conf_section_get_num(sp);
|
struct rpc_listen_address listen_addrs[MAX_LISTEN_ADDRESSES];
|
||||||
|
int num_hosts;
|
||||||
|
char *hosts[MAX_HOSTS];
|
||||||
|
const char *bdf;
|
||||||
|
const char *sn;
|
||||||
|
int num_devs;
|
||||||
|
char *devs[MAX_VIRTUAL_NAMESPACE];
|
||||||
|
|
||||||
nqn = spdk_conf_section_get_val(sp, "NQN");
|
nqn = spdk_conf_section_get_val(sp, "NQN");
|
||||||
if (nqn == NULL) {
|
|
||||||
SPDK_ERRLOG("No NQN specified for Subsystem %d\n", num);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Determine which core to assign to the subsystem */
|
|
||||||
mask = spdk_app_get_core_mask();
|
|
||||||
lcore = spdk_conf_section_get_intval(sp, "Core");
|
|
||||||
if (lcore < 0) {
|
|
||||||
lcore = 0;
|
|
||||||
for (i = 0; i < num; i++) {
|
|
||||||
lcore = spdk_nvmf_allocate_lcore(mask, lcore);
|
|
||||||
lcore++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lcore = spdk_nvmf_allocate_lcore(mask, lcore);
|
|
||||||
|
|
||||||
mode_str = spdk_conf_section_get_val(sp, "Mode");
|
mode_str = spdk_conf_section_get_val(sp, "Mode");
|
||||||
if (mode_str == NULL) {
|
lcore = spdk_conf_section_get_intval(sp, "Core");
|
||||||
SPDK_ERRLOG("No Mode specified for Subsystem %d\n", num);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcasecmp(mode_str, "Direct") == 0) {
|
|
||||||
mode = NVMF_SUBSYSTEM_MODE_DIRECT;
|
|
||||||
} else if (strcasecmp(mode_str, "Virtual") == 0) {
|
|
||||||
mode = NVMF_SUBSYSTEM_MODE_VIRTUAL;
|
|
||||||
} else {
|
|
||||||
SPDK_ERRLOG("Invalid Subsystem mode: %s\n", mode_str);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
app_subsys = nvmf_tgt_create_subsystem(nqn, SPDK_NVMF_SUBTYPE_NVME, mode, lcore);
|
|
||||||
if (app_subsys == NULL) {
|
|
||||||
SPDK_ERRLOG("Subsystem createion failed\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
subsystem = app_subsys->subsystem;
|
|
||||||
|
|
||||||
/* Parse Listen sections */
|
/* Parse Listen sections */
|
||||||
|
num_listen_addrs = 0;
|
||||||
for (i = 0; i < MAX_LISTEN_ADDRESSES; i++) {
|
for (i = 0; i < MAX_LISTEN_ADDRESSES; i++) {
|
||||||
char *transport_name, *listen_addr;
|
char *listen_addr;
|
||||||
char *traddr, *trsvcid;
|
|
||||||
int numa_node = -1;
|
|
||||||
|
|
||||||
transport_name = spdk_conf_section_get_nmval(sp, "Listen", i, 0);
|
listen_addrs[i].transport = spdk_conf_section_get_nmval(sp, "Listen", i, 0);
|
||||||
listen_addr = spdk_conf_section_get_nmval(sp, "Listen", i, 1);
|
listen_addr = spdk_conf_section_get_nmval(sp, "Listen", i, 1);
|
||||||
|
|
||||||
if (!transport_name || !listen_addr) {
|
if (!listen_addrs[i].transport || !listen_addr) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
listen_addr = strdup(listen_addr);
|
listen_addr = strdup(listen_addr);
|
||||||
|
|
||||||
ret = spdk_parse_ip_addr(listen_addr, &traddr, &trsvcid);
|
ret = spdk_parse_ip_addr(listen_addr, &listen_addrs[i].traddr, &listen_addrs[i].trsvcid);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SPDK_ERRLOG("Unable to parse listen address '%s'\n", listen_addr);
|
SPDK_ERRLOG("Unable to parse listen address '%s'\n", listen_addr);
|
||||||
|
free(listen_addr);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
numa_node = spdk_get_ifaddr_numa_node(traddr);
|
num_listen_addrs++;
|
||||||
if (numa_node >= 0) {
|
|
||||||
if (rte_lcore_to_socket_id(app_subsys->lcore) != (unsigned)numa_node) {
|
|
||||||
SPDK_WARNLOG("Subsystem %s is configured to run on a CPU core %u belonging "
|
|
||||||
"to a different NUMA node than the associated NIC. "
|
|
||||||
"This may result in reduced performance.\n",
|
|
||||||
spdk_nvmf_subsystem_get_nqn(app_subsys->subsystem), app_subsys->lcore);
|
|
||||||
SPDK_WARNLOG("The NIC is on socket %u\n", numa_node);
|
|
||||||
SPDK_WARNLOG("The Subsystem is on socket %u\n",
|
|
||||||
rte_lcore_to_socket_id(app_subsys->lcore));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = spdk_nvmf_subsystem_add_listener(subsystem, transport_name, traddr, trsvcid);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
SPDK_ERRLOG("Failed to listen on traddr=%s, trsvcid=%s\n", traddr, trsvcid);
|
|
||||||
free(listen_addr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
free(listen_addr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse Host sections */
|
/* Parse Host sections */
|
||||||
|
num_hosts = 0;
|
||||||
for (i = 0; i < MAX_HOSTS; i++) {
|
for (i = 0; i < MAX_HOSTS; i++) {
|
||||||
char *host_nqn;
|
hosts[i] = spdk_conf_section_get_nval(sp, "Host", i);
|
||||||
|
if (!hosts[i]) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
host_nqn = spdk_conf_section_get_nval(sp, "Host", i);
|
bdf = spdk_conf_section_get_val(sp, "NVMe");
|
||||||
if (!host_nqn) {
|
sn = spdk_conf_section_get_val(sp, "SN");
|
||||||
|
|
||||||
|
num_devs = 0;
|
||||||
|
for (i = 0; i < MAX_VIRTUAL_NAMESPACE; i++) {
|
||||||
|
devs[i] = spdk_conf_section_get_nmval(sp, "Namespace", i, 0);
|
||||||
|
if (!devs[i]) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
spdk_nvmf_subsystem_add_host(subsystem, host_nqn);
|
num_devs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode == NVMF_SUBSYSTEM_MODE_DIRECT) {
|
return spdk_nvmf_parse_subsystem_for_rpc(nqn, mode_str, lcore,
|
||||||
const char *bdf;
|
num_listen_addrs, listen_addrs,
|
||||||
struct spdk_nvmf_probe_ctx ctx = { 0 };
|
num_hosts, hosts,
|
||||||
struct spdk_nvme_transport_id trid = {};
|
bdf, sn,
|
||||||
struct spdk_pci_addr pci_addr;
|
num_devs, devs);
|
||||||
|
|
||||||
/* Parse NVMe section */
|
|
||||||
bdf = spdk_conf_section_get_val(sp, "NVMe");
|
|
||||||
if (bdf == NULL) {
|
|
||||||
SPDK_ERRLOG("Subsystem %d: missing NVMe directive\n", num);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.app_subsystem = app_subsys;
|
|
||||||
ctx.found = false;
|
|
||||||
trid.trtype = SPDK_NVME_TRANSPORT_PCIE;
|
|
||||||
if (strcmp(bdf, "*") == 0) {
|
|
||||||
ctx.any = true;
|
|
||||||
} else {
|
|
||||||
if (spdk_pci_addr_parse(&pci_addr, bdf) < 0) {
|
|
||||||
SPDK_ERRLOG("Invalid format for NVMe BDF: %s\n", bdf);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ctx.any = false;
|
|
||||||
spdk_pci_addr_fmt(trid.traddr, sizeof(trid.traddr), &pci_addr);
|
|
||||||
ctx.trid = trid;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spdk_nvme_probe(&trid, &ctx, probe_cb, attach_cb, NULL)) {
|
|
||||||
SPDK_ERRLOG("One or more controllers failed in spdk_nvme_probe()\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ctx.found) {
|
|
||||||
SPDK_ERRLOG("Could not find NVMe controller for Subsystem%d\n", num);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
struct spdk_bdev *bdev;
|
|
||||||
const char *namespace, *sn, *val;
|
|
||||||
|
|
||||||
sn = spdk_conf_section_get_val(sp, "SN");
|
|
||||||
if (sn == NULL) {
|
|
||||||
SPDK_ERRLOG("Subsystem %d: missing serial number\n", num);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (spdk_nvmf_validate_sn(sn) != 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace = spdk_conf_section_get_val(sp, "Namespace");
|
|
||||||
if (namespace == NULL) {
|
|
||||||
SPDK_ERRLOG("Subsystem %d: missing Namespace directive\n", num);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
spdk_nvmf_subsystem_set_sn(subsystem, sn);
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_VIRTUAL_NAMESPACE; i++) {
|
|
||||||
val = spdk_conf_section_get_nval(sp, "Namespace", i);
|
|
||||||
if (val == NULL) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
namespace = spdk_conf_section_get_nmval(sp, "Namespace", i, 0);
|
|
||||||
if (!namespace) {
|
|
||||||
SPDK_ERRLOG("Namespace %d: missing block device\n", i);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bdev = spdk_bdev_get_by_name(namespace);
|
|
||||||
if (!bdev) {
|
|
||||||
SPDK_ERRLOG("bdev is NULL\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spdk_nvmf_subsystem_add_ns(subsystem, bdev)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SPDK_NOTICELOG("Attaching block device %s to subsystem %p\n",
|
|
||||||
bdev->name, subsystem);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nvmf_tgt_start_subsystem(app_subsys);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
Loading…
x
Reference in New Issue
Block a user