virtio: remove g_virtio_driver
g_virtio_driver contained just a list of all Virtio-SCSI devices. It's now being removed for two reasons: * it's backend-specific, doesn't fit a generic virtio lib * it's difficult to ensure thread-safety for it Virtio bdev modules will now manage their Virtio devices by themselves. Virtio-SCSI has now an internal device list. (And VirtioBlk module maps devices to bdevs 1:1, so doesn't need any additional work here.) Change-Id: I3bc68d76d6904df5c56f00fca7ab387871ecf88f Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com> Reviewed-on: https://review.gerrithub.io/405179 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
0bc7c3de4b
commit
6ccc262022
@ -91,8 +91,6 @@ struct virtio_dev {
|
|||||||
|
|
||||||
/** Context for the backend ops */
|
/** Context for the backend ops */
|
||||||
void *ctx;
|
void *ctx;
|
||||||
|
|
||||||
TAILQ_ENTRY(virtio_dev) tailq;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct virtio_dev_ops {
|
struct virtio_dev_ops {
|
||||||
@ -180,12 +178,6 @@ enum spdk_virtio_desc_type {
|
|||||||
/* TODO VIRTIO_DESC_INDIRECT */
|
/* TODO VIRTIO_DESC_INDIRECT */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct virtio_driver {
|
|
||||||
TAILQ_HEAD(, virtio_dev) scsi_devs;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct virtio_driver g_virtio_driver;
|
|
||||||
|
|
||||||
/** Context for creating PCI virtio_devs */
|
/** Context for creating PCI virtio_devs */
|
||||||
struct virtio_pci_ctx;
|
struct virtio_pci_ctx;
|
||||||
|
|
||||||
|
@ -96,6 +96,8 @@ struct virtio_scsi_dev {
|
|||||||
|
|
||||||
/** Context for the `remove_cb`. */
|
/** Context for the `remove_cb`. */
|
||||||
void *remove_ctx;
|
void *remove_ctx;
|
||||||
|
|
||||||
|
TAILQ_ENTRY(virtio_scsi_dev) tailq;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct virtio_scsi_io_ctx {
|
struct virtio_scsi_io_ctx {
|
||||||
@ -179,6 +181,9 @@ struct bdev_virtio_io_channel {
|
|||||||
struct spdk_poller *poller;
|
struct spdk_poller *poller;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
TAILQ_HEAD(, virtio_scsi_dev) g_virtio_scsi_devs =
|
||||||
|
TAILQ_HEAD_INITIALIZER(g_virtio_scsi_devs);
|
||||||
|
|
||||||
/** Module finish in progress */
|
/** Module finish in progress */
|
||||||
static bool g_bdev_virtio_finish = false;
|
static bool g_bdev_virtio_finish = false;
|
||||||
|
|
||||||
@ -288,7 +293,7 @@ virtio_scsi_dev_init(struct virtio_scsi_dev *svdev, uint16_t max_queues)
|
|||||||
bdev_virtio_scsi_ch_destroy_cb,
|
bdev_virtio_scsi_ch_destroy_cb,
|
||||||
sizeof(struct bdev_virtio_io_channel));
|
sizeof(struct bdev_virtio_io_channel));
|
||||||
|
|
||||||
TAILQ_INSERT_TAIL(&g_virtio_driver.scsi_devs, &svdev->vdev, tailq);
|
TAILQ_INSERT_TAIL(&g_virtio_scsi_devs, svdev, tailq);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -410,12 +415,6 @@ static struct spdk_bdev_module virtio_scsi_if = {
|
|||||||
|
|
||||||
SPDK_BDEV_MODULE_REGISTER(&virtio_scsi_if)
|
SPDK_BDEV_MODULE_REGISTER(&virtio_scsi_if)
|
||||||
|
|
||||||
static struct virtio_scsi_dev *
|
|
||||||
virtio_dev_to_scsi(struct virtio_dev *vdev)
|
|
||||||
{
|
|
||||||
return SPDK_CONTAINEROF(vdev, struct virtio_scsi_dev, vdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct virtio_scsi_io_ctx *
|
static struct virtio_scsi_io_ctx *
|
||||||
bdev_virtio_init_io_vreq(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
|
bdev_virtio_init_io_vreq(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
|
||||||
{
|
{
|
||||||
@ -1686,10 +1685,10 @@ bdev_virtio_initial_scan_complete(void *ctx __attribute__((unused)),
|
|||||||
int result __attribute__((unused)),
|
int result __attribute__((unused)),
|
||||||
struct spdk_bdev **bdevs __attribute__((unused)), size_t bdevs_cnt __attribute__((unused)))
|
struct spdk_bdev **bdevs __attribute__((unused)), size_t bdevs_cnt __attribute__((unused)))
|
||||||
{
|
{
|
||||||
struct virtio_dev *vdev;
|
struct virtio_scsi_dev *svdev;
|
||||||
|
|
||||||
TAILQ_FOREACH(vdev, &g_virtio_driver.scsi_devs, tailq) {
|
TAILQ_FOREACH(svdev, &g_virtio_scsi_devs, tailq) {
|
||||||
if (virtio_dev_to_scsi(vdev)->scan_ctx) {
|
if (svdev->scan_ctx) {
|
||||||
/* another device is still being scanned */
|
/* another device is still being scanned */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1701,8 +1700,7 @@ bdev_virtio_initial_scan_complete(void *ctx __attribute__((unused)),
|
|||||||
static int
|
static int
|
||||||
bdev_virtio_initialize(void)
|
bdev_virtio_initialize(void)
|
||||||
{
|
{
|
||||||
struct virtio_scsi_dev *svdev;
|
struct virtio_scsi_dev *svdev, *next_svdev;
|
||||||
struct virtio_dev *vdev, *next_vdev;
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = bdev_virtio_process_config();
|
rc = bdev_virtio_process_config();
|
||||||
@ -1710,14 +1708,13 @@ bdev_virtio_initialize(void)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TAILQ_EMPTY(&g_virtio_driver.scsi_devs)) {
|
if (TAILQ_EMPTY(&g_virtio_scsi_devs)) {
|
||||||
spdk_bdev_module_init_done(&virtio_scsi_if);
|
spdk_bdev_module_init_done(&virtio_scsi_if);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize all created devices and scan available targets */
|
/* Initialize all created devices and scan available targets */
|
||||||
TAILQ_FOREACH(vdev, &g_virtio_driver.scsi_devs, tailq) {
|
TAILQ_FOREACH(svdev, &g_virtio_scsi_devs, tailq) {
|
||||||
svdev = virtio_dev_to_scsi(vdev);
|
|
||||||
rc = virtio_scsi_dev_scan(svdev, bdev_virtio_initial_scan_complete, NULL);
|
rc = virtio_scsi_dev_scan(svdev, bdev_virtio_initial_scan_complete, NULL);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
goto out;
|
goto out;
|
||||||
@ -1728,9 +1725,8 @@ bdev_virtio_initialize(void)
|
|||||||
|
|
||||||
out:
|
out:
|
||||||
/* Remove any created devices */
|
/* Remove any created devices */
|
||||||
TAILQ_FOREACH_SAFE(vdev, &g_virtio_driver.scsi_devs, tailq, next_vdev) {
|
TAILQ_FOREACH_SAFE(svdev, &g_virtio_scsi_devs, tailq, next_svdev) {
|
||||||
svdev = virtio_dev_to_scsi(vdev);
|
TAILQ_REMOVE(&g_virtio_scsi_devs, svdev, tailq);
|
||||||
TAILQ_REMOVE(&g_virtio_driver.scsi_devs, vdev, tailq);
|
|
||||||
virtio_scsi_dev_remove(svdev, NULL, NULL);
|
virtio_scsi_dev_remove(svdev, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1765,7 +1761,7 @@ virtio_scsi_dev_unregister_cb(void *io_device)
|
|||||||
virtio_dev_stop(vdev);
|
virtio_dev_stop(vdev);
|
||||||
virtio_dev_destruct(vdev);
|
virtio_dev_destruct(vdev);
|
||||||
|
|
||||||
TAILQ_REMOVE(&g_virtio_driver.scsi_devs, vdev, tailq);
|
TAILQ_REMOVE(&g_virtio_scsi_devs, svdev, tailq);
|
||||||
remove_cb = svdev->remove_cb;
|
remove_cb = svdev->remove_cb;
|
||||||
remove_ctx = svdev->remove_ctx;
|
remove_ctx = svdev->remove_ctx;
|
||||||
spdk_dma_free(svdev->eventq_ios);
|
spdk_dma_free(svdev->eventq_ios);
|
||||||
@ -1775,7 +1771,7 @@ virtio_scsi_dev_unregister_cb(void *io_device)
|
|||||||
remove_cb(remove_ctx, 0);
|
remove_cb(remove_ctx, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
finish_module = TAILQ_EMPTY(&g_virtio_driver.scsi_devs);
|
finish_module = TAILQ_EMPTY(&g_virtio_scsi_devs);
|
||||||
|
|
||||||
if (g_bdev_virtio_finish && finish_module) {
|
if (g_bdev_virtio_finish && finish_module) {
|
||||||
spdk_bdev_module_finish_done();
|
spdk_bdev_module_finish_done();
|
||||||
@ -1820,18 +1816,18 @@ virtio_scsi_dev_remove(struct virtio_scsi_dev *svdev,
|
|||||||
static void
|
static void
|
||||||
bdev_virtio_finish(void)
|
bdev_virtio_finish(void)
|
||||||
{
|
{
|
||||||
struct virtio_dev *vdev, *next;
|
struct virtio_scsi_dev *svdev, *next;
|
||||||
|
|
||||||
g_bdev_virtio_finish = true;
|
g_bdev_virtio_finish = true;
|
||||||
|
|
||||||
if (TAILQ_EMPTY(&g_virtio_driver.scsi_devs)) {
|
if (TAILQ_EMPTY(&g_virtio_scsi_devs)) {
|
||||||
spdk_bdev_module_finish_done();
|
spdk_bdev_module_finish_done();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Defer module finish until all controllers are removed. */
|
/* Defer module finish until all controllers are removed. */
|
||||||
TAILQ_FOREACH_SAFE(vdev, &g_virtio_driver.scsi_devs, tailq, next) {
|
TAILQ_FOREACH_SAFE(svdev, &g_virtio_scsi_devs, tailq, next) {
|
||||||
virtio_scsi_dev_remove(virtio_dev_to_scsi(vdev), NULL, NULL);
|
virtio_scsi_dev_remove(svdev, NULL, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1899,12 +1895,10 @@ bdev_virtio_pci_scsi_dev_create(const char *name, struct spdk_pci_addr *pci_addr
|
|||||||
void
|
void
|
||||||
bdev_virtio_scsi_dev_remove(const char *name, bdev_virtio_remove_cb cb_fn, void *cb_arg)
|
bdev_virtio_scsi_dev_remove(const char *name, bdev_virtio_remove_cb cb_fn, void *cb_arg)
|
||||||
{
|
{
|
||||||
struct virtio_scsi_dev *svdev = NULL;
|
struct virtio_scsi_dev *svdev;
|
||||||
struct virtio_dev *vdev;
|
|
||||||
|
|
||||||
TAILQ_FOREACH(vdev, &g_virtio_driver.scsi_devs, tailq) {
|
TAILQ_FOREACH(svdev, &g_virtio_scsi_devs, tailq) {
|
||||||
if (strcmp(vdev->name, name) == 0) {
|
if (strcmp(svdev->vdev.name, name) == 0) {
|
||||||
svdev = virtio_dev_to_scsi(vdev);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,10 +65,6 @@
|
|||||||
#define virtio_rmb() spdk_smp_rmb()
|
#define virtio_rmb() spdk_smp_rmb()
|
||||||
#define virtio_wmb() spdk_smp_wmb()
|
#define virtio_wmb() spdk_smp_wmb()
|
||||||
|
|
||||||
struct virtio_driver g_virtio_driver = {
|
|
||||||
.scsi_devs = TAILQ_HEAD_INITIALIZER(g_virtio_driver.scsi_devs),
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Chain all the descriptors in the ring with an END */
|
/* Chain all the descriptors in the ring with an END */
|
||||||
static inline void
|
static inline void
|
||||||
vring_desc_init(struct vring_desc *dp, uint16_t n)
|
vring_desc_init(struct vring_desc *dp, uint16_t n)
|
||||||
|
Loading…
Reference in New Issue
Block a user