diff --git a/lib/bdev/virtio/bdev_virtio.c b/lib/bdev/virtio/bdev_virtio.c index f8e224b84..ddb1af55c 100644 --- a/lib/bdev/virtio/bdev_virtio.c +++ b/lib/bdev/virtio/bdev_virtio.c @@ -305,8 +305,14 @@ scan_target_finish(struct virtio_scsi_scan_base *base) spdk_bdev_register(&disk->bdev); } + TAILQ_REMOVE(&g_virtio_driver.init_ctrlrs, base->vdev, tailq); + TAILQ_INSERT_TAIL(&g_virtio_driver.attached_ctrlrs, base->vdev, tailq); + spdk_dma_free(base); - spdk_bdev_module_init_done(SPDK_GET_BDEV_MODULE(virtio_scsi)); + + if (TAILQ_EMPTY(&g_virtio_driver.init_ctrlrs)) { + spdk_bdev_module_init_done(SPDK_GET_BDEV_MODULE(virtio_scsi)); + } } static void @@ -570,6 +576,8 @@ bdev_virtio_initialize(void) virtio_init_device(vdev, VIRTIO_SCSI_DEV_SUPPORTED_FEATURES); virtio_dev_start(vdev); + TAILQ_INSERT_TAIL(&g_virtio_driver.init_ctrlrs, vdev, tailq); + base->vdev = vdev; TAILQ_INIT(&base->found_disks); diff --git a/lib/bdev/virtio/rte_virtio/virtio_dev.h b/lib/bdev/virtio/rte_virtio/virtio_dev.h index d93f44c72..bc515a5ac 100644 --- a/lib/bdev/virtio/rte_virtio/virtio_dev.h +++ b/lib/bdev/virtio/rte_virtio/virtio_dev.h @@ -36,6 +36,7 @@ #include #include +#include #define VIRTIO_MAX_RX_QUEUES 128U #define VIRTIO_MAX_TX_QUEUES 128U @@ -52,6 +53,8 @@ struct virtio_dev { /** Modern/legacy virtio device flag. */ uint8_t modern; + + TAILQ_ENTRY(virtio_dev) tailq; }; struct virtio_req { diff --git a/lib/bdev/virtio/rte_virtio/virtio_pci.c b/lib/bdev/virtio/rte_virtio/virtio_pci.c index fadc4965b..c87cf4832 100644 --- a/lib/bdev/virtio/rte_virtio/virtio_pci.c +++ b/lib/bdev/virtio/rte_virtio/virtio_pci.c @@ -43,7 +43,10 @@ #include "virtio_logs.h" #include "virtio_queue.h" -struct virtio_driver g_virtio_driver; +struct virtio_driver g_virtio_driver = { + .init_ctrlrs = TAILQ_HEAD_INITIALIZER(g_virtio_driver.init_ctrlrs), + .attached_ctrlrs = TAILQ_HEAD_INITIALIZER(g_virtio_driver.attached_ctrlrs), +}; /* * Following macros are derived from linux/pci_regs.h, however, diff --git a/lib/bdev/virtio/rte_virtio/virtio_pci.h b/lib/bdev/virtio/rte_virtio/virtio_pci.h index 2df26fa7d..552d67278 100644 --- a/lib/bdev/virtio/rte_virtio/virtio_pci.h +++ b/lib/bdev/virtio/rte_virtio/virtio_pci.h @@ -238,6 +238,8 @@ struct vtpci_internal { struct virtio_driver { struct vtpci_internal internal[128]; + TAILQ_HEAD(, virtio_dev) init_ctrlrs; + TAILQ_HEAD(, virtio_dev) attached_ctrlrs; }; extern struct virtio_driver g_virtio_driver;