vhost: removed dpdk_vid_mapping

As a consequence MAX_VHOST_DEVICE define was removed, which was a
copy of a private DPDK define. Using it was more likely a hack.
Also renamed MAX_SCSI_CTRLRS to MAX_VHOST_DEVICES.

Instead of dpdk_vid_mapping, a new function
spdk_vhost_dev_find_by_vid is used. It simply iterates through
all the controllers.

Since this patch required to move the definition of spdk_vhost_ctrlrs
array, it has been renamed to g_spdk_vhost_devices.

Change-Id: I9b70ccb97ffaa90a22c6a1c90850b3205a9b9b27
Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/361881
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
Dariusz Stojaczyk 2017-05-18 15:57:09 +02:00 committed by Jim Harris
parent c6745bc2b8
commit 53a452d228

View File

@ -64,7 +64,7 @@ static char dev_dirname[PATH_MAX] = "";
#define SPDK_CACHE_LINE_SIZE RTE_CACHE_LINE_SIZE #define SPDK_CACHE_LINE_SIZE RTE_CACHE_LINE_SIZE
#define MAX_VHOST_VRINGS 256 #define MAX_VHOST_VRINGS 256
#define MAX_VHOST_DEVICE 1024 #define MAX_VHOST_DEVICES 15
#ifndef VIRTIO_F_VERSION_1 #ifndef VIRTIO_F_VERSION_1
#define VIRTIO_F_VERSION_1 32 #define VIRTIO_F_VERSION_1 32
@ -107,6 +107,24 @@ struct spdk_vhost_dev {
struct rte_vhost_vring virtqueue[MAX_VHOST_VRINGS] __attribute((aligned(SPDK_CACHE_LINE_SIZE))); struct rte_vhost_vring virtqueue[MAX_VHOST_VRINGS] __attribute((aligned(SPDK_CACHE_LINE_SIZE)));
}; };
static struct spdk_vhost_dev *g_spdk_vhost_devices[MAX_VHOST_DEVICES];
static struct spdk_vhost_dev *
spdk_vhost_dev_find_by_vid(int vid)
{
unsigned i;
struct spdk_vhost_dev *vdev;
for (i = 0; i < MAX_VHOST_DEVICES; i++) {
vdev = g_spdk_vhost_devices[i];
if (vdev && vdev->vid == vid) {
return vdev;
}
}
return NULL;
}
static void static void
spdk_vhost_dev_destruct(struct spdk_vhost_dev *vdev) spdk_vhost_dev_destruct(struct spdk_vhost_dev *vdev)
{ {
@ -177,10 +195,6 @@ struct spdk_vhost_scsi_dev {
struct spdk_poller *controlq_poller; struct spdk_poller *controlq_poller;
} __rte_cache_aligned; } __rte_cache_aligned;
/* This maps from the integer index passed by DPDK to the our controller representation. */
/* MAX_VHOST_DEVICE from DPDK. */
static struct spdk_vhost_dev *dpdk_vid_mapping[MAX_VHOST_DEVICE];
/* /*
* Get available requests from avail ring. * Get available requests from avail ring.
*/ */
@ -825,8 +839,10 @@ destroy_device(int vid)
sem_t done_sem; sem_t done_sem;
uint32_t i; uint32_t i;
assert(vid < MAX_VHOST_DEVICE); vdev = spdk_vhost_dev_find_by_vid(vid);
vdev = dpdk_vid_mapping[vid]; if (vdev == NULL) {
rte_panic("Couldn't find device with vid %d to stop.\n", vid);
}
svdev = (struct spdk_vhost_scsi_dev *) vdev; svdev = (struct spdk_vhost_scsi_dev *) vdev;
event = vhost_sem_event_alloc(vdev->lcore, vdev_event_done_cb, NULL, &done_sem); event = vhost_sem_event_alloc(vdev->lcore, vdev_event_done_cb, NULL, &done_sem);
@ -856,15 +872,9 @@ destroy_device(int vid)
g_num_ctrlrs[vdev->lcore]--; g_num_ctrlrs[vdev->lcore]--;
vdev->lcore = -1; vdev->lcore = -1;
spdk_vhost_dev_destruct(&svdev->vdev); spdk_vhost_dev_destruct(vdev);
dpdk_vid_mapping[vid] = NULL;
} }
#define LUN_DEV_NAME_SIZE 8
#define MAX_SCSI_CTRLRS 15
static struct spdk_vhost_dev *spdk_vhost_ctrlrs[MAX_SCSI_CTRLRS];
struct spdk_vhost_dev * struct spdk_vhost_dev *
spdk_vhost_dev_find(const char *ctrlr_name) spdk_vhost_dev_find(const char *ctrlr_name)
{ {
@ -875,20 +885,19 @@ spdk_vhost_dev_find(const char *ctrlr_name)
ctrlr_name += dev_dirname_len; ctrlr_name += dev_dirname_len;
} }
for (i = 0; i < MAX_SCSI_CTRLRS; i++) { for (i = 0; i < MAX_VHOST_DEVICES; i++) {
if (spdk_vhost_ctrlrs[i] == NULL) { if (g_spdk_vhost_devices[i] == NULL) {
continue; continue;
} }
if (strcmp(spdk_vhost_ctrlrs[i]->name, ctrlr_name) == 0) { if (strcmp(g_spdk_vhost_devices[i]->name, ctrlr_name) == 0) {
return spdk_vhost_ctrlrs[i]; return g_spdk_vhost_devices[i];
} }
} }
return NULL; return NULL;
} }
static int new_device(int vid); static int new_device(int vid);
static void destroy_device(int vid); static void destroy_device(int vid);
/* /*
@ -925,14 +934,14 @@ spdk_vhost_scsi_dev_construct(const char *name, uint64_t cpumask)
return -EEXIST; return -EEXIST;
} }
for (ctrlr_num = 0; ctrlr_num < MAX_SCSI_CTRLRS; ctrlr_num++) { for (ctrlr_num = 0; ctrlr_num < MAX_VHOST_DEVICES; ctrlr_num++) {
if (spdk_vhost_ctrlrs[ctrlr_num] == NULL) { if (g_spdk_vhost_devices[ctrlr_num] == NULL) {
break; break;
} }
} }
if (ctrlr_num == MAX_SCSI_CTRLRS) { if (ctrlr_num == MAX_VHOST_DEVICES) {
SPDK_ERRLOG("Max scsi controllers reached (%d).\n", MAX_SCSI_CTRLRS); SPDK_ERRLOG("Max scsi controllers reached (%d).\n", MAX_VHOST_DEVICES);
return -ENOSPC; return -ENOSPC;
} }
@ -986,7 +995,7 @@ spdk_vhost_scsi_dev_construct(const char *name, uint64_t cpumask)
return -EIO; return -EIO;
} }
spdk_vhost_ctrlrs[ctrlr_num] = vdev; g_spdk_vhost_devices[ctrlr_num] = vdev;
SPDK_NOTICELOG("Controller %s: new controller added\n", name); SPDK_NOTICELOG("Controller %s: new controller added\n", name);
return 0; return 0;
} }
@ -1005,13 +1014,13 @@ spdk_vhost_scsi_dev_remove(struct spdk_vhost_scsi_dev *svdev)
return -ENODEV; return -ENODEV;
} }
for (ctrlr_num = 0; ctrlr_num < MAX_SCSI_CTRLRS; ctrlr_num++) { for (ctrlr_num = 0; ctrlr_num < MAX_VHOST_DEVICES; ctrlr_num++) {
if (spdk_vhost_ctrlrs[ctrlr_num] == vdev) { if (g_spdk_vhost_devices[ctrlr_num] == vdev) {
break; break;
} }
} }
if (ctrlr_num == MAX_SCSI_CTRLRS) { if (ctrlr_num == MAX_VHOST_DEVICES) {
SPDK_ERRLOG("Trying to remove invalid controller: %s.\n", vdev->name); SPDK_ERRLOG("Trying to remove invalid controller: %s.\n", vdev->name);
return -ENOSPC; return -ENOSPC;
} }
@ -1043,7 +1052,7 @@ spdk_vhost_scsi_dev_remove(struct spdk_vhost_scsi_dev *svdev)
*/ */
free(vdev->name); free(vdev->name);
spdk_free(svdev); spdk_free(svdev);
spdk_vhost_ctrlrs[ctrlr_num] = NULL; g_spdk_vhost_devices[ctrlr_num] = NULL;
return 0; return 0;
} }
@ -1174,8 +1183,8 @@ spdk_vhost_dev_next(struct spdk_vhost_dev *prev)
int i = 0; int i = 0;
if (prev != NULL) { if (prev != NULL) {
for (; i < MAX_SCSI_CTRLRS; i++) { for (; i < MAX_VHOST_DEVICES; i++) {
if (spdk_vhost_ctrlrs[i] == prev) { if (g_spdk_vhost_devices[i] == prev) {
break; break;
} }
} }
@ -1183,12 +1192,12 @@ spdk_vhost_dev_next(struct spdk_vhost_dev *prev)
i++; i++;
} }
for (; i < MAX_SCSI_CTRLRS; i++) { for (; i < MAX_VHOST_DEVICES; i++) {
if (spdk_vhost_ctrlrs[i] == NULL) { if (g_spdk_vhost_devices[i] == NULL) {
continue; continue;
} }
return spdk_vhost_ctrlrs[i]; return g_spdk_vhost_devices[i];
} }
return NULL; return NULL;
@ -1315,8 +1324,6 @@ new_device(int vid)
char ifname[PATH_MAX]; char ifname[PATH_MAX];
sem_t added; sem_t added;
assert(vid < MAX_VHOST_DEVICE);
if (rte_vhost_get_ifname(vid, ifname, PATH_MAX) < 0) { if (rte_vhost_get_ifname(vid, ifname, PATH_MAX) < 0) {
SPDK_ERRLOG("Couldn't get a valid ifname for device %d\n", vid); SPDK_ERRLOG("Couldn't get a valid ifname for device %d\n", vid);
return -1; return -1;
@ -1338,7 +1345,6 @@ new_device(int vid)
return -1; return -1;
} }
dpdk_vid_mapping[vid] = vdev;
vdev->lcore = spdk_vhost_allocate_reactor(vdev->cpumask); vdev->lcore = spdk_vhost_allocate_reactor(vdev->cpumask);
event = vhost_sem_event_alloc(vdev->lcore, add_vdev_cb, vdev, &added); event = vhost_sem_event_alloc(vdev->lcore, add_vdev_cb, vdev, &added);
@ -1377,8 +1383,8 @@ session_shutdown(void *arg)
struct spdk_vhost_dev *vdev = NULL; struct spdk_vhost_dev *vdev = NULL;
int i; int i;
for (i = 0; i < MAX_SCSI_CTRLRS; i++) { for (i = 0; i < MAX_VHOST_DEVICES; i++) {
vdev = spdk_vhost_ctrlrs[i]; vdev = g_spdk_vhost_devices[i];
if (vdev == NULL) { if (vdev == NULL) {
continue; continue;
} }