From 515d028ec49635aacca1bf4192ec85e082844d2d Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Tue, 26 Jul 2022 15:13:26 +0800 Subject: [PATCH] bdev/virtio_blk|scsi: don't negotiate `VHOST_USER_F_BITS` for PCI devices VHOST_USER_F_PROTOCOL_FEATURES is used for `vhost_user` transport, so unmask it for PCI devices. Change-Id: If84d6c0ee7558886f14647dad07e41530e306206 Signed-off-by: Changpeng Liu Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13790 Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki Tested-by: SPDK CI Jenkins --- module/bdev/virtio/bdev_virtio_blk.c | 8 +++++--- module/bdev/virtio/bdev_virtio_scsi.c | 14 ++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/module/bdev/virtio/bdev_virtio_blk.c b/module/bdev/virtio/bdev_virtio_blk.c index abd2f2224..c4b04dbfc 100644 --- a/module/bdev/virtio/bdev_virtio_blk.c +++ b/module/bdev/virtio/bdev_virtio_blk.c @@ -59,8 +59,7 @@ struct bdev_virtio_blk_io_channel { 1ULL << VIRTIO_BLK_F_MQ | \ 1ULL << VIRTIO_BLK_F_RO | \ 1ULL << VIRTIO_BLK_F_DISCARD | \ - 1ULL << VIRTIO_RING_F_EVENT_IDX | \ - 1ULL << VHOST_USER_F_PROTOCOL_FEATURES) + 1ULL << VIRTIO_RING_F_EVENT_IDX) /* 10 sec for max poll period */ #define VIRTIO_BLK_HOTPLUG_POLL_PERIOD_MAX 10000000ULL @@ -590,6 +589,7 @@ virtio_user_blk_dev_create(const char *name, const char *path, uint16_t num_queues, uint32_t queue_size) { struct virtio_blk_dev *bvdev; + uint64_t feature_bits; int rc; bvdev = calloc(1, sizeof(*bvdev)); @@ -605,7 +605,9 @@ virtio_user_blk_dev_create(const char *name, const char *path, return NULL; } - rc = virtio_dev_reset(&bvdev->vdev, VIRTIO_BLK_DEV_SUPPORTED_FEATURES); + feature_bits = VIRTIO_BLK_DEV_SUPPORTED_FEATURES; + feature_bits |= (1ULL << VHOST_USER_F_PROTOCOL_FEATURES); + rc = virtio_dev_reset(&bvdev->vdev, feature_bits); if (rc != 0) { virtio_dev_destruct(&bvdev->vdev); free(bvdev); diff --git a/module/bdev/virtio/bdev_virtio_scsi.c b/module/bdev/virtio/bdev_virtio_scsi.c index ee1e2d8a4..e12e1ef23 100644 --- a/module/bdev/virtio/bdev_virtio_scsi.c +++ b/module/bdev/virtio/bdev_virtio_scsi.c @@ -166,8 +166,7 @@ static bool g_bdev_virtio_finish = false; #define VIRTIO_SCSI_DEV_SUPPORTED_FEATURES \ (1ULL << VIRTIO_SCSI_F_INOUT | \ 1ULL << VIRTIO_SCSI_F_HOTPLUG | \ - 1ULL << VIRTIO_RING_F_EVENT_IDX | \ - 1ULL << VHOST_USER_F_PROTOCOL_FEATURES) + 1ULL << VIRTIO_RING_F_EVENT_IDX) static void virtio_scsi_dev_unregister_cb(void *io_device); static void virtio_scsi_dev_remove(struct virtio_scsi_dev *svdev, @@ -194,7 +193,7 @@ virtio_scsi_dev_send_eventq_io(struct virtqueue *vq, struct virtio_scsi_eventq_i } static int -virtio_scsi_dev_init(struct virtio_scsi_dev *svdev, uint16_t max_queues) +virtio_scsi_dev_init(struct virtio_scsi_dev *svdev, uint16_t max_queues, uint64_t feature_bits) { struct virtio_dev *vdev = &svdev->vdev; struct spdk_ring *ctrlq_ring; @@ -203,7 +202,7 @@ virtio_scsi_dev_init(struct virtio_scsi_dev *svdev, uint16_t max_queues) uint16_t i, num_events; int rc; - rc = virtio_dev_reset(vdev, VIRTIO_SCSI_DEV_SUPPORTED_FEATURES); + rc = virtio_dev_reset(vdev, feature_bits); if (rc != 0) { return rc; } @@ -319,7 +318,7 @@ virtio_pci_scsi_dev_create(const char *name, struct virtio_pci_ctx *pci_ctx) goto fail; } - rc = virtio_scsi_dev_init(svdev, num_queues); + rc = virtio_scsi_dev_init(svdev, num_queues, VIRTIO_SCSI_DEV_SUPPORTED_FEATURES); if (rc != 0) { goto fail; } @@ -339,6 +338,7 @@ virtio_user_scsi_dev_create(const char *name, const char *path, { struct virtio_scsi_dev *svdev; struct virtio_dev *vdev; + uint64_t feature_bits; int rc; svdev = calloc(1, sizeof(*svdev)); @@ -355,7 +355,9 @@ virtio_user_scsi_dev_create(const char *name, const char *path, return NULL; } - rc = virtio_scsi_dev_init(svdev, num_queues); + feature_bits = VIRTIO_SCSI_DEV_SUPPORTED_FEATURES; + feature_bits |= (1ULL << VHOST_USER_F_PROTOCOL_FEATURES); + rc = virtio_scsi_dev_init(svdev, num_queues, feature_bits); if (rc != 0) { virtio_dev_destruct(vdev); free(svdev);