diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index ef2581ad7..a949f5c4d 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -472,18 +472,28 @@ spdk_vhost_dev_find(const char *ctrlr_name) static int spdk_vhost_parse_core_mask(const char *mask, uint64_t *cpumask) { - char *end; + int rc; + + if (cpumask == NULL) { + return -1; + } if (mask == NULL) { *cpumask = spdk_app_get_core_mask(); return 0; } - errno = 0; - *cpumask = strtoull(mask, &end, 16); + *cpumask = 0; - if (*end != '\0' || errno || !*cpumask || - ((*cpumask & spdk_app_get_core_mask()) != *cpumask)) { + rc = spdk_app_parse_core_mask(mask, cpumask); + if (rc != 0) { + SPDK_ERRLOG("invalid cpumask %s\n", mask); + return -1; + } + + if (*cpumask == 0) { + SPDK_ERRLOG("no cpu is selected among reactor mask(=%jx)\n", + spdk_app_get_core_mask()); return -1; } @@ -508,7 +518,7 @@ spdk_vhost_dev_construct(struct spdk_vhost_dev *vdev, const char *name, const ch } if (spdk_vhost_parse_core_mask(mask_str, &cpumask) != 0) { - SPDK_ERRLOG("cpumask %s not a subset of app mask 0x%jx\n", + SPDK_ERRLOG("cpumask %s is invalid (app mask is 0x%jx)\n", mask_str, spdk_app_get_core_mask()); return -EINVAL; } diff --git a/test/unit/lib/vhost/vhost.c/vhost_ut.c b/test/unit/lib/vhost/vhost.c/vhost_ut.c index 627b59d46..ec63b37a2 100644 --- a/test/unit/lib/vhost/vhost.c/vhost_ut.c +++ b/test/unit/lib/vhost/vhost.c/vhost_ut.c @@ -47,6 +47,7 @@ DEFINE_STUB(spdk_event_allocate, struct spdk_event *, DEFINE_STUB(spdk_mem_register, int, (void *vaddr, size_t len), 0); DEFINE_STUB(spdk_mem_unregister, int, (void *vaddr, size_t len), 0); DEFINE_STUB(spdk_app_get_core_mask, uint64_t, (void), 0); +DEFINE_STUB(spdk_app_parse_core_mask, int, (const char *mask, uint64_t *cpumask), 0); DEFINE_STUB_V(spdk_app_stop, (int rc)); DEFINE_STUB_V(spdk_event_call, (struct spdk_event *event)); DEFINE_STUB(spdk_poller_register, struct spdk_poller *, (spdk_poller_fn fn, void *arg,