diff --git a/include/spdk_internal/virtio.h b/include/spdk_internal/virtio.h index 67b81eaff..40541a959 100644 --- a/include/spdk_internal/virtio.h +++ b/include/spdk_internal/virtio.h @@ -190,10 +190,11 @@ struct virtio_pci_ctx; /** * Callback for creating virtio_dev from a PCI device. - * The first param is the PCI context to be associated with virtio_dev. + * \param pci_ctx PCI context to be associated with a virtio_dev + * \param ctx context provided by the user * \return 0 on success, -1 on error. */ -typedef int (*virtio_pci_create_cb)(struct virtio_pci_ctx *pci_ctx); +typedef int (*virtio_pci_create_cb)(struct virtio_pci_ctx *pci_ctx, void *ctx); uint16_t virtio_recv_pkts(struct virtqueue *vq, void **io, uint32_t *len, uint16_t io_cnt); @@ -434,12 +435,14 @@ void virtio_dev_dump_json_config(struct virtio_dev *vdev, struct spdk_json_write * Enumerate all PCI Virtio devices of given type on the system. * * \param enum_cb a function to be called for each valid PCI device. - * \return if a virtio_dev is has been created, the callback should return 0. + * If a virtio_dev is has been created, the callback should return 0. * Returning any other value will cause the PCI context to be freed, * making it unusable. + * \param enum_ctx additional opaque context to be passed into `enum_cb` * \param pci_device_id PCI Device ID of devices to iterate through */ -int virtio_pci_dev_enumerate(virtio_pci_create_cb enum_cb, uint16_t pci_device_id); +int virtio_pci_dev_enumerate(virtio_pci_create_cb enum_cb, void *enum_ctx, + uint16_t pci_device_id); /** * Connect to a vhost-user device and init corresponding virtio_dev struct. diff --git a/lib/bdev/virtio/bdev_virtio_scsi.c b/lib/bdev/virtio/bdev_virtio_scsi.c index dc349a553..5f7c13253 100644 --- a/lib/bdev/virtio/bdev_virtio_scsi.c +++ b/lib/bdev/virtio/bdev_virtio_scsi.c @@ -293,7 +293,7 @@ virtio_scsi_dev_init(struct virtio_scsi_dev *svdev, uint16_t max_queues) } static int -virtio_pci_scsi_dev_create_cb(struct virtio_pci_ctx *pci_ctx) +virtio_pci_scsi_dev_create_cb(struct virtio_pci_ctx *pci_ctx, void *ctx) { static int pci_dev_counter = 0; struct virtio_scsi_dev *svdev; @@ -1502,7 +1502,7 @@ bdev_virtio_process_config(void) enable_pci = spdk_conf_section_get_boolval(sp, "Enable", false); if (enable_pci) { - rc = virtio_pci_dev_enumerate(virtio_pci_scsi_dev_create_cb, + rc = virtio_pci_dev_enumerate(virtio_pci_scsi_dev_create_cb, NULL, PCI_DEVICE_ID_VIRTIO_SCSI_MODERN); } diff --git a/lib/virtio/virtio_pci.c b/lib/virtio/virtio_pci.c index 9714f8a8e..817ce9d0e 100644 --- a/lib/virtio/virtio_pci.c +++ b/lib/virtio/virtio_pci.c @@ -62,6 +62,7 @@ struct virtio_hw { struct virtio_pci_probe_ctx { virtio_pci_create_cb enum_cb; + void *enum_ctx; uint16_t device_id; }; @@ -421,7 +422,7 @@ next: } static int -virtio_pci_dev_probe(struct spdk_pci_device *pci_dev, virtio_pci_create_cb enum_cb) +virtio_pci_dev_probe(struct spdk_pci_device *pci_dev, struct virtio_pci_probe_ctx *ctx) { struct virtio_hw *hw; uint8_t *bar_vaddr; @@ -468,7 +469,7 @@ virtio_pci_dev_probe(struct spdk_pci_device *pci_dev, virtio_pci_create_cb enum_ return -1; } - rc = enum_cb((struct virtio_pci_ctx *)hw); + rc = ctx->enum_cb((struct virtio_pci_ctx *)hw, ctx->enum_ctx); if (rc != 0) { free_virtio_hw(hw); } @@ -486,11 +487,12 @@ virtio_pci_dev_probe_cb(void *probe_ctx, struct spdk_pci_device *pci_dev) return 1; } - return virtio_pci_dev_probe(pci_dev, ctx->enum_cb); + return virtio_pci_dev_probe(pci_dev, ctx); } int -virtio_pci_dev_enumerate(virtio_pci_create_cb enum_cb, uint16_t pci_device_id) +virtio_pci_dev_enumerate(virtio_pci_create_cb enum_cb, void *enum_ctx, + uint16_t pci_device_id) { struct virtio_pci_probe_ctx ctx; @@ -500,6 +502,7 @@ virtio_pci_dev_enumerate(virtio_pci_create_cb enum_cb, uint16_t pci_device_id) } ctx.enum_cb = enum_cb; + ctx.enum_ctx = enum_ctx; ctx.device_id = pci_device_id; return spdk_pci_virtio_enumerate(virtio_pci_dev_probe_cb, &ctx);