rte_virtio: remove vtpci_internal

Now that legacy PCI support has
been dropped, we can safely assume
there's only one backend type
per device. So the vtpci_internal
- containing process-local data -
can be removed.

Change-Id: I15d87a280b74318c7a44ee60ce3408756d1f5a69
Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/385423
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Dariusz Stojaczyk 2017-11-02 15:04:21 +01:00 committed by Jim Harris
parent 79f99ccce0
commit a8c375ad77
4 changed files with 10 additions and 36 deletions

View File

@ -287,11 +287,8 @@ virtio_dev_init(struct virtio_dev *dev, uint64_t req_features)
void void
virtio_dev_free(struct virtio_dev *dev) virtio_dev_free(struct virtio_dev *dev)
{ {
uint32_t vdev_id = dev->id;
virtio_free_queues(dev); virtio_free_queues(dev);
vtpci_ops(dev)->free_vdev(dev); vtpci_ops(dev)->free_vdev(dev);
vtpci_deinit(vdev_id);
pthread_mutex_destroy(&dev->mutex); pthread_mutex_destroy(&dev->mutex);
free(dev); free(dev);
} }

View File

@ -98,6 +98,9 @@ struct virtio_dev {
/** Mutex for asynchronous virtqueue-changing operations. */ /** Mutex for asynchronous virtqueue-changing operations. */
pthread_mutex_t mutex; pthread_mutex_t mutex;
/** Backend-specific callbacks. */
const struct virtio_pci_ops *backend_ops;
/** Context for the backend ops */ /** Context for the backend ops */
void *ctx; void *ctx;

View File

@ -43,6 +43,7 @@
struct virtio_driver g_virtio_driver = { struct virtio_driver g_virtio_driver = {
.init_ctrlrs = TAILQ_HEAD_INITIALIZER(g_virtio_driver.init_ctrlrs), .init_ctrlrs = TAILQ_HEAD_INITIALIZER(g_virtio_driver.init_ctrlrs),
.attached_ctrlrs = TAILQ_HEAD_INITIALIZER(g_virtio_driver.attached_ctrlrs), .attached_ctrlrs = TAILQ_HEAD_INITIALIZER(g_virtio_driver.attached_ctrlrs),
.ctrlr_counter = 0,
}; };
/* /*
@ -519,27 +520,17 @@ struct virtio_dev *
struct virtio_dev *vdev; struct virtio_dev *vdev;
unsigned vdev_num; unsigned vdev_num;
for (vdev_num = 0; vdev_num < VIRTIO_MAX_DEVICES; vdev_num++) {
if (g_virtio_driver.internal[vdev_num].vtpci_ops == NULL) {
break;
}
}
if (vdev_num == VIRTIO_MAX_DEVICES) {
SPDK_ERRLOG("Max vhost device limit reached (%u).\n", VIRTIO_MAX_DEVICES);
return NULL;
}
vdev = calloc(1, sizeof(*vdev)); vdev = calloc(1, sizeof(*vdev));
if (vdev == NULL) { if (vdev == NULL) {
SPDK_ERRLOG("virtio device calloc failed\n"); SPDK_ERRLOG("virtio device calloc failed\n");
return NULL; return NULL;
} }
vdev_num = __sync_add_and_fetch(&g_virtio_driver.ctrlr_counter, 1);
vdev->id = vdev_num; vdev->id = vdev_num;
pthread_mutex_init(&vdev->mutex, NULL); pthread_mutex_init(&vdev->mutex, NULL);
vdev->backend_ops = ops;
vdev->ctx = ctx; vdev->ctx = ctx;
g_virtio_driver.internal[vdev_num].vtpci_ops = ops;
return vdev; return vdev;
} }
@ -558,13 +549,7 @@ vtpci_enumerate_pci(void)
const struct virtio_pci_ops * const struct virtio_pci_ops *
vtpci_ops(struct virtio_dev *dev) vtpci_ops(struct virtio_dev *dev)
{ {
return g_virtio_driver.internal[dev->id].vtpci_ops; return dev->backend_ops;
}
void
vtpci_deinit(uint32_t id)
{
g_virtio_driver.internal[id].vtpci_ops = NULL;
} }
void void

View File

@ -45,8 +45,6 @@
struct virtqueue; struct virtqueue;
#define VIRTIO_MAX_DEVICES 128
/* Extra status define for readability */ /* Extra status define for readability */
#define VIRTIO_CONFIG_S_RESET 0 #define VIRTIO_CONFIG_S_RESET 0
@ -104,19 +102,12 @@ struct virtio_hw {
struct virtio_scsi_config *dev_cfg; struct virtio_scsi_config *dev_cfg;
}; };
/*
* While virtio_hw is stored in shared memory, this structure stores
* some infos that may vary in the multiple process model locally.
* For example, the vtpci_ops pointer.
*/
struct vtpci_internal {
const struct virtio_pci_ops *vtpci_ops;
};
struct virtio_driver { struct virtio_driver {
struct vtpci_internal internal[VIRTIO_MAX_DEVICES];
TAILQ_HEAD(, virtio_dev) init_ctrlrs; TAILQ_HEAD(, virtio_dev) init_ctrlrs;
TAILQ_HEAD(, virtio_dev) attached_ctrlrs; TAILQ_HEAD(, virtio_dev) attached_ctrlrs;
/* Increment-only virtio_dev counter */
unsigned ctrlr_counter;
}; };
extern struct virtio_driver g_virtio_driver; extern struct virtio_driver g_virtio_driver;
@ -145,8 +136,6 @@ void vtpci_read_dev_config(struct virtio_dev *, size_t, void *, int);
const struct virtio_pci_ops *vtpci_ops(struct virtio_dev *dev); const struct virtio_pci_ops *vtpci_ops(struct virtio_dev *dev);
void vtpci_deinit(uint32_t id);
void vtpci_dump_json_config(struct virtio_dev *hw, struct spdk_json_write_ctx *w); void vtpci_dump_json_config(struct virtio_dev *hw, struct spdk_json_write_ctx *w);
extern const struct virtio_pci_ops virtio_user_ops; extern const struct virtio_pci_ops virtio_user_ops;