Commit 6ccc2620 authored by Dariusz Stojaczyk's avatar Dariusz Stojaczyk Committed by Jim Harris
Browse files

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: default avatarDariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/405179


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 0bc7c3de
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -91,8 +91,6 @@ struct virtio_dev {

	/** Context for the backend ops */
	void		*ctx;

	TAILQ_ENTRY(virtio_dev) tailq;
};

struct virtio_dev_ops {
@@ -180,12 +178,6 @@ enum spdk_virtio_desc_type {
	/* 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 */
struct virtio_pci_ctx;

+23 −29
Original line number Diff line number Diff line
@@ -96,6 +96,8 @@ struct virtio_scsi_dev {

	/** Context for the `remove_cb`. */
	void				*remove_ctx;

	TAILQ_ENTRY(virtio_scsi_dev) tailq;
};

struct virtio_scsi_io_ctx {
@@ -179,6 +181,9 @@ struct bdev_virtio_io_channel {
	struct spdk_poller	*poller;
};

TAILQ_HEAD(, virtio_scsi_dev) g_virtio_scsi_devs =
	TAILQ_HEAD_INITIALIZER(g_virtio_scsi_devs);

/** Module finish in progress */
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,
				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;
}

@@ -410,12 +415,6 @@ static struct spdk_bdev_module 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 *
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)),
				  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) {
		if (virtio_dev_to_scsi(vdev)->scan_ctx) {
	TAILQ_FOREACH(svdev, &g_virtio_scsi_devs, tailq) {
		if (svdev->scan_ctx) {
			/* another device is still being scanned */
			return;
		}
@@ -1701,8 +1700,7 @@ bdev_virtio_initial_scan_complete(void *ctx __attribute__((unused)),
static int
bdev_virtio_initialize(void)
{
	struct virtio_scsi_dev *svdev;
	struct virtio_dev *vdev, *next_vdev;
	struct virtio_scsi_dev *svdev, *next_svdev;
	int rc;

	rc = bdev_virtio_process_config();
@@ -1710,14 +1708,13 @@ bdev_virtio_initialize(void)
		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);
		return 0;
	}

	/* Initialize all created devices and scan available targets */
	TAILQ_FOREACH(vdev, &g_virtio_driver.scsi_devs, tailq) {
		svdev = virtio_dev_to_scsi(vdev);
	TAILQ_FOREACH(svdev, &g_virtio_scsi_devs, tailq) {
		rc = virtio_scsi_dev_scan(svdev, bdev_virtio_initial_scan_complete, NULL);
		if (rc != 0) {
			goto out;
@@ -1728,9 +1725,8 @@ bdev_virtio_initialize(void)

out:
	/* Remove any created devices */
	TAILQ_FOREACH_SAFE(vdev, &g_virtio_driver.scsi_devs, tailq, next_vdev) {
		svdev = virtio_dev_to_scsi(vdev);
		TAILQ_REMOVE(&g_virtio_driver.scsi_devs, vdev, tailq);
	TAILQ_FOREACH_SAFE(svdev, &g_virtio_scsi_devs, tailq, next_svdev) {
		TAILQ_REMOVE(&g_virtio_scsi_devs, svdev, tailq);
		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_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_ctx = svdev->remove_ctx;
	spdk_dma_free(svdev->eventq_ios);
@@ -1775,7 +1771,7 @@ virtio_scsi_dev_unregister_cb(void *io_device)
		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) {
		spdk_bdev_module_finish_done();
@@ -1820,18 +1816,18 @@ virtio_scsi_dev_remove(struct virtio_scsi_dev *svdev,
static void
bdev_virtio_finish(void)
{
	struct virtio_dev *vdev, *next;
	struct virtio_scsi_dev *svdev, *next;

	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();
		return;
	}

	/* Defer module finish until all controllers are removed. */
	TAILQ_FOREACH_SAFE(vdev, &g_virtio_driver.scsi_devs, tailq, next) {
		virtio_scsi_dev_remove(virtio_dev_to_scsi(vdev), NULL, NULL);
	TAILQ_FOREACH_SAFE(svdev, &g_virtio_scsi_devs, tailq, next) {
		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
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_dev *vdev;
	struct virtio_scsi_dev *svdev;

	TAILQ_FOREACH(vdev, &g_virtio_driver.scsi_devs, tailq) {
		if (strcmp(vdev->name, name) == 0) {
			svdev = virtio_dev_to_scsi(vdev);
	TAILQ_FOREACH(svdev, &g_virtio_scsi_devs, tailq) {
		if (strcmp(svdev->vdev.name, name) == 0) {
			break;
		}
	}
+0 −4
Original line number Diff line number Diff line
@@ -65,10 +65,6 @@
#define virtio_rmb()	spdk_smp_rmb()
#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 */
static inline void
vring_desc_init(struct vring_desc *dp, uint16_t n)