virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
* [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
@ 2024-07-03 12:38 Jiri Pirko
  2024-07-03 12:38 ` [PATCH virtio 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
                   ` (19 more replies)
  0 siblings, 20 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
names, callbacks and ctx (in case of the second one) as separate args.
That became inconvenient as the ctx addition showed.

For virtio_net control queue, an indication of queue flavour (slow path)
is going to be needed to be passed to PCI transport in order to
assign vectors properly, another array added to virtio_find_vqs_ctx()
arg list would not be nice and convenient.

Instead, introduce a structure to carry vq callback, name and ctx. Pass
array of these structures to virtio_find_vqs() and all the way down to
transport find_vqs() op implementation.

That allows to easily extend what needs to be passed down. Also, it
makes the code a bit more cleaner. We get rid of separate
virtio_find_vqs_ctx() helper.

This patchset does the conversion in steps, using temporary _info() op
and helper. Note they are renamed back.

Patch #1 does one forgotten conversion to virtio_find_single_vq().
Patches #2 and #3 do preparations for find_vqs_info() op introduction.
Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
  introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
Patches #5 and #6 convert transports to implement find_vqs_info() op
  that accepts array of virtio_queue_info structs.
Patch #7 converts virtio_find_single_vq() to use the new way as well.
Patch #8 removes original find_vqs() op.
Patch #9 renames find_vqs_info() to find_vqs() and completes first part
  of conversion this patches does.
Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
  users to use new virtio_find_vqs_info() helper.
Patch #18 removes no longer used virtio_find_vqs() and
  virtio_find_vqs_ctx() helpers.
Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
  to virtio_find_vqs().

Jiri Pirko (19):
  caif_virtio: use virtio_find_single_vq() for single virtqueue finding
  virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
  virtio: make virtio_find_single_vq() call virtio_find_vqs()
  virtio: introduce virtio_queue_info struct and find_vqs_info() config
    op
  virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
  virtio: convert find_vqs() op implementations to find_vqs_info()
  virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
    directly
  virtio: remove the original find_vqs() op
  virtio: rename find_vqs_info() op to find_vqs()
  virtio_blk: convert to use virtio_find_vqs_info()
  virtio_console: convert to use virtio_find_vqs_info()
  virtio_crypto: convert to use virtio_find_vqs_info()
  virtio_net: convert to use virtio_find_vqs_info()
  scsi: virtio_scsi: convert to use virtio_find_vqs_info()
  virtiofs: convert to use virtio_find_vqs_info()
  virtio_balloon: convert to use virtio_find_vqs_info()
  virtio: convert the rest virtio_find_vqs() users to
    virtio_find_vqs_info()
  virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
    helpers
  virtio: rename virtio_find_vqs_info() to virtio_find_vqs()

 arch/um/drivers/virt-pci.c                    |  8 ++-
 arch/um/drivers/virtio_uml.c                  | 12 ++--
 drivers/block/virtio_blk.c                    | 20 +++----
 drivers/bluetooth/virtio_bt.c                 | 13 ++--
 drivers/char/virtio_console.c                 | 43 ++++++-------
 drivers/crypto/virtio/virtio_crypto_core.c    | 31 ++++------
 drivers/firmware/arm_scmi/virtio.c            | 11 ++--
 drivers/gpio/gpio-virtio.c                    | 10 ++--
 drivers/gpu/drm/virtio/virtgpu_kms.c          |  9 ++-
 drivers/iommu/virtio-iommu.c                  | 11 ++--
 drivers/net/caif/caif_virtio.c                |  8 +--
 drivers/net/virtio_net.c                      | 34 ++++-------
 drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
 drivers/platform/mellanox/mlxbf-tmfifo.c      | 10 ++--
 drivers/remoteproc/remoteproc_virtio.c        | 12 ++--
 drivers/rpmsg/virtio_rpmsg_bus.c              |  8 ++-
 drivers/s390/virtio/virtio_ccw.c              | 13 ++--
 drivers/scsi/virtio_scsi.c                    | 32 ++++------
 drivers/virtio/virtio_balloon.c               | 32 ++++------
 drivers/virtio/virtio_input.c                 |  9 +--
 drivers/virtio/virtio_mmio.c                  | 12 ++--
 drivers/virtio/virtio_pci_common.c            | 49 ++++++++-------
 drivers/virtio/virtio_pci_common.h            |  4 +-
 drivers/virtio/virtio_pci_modern.c            |  5 +-
 drivers/virtio/virtio_vdpa.c                  | 13 ++--
 fs/fuse/virtio_fs.c                           | 22 +++----
 include/linux/virtio_config.h                 | 60 +++++++++----------
 net/vmw_vsock/virtio_transport.c              | 16 ++---
 sound/virtio/virtio_card.c                    | 23 ++++---
 29 files changed, 240 insertions(+), 302 deletions(-)

-- 
2.45.2


^ permalink raw reply	[flat|nested] 30+ messages in thread

* [PATCH virtio 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
@ 2024-07-03 12:38 ` Jiri Pirko
  2024-07-03 12:38 ` [PATCH virtio 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx() Jiri Pirko
                   ` (18 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Since caif uses only one queue, convert to virtio_find_single_vq()
helper which is made for this purpose.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/net/caif/caif_virtio.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/caif/caif_virtio.c b/drivers/net/caif/caif_virtio.c
index 99d984851fef..7fea00c7ca8a 100644
--- a/drivers/net/caif/caif_virtio.c
+++ b/drivers/net/caif/caif_virtio.c
@@ -646,9 +646,7 @@ static inline void debugfs_init(struct cfv_info *cfv)
 /* Setup CAIF for the a virtio device */
 static int cfv_probe(struct virtio_device *vdev)
 {
-	vq_callback_t *vq_cbs = cfv_release_cb;
 	vrh_callback_t *vrh_cbs = cfv_recv;
-	const char *names =  "output";
 	const char *cfv_netdev_name = "cfvrt";
 	struct net_device *netdev;
 	struct cfv_info *cfv;
@@ -675,9 +673,11 @@ static int cfv_probe(struct virtio_device *vdev)
 		goto err;
 
 	/* Get the TX virtio ring. This is a "guest side vring". */
-	err = virtio_find_vqs(vdev, 1, &cfv->vq_tx, &vq_cbs, &names, NULL);
-	if (err)
+	cfv->vq_tx = virtio_find_single_vq(vdev, cfv_release_cb, "output");
+	if (IS_ERR(cfv->vq_tx)) {
+		err = PTR_ERR(cfv->vq_tx);
 		goto err;
+	}
 
 	/* Get the CAIF configuration from virtio config space, if available */
 	if (vdev->config->get) {
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
  2024-07-03 12:38 ` [PATCH virtio 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
@ 2024-07-03 12:38 ` Jiri Pirko
  2024-07-03 12:38 ` [PATCH virtio 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs() Jiri Pirko
                   ` (17 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

In order to prepare for conversion of virtio_find_vqs*() arguments, make
virtio_find_vqs() to call virtio_find_vqs_ctx() instead of op directly.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 include/linux/virtio_config.h | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index da9b271b54db..d19eaf6bafbf 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -225,22 +225,23 @@ struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
 }
 
 static inline
-int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
+int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
 			struct virtqueue *vqs[], vq_callback_t *callbacks[],
-			const char * const names[],
+			const char * const names[], const bool *ctx,
 			struct irq_affinity *desc)
 {
-	return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, NULL, desc);
+	return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
+				      desc);
 }
 
 static inline
-int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
+int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
 			struct virtqueue *vqs[], vq_callback_t *callbacks[],
-			const char * const names[], const bool *ctx,
+			const char * const names[],
 			struct irq_affinity *desc)
 {
-	return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
-				      desc);
+	return virtio_find_vqs_ctx(vdev, nvqs, vqs, callbacks,
+				   names, NULL, desc);
 }
 
 /**
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
  2024-07-03 12:38 ` [PATCH virtio 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
  2024-07-03 12:38 ` [PATCH virtio 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx() Jiri Pirko
@ 2024-07-03 12:38 ` Jiri Pirko
  2024-07-03 12:38 ` [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
                   ` (16 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

In order to prepare for conversion of virtio_find_vqs*() arguments, make
virtio_find_single_vq() to call virtio_find_vqs() instead of
op directly.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 include/linux/virtio_config.h | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index d19eaf6bafbf..82a1d798b2f1 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -210,20 +210,6 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
 	return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
 }
 
-static inline
-struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
-					vq_callback_t *c, const char *n)
-{
-	vq_callback_t *callbacks[] = { c };
-	const char *names[] = { n };
-	struct virtqueue *vq;
-	int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names, NULL,
-					 NULL);
-	if (err < 0)
-		return ERR_PTR(err);
-	return vq;
-}
-
 static inline
 int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
 			struct virtqueue *vqs[], vq_callback_t *callbacks[],
@@ -244,6 +230,20 @@ int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
 				   names, NULL, desc);
 }
 
+static inline
+struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
+					vq_callback_t *c, const char *n)
+{
+	vq_callback_t *callbacks[] = { c };
+	const char *names[] = { n };
+	struct virtqueue *vq;
+	int err = virtio_find_vqs(vdev, 1, &vq, callbacks, names, NULL);
+
+	if (err < 0)
+		return ERR_PTR(err);
+	return vq;
+}
+
 /**
  * virtio_synchronize_cbs - synchronize with virtqueue callbacks
  * @dev: the virtio device
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (2 preceding siblings ...)
  2024-07-03 12:38 ` [PATCH virtio 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs() Jiri Pirko
@ 2024-07-03 12:38 ` Jiri Pirko
  2024-07-03 13:02   ` Michael S. Tsirkin
  2024-07-03 12:38 ` [PATCH virtio 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info() Jiri Pirko
                   ` (15 subsequent siblings)
  19 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Introduce a structure virtio_queue_info to carry name, callback and ctx
together. In order to allow config implementations to accept config op
with array of virtio_queue_info structures, introduce a new
find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
Note that whole virtio_find_vqs_ctx() is going to be eventually removed
at the and of this patchset.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
 1 file changed, 48 insertions(+), 3 deletions(-)

diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 82a1d798b2f1..21029afeede1 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -18,6 +18,16 @@ struct virtio_shm_region {
 
 typedef void vq_callback_t(struct virtqueue *);
 
+struct virtio_queue_info {
+	const char *name; /* mainly for debugging, may be NULL for vq
+			   * unused by driver.
+			   */
+	vq_callback_t *callback; /* May be NULL for vq that do
+				  * not need a callback.
+				  */
+	bool ctx;
+};
+
 /**
  * struct virtio_config_ops - operations for configuring a virtio device
  * Note: Do not assume that a transport implements all of the operations
@@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
  *	names: array of virtqueue names (mainly for debugging)
  *		include a NULL entry for vqs unused by driver
  *	Returns 0 on success or error status
+ * @find_vqs_info: find virtqueues and instantiate them.
+ *	vdev: the virtio_device
+ *	nvqs: the number of virtqueues to find
+ *	vqs: on success, includes new virtqueues
+ *	vqs_info: array of virtqueue info structures
+ *	Returns 0 on success or error status
  * @del_vqs: free virtqueues found by find_vqs().
  * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
  *      The function guarantees that all memory operations on the
@@ -109,6 +125,10 @@ struct virtio_config_ops {
 			struct virtqueue *vqs[], vq_callback_t *callbacks[],
 			const char * const names[], const bool *ctx,
 			struct irq_affinity *desc);
+	int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
+			     struct virtqueue *vqs[],
+			     struct virtio_queue_info vqs_info[],
+			     struct irq_affinity *desc);
 	void (*del_vqs)(struct virtio_device *);
 	void (*synchronize_cbs)(struct virtio_device *);
 	u64 (*get_features)(struct virtio_device *vdev);
@@ -117,7 +137,7 @@ struct virtio_config_ops {
 	int (*set_vq_affinity)(struct virtqueue *vq,
 			       const struct cpumask *cpu_mask);
 	const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
-			int index);
+						 int index);
 	bool (*get_shm_region)(struct virtio_device *vdev,
 			       struct virtio_shm_region *region, u8 id);
 	int (*disable_vq_and_reset)(struct virtqueue *vq);
@@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
 	return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
 }
 
+static inline
+int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
+			 struct virtqueue *vqs[],
+			 struct virtio_queue_info vqs_info[],
+			 struct irq_affinity *desc)
+{
+	return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
+}
+
 static inline
 int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
 			struct virtqueue *vqs[], vq_callback_t *callbacks[],
 			const char * const names[], const bool *ctx,
 			struct irq_affinity *desc)
 {
-	return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
-				      desc);
+	struct virtio_queue_info *vqs_info;
+	int err, i;
+
+	if (!vdev->config->find_vqs_info)
+		return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
+					      names, ctx, desc);
+
+	vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
+	if (!vqs_info)
+		return -ENOMEM;
+	for (i = 0; i < nvqs; i++) {
+		vqs_info[i].name = names[i];
+		vqs_info[i].callback = callbacks[i];
+		vqs_info[i].ctx = ctx ? ctx[i] : false;
+	}
+	err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
+	kfree(vqs_info);
+	return err;
 }
 
 static inline
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (3 preceding siblings ...)
  2024-07-03 12:38 ` [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
@ 2024-07-03 12:38 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
                   ` (14 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Convert existing vp_find_vqs() and vp_modern_find_vqs() implementations
to find_vqs_info() config op.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/virtio/virtio_pci_common.c | 49 ++++++++++++++++--------------
 drivers/virtio/virtio_pci_common.h |  4 +--
 drivers/virtio/virtio_pci_legacy.c |  2 +-
 drivers/virtio/virtio_pci_modern.c |  9 +++---
 4 files changed, 34 insertions(+), 30 deletions(-)

diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
index f6b0b00e4599..ce9cce6f6a08 100644
--- a/drivers/virtio/virtio_pci_common.c
+++ b/drivers/virtio/virtio_pci_common.c
@@ -285,12 +285,13 @@ void vp_del_vqs(struct virtio_device *vdev)
 }
 
 static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
-		struct virtqueue *vqs[], vq_callback_t *callbacks[],
-		const char * const names[], bool per_vq_vectors,
-		const bool *ctx,
-		struct irq_affinity *desc)
+			    struct virtqueue *vqs[],
+			    struct virtio_queue_info vqs_info[],
+			    bool per_vq_vectors,
+			    struct irq_affinity *desc)
 {
 	struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+	struct virtio_queue_info *vqi;
 	u16 msix_vec;
 	int i, err, nvectors, allocated_vectors, queue_idx = 0;
 
@@ -301,9 +302,11 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
 	if (per_vq_vectors) {
 		/* Best option: one for change interrupt, one per vq. */
 		nvectors = 1;
-		for (i = 0; i < nvqs; ++i)
-			if (names[i] && callbacks[i])
+		for (i = 0; i < nvqs; ++i) {
+			vqi = &vqs_info[i];
+			if (vqi->name && vqi->callback)
 				++nvectors;
+		}
 	} else {
 		/* Second best: one for change, shared for all vqs. */
 		nvectors = 2;
@@ -317,20 +320,20 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
 	vp_dev->per_vq_vectors = per_vq_vectors;
 	allocated_vectors = vp_dev->msix_used_vectors;
 	for (i = 0; i < nvqs; ++i) {
-		if (!names[i]) {
+		vqi = &vqs_info[i];
+		if (!vqi->name) {
 			vqs[i] = NULL;
 			continue;
 		}
 
-		if (!callbacks[i])
+		if (!vqi->callback)
 			msix_vec = VIRTIO_MSI_NO_VECTOR;
 		else if (vp_dev->per_vq_vectors)
 			msix_vec = allocated_vectors++;
 		else
 			msix_vec = VP_MSIX_VQ_VECTOR;
-		vqs[i] = vp_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
-				     ctx ? ctx[i] : false,
-				     msix_vec);
+		vqs[i] = vp_setup_vq(vdev, queue_idx++, vqi->callback,
+				     vqi->name, vqi->ctx, msix_vec);
 		if (IS_ERR(vqs[i])) {
 			err = PTR_ERR(vqs[i]);
 			goto error_find;
@@ -343,7 +346,7 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
 		snprintf(vp_dev->msix_names[msix_vec],
 			 sizeof *vp_dev->msix_names,
 			 "%s-%s",
-			 dev_name(&vp_dev->vdev.dev), names[i]);
+			 dev_name(&vp_dev->vdev.dev), vqi->name);
 		err = request_irq(pci_irq_vector(vp_dev->pci_dev, msix_vec),
 				  vring_interrupt, 0,
 				  vp_dev->msix_names[msix_vec],
@@ -361,10 +364,11 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
 }
 
 static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
-		struct virtqueue *vqs[], vq_callback_t *callbacks[],
-		const char * const names[], const bool *ctx)
+			    struct virtqueue *vqs[],
+			    struct virtio_queue_info vqs_info[])
 {
 	struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+	struct virtio_queue_info *vqi;
 	int i, err, queue_idx = 0;
 
 	vp_dev->vqs = kcalloc(nvqs, sizeof(*vp_dev->vqs), GFP_KERNEL);
@@ -379,12 +383,13 @@ static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
 	vp_dev->intx_enabled = 1;
 	vp_dev->per_vq_vectors = false;
 	for (i = 0; i < nvqs; ++i) {
-		if (!names[i]) {
+		vqi = &vqs_info[i];
+		if (!vqi->name) {
 			vqs[i] = NULL;
 			continue;
 		}
-		vqs[i] = vp_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
-				     ctx ? ctx[i] : false,
+		vqs[i] = vp_setup_vq(vdev, queue_idx++, vqi->callback,
+				     vqi->name, vqi->ctx,
 				     VIRTIO_MSI_NO_VECTOR);
 		if (IS_ERR(vqs[i])) {
 			err = PTR_ERR(vqs[i]);
@@ -400,25 +405,25 @@ static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
 
 /* the config->find_vqs() implementation */
 int vp_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
-		struct virtqueue *vqs[], vq_callback_t *callbacks[],
-		const char * const names[], const bool *ctx,
+		struct virtqueue *vqs[],
+		struct virtio_queue_info vqs_info[],
 		struct irq_affinity *desc)
 {
 	int err;
 
 	/* Try MSI-X with one vector per queue. */
-	err = vp_find_vqs_msix(vdev, nvqs, vqs, callbacks, names, true, ctx, desc);
+	err = vp_find_vqs_msix(vdev, nvqs, vqs, vqs_info, true, desc);
 	if (!err)
 		return 0;
 	/* Fallback: MSI-X with one vector for config, one shared for queues. */
-	err = vp_find_vqs_msix(vdev, nvqs, vqs, callbacks, names, false, ctx, desc);
+	err = vp_find_vqs_msix(vdev, nvqs, vqs, vqs_info, false, desc);
 	if (!err)
 		return 0;
 	/* Is there an interrupt? If not give up. */
 	if (!(to_vp_device(vdev)->pci_dev->irq))
 		return err;
 	/* Finally fall back to regular interrupts. */
-	return vp_find_vqs_intx(vdev, nvqs, vqs, callbacks, names, ctx);
+	return vp_find_vqs_intx(vdev, nvqs, vqs, vqs_info);
 }
 
 const char *vp_bus_name(struct virtio_device *vdev)
diff --git a/drivers/virtio/virtio_pci_common.h b/drivers/virtio/virtio_pci_common.h
index 7fef52bee455..d7e65631b5f6 100644
--- a/drivers/virtio/virtio_pci_common.h
+++ b/drivers/virtio/virtio_pci_common.h
@@ -127,8 +127,8 @@ bool vp_notify(struct virtqueue *vq);
 void vp_del_vqs(struct virtio_device *vdev);
 /* the config->find_vqs() implementation */
 int vp_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
-		struct virtqueue *vqs[], vq_callback_t *callbacks[],
-		const char * const names[], const bool *ctx,
+		struct virtqueue *vqs[],
+		struct virtio_queue_info vqs_info[],
 		struct irq_affinity *desc);
 const char *vp_bus_name(struct virtio_device *vdev);
 
diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
index d9cbb02b35a1..a9786e38d763 100644
--- a/drivers/virtio/virtio_pci_legacy.c
+++ b/drivers/virtio/virtio_pci_legacy.c
@@ -192,7 +192,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
 	.get_status	= vp_get_status,
 	.set_status	= vp_set_status,
 	.reset		= vp_reset,
-	.find_vqs	= vp_find_vqs,
+	.find_vqs_info	= vp_find_vqs,
 	.del_vqs	= vp_del_vqs,
 	.synchronize_cbs = vp_synchronize_vectors,
 	.get_features	= vp_get_features,
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index f62b530aa3b5..20933b9f2568 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -595,13 +595,12 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
 
 static int vp_modern_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
 			      struct virtqueue *vqs[],
-			      vq_callback_t *callbacks[],
-			      const char * const names[], const bool *ctx,
+			      struct virtio_queue_info vqs_info[],
 			      struct irq_affinity *desc)
 {
 	struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 	struct virtqueue *vq;
-	int rc = vp_find_vqs(vdev, nvqs, vqs, callbacks, names, ctx, desc);
+	int rc = vp_find_vqs(vdev, nvqs, vqs, vqs_info, desc);
 
 	if (rc)
 		return rc;
@@ -782,7 +781,7 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
 	.get_status	= vp_get_status,
 	.set_status	= vp_set_status,
 	.reset		= vp_reset,
-	.find_vqs	= vp_modern_find_vqs,
+	.find_vqs_info	= vp_modern_find_vqs,
 	.del_vqs	= vp_del_vqs,
 	.synchronize_cbs = vp_synchronize_vectors,
 	.get_features	= vp_get_features,
@@ -804,7 +803,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
 	.get_status	= vp_get_status,
 	.set_status	= vp_set_status,
 	.reset		= vp_reset,
-	.find_vqs	= vp_modern_find_vqs,
+	.find_vqs_info	= vp_modern_find_vqs,
 	.del_vqs	= vp_del_vqs,
 	.synchronize_cbs = vp_synchronize_vectors,
 	.get_features	= vp_get_features,
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 06/19] virtio: convert find_vqs() op implementations to find_vqs_info()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (4 preceding siblings ...)
  2024-07-03 12:38 ` [PATCH virtio 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info() Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly Jiri Pirko
                   ` (13 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Convert existing find_vqs() transport implementations
to use find_vqs_info() config op.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 arch/um/drivers/virtio_uml.c             | 14 ++++++++------
 drivers/platform/mellanox/mlxbf-tmfifo.c | 12 ++++++------
 drivers/remoteproc/remoteproc_virtio.c   | 14 +++++++-------
 drivers/s390/virtio/virtio_ccw.c         | 15 +++++++--------
 drivers/virtio/virtio_mmio.c             | 14 +++++++-------
 drivers/virtio/virtio_vdpa.c             | 15 +++++++--------
 6 files changed, 42 insertions(+), 42 deletions(-)

diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
index 8adca2000e51..a87f0bcd36b5 100644
--- a/arch/um/drivers/virtio_uml.c
+++ b/arch/um/drivers/virtio_uml.c
@@ -1014,11 +1014,12 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
 }
 
 static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
-		       struct virtqueue *vqs[], vq_callback_t *callbacks[],
-		       const char * const names[], const bool *ctx,
+		       struct virtqueue *vqs[],
+		       struct virtio_queue_info vqs_info[],
 		       struct irq_affinity *desc)
 {
 	struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
+	struct virtio_queue_info *vqi;
 	int i, queue_idx = 0, rc;
 	struct virtqueue *vq;
 
@@ -1031,13 +1032,14 @@ static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
 		return rc;
 
 	for (i = 0; i < nvqs; ++i) {
-		if (!names[i]) {
+		vqi = &vqs_info[i];
+		if (!vqi->name) {
 			vqs[i] = NULL;
 			continue;
 		}
 
-		vqs[i] = vu_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
-				     ctx ? ctx[i] : false);
+		vqs[i] = vu_setup_vq(vdev, queue_idx++, vqi->callback,
+				     vqi->name, vqi->ctx);
 		if (IS_ERR(vqs[i])) {
 			rc = PTR_ERR(vqs[i]);
 			goto error_setup;
@@ -1097,7 +1099,7 @@ static const struct virtio_config_ops virtio_uml_config_ops = {
 	.get_status = vu_get_status,
 	.set_status = vu_set_status,
 	.reset = vu_reset,
-	.find_vqs = vu_find_vqs,
+	.find_vqs_info = vu_find_vqs,
 	.del_vqs = vu_del_vqs,
 	.get_features = vu_get_features,
 	.finalize_features = vu_finalize_features,
diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
index b8d1e32e97eb..825116bd2db9 100644
--- a/drivers/platform/mellanox/mlxbf-tmfifo.c
+++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
@@ -1058,13 +1058,12 @@ static void mlxbf_tmfifo_virtio_del_vqs(struct virtio_device *vdev)
 static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
 					unsigned int nvqs,
 					struct virtqueue *vqs[],
-					vq_callback_t *callbacks[],
-					const char * const names[],
-					const bool *ctx,
+					struct virtio_queue_info vqs_info[],
 					struct irq_affinity *desc)
 {
 	struct mlxbf_tmfifo_vdev *tm_vdev = mlxbf_vdev_to_tmfifo(vdev);
 	struct mlxbf_tmfifo_vring *vring;
+	struct virtio_queue_info *vqi;
 	struct virtqueue *vq;
 	int i, ret, size;
 
@@ -1072,7 +1071,8 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
 		return -EINVAL;
 
 	for (i = 0; i < nvqs; ++i) {
-		if (!names[i]) {
+		vqi = &vqs_info[i];
+		if (!vqi->name) {
 			ret = -EINVAL;
 			goto error;
 		}
@@ -1084,7 +1084,7 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
 		vq = vring_new_virtqueue(i, vring->num, vring->align, vdev,
 					 false, false, vring->va,
 					 mlxbf_tmfifo_virtio_notify,
-					 callbacks[i], names[i]);
+					 vqi->callback, vqi->name);
 		if (!vq) {
 			dev_err(&vdev->dev, "vring_new_virtqueue failed\n");
 			ret = -ENOMEM;
@@ -1175,7 +1175,7 @@ static void tmfifo_virtio_dev_release(struct device *device)
 static const struct virtio_config_ops mlxbf_tmfifo_virtio_config_ops = {
 	.get_features = mlxbf_tmfifo_virtio_get_features,
 	.finalize_features = mlxbf_tmfifo_virtio_finalize_features,
-	.find_vqs = mlxbf_tmfifo_virtio_find_vqs,
+	.find_vqs_info = mlxbf_tmfifo_virtio_find_vqs,
 	.del_vqs = mlxbf_tmfifo_virtio_del_vqs,
 	.reset = mlxbf_tmfifo_virtio_reset,
 	.set_status = mlxbf_tmfifo_virtio_set_status,
diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
index 25b66b113b69..85a678e99bfb 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -182,21 +182,21 @@ static void rproc_virtio_del_vqs(struct virtio_device *vdev)
 
 static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
 				 struct virtqueue *vqs[],
-				 vq_callback_t *callbacks[],
-				 const char * const names[],
-				 const bool * ctx,
+				 struct virtio_queue_info vqs_info[],
 				 struct irq_affinity *desc)
 {
+	struct virtio_queue_info *vqi;
 	int i, ret, queue_idx = 0;
 
 	for (i = 0; i < nvqs; ++i) {
-		if (!names[i]) {
+		vqi = &vqs_info[i];
+		if (!vqi->name) {
 			vqs[i] = NULL;
 			continue;
 		}
 
-		vqs[i] = rp_find_vq(vdev, queue_idx++, callbacks[i], names[i],
-				    ctx ? ctx[i] : false);
+		vqs[i] = rp_find_vq(vdev, queue_idx++, vqi->callback,
+				    vqi->name, vqi->ctx);
 		if (IS_ERR(vqs[i])) {
 			ret = PTR_ERR(vqs[i]);
 			goto error;
@@ -327,7 +327,7 @@ static void rproc_virtio_set(struct virtio_device *vdev, unsigned int offset,
 static const struct virtio_config_ops rproc_virtio_config_ops = {
 	.get_features	= rproc_virtio_get_features,
 	.finalize_features = rproc_virtio_finalize_features,
-	.find_vqs	= rproc_virtio_find_vqs,
+	.find_vqs_info	= rproc_virtio_find_vqs,
 	.del_vqs	= rproc_virtio_del_vqs,
 	.reset		= rproc_virtio_reset,
 	.set_status	= rproc_virtio_set_status,
diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
index d7569f395559..f92303f92c0c 100644
--- a/drivers/s390/virtio/virtio_ccw.c
+++ b/drivers/s390/virtio/virtio_ccw.c
@@ -689,12 +689,11 @@ static int virtio_ccw_register_adapter_ind(struct virtio_ccw_device *vcdev,
 
 static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
 			       struct virtqueue *vqs[],
-			       vq_callback_t *callbacks[],
-			       const char * const names[],
-			       const bool *ctx,
+			       struct virtio_queue_info vqs_info[],
 			       struct irq_affinity *desc)
 {
 	struct virtio_ccw_device *vcdev = to_vc_device(vdev);
+	struct virtio_queue_info *vqi;
 	dma64_t *indicatorp = NULL;
 	int ret, i, queue_idx = 0;
 	struct ccw1 *ccw;
@@ -704,14 +703,14 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
 		return -ENOMEM;
 
 	for (i = 0; i < nvqs; ++i) {
-		if (!names[i]) {
+		vqi = &vqs_info[i];
+		if (!vq_info->name) {
 			vqs[i] = NULL;
 			continue;
 		}
 
-		vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, callbacks[i],
-					     names[i], ctx ? ctx[i] : false,
-					     ccw);
+		vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, vqi->callback,
+					     vqi->name, vqi->ctx, ccw);
 		if (IS_ERR(vqs[i])) {
 			ret = PTR_ERR(vqs[i]);
 			vqs[i] = NULL;
@@ -1077,7 +1076,7 @@ static const struct virtio_config_ops virtio_ccw_config_ops = {
 	.get_status = virtio_ccw_get_status,
 	.set_status = virtio_ccw_set_status,
 	.reset = virtio_ccw_reset,
-	.find_vqs = virtio_ccw_find_vqs,
+	.find_vqs_info = virtio_ccw_find_vqs,
 	.del_vqs = virtio_ccw_del_vqs,
 	.bus_name = virtio_ccw_bus_name,
 	.synchronize_cbs = virtio_ccw_synchronize_cbs,
diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
index 173596589c71..1aa7988b5f31 100644
--- a/drivers/virtio/virtio_mmio.c
+++ b/drivers/virtio/virtio_mmio.c
@@ -489,13 +489,12 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
 
 static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
 		       struct virtqueue *vqs[],
-		       vq_callback_t *callbacks[],
-		       const char * const names[],
-		       const bool *ctx,
+		       struct virtio_queue_info vqs_info[],
 		       struct irq_affinity *desc)
 {
 	struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
 	int irq = platform_get_irq(vm_dev->pdev, 0);
+	struct virtio_queue_info *vqi;
 	int i, err, queue_idx = 0;
 
 	if (irq < 0)
@@ -510,13 +509,14 @@ static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
 		enable_irq_wake(irq);
 
 	for (i = 0; i < nvqs; ++i) {
-		if (!names[i]) {
+		vqi = &vqs_info[i];
+		if (!vqi->name) {
 			vqs[i] = NULL;
 			continue;
 		}
 
-		vqs[i] = vm_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
-				     ctx ? ctx[i] : false);
+		vqs[i] = vm_setup_vq(vdev, queue_idx++, vqi->callback,
+				     vqi->name, vqi->ctx);
 		if (IS_ERR(vqs[i])) {
 			vm_del_vqs(vdev);
 			return PTR_ERR(vqs[i]);
@@ -570,7 +570,7 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
 	.get_status	= vm_get_status,
 	.set_status	= vm_set_status,
 	.reset		= vm_reset,
-	.find_vqs	= vm_find_vqs,
+	.find_vqs_info	= vm_find_vqs,
 	.del_vqs	= vm_del_vqs,
 	.get_features	= vm_get_features,
 	.finalize_features = vm_finalize_features,
diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
index e803db0da307..39db3b8ac85b 100644
--- a/drivers/virtio/virtio_vdpa.c
+++ b/drivers/virtio/virtio_vdpa.c
@@ -358,15 +358,14 @@ create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd)
 
 static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
 				struct virtqueue *vqs[],
-				vq_callback_t *callbacks[],
-				const char * const names[],
-				const bool *ctx,
+				struct virtio_queue_info vqs_info[],
 				struct irq_affinity *desc)
 {
 	struct virtio_vdpa_device *vd_dev = to_virtio_vdpa_device(vdev);
 	struct vdpa_device *vdpa = vd_get_vdpa(vdev);
 	const struct vdpa_config_ops *ops = vdpa->config;
 	struct irq_affinity default_affd = { 0 };
+	struct virtio_queue_info *vqi;
 	struct cpumask *masks;
 	struct vdpa_callback cb;
 	bool has_affinity = desc && ops->set_vq_affinity;
@@ -379,14 +378,14 @@ static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
 	}
 
 	for (i = 0; i < nvqs; ++i) {
-		if (!names[i]) {
+		vqi = &vqs_info[i];
+		if (!vqi->name) {
 			vqs[i] = NULL;
 			continue;
 		}
 
-		vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++,
-					      callbacks[i], names[i], ctx ?
-					      ctx[i] : false);
+		vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++, vqi->callback,
+					      vqi->name, vqi->ctx);
 		if (IS_ERR(vqs[i])) {
 			err = PTR_ERR(vqs[i]);
 			goto err_setup_vq;
@@ -470,7 +469,7 @@ static const struct virtio_config_ops virtio_vdpa_config_ops = {
 	.get_status	= virtio_vdpa_get_status,
 	.set_status	= virtio_vdpa_set_status,
 	.reset		= virtio_vdpa_reset,
-	.find_vqs	= virtio_vdpa_find_vqs,
+	.find_vqs_info	= virtio_vdpa_find_vqs,
 	.del_vqs	= virtio_vdpa_del_vqs,
 	.get_features	= virtio_vdpa_get_features,
 	.finalize_features = virtio_vdpa_finalize_features,
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (5 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 08/19] virtio: remove the original find_vqs() op Jiri Pirko
                   ` (12 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Since there are no more implementations of find_vqs() op, call
virtio_find_vqs_info() from virtio_find_single_vq() directly.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 include/linux/virtio_config.h | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 21029afeede1..76bf74a985f6 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -279,10 +279,11 @@ static inline
 struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
 					vq_callback_t *c, const char *n)
 {
-	vq_callback_t *callbacks[] = { c };
-	const char *names[] = { n };
+	struct virtio_queue_info vqs_info[] = {
+		{ n, c },
+	};
 	struct virtqueue *vq;
-	int err = virtio_find_vqs(vdev, 1, &vq, callbacks, names, NULL);
+	int err = virtio_find_vqs_info(vdev, 1, &vq, vqs_info, NULL);
 
 	if (err < 0)
 		return ERR_PTR(err);
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 08/19] virtio: remove the original find_vqs() op
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (6 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 09/19] virtio: rename find_vqs_info() op to find_vqs() Jiri Pirko
                   ` (11 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

As it is no longer used, remove it.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 include/linux/virtio_config.h | 17 -----------------
 1 file changed, 17 deletions(-)

diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 76bf74a985f6..48edb88a998d 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -59,15 +59,6 @@ struct virtio_queue_info {
  *	After this, status and feature negotiation must be done again
  *	Device must not be reset from its vq/config callbacks, or in
  *	parallel with being added/removed.
- * @find_vqs: find virtqueues and instantiate them.
- *	vdev: the virtio_device
- *	nvqs: the number of virtqueues to find
- *	vqs: on success, includes new virtqueues
- *	callbacks: array of callbacks, for each virtqueue
- *		include a NULL entry for vqs that do not need a callback
- *	names: array of virtqueue names (mainly for debugging)
- *		include a NULL entry for vqs unused by driver
- *	Returns 0 on success or error status
  * @find_vqs_info: find virtqueues and instantiate them.
  *	vdev: the virtio_device
  *	nvqs: the number of virtqueues to find
@@ -121,10 +112,6 @@ struct virtio_config_ops {
 	u8 (*get_status)(struct virtio_device *vdev);
 	void (*set_status)(struct virtio_device *vdev, u8 status);
 	void (*reset)(struct virtio_device *vdev);
-	int (*find_vqs)(struct virtio_device *, unsigned nvqs,
-			struct virtqueue *vqs[], vq_callback_t *callbacks[],
-			const char * const names[], const bool *ctx,
-			struct irq_affinity *desc);
 	int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
 			     struct virtqueue *vqs[],
 			     struct virtio_queue_info vqs_info[],
@@ -248,10 +235,6 @@ int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
 	struct virtio_queue_info *vqs_info;
 	int err, i;
 
-	if (!vdev->config->find_vqs_info)
-		return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
-					      names, ctx, desc);
-
 	vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
 	if (!vqs_info)
 		return -ENOMEM;
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 09/19] virtio: rename find_vqs_info() op to find_vqs()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (7 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 08/19] virtio: remove the original find_vqs() op Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 10/19] virtio_blk: convert to use virtio_find_vqs_info() Jiri Pirko
                   ` (10 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Since the original find_vqs() is no longer present, rename
find_vqs_info() back to find_vqs().

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 arch/um/drivers/virtio_uml.c             |  2 +-
 drivers/platform/mellanox/mlxbf-tmfifo.c |  2 +-
 drivers/remoteproc/remoteproc_virtio.c   |  2 +-
 drivers/s390/virtio/virtio_ccw.c         |  2 +-
 drivers/virtio/virtio_mmio.c             |  2 +-
 drivers/virtio/virtio_pci_legacy.c       |  2 +-
 drivers/virtio/virtio_pci_modern.c       |  4 ++--
 drivers/virtio/virtio_vdpa.c             |  2 +-
 include/linux/virtio_config.h            | 12 ++++++------
 9 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
index a87f0bcd36b5..99cded70ecfb 100644
--- a/arch/um/drivers/virtio_uml.c
+++ b/arch/um/drivers/virtio_uml.c
@@ -1099,7 +1099,7 @@ static const struct virtio_config_ops virtio_uml_config_ops = {
 	.get_status = vu_get_status,
 	.set_status = vu_set_status,
 	.reset = vu_reset,
-	.find_vqs_info = vu_find_vqs,
+	.find_vqs = vu_find_vqs,
 	.del_vqs = vu_del_vqs,
 	.get_features = vu_get_features,
 	.finalize_features = vu_finalize_features,
diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
index 825116bd2db9..d8f7773875f9 100644
--- a/drivers/platform/mellanox/mlxbf-tmfifo.c
+++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
@@ -1175,7 +1175,7 @@ static void tmfifo_virtio_dev_release(struct device *device)
 static const struct virtio_config_ops mlxbf_tmfifo_virtio_config_ops = {
 	.get_features = mlxbf_tmfifo_virtio_get_features,
 	.finalize_features = mlxbf_tmfifo_virtio_finalize_features,
-	.find_vqs_info = mlxbf_tmfifo_virtio_find_vqs,
+	.find_vqs = mlxbf_tmfifo_virtio_find_vqs,
 	.del_vqs = mlxbf_tmfifo_virtio_del_vqs,
 	.reset = mlxbf_tmfifo_virtio_reset,
 	.set_status = mlxbf_tmfifo_virtio_set_status,
diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
index 85a678e99bfb..dde5fb173e54 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -327,7 +327,7 @@ static void rproc_virtio_set(struct virtio_device *vdev, unsigned int offset,
 static const struct virtio_config_ops rproc_virtio_config_ops = {
 	.get_features	= rproc_virtio_get_features,
 	.finalize_features = rproc_virtio_finalize_features,
-	.find_vqs_info	= rproc_virtio_find_vqs,
+	.find_vqs	= rproc_virtio_find_vqs,
 	.del_vqs	= rproc_virtio_del_vqs,
 	.reset		= rproc_virtio_reset,
 	.set_status	= rproc_virtio_set_status,
diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
index f92303f92c0c..9d111b5992e5 100644
--- a/drivers/s390/virtio/virtio_ccw.c
+++ b/drivers/s390/virtio/virtio_ccw.c
@@ -1076,7 +1076,7 @@ static const struct virtio_config_ops virtio_ccw_config_ops = {
 	.get_status = virtio_ccw_get_status,
 	.set_status = virtio_ccw_set_status,
 	.reset = virtio_ccw_reset,
-	.find_vqs_info = virtio_ccw_find_vqs,
+	.find_vqs = virtio_ccw_find_vqs,
 	.del_vqs = virtio_ccw_del_vqs,
 	.bus_name = virtio_ccw_bus_name,
 	.synchronize_cbs = virtio_ccw_synchronize_cbs,
diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
index 1aa7988b5f31..c1951fff8212 100644
--- a/drivers/virtio/virtio_mmio.c
+++ b/drivers/virtio/virtio_mmio.c
@@ -570,7 +570,7 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
 	.get_status	= vm_get_status,
 	.set_status	= vm_set_status,
 	.reset		= vm_reset,
-	.find_vqs_info	= vm_find_vqs,
+	.find_vqs	= vm_find_vqs,
 	.del_vqs	= vm_del_vqs,
 	.get_features	= vm_get_features,
 	.finalize_features = vm_finalize_features,
diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
index a9786e38d763..d9cbb02b35a1 100644
--- a/drivers/virtio/virtio_pci_legacy.c
+++ b/drivers/virtio/virtio_pci_legacy.c
@@ -192,7 +192,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
 	.get_status	= vp_get_status,
 	.set_status	= vp_set_status,
 	.reset		= vp_reset,
-	.find_vqs_info	= vp_find_vqs,
+	.find_vqs	= vp_find_vqs,
 	.del_vqs	= vp_del_vqs,
 	.synchronize_cbs = vp_synchronize_vectors,
 	.get_features	= vp_get_features,
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index 20933b9f2568..787bc534b05c 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -781,7 +781,7 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
 	.get_status	= vp_get_status,
 	.set_status	= vp_set_status,
 	.reset		= vp_reset,
-	.find_vqs_info	= vp_modern_find_vqs,
+	.find_vqs	= vp_modern_find_vqs,
 	.del_vqs	= vp_del_vqs,
 	.synchronize_cbs = vp_synchronize_vectors,
 	.get_features	= vp_get_features,
@@ -803,7 +803,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
 	.get_status	= vp_get_status,
 	.set_status	= vp_set_status,
 	.reset		= vp_reset,
-	.find_vqs_info	= vp_modern_find_vqs,
+	.find_vqs	= vp_modern_find_vqs,
 	.del_vqs	= vp_del_vqs,
 	.synchronize_cbs = vp_synchronize_vectors,
 	.get_features	= vp_get_features,
diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
index 39db3b8ac85b..f90ecf587ce2 100644
--- a/drivers/virtio/virtio_vdpa.c
+++ b/drivers/virtio/virtio_vdpa.c
@@ -469,7 +469,7 @@ static const struct virtio_config_ops virtio_vdpa_config_ops = {
 	.get_status	= virtio_vdpa_get_status,
 	.set_status	= virtio_vdpa_set_status,
 	.reset		= virtio_vdpa_reset,
-	.find_vqs_info	= virtio_vdpa_find_vqs,
+	.find_vqs	= virtio_vdpa_find_vqs,
 	.del_vqs	= virtio_vdpa_del_vqs,
 	.get_features	= virtio_vdpa_get_features,
 	.finalize_features = virtio_vdpa_finalize_features,
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 48edb88a998d..24bbb1805b80 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -59,7 +59,7 @@ struct virtio_queue_info {
  *	After this, status and feature negotiation must be done again
  *	Device must not be reset from its vq/config callbacks, or in
  *	parallel with being added/removed.
- * @find_vqs_info: find virtqueues and instantiate them.
+ * @find_vqs: find virtqueues and instantiate them.
  *	vdev: the virtio_device
  *	nvqs: the number of virtqueues to find
  *	vqs: on success, includes new virtqueues
@@ -112,10 +112,10 @@ struct virtio_config_ops {
 	u8 (*get_status)(struct virtio_device *vdev);
 	void (*set_status)(struct virtio_device *vdev, u8 status);
 	void (*reset)(struct virtio_device *vdev);
-	int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
-			     struct virtqueue *vqs[],
-			     struct virtio_queue_info vqs_info[],
-			     struct irq_affinity *desc);
+	int (*find_vqs)(struct virtio_device *vdev, unsigned int nvqs,
+			struct virtqueue *vqs[],
+			struct virtio_queue_info vqs_info[],
+			struct irq_affinity *desc);
 	void (*del_vqs)(struct virtio_device *);
 	void (*synchronize_cbs)(struct virtio_device *);
 	u64 (*get_features)(struct virtio_device *vdev);
@@ -223,7 +223,7 @@ int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
 			 struct virtio_queue_info vqs_info[],
 			 struct irq_affinity *desc)
 {
-	return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
+	return vdev->config->find_vqs(vdev, nvqs, vqs, vqs_info, desc);
 }
 
 static inline
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 10/19] virtio_blk: convert to use virtio_find_vqs_info()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (8 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 09/19] virtio: rename find_vqs_info() op to find_vqs() Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 11/19] virtio_console: " Jiri Pirko
                   ` (9 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/block/virtio_blk.c | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 46bdbad1ab48..574498280dee 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -964,8 +964,7 @@ static int init_vq(struct virtio_blk *vblk)
 {
 	int err;
 	unsigned short i;
-	vq_callback_t **callbacks;
-	const char **names;
+	struct virtio_queue_info *vqs_info;
 	struct virtqueue **vqs;
 	unsigned short num_vqs;
 	unsigned short num_poll_vqs;
@@ -1002,28 +1001,26 @@ static int init_vq(struct virtio_blk *vblk)
 	if (!vblk->vqs)
 		return -ENOMEM;
 
-	names = kmalloc_array(num_vqs, sizeof(*names), GFP_KERNEL);
-	callbacks = kmalloc_array(num_vqs, sizeof(*callbacks), GFP_KERNEL);
+	vqs_info = kcalloc(num_vqs, sizeof(*vqs_info), GFP_KERNEL);
 	vqs = kmalloc_array(num_vqs, sizeof(*vqs), GFP_KERNEL);
-	if (!names || !callbacks || !vqs) {
+	if (!vqs_info || !vqs) {
 		err = -ENOMEM;
 		goto out;
 	}
 
 	for (i = 0; i < num_vqs - num_poll_vqs; i++) {
-		callbacks[i] = virtblk_done;
+		vqs_info[i].callback = virtblk_done;
 		snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req.%u", i);
-		names[i] = vblk->vqs[i].name;
+		vqs_info[i].name = vblk->vqs[i].name;
 	}
 
 	for (; i < num_vqs; i++) {
-		callbacks[i] = NULL;
 		snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req_poll.%u", i);
-		names[i] = vblk->vqs[i].name;
+		vqs_info[i].name = vblk->vqs[i].name;
 	}
 
 	/* Discover virtqueues and write information to configuration.  */
-	err = virtio_find_vqs(vdev, num_vqs, vqs, callbacks, names, &desc);
+	err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
 	if (err)
 		goto out;
 
@@ -1035,8 +1032,7 @@ static int init_vq(struct virtio_blk *vblk)
 
 out:
 	kfree(vqs);
-	kfree(callbacks);
-	kfree(names);
+	kfree(vqs_info);
 	if (err)
 		kfree(vblk->vqs);
 	return err;
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 11/19] virtio_console: convert to use virtio_find_vqs_info()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (9 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 10/19] virtio_blk: convert to use virtio_find_vqs_info() Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 12/19] virtio_crypto: " Jiri Pirko
                   ` (8 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/char/virtio_console.c | 44 ++++++++++++++---------------------
 1 file changed, 18 insertions(+), 26 deletions(-)

diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index d9ee2dbc7eab..23dbf1c18c90 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1804,8 +1804,7 @@ static void config_work_handler(struct work_struct *work)
 
 static int init_vqs(struct ports_device *portdev)
 {
-	vq_callback_t **io_callbacks;
-	char **io_names;
+	struct virtio_queue_info *vqs_info;
 	struct virtqueue **vqs;
 	u32 i, j, nr_ports, nr_queues;
 	int err;
@@ -1814,15 +1813,12 @@ static int init_vqs(struct ports_device *portdev)
 	nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;
 
 	vqs = kmalloc_array(nr_queues, sizeof(struct virtqueue *), GFP_KERNEL);
-	io_callbacks = kmalloc_array(nr_queues, sizeof(vq_callback_t *),
-				     GFP_KERNEL);
-	io_names = kmalloc_array(nr_queues, sizeof(char *), GFP_KERNEL);
+	vqs_info = kcalloc(nr_queues, sizeof(*vqs_info), GFP_KERNEL);
 	portdev->in_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
 					GFP_KERNEL);
 	portdev->out_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
 					 GFP_KERNEL);
-	if (!vqs || !io_callbacks || !io_names || !portdev->in_vqs ||
-	    !portdev->out_vqs) {
+	if (!vqs || !vqs_info || !portdev->in_vqs || !portdev->out_vqs) {
 		err = -ENOMEM;
 		goto free;
 	}
@@ -1833,30 +1829,28 @@ static int init_vqs(struct ports_device *portdev)
 	 * 0 before others.
 	 */
 	j = 0;
-	io_callbacks[j] = in_intr;
-	io_callbacks[j + 1] = out_intr;
-	io_names[j] = "input";
-	io_names[j + 1] = "output";
+	vqs_info[j].callback = in_intr;
+	vqs_info[j + 1].callback = out_intr;
+	vqs_info[j].name = "input";
+	vqs_info[j + 1].name = "output";
 	j += 2;
 
 	if (use_multiport(portdev)) {
-		io_callbacks[j] = control_intr;
-		io_callbacks[j + 1] = NULL;
-		io_names[j] = "control-i";
-		io_names[j + 1] = "control-o";
+		vqs_info[j].callback = control_intr;
+		vqs_info[j].name = "control-i";
+		vqs_info[j + 1].name = "control-o";
 
 		for (i = 1; i < nr_ports; i++) {
 			j += 2;
-			io_callbacks[j] = in_intr;
-			io_callbacks[j + 1] = out_intr;
-			io_names[j] = "input";
-			io_names[j + 1] = "output";
+			vqs_info[j].callback = in_intr;
+			vqs_info[j + 1].callback = out_intr;
+			vqs_info[j].name = "input";
+			vqs_info[j + 1].name = "output";
 		}
 	}
 	/* Find the queues. */
-	err = virtio_find_vqs(portdev->vdev, nr_queues, vqs,
-			      io_callbacks,
-			      (const char **)io_names, NULL);
+	err = virtio_find_vqs_info(portdev->vdev, nr_queues, vqs,
+				   vqs_info, NULL);
 	if (err)
 		goto free;
 
@@ -1874,8 +1868,7 @@ static int init_vqs(struct ports_device *portdev)
 			portdev->out_vqs[i] = vqs[j + 1];
 		}
 	}
-	kfree(io_names);
-	kfree(io_callbacks);
+	kfree(vqs_info);
 	kfree(vqs);
 
 	return 0;
@@ -1883,8 +1876,7 @@ static int init_vqs(struct ports_device *portdev)
 free:
 	kfree(portdev->out_vqs);
 	kfree(portdev->in_vqs);
-	kfree(io_names);
-	kfree(io_callbacks);
+	kfree(vqs_info);
 	kfree(vqs);
 
 	return err;
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 12/19] virtio_crypto: convert to use virtio_find_vqs_info()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (10 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 11/19] virtio_console: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 13/19] virtio_net: " Jiri Pirko
                   ` (7 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/crypto/virtio/virtio_crypto_core.c | 31 +++++++++-------------
 1 file changed, 12 insertions(+), 19 deletions(-)

diff --git a/drivers/crypto/virtio/virtio_crypto_core.c b/drivers/crypto/virtio/virtio_crypto_core.c
index 30cd040aa03b..800d5c2a688c 100644
--- a/drivers/crypto/virtio/virtio_crypto_core.c
+++ b/drivers/crypto/virtio/virtio_crypto_core.c
@@ -96,11 +96,10 @@ static void virtcrypto_dataq_callback(struct virtqueue *vq)
 
 static int virtcrypto_find_vqs(struct virtio_crypto *vi)
 {
-	vq_callback_t **callbacks;
+	struct virtio_queue_info *vqs_info;
 	struct virtqueue **vqs;
 	int ret = -ENOMEM;
 	int i, total_vqs;
-	const char **names;
 	struct device *dev = &vi->vdev->dev;
 
 	/*
@@ -114,26 +113,23 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
 	vqs = kcalloc(total_vqs, sizeof(*vqs), GFP_KERNEL);
 	if (!vqs)
 		goto err_vq;
-	callbacks = kcalloc(total_vqs, sizeof(*callbacks), GFP_KERNEL);
-	if (!callbacks)
-		goto err_callback;
-	names = kcalloc(total_vqs, sizeof(*names), GFP_KERNEL);
-	if (!names)
-		goto err_names;
+	vqs_info = kcalloc(total_vqs, sizeof(*vqs_info), GFP_KERNEL);
+	if (!vqs_info)
+		goto err_vqs_info;
 
 	/* Parameters for control virtqueue */
-	callbacks[total_vqs - 1] = virtcrypto_ctrlq_callback;
-	names[total_vqs - 1] = "controlq";
+	vqs_info[total_vqs - 1].callback = virtcrypto_ctrlq_callback;
+	vqs_info[total_vqs - 1].name = "controlq";
 
 	/* Allocate/initialize parameters for data virtqueues */
 	for (i = 0; i < vi->max_data_queues; i++) {
-		callbacks[i] = virtcrypto_dataq_callback;
+		vqs_info[i].callback = virtcrypto_dataq_callback;
 		snprintf(vi->data_vq[i].name, sizeof(vi->data_vq[i].name),
 				"dataq.%d", i);
-		names[i] = vi->data_vq[i].name;
+		vqs_info[i].name = vi->data_vq[i].name;
 	}
 
-	ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, callbacks, names, NULL);
+	ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
 	if (ret)
 		goto err_find;
 
@@ -153,18 +149,15 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
 				(unsigned long)&vi->data_vq[i]);
 	}
 
-	kfree(names);
-	kfree(callbacks);
+	kfree(vqs_info);
 	kfree(vqs);
 
 	return 0;
 
 err_engine:
 err_find:
-	kfree(names);
-err_names:
-	kfree(callbacks);
-err_callback:
+	kfree(vqs_info);
+err_vqs_info:
 	kfree(vqs);
 err_vq:
 	return ret;
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 13/19] virtio_net: convert to use virtio_find_vqs_info()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (11 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 12/19] virtio_crypto: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 14/19] scsi: virtio_scsi: " Jiri Pirko
                   ` (6 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Instead of passing separate names and callbacks arrays
to virtio_find_vqs_ctx(), allocate one of virtual_queue_info structs
and pass it to virtio_find_vqs_info().

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/net/virtio_net.c | 34 +++++++++++++---------------------
 1 file changed, 13 insertions(+), 21 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 283b34d50296..3e367c7b88a0 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -4351,9 +4351,8 @@ static unsigned int mergeable_min_buf_len(struct virtnet_info *vi, struct virtqu
 
 static int virtnet_find_vqs(struct virtnet_info *vi)
 {
-	vq_callback_t **callbacks;
+	struct virtio_queue_info *vqs_info;
 	struct virtqueue **vqs;
-	const char **names;
 	int ret = -ENOMEM;
 	int total_vqs;
 	bool *ctx;
@@ -4370,12 +4369,9 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
 	vqs = kcalloc(total_vqs, sizeof(*vqs), GFP_KERNEL);
 	if (!vqs)
 		goto err_vq;
-	callbacks = kmalloc_array(total_vqs, sizeof(*callbacks), GFP_KERNEL);
-	if (!callbacks)
-		goto err_callback;
-	names = kmalloc_array(total_vqs, sizeof(*names), GFP_KERNEL);
-	if (!names)
-		goto err_names;
+	vqs_info = kcalloc(total_vqs, sizeof(*vqs_info), GFP_KERNEL);
+	if (!vqs_info)
+		goto err_vqs_info;
 	if (!vi->big_packets || vi->mergeable_rx_bufs) {
 		ctx = kcalloc(total_vqs, sizeof(*ctx), GFP_KERNEL);
 		if (!ctx)
@@ -4386,24 +4382,22 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
 
 	/* Parameters for control virtqueue, if any */
 	if (vi->has_cvq) {
-		callbacks[total_vqs - 1] = NULL;
-		names[total_vqs - 1] = "control";
+		vqs_info[total_vqs - 1].name = "control";
 	}
 
 	/* Allocate/initialize parameters for send/receive virtqueues */
 	for (i = 0; i < vi->max_queue_pairs; i++) {
-		callbacks[rxq2vq(i)] = skb_recv_done;
-		callbacks[txq2vq(i)] = skb_xmit_done;
+		vqs_info[rxq2vq(i)].callback = skb_recv_done;
+		vqs_info[txq2vq(i)].callback = skb_xmit_done;
 		sprintf(vi->rq[i].name, "input.%u", i);
 		sprintf(vi->sq[i].name, "output.%u", i);
-		names[rxq2vq(i)] = vi->rq[i].name;
-		names[txq2vq(i)] = vi->sq[i].name;
+		vqs_info[rxq2vq(i)].name = vi->rq[i].name;
+		vqs_info[txq2vq(i)].name = vi->sq[i].name;
 		if (ctx)
-			ctx[rxq2vq(i)] = true;
+			vqs_info[rxq2vq(i)].ctx = true;
 	}
 
-	ret = virtio_find_vqs_ctx(vi->vdev, total_vqs, vqs, callbacks,
-				  names, ctx, NULL);
+	ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
 	if (ret)
 		goto err_find;
 
@@ -4425,10 +4419,8 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
 err_find:
 	kfree(ctx);
 err_ctx:
-	kfree(names);
-err_names:
-	kfree(callbacks);
-err_callback:
+	kfree(vqs_info);
+err_vqs_info:
 	kfree(vqs);
 err_vq:
 	return ret;
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 14/19] scsi: virtio_scsi: convert to use virtio_find_vqs_info()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (12 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 13/19] virtio_net: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 15/19] virtiofs: " Jiri Pirko
                   ` (5 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/scsi/virtio_scsi.c | 32 +++++++++++++-------------------
 1 file changed, 13 insertions(+), 19 deletions(-)

diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 89ca26945721..416c6820b537 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -841,19 +841,16 @@ static int virtscsi_init(struct virtio_device *vdev,
 	int err;
 	u32 i;
 	u32 num_vqs, num_poll_vqs, num_req_vqs;
-	vq_callback_t **callbacks;
-	const char **names;
+	struct virtio_queue_info *vqs_info;
 	struct virtqueue **vqs;
 	struct irq_affinity desc = { .pre_vectors = 2 };
 
 	num_req_vqs = vscsi->num_queues;
 	num_vqs = num_req_vqs + VIRTIO_SCSI_VQ_BASE;
 	vqs = kmalloc_array(num_vqs, sizeof(struct virtqueue *), GFP_KERNEL);
-	callbacks = kmalloc_array(num_vqs, sizeof(vq_callback_t *),
-				  GFP_KERNEL);
-	names = kmalloc_array(num_vqs, sizeof(char *), GFP_KERNEL);
+	vqs_info = kcalloc(num_vqs, sizeof(*vqs_info), GFP_KERNEL);
 
-	if (!callbacks || !vqs || !names) {
+	if (!vqs || !vqs_info) {
 		err = -ENOMEM;
 		goto out;
 	}
@@ -869,22 +866,20 @@ static int virtscsi_init(struct virtio_device *vdev,
 		 vscsi->io_queues[HCTX_TYPE_READ],
 		 vscsi->io_queues[HCTX_TYPE_POLL]);
 
-	callbacks[0] = virtscsi_ctrl_done;
-	callbacks[1] = virtscsi_event_done;
-	names[0] = "control";
-	names[1] = "event";
+	vqs_info[0].callback = virtscsi_ctrl_done;
+	vqs_info[0].name = "control";
+	vqs_info[1].callback = virtscsi_event_done;
+	vqs_info[1].name = "event";
 	for (i = VIRTIO_SCSI_VQ_BASE; i < num_vqs - num_poll_vqs; i++) {
-		callbacks[i] = virtscsi_req_done;
-		names[i] = "request";
+		vqs_info[i].callback = virtscsi_req_done;
+		vqs_info[i].name = "request";
 	}
 
-	for (; i < num_vqs; i++) {
-		callbacks[i] = NULL;
-		names[i] = "request_poll";
-	}
+	for (; i < num_vqs; i++)
+		vqs_info[i].name = "request_poll";
 
 	/* Discover virtqueues and write information to configuration.  */
-	err = virtio_find_vqs(vdev, num_vqs, vqs, callbacks, names, &desc);
+	err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
 	if (err)
 		goto out;
 
@@ -900,8 +895,7 @@ static int virtscsi_init(struct virtio_device *vdev,
 	err = 0;
 
 out:
-	kfree(names);
-	kfree(callbacks);
+	kfree(vqs_info);
 	kfree(vqs);
 	if (err)
 		virtscsi_remove_vqs(vdev);
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 15/19] virtiofs: convert to use virtio_find_vqs_info()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (13 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 14/19] scsi: virtio_scsi: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 16/19] virtio_balloon: " Jiri Pirko
                   ` (4 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 fs/fuse/virtio_fs.c | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
index ca7b64f9c3c7..466d4888d664 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -740,9 +740,8 @@ static void virtio_fs_init_vq(struct virtio_fs_vq *fsvq, char *name,
 static int virtio_fs_setup_vqs(struct virtio_device *vdev,
 			       struct virtio_fs *fs)
 {
+	struct virtio_queue_info *vqs_info;
 	struct virtqueue **vqs;
-	vq_callback_t **callbacks;
-	const char **names;
 	unsigned int i;
 	int ret = 0;
 
@@ -757,18 +756,16 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
 		return -ENOMEM;
 
 	vqs = kmalloc_array(fs->nvqs, sizeof(vqs[VQ_HIPRIO]), GFP_KERNEL);
-	callbacks = kmalloc_array(fs->nvqs, sizeof(callbacks[VQ_HIPRIO]),
-					GFP_KERNEL);
-	names = kmalloc_array(fs->nvqs, sizeof(names[VQ_HIPRIO]), GFP_KERNEL);
-	if (!vqs || !callbacks || !names) {
+	vqs_info = kcalloc(fs->nvqs, sizeof(*vqs_info), GFP_KERNEL);
+	if (!vqs || !vqs_info) {
 		ret = -ENOMEM;
 		goto out;
 	}
 
 	/* Initialize the hiprio/forget request virtqueue */
-	callbacks[VQ_HIPRIO] = virtio_fs_vq_done;
+	vqs_info[VQ_HIPRIO].callback = virtio_fs_vq_done;
 	virtio_fs_init_vq(&fs->vqs[VQ_HIPRIO], "hiprio", VQ_HIPRIO);
-	names[VQ_HIPRIO] = fs->vqs[VQ_HIPRIO].name;
+	vqs_info[VQ_HIPRIO].name = fs->vqs[VQ_HIPRIO].name;
 
 	/* Initialize the requests virtqueues */
 	for (i = VQ_REQUEST; i < fs->nvqs; i++) {
@@ -776,11 +773,11 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
 
 		snprintf(vq_name, VQ_NAME_LEN, "requests.%u", i - VQ_REQUEST);
 		virtio_fs_init_vq(&fs->vqs[i], vq_name, VQ_REQUEST);
-		callbacks[i] = virtio_fs_vq_done;
-		names[i] = fs->vqs[i].name;
+		vqs_info[i].callback = virtio_fs_vq_done;
+		vqs_info[i].name = fs->vqs[i].name;
 	}
 
-	ret = virtio_find_vqs(vdev, fs->nvqs, vqs, callbacks, names, NULL);
+	ret = virtio_find_vqs_info(vdev, fs->nvqs, vqs, vqs_info, NULL);
 	if (ret < 0)
 		goto out;
 
@@ -789,8 +786,7 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
 
 	virtio_fs_start_all_queues(fs);
 out:
-	kfree(names);
-	kfree(callbacks);
+	kfree(vqs_info);
 	kfree(vqs);
 	if (ret)
 		kfree(fs->vqs);
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 16/19] virtio_balloon: convert to use virtio_find_vqs_info()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (14 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 15/19] virtiofs: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
                   ` (3 subsequent siblings)
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), have one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/virtio/virtio_balloon.c | 34 +++++++++++++--------------------
 1 file changed, 13 insertions(+), 21 deletions(-)

diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index c0a63638f95e..02ae30cc96ec 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -545,9 +545,8 @@ static void update_balloon_size_func(struct work_struct *work)
 
 static int init_vqs(struct virtio_balloon *vb)
 {
+	struct virtio_queue_info vqs_info[VIRTIO_BALLOON_VQ_MAX] = {};
 	struct virtqueue *vqs[VIRTIO_BALLOON_VQ_MAX];
-	vq_callback_t *callbacks[VIRTIO_BALLOON_VQ_MAX];
-	const char *names[VIRTIO_BALLOON_VQ_MAX];
 	int err;
 
 	/*
@@ -555,33 +554,26 @@ static int init_vqs(struct virtio_balloon *vb)
 	 * will be NULL if the related feature is not enabled, which will
 	 * cause no allocation for the corresponding virtqueue in find_vqs.
 	 */
-	callbacks[VIRTIO_BALLOON_VQ_INFLATE] = balloon_ack;
-	names[VIRTIO_BALLOON_VQ_INFLATE] = "inflate";
-	callbacks[VIRTIO_BALLOON_VQ_DEFLATE] = balloon_ack;
-	names[VIRTIO_BALLOON_VQ_DEFLATE] = "deflate";
-	callbacks[VIRTIO_BALLOON_VQ_STATS] = NULL;
-	names[VIRTIO_BALLOON_VQ_STATS] = NULL;
-	callbacks[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
-	names[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
-	names[VIRTIO_BALLOON_VQ_REPORTING] = NULL;
+	vqs_info[VIRTIO_BALLOON_VQ_INFLATE].callback = balloon_ack;
+	vqs_info[VIRTIO_BALLOON_VQ_INFLATE].name = "inflate";
+	vqs_info[VIRTIO_BALLOON_VQ_DEFLATE].callback = balloon_ack;
+	vqs_info[VIRTIO_BALLOON_VQ_DEFLATE].name = "deflate";
 
 	if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ)) {
-		names[VIRTIO_BALLOON_VQ_STATS] = "stats";
-		callbacks[VIRTIO_BALLOON_VQ_STATS] = stats_request;
+		vqs_info[VIRTIO_BALLOON_VQ_STATS].name = "stats";
+		vqs_info[VIRTIO_BALLOON_VQ_STATS].callback = stats_request;
 	}
 
-	if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) {
-		names[VIRTIO_BALLOON_VQ_FREE_PAGE] = "free_page_vq";
-		callbacks[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
-	}
+	if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT))
+		vqs_info[VIRTIO_BALLOON_VQ_FREE_PAGE].name = "free_page_vq";
 
 	if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_REPORTING)) {
-		names[VIRTIO_BALLOON_VQ_REPORTING] = "reporting_vq";
-		callbacks[VIRTIO_BALLOON_VQ_REPORTING] = balloon_ack;
+		vqs_info[VIRTIO_BALLOON_VQ_REPORTING].name = "reporting_vq";
+		vqs_info[VIRTIO_BALLOON_VQ_REPORTING].callback = balloon_ack;
 	}
 
-	err = virtio_find_vqs(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
-			      callbacks, names, NULL);
+	err = virtio_find_vqs_info(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
+				   vqs_info, NULL);
 	if (err)
 		return err;
 
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (15 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 16/19] virtio_balloon: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 13:11   ` Michael S. Tsirkin
  2024-07-03 12:39 ` [PATCH virtio 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers Jiri Pirko
                   ` (2 subsequent siblings)
  19 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), have one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 arch/um/drivers/virt-pci.c                    |  8 ++++---
 drivers/bluetooth/virtio_bt.c                 | 14 ++++-------
 drivers/firmware/arm_scmi/virtio.c            | 11 ++++-----
 drivers/gpio/gpio-virtio.c                    | 10 ++++----
 drivers/gpu/drm/virtio/virtgpu_kms.c          |  9 ++++----
 drivers/iommu/virtio-iommu.c                  | 11 ++++-----
 drivers/net/wireless/virtual/mac80211_hwsim.c | 14 ++++-------
 drivers/rpmsg/virtio_rpmsg_bus.c              |  8 ++++---
 drivers/virtio/virtio_input.c                 |  9 ++++----
 net/vmw_vsock/virtio_transport.c              | 17 +++++---------
 sound/virtio/virtio_card.c                    | 23 ++++++++-----------
 11 files changed, 59 insertions(+), 75 deletions(-)

diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
index 7cb503469bbd..3df2ea53471a 100644
--- a/arch/um/drivers/virt-pci.c
+++ b/arch/um/drivers/virt-pci.c
@@ -567,12 +567,14 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
 
 static int um_pci_init_vqs(struct um_pci_device *dev)
 {
+	struct virtio_queue_info vqs_info[] = {
+		{ "cmd", um_pci_cmd_vq_cb },
+		{ "irq", um_pci_irq_vq_cb },
+	};
 	struct virtqueue *vqs[2];
-	static const char *const names[2] = { "cmd", "irq" };
-	vq_callback_t *cbs[2] = { um_pci_cmd_vq_cb, um_pci_irq_vq_cb };
 	int err, i;
 
-	err = virtio_find_vqs(dev->vdev, 2, vqs, cbs, names, NULL);
+	err = virtio_find_vqs_info(dev->vdev, 2, vqs, vqs_info, NULL);
 	if (err)
 		return err;
 
diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c
index 463b49ca2492..6481f9fe24c4 100644
--- a/drivers/bluetooth/virtio_bt.c
+++ b/drivers/bluetooth/virtio_bt.c
@@ -254,13 +254,9 @@ static void virtbt_rx_done(struct virtqueue *vq)
 
 static int virtbt_probe(struct virtio_device *vdev)
 {
-	vq_callback_t *callbacks[VIRTBT_NUM_VQS] = {
-		[VIRTBT_VQ_TX] = virtbt_tx_done,
-		[VIRTBT_VQ_RX] = virtbt_rx_done,
-	};
-	const char *names[VIRTBT_NUM_VQS] = {
-		[VIRTBT_VQ_TX] = "tx",
-		[VIRTBT_VQ_RX] = "rx",
+	struct virtio_queue_info vqs_info[VIRTBT_NUM_VQS] = {
+		[VIRTBT_VQ_TX] = { "tx", virtbt_tx_done },
+		[VIRTBT_VQ_RX] = { "rx", virtbt_rx_done },
 	};
 	struct virtio_bluetooth *vbt;
 	struct hci_dev *hdev;
@@ -289,8 +285,8 @@ static int virtbt_probe(struct virtio_device *vdev)
 
 	INIT_WORK(&vbt->rx, virtbt_rx_work);
 
-	err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, callbacks,
-			      names, NULL);
+	err = virtio_find_vqs_info(vdev, VIRTBT_NUM_VQS, vbt->vqs,
+				   vqs_info, NULL);
 	if (err)
 		return err;
 
diff --git a/drivers/firmware/arm_scmi/virtio.c b/drivers/firmware/arm_scmi/virtio.c
index 4892058445ce..a6ae59c03308 100644
--- a/drivers/firmware/arm_scmi/virtio.c
+++ b/drivers/firmware/arm_scmi/virtio.c
@@ -354,11 +354,9 @@ static void scmi_vio_deferred_tx_worker(struct work_struct *work)
 	scmi_vio_channel_release(vioch);
 }
 
-static const char *const scmi_vio_vqueue_names[] = { "tx", "rx" };
-
-static vq_callback_t *scmi_vio_complete_callbacks[] = {
-	scmi_vio_complete_cb,
-	scmi_vio_complete_cb
+static struct virtio_queue_info scmi_vio_vqs_info[] = {
+	{ "tx", scmi_vio_complete_cb },
+	{ "rx", scmi_vio_complete_cb },
 };
 
 static unsigned int virtio_get_max_msg(struct scmi_chan_info *base_cinfo)
@@ -831,8 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
 	if (have_vq_rx)
 		channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
 
-	ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_complete_callbacks,
-			      scmi_vio_vqueue_names, NULL);
+	ret = virtio_find_vqs_info(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
 	if (ret) {
 		dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
 		return ret;
diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c
index 9fae8e396c58..a45b392358c4 100644
--- a/drivers/gpio/gpio-virtio.c
+++ b/drivers/gpio/gpio-virtio.c
@@ -457,15 +457,15 @@ static void virtio_gpio_free_vqs(struct virtio_device *vdev)
 static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
 				 struct virtio_device *vdev)
 {
-	const char * const names[] = { "requestq", "eventq" };
-	vq_callback_t *cbs[] = {
-		virtio_gpio_request_vq,
-		virtio_gpio_event_vq,
+	struct virtio_queue_info vqs_info[] = {
+		{ "requestq", virtio_gpio_request_vq },
+		{ "eventq", virtio_gpio_event_vq },
 	};
 	struct virtqueue *vqs[2] = { NULL, NULL };
 	int ret;
 
-	ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs, cbs, names, NULL);
+	ret = virtio_find_vqs_info(vdev, vgpio->irq_lines ? 2 : 1, vqs,
+				   vqs_info, NULL);
 	if (ret) {
 		dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
 		return ret;
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 5a3b5aaed1f3..938c08a707eb 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -116,11 +116,10 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev,
 
 int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
 {
-	static vq_callback_t *callbacks[] = {
-		virtio_gpu_ctrl_ack, virtio_gpu_cursor_ack
+	struct virtio_queue_info vqs_info[] = {
+		{ "control", virtio_gpu_ctrl_ack },
+		{ "cursor", virtio_gpu_cursor_ack },
 	};
-	static const char * const names[] = { "control", "cursor" };
-
 	struct virtio_gpu_device *vgdev;
 	/* this will expand later */
 	struct virtqueue *vqs[2];
@@ -207,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
 	DRM_INFO("features: %ccontext_init\n",
 		 vgdev->has_context_init ? '+' : '-');
 
-	ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
+	ret = virtio_find_vqs_info(vgdev->vdev, 2, vqs, vqs_info, NULL);
 	if (ret) {
 		DRM_ERROR("failed to find virt queues\n");
 		goto err_vqs;
diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
index 9ed8958a42bf..ef77c1efc767 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -1094,14 +1094,13 @@ static struct iommu_ops viommu_ops = {
 static int viommu_init_vqs(struct viommu_dev *viommu)
 {
 	struct virtio_device *vdev = dev_to_virtio(viommu->dev);
-	const char *names[] = { "request", "event" };
-	vq_callback_t *callbacks[] = {
-		NULL, /* No async requests */
-		viommu_event_handler,
+	struct virtio_queue_info vqs_info[] = {
+		{ "request" },
+		{ "event", viommu_event_handler },
 	};
 
-	return virtio_find_vqs(vdev, VIOMMU_NR_VQS, viommu->vqs, callbacks,
-			       names, NULL);
+	return virtio_find_vqs_info(vdev, VIOMMU_NR_VQS, viommu->vqs,
+				    vqs_info, NULL);
 }
 
 static int viommu_fill_evtq(struct viommu_dev *viommu)
diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
index 20fa21bb4d1c..565c091f1ba5 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -6558,17 +6558,13 @@ static void hwsim_virtio_rx_done(struct virtqueue *vq)
 
 static int init_vqs(struct virtio_device *vdev)
 {
-	vq_callback_t *callbacks[HWSIM_NUM_VQS] = {
-		[HWSIM_VQ_TX] = hwsim_virtio_tx_done,
-		[HWSIM_VQ_RX] = hwsim_virtio_rx_done,
-	};
-	const char *names[HWSIM_NUM_VQS] = {
-		[HWSIM_VQ_TX] = "tx",
-		[HWSIM_VQ_RX] = "rx",
+	struct virtio_queue_info vqs_info[HWSIM_NUM_VQS] = {
+		[HWSIM_VQ_TX] = { "tx", hwsim_virtio_tx_done },
+		[HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
 	};
 
-	return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
-			       hwsim_vqs, callbacks, names, NULL);
+	return virtio_find_vqs_info(vdev, HWSIM_NUM_VQS,
+				    hwsim_vqs, vqs_info, NULL);
 }
 
 static int fill_vq(struct virtqueue *vq)
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index e9e8c1f7829f..440f1cc9157d 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -868,8 +868,10 @@ static void rpmsg_virtio_del_ctrl_dev(struct rpmsg_device *rpdev_ctrl)
 
 static int rpmsg_probe(struct virtio_device *vdev)
 {
-	vq_callback_t *vq_cbs[] = { rpmsg_recv_done, rpmsg_xmit_done };
-	static const char * const names[] = { "input", "output" };
+	struct virtio_queue_info vqs_info[] = {
+		{ "input", rpmsg_recv_done },
+		{ "output", rpmsg_xmit_done },
+	};
 	struct virtqueue *vqs[2];
 	struct virtproc_info *vrp;
 	struct virtio_rpmsg_channel *vch = NULL;
@@ -891,7 +893,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
 	init_waitqueue_head(&vrp->sendq);
 
 	/* We expect two virtqueues, rx and tx (and in this order) */
-	err = virtio_find_vqs(vdev, 2, vqs, vq_cbs, names, NULL);
+	err = virtio_find_vqs_info(vdev, 2, vqs, vqs_info, NULL);
 	if (err)
 		goto free_vrp;
 
diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
index 1a730d6c0b55..e1491ad9eced 100644
--- a/drivers/virtio/virtio_input.c
+++ b/drivers/virtio/virtio_input.c
@@ -185,13 +185,14 @@ static void virtinput_cfg_abs(struct virtio_input *vi, int abs)
 
 static int virtinput_init_vqs(struct virtio_input *vi)
 {
+	struct virtio_queue_info vqs_info[] = {
+		{ "events", virtinput_recv_events },
+		{ "status", virtinput_recv_status },
+	};
 	struct virtqueue *vqs[2];
-	vq_callback_t *cbs[] = { virtinput_recv_events,
-				 virtinput_recv_status };
-	static const char * const names[] = { "events", "status" };
 	int err;
 
-	err = virtio_find_vqs(vi->vdev, 2, vqs, cbs, names, NULL);
+	err = virtio_find_vqs_info(vi->vdev, 2, vqs, vqs_info, NULL);
 	if (err)
 		return err;
 	vi->evt = vqs[0];
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index 43d405298857..d303ef4d9898 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -617,20 +617,15 @@ static void virtio_transport_rx_work(struct work_struct *work)
 static int virtio_vsock_vqs_init(struct virtio_vsock *vsock)
 {
 	struct virtio_device *vdev = vsock->vdev;
-	static const char * const names[] = {
-		"rx",
-		"tx",
-		"event",
-	};
-	vq_callback_t *callbacks[] = {
-		virtio_vsock_rx_done,
-		virtio_vsock_tx_done,
-		virtio_vsock_event_done,
+	struct virtio_queue_info vqs_info[] = {
+		{ "rx", virtio_vsock_rx_done },
+		{ "tx", virtio_vsock_tx_done },
+		{ "event", virtio_vsock_event_done },
 	};
 	int ret;
 
-	ret = virtio_find_vqs(vdev, VSOCK_VQ_MAX, vsock->vqs, callbacks, names,
-			      NULL);
+	ret = virtio_find_vqs_info(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info,
+				   NULL);
 	if (ret < 0)
 		return ret;
 
diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c
index 7805daea0102..a6b0da6790dc 100644
--- a/sound/virtio/virtio_card.c
+++ b/sound/virtio/virtio_card.c
@@ -110,25 +110,22 @@ static void virtsnd_event_notify_cb(struct virtqueue *vqueue)
 static int virtsnd_find_vqs(struct virtio_snd *snd)
 {
 	struct virtio_device *vdev = snd->vdev;
-	static vq_callback_t *callbacks[VIRTIO_SND_VQ_MAX] = {
-		[VIRTIO_SND_VQ_CONTROL] = virtsnd_ctl_notify_cb,
-		[VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb,
-		[VIRTIO_SND_VQ_TX] = virtsnd_pcm_tx_notify_cb,
-		[VIRTIO_SND_VQ_RX] = virtsnd_pcm_rx_notify_cb
-	};
-	static const char *names[VIRTIO_SND_VQ_MAX] = {
-		[VIRTIO_SND_VQ_CONTROL] = "virtsnd-ctl",
-		[VIRTIO_SND_VQ_EVENT] = "virtsnd-event",
-		[VIRTIO_SND_VQ_TX] = "virtsnd-tx",
-		[VIRTIO_SND_VQ_RX] = "virtsnd-rx"
+	struct virtio_queue_info vqs_info[] = {
+		[VIRTIO_SND_VQ_CONTROL] = { "virtsnd-ctl",
+					    virtsnd_ctl_notify_cb },
+		[VIRTIO_SND_VQ_EVENT] = { "virtsnd-event",
+					  virtsnd_event_notify_cb },
+		[VIRTIO_SND_VQ_TX] = { "virtsnd-tx",
+				       virtsnd_pcm_tx_notify_cb },
+		[VIRTIO_SND_VQ_RX] = { "virtsnd-rx",
+				       virtsnd_pcm_rx_notify_cb },
 	};
 	struct virtqueue *vqs[VIRTIO_SND_VQ_MAX] = { 0 };
 	unsigned int i;
 	unsigned int n;
 	int rc;
 
-	rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, callbacks, names,
-			     NULL);
+	rc = virtio_find_vqs_info(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
 	if (rc) {
 		dev_err(&vdev->dev, "failed to initialize virtqueues\n");
 		return rc;
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (16 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:39 ` [PATCH virtio 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs() Jiri Pirko
  2024-07-03 12:50 ` [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Michael S. Tsirkin
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

All callers of virtio_find_vqs() and virtio_find_vqs_ctx() were
converted to use virtio_find_vqs_info(). Remove no longer used helpers.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 include/linux/virtio_config.h | 32 --------------------------------
 1 file changed, 32 deletions(-)

diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 24bbb1805b80..639d68e95580 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -226,38 +226,6 @@ int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
 	return vdev->config->find_vqs(vdev, nvqs, vqs, vqs_info, desc);
 }
 
-static inline
-int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
-			struct virtqueue *vqs[], vq_callback_t *callbacks[],
-			const char * const names[], const bool *ctx,
-			struct irq_affinity *desc)
-{
-	struct virtio_queue_info *vqs_info;
-	int err, i;
-
-	vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
-	if (!vqs_info)
-		return -ENOMEM;
-	for (i = 0; i < nvqs; i++) {
-		vqs_info[i].name = names[i];
-		vqs_info[i].callback = callbacks[i];
-		vqs_info[i].ctx = ctx ? ctx[i] : false;
-	}
-	err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
-	kfree(vqs_info);
-	return err;
-}
-
-static inline
-int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
-			struct virtqueue *vqs[], vq_callback_t *callbacks[],
-			const char * const names[],
-			struct irq_affinity *desc)
-{
-	return virtio_find_vqs_ctx(vdev, nvqs, vqs, callbacks,
-				   names, NULL, desc);
-}
-
 static inline
 struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
 					vq_callback_t *c, const char *n)
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [PATCH virtio 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (17 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
  2024-07-03 12:50 ` [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Michael S. Tsirkin
  19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
  To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi

From: Jiri Pirko <jiri@nvidia.com>

Since the original virtio_find_vqs() is no longer present, rename
virtio_find_vqs_info() back to virtio_find_vqs().

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
 arch/um/drivers/virt-pci.c                    |  2 +-
 drivers/block/virtio_blk.c                    |  2 +-
 drivers/bluetooth/virtio_bt.c                 |  3 +--
 drivers/char/virtio_console.c                 |  3 +--
 drivers/crypto/virtio/virtio_crypto_core.c    |  2 +-
 drivers/firmware/arm_scmi/virtio.c            |  2 +-
 drivers/gpio/gpio-virtio.c                    |  4 ++--
 drivers/gpu/drm/virtio/virtgpu_kms.c          |  2 +-
 drivers/iommu/virtio-iommu.c                  |  4 ++--
 drivers/net/virtio_net.c                      |  2 +-
 drivers/net/wireless/virtual/mac80211_hwsim.c |  4 ++--
 drivers/rpmsg/virtio_rpmsg_bus.c              |  2 +-
 drivers/scsi/virtio_scsi.c                    |  2 +-
 drivers/virtio/virtio_balloon.c               |  4 ++--
 drivers/virtio/virtio_input.c                 |  2 +-
 fs/fuse/virtio_fs.c                           |  2 +-
 include/linux/virtio_config.h                 | 10 +++++-----
 net/vmw_vsock/virtio_transport.c              |  3 +--
 sound/virtio/virtio_card.c                    |  2 +-
 19 files changed, 27 insertions(+), 30 deletions(-)

diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
index 3df2ea53471a..643b52d957d9 100644
--- a/arch/um/drivers/virt-pci.c
+++ b/arch/um/drivers/virt-pci.c
@@ -574,7 +574,7 @@ static int um_pci_init_vqs(struct um_pci_device *dev)
 	struct virtqueue *vqs[2];
 	int err, i;
 
-	err = virtio_find_vqs_info(dev->vdev, 2, vqs, vqs_info, NULL);
+	err = virtio_find_vqs(dev->vdev, 2, vqs, vqs_info, NULL);
 	if (err)
 		return err;
 
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 574498280dee..96f5fffee4b9 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -1020,7 +1020,7 @@ static int init_vq(struct virtio_blk *vblk)
 	}
 
 	/* Discover virtqueues and write information to configuration.  */
-	err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
+	err = virtio_find_vqs(vdev, num_vqs, vqs, vqs_info, &desc);
 	if (err)
 		goto out;
 
diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c
index 6481f9fe24c4..a9a82c358cb9 100644
--- a/drivers/bluetooth/virtio_bt.c
+++ b/drivers/bluetooth/virtio_bt.c
@@ -285,8 +285,7 @@ static int virtbt_probe(struct virtio_device *vdev)
 
 	INIT_WORK(&vbt->rx, virtbt_rx_work);
 
-	err = virtio_find_vqs_info(vdev, VIRTBT_NUM_VQS, vbt->vqs,
-				   vqs_info, NULL);
+	err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, vqs_info, NULL);
 	if (err)
 		return err;
 
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 23dbf1c18c90..b69fb675883c 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1849,8 +1849,7 @@ static int init_vqs(struct ports_device *portdev)
 		}
 	}
 	/* Find the queues. */
-	err = virtio_find_vqs_info(portdev->vdev, nr_queues, vqs,
-				   vqs_info, NULL);
+	err = virtio_find_vqs(portdev->vdev, nr_queues, vqs, vqs_info, NULL);
 	if (err)
 		goto free;
 
diff --git a/drivers/crypto/virtio/virtio_crypto_core.c b/drivers/crypto/virtio/virtio_crypto_core.c
index 800d5c2a688c..fb7853fdad3a 100644
--- a/drivers/crypto/virtio/virtio_crypto_core.c
+++ b/drivers/crypto/virtio/virtio_crypto_core.c
@@ -129,7 +129,7 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
 		vqs_info[i].name = vi->data_vq[i].name;
 	}
 
-	ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
+	ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, vqs_info, NULL);
 	if (ret)
 		goto err_find;
 
diff --git a/drivers/firmware/arm_scmi/virtio.c b/drivers/firmware/arm_scmi/virtio.c
index a6ae59c03308..0ee745762a43 100644
--- a/drivers/firmware/arm_scmi/virtio.c
+++ b/drivers/firmware/arm_scmi/virtio.c
@@ -829,7 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
 	if (have_vq_rx)
 		channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
 
-	ret = virtio_find_vqs_info(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
+	ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
 	if (ret) {
 		dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
 		return ret;
diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c
index a45b392358c4..c0a0913d62c7 100644
--- a/drivers/gpio/gpio-virtio.c
+++ b/drivers/gpio/gpio-virtio.c
@@ -464,8 +464,8 @@ static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
 	struct virtqueue *vqs[2] = { NULL, NULL };
 	int ret;
 
-	ret = virtio_find_vqs_info(vdev, vgpio->irq_lines ? 2 : 1, vqs,
-				   vqs_info, NULL);
+	ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs,
+			      vqs_info, NULL);
 	if (ret) {
 		dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
 		return ret;
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 938c08a707eb..ebb6ece2aec3 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -206,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
 	DRM_INFO("features: %ccontext_init\n",
 		 vgdev->has_context_init ? '+' : '-');
 
-	ret = virtio_find_vqs_info(vgdev->vdev, 2, vqs, vqs_info, NULL);
+	ret = virtio_find_vqs(vgdev->vdev, 2, vqs, vqs_info, NULL);
 	if (ret) {
 		DRM_ERROR("failed to find virt queues\n");
 		goto err_vqs;
diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
index ef77c1efc767..9f713789cd4a 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -1099,8 +1099,8 @@ static int viommu_init_vqs(struct viommu_dev *viommu)
 		{ "event", viommu_event_handler },
 	};
 
-	return virtio_find_vqs_info(vdev, VIOMMU_NR_VQS, viommu->vqs,
-				    vqs_info, NULL);
+	return virtio_find_vqs(vdev, VIOMMU_NR_VQS, viommu->vqs,
+			       vqs_info, NULL);
 }
 
 static int viommu_fill_evtq(struct viommu_dev *viommu)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 3e367c7b88a0..981703972483 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -4397,7 +4397,7 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
 			vqs_info[rxq2vq(i)].ctx = true;
 	}
 
-	ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
+	ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, vqs_info, NULL);
 	if (ret)
 		goto err_find;
 
diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
index 565c091f1ba5..7782fc59701a 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -6563,8 +6563,8 @@ static int init_vqs(struct virtio_device *vdev)
 		[HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
 	};
 
-	return virtio_find_vqs_info(vdev, HWSIM_NUM_VQS,
-				    hwsim_vqs, vqs_info, NULL);
+	return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
+			       hwsim_vqs, vqs_info, NULL);
 }
 
 static int fill_vq(struct virtqueue *vq)
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index 440f1cc9157d..32e8a546edf3 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -893,7 +893,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
 	init_waitqueue_head(&vrp->sendq);
 
 	/* We expect two virtqueues, rx and tx (and in this order) */
-	err = virtio_find_vqs_info(vdev, 2, vqs, vqs_info, NULL);
+	err = virtio_find_vqs(vdev, 2, vqs, vqs_info, NULL);
 	if (err)
 		goto free_vrp;
 
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 416c6820b537..25db62f01be9 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -879,7 +879,7 @@ static int virtscsi_init(struct virtio_device *vdev,
 		vqs_info[i].name = "request_poll";
 
 	/* Discover virtqueues and write information to configuration.  */
-	err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
+	err = virtio_find_vqs(vdev, num_vqs, vqs, vqs_info, &desc);
 	if (err)
 		goto out;
 
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index 02ae30cc96ec..49719d74449b 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -572,8 +572,8 @@ static int init_vqs(struct virtio_balloon *vb)
 		vqs_info[VIRTIO_BALLOON_VQ_REPORTING].callback = balloon_ack;
 	}
 
-	err = virtio_find_vqs_info(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
-				   vqs_info, NULL);
+	err = virtio_find_vqs(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
+			      vqs_info, NULL);
 	if (err)
 		return err;
 
diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
index e1491ad9eced..2cd1df0b6533 100644
--- a/drivers/virtio/virtio_input.c
+++ b/drivers/virtio/virtio_input.c
@@ -192,7 +192,7 @@ static int virtinput_init_vqs(struct virtio_input *vi)
 	struct virtqueue *vqs[2];
 	int err;
 
-	err = virtio_find_vqs_info(vi->vdev, 2, vqs, vqs_info, NULL);
+	err = virtio_find_vqs(vi->vdev, 2, vqs, vqs_info, NULL);
 	if (err)
 		return err;
 	vi->evt = vqs[0];
diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
index 466d4888d664..0424eb15867c 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -777,7 +777,7 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
 		vqs_info[i].name = fs->vqs[i].name;
 	}
 
-	ret = virtio_find_vqs_info(vdev, fs->nvqs, vqs, vqs_info, NULL);
+	ret = virtio_find_vqs(vdev, fs->nvqs, vqs, vqs_info, NULL);
 	if (ret < 0)
 		goto out;
 
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 639d68e95580..3c48f1ff6efc 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -218,10 +218,10 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
 }
 
 static inline
-int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
-			 struct virtqueue *vqs[],
-			 struct virtio_queue_info vqs_info[],
-			 struct irq_affinity *desc)
+int virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
+		    struct virtqueue *vqs[],
+		    struct virtio_queue_info vqs_info[],
+		    struct irq_affinity *desc)
 {
 	return vdev->config->find_vqs(vdev, nvqs, vqs, vqs_info, desc);
 }
@@ -234,7 +234,7 @@ struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
 		{ n, c },
 	};
 	struct virtqueue *vq;
-	int err = virtio_find_vqs_info(vdev, 1, &vq, vqs_info, NULL);
+	int err = virtio_find_vqs(vdev, 1, &vq, vqs_info, NULL);
 
 	if (err < 0)
 		return ERR_PTR(err);
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index d303ef4d9898..3e957cf65412 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -624,8 +624,7 @@ static int virtio_vsock_vqs_init(struct virtio_vsock *vsock)
 	};
 	int ret;
 
-	ret = virtio_find_vqs_info(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info,
-				   NULL);
+	ret = virtio_find_vqs(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info, NULL);
 	if (ret < 0)
 		return ret;
 
diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c
index a6b0da6790dc..ae560365439b 100644
--- a/sound/virtio/virtio_card.c
+++ b/sound/virtio/virtio_card.c
@@ -125,7 +125,7 @@ static int virtsnd_find_vqs(struct virtio_snd *snd)
 	unsigned int n;
 	int rc;
 
-	rc = virtio_find_vqs_info(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
+	rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
 	if (rc) {
 		dev_err(&vdev->dev, "failed to initialize virtqueues\n");
 		return rc;
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 30+ messages in thread

* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
  2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
                   ` (18 preceding siblings ...)
  2024-07-03 12:39 ` [PATCH virtio 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs() Jiri Pirko
@ 2024-07-03 12:50 ` Michael S. Tsirkin
  2024-07-03 13:24   ` Jiri Pirko
  19 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-03 12:50 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
	hengqi

On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@nvidia.com>
> 
> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
> names, callbacks and ctx (in case of the second one) as separate args.
> That became inconvenient as the ctx addition showed.
> 
> For virtio_net control queue, an indication of queue flavour (slow path)
> is going to be needed to be passed to PCI transport in order to
> assign vectors properly, another array added to virtio_find_vqs_ctx()
> arg list would not be nice and convenient.
> 
> Instead, introduce a structure to carry vq callback, name and ctx. Pass
> array of these structures to virtio_find_vqs() and all the way down to
> transport find_vqs() op implementation.
> 
> That allows to easily extend what needs to be passed down. Also, it
> makes the code a bit more cleaner. We get rid of separate
> virtio_find_vqs_ctx() helper.
> 
> This patchset does the conversion in steps, using temporary _info() op
> and helper. Note they are renamed back.

Thanks a lot Jiri, looks very good.
Some minor comments.


> Patch #1 does one forgotten conversion to virtio_find_single_vq().
> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
>   introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
> Patches #5 and #6 convert transports to implement find_vqs_info() op
>   that accepts array of virtio_queue_info structs.
> Patch #7 converts virtio_find_single_vq() to use the new way as well.
> Patch #8 removes original find_vqs() op.
> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
>   of conversion this patches does.
> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
>   users to use new virtio_find_vqs_info() helper.
> Patch #18 removes no longer used virtio_find_vqs() and
>   virtio_find_vqs_ctx() helpers.
> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
>   to virtio_find_vqs().
> 
> Jiri Pirko (19):
>   caif_virtio: use virtio_find_single_vq() for single virtqueue finding
>   virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
>   virtio: make virtio_find_single_vq() call virtio_find_vqs()
>   virtio: introduce virtio_queue_info struct and find_vqs_info() config
>     op
>   virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
>   virtio: convert find_vqs() op implementations to find_vqs_info()
>   virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
>     directly
>   virtio: remove the original find_vqs() op
>   virtio: rename find_vqs_info() op to find_vqs()
>   virtio_blk: convert to use virtio_find_vqs_info()
>   virtio_console: convert to use virtio_find_vqs_info()
>   virtio_crypto: convert to use virtio_find_vqs_info()
>   virtio_net: convert to use virtio_find_vqs_info()
>   scsi: virtio_scsi: convert to use virtio_find_vqs_info()
>   virtiofs: convert to use virtio_find_vqs_info()
>   virtio_balloon: convert to use virtio_find_vqs_info()
>   virtio: convert the rest virtio_find_vqs() users to
>     virtio_find_vqs_info()
>   virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
>     helpers
>   virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
> 
>  arch/um/drivers/virt-pci.c                    |  8 ++-
>  arch/um/drivers/virtio_uml.c                  | 12 ++--
>  drivers/block/virtio_blk.c                    | 20 +++----
>  drivers/bluetooth/virtio_bt.c                 | 13 ++--
>  drivers/char/virtio_console.c                 | 43 ++++++-------
>  drivers/crypto/virtio/virtio_crypto_core.c    | 31 ++++------
>  drivers/firmware/arm_scmi/virtio.c            | 11 ++--
>  drivers/gpio/gpio-virtio.c                    | 10 ++--
>  drivers/gpu/drm/virtio/virtgpu_kms.c          |  9 ++-
>  drivers/iommu/virtio-iommu.c                  | 11 ++--
>  drivers/net/caif/caif_virtio.c                |  8 +--
>  drivers/net/virtio_net.c                      | 34 ++++-------
>  drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
>  drivers/platform/mellanox/mlxbf-tmfifo.c      | 10 ++--
>  drivers/remoteproc/remoteproc_virtio.c        | 12 ++--
>  drivers/rpmsg/virtio_rpmsg_bus.c              |  8 ++-
>  drivers/s390/virtio/virtio_ccw.c              | 13 ++--
>  drivers/scsi/virtio_scsi.c                    | 32 ++++------
>  drivers/virtio/virtio_balloon.c               | 32 ++++------
>  drivers/virtio/virtio_input.c                 |  9 +--
>  drivers/virtio/virtio_mmio.c                  | 12 ++--
>  drivers/virtio/virtio_pci_common.c            | 49 ++++++++-------
>  drivers/virtio/virtio_pci_common.h            |  4 +-
>  drivers/virtio/virtio_pci_modern.c            |  5 +-
>  drivers/virtio/virtio_vdpa.c                  | 13 ++--
>  fs/fuse/virtio_fs.c                           | 22 +++----
>  include/linux/virtio_config.h                 | 60 +++++++++----------
>  net/vmw_vsock/virtio_transport.c              | 16 ++---
>  sound/virtio/virtio_card.c                    | 23 ++++---
>  29 files changed, 240 insertions(+), 302 deletions(-)
> 
> -- 
> 2.45.2


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
  2024-07-03 12:38 ` [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
@ 2024-07-03 13:02   ` Michael S. Tsirkin
  2024-07-03 13:23     ` Jiri Pirko
  0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-03 13:02 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
	hengqi

On Wed, Jul 03, 2024 at 02:38:58PM +0200, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@nvidia.com>
> 
> Introduce a structure virtio_queue_info to carry name, callback and ctx
> together. In order to allow config implementations to accept config op
> with array of virtio_queue_info structures, introduce a new
> find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
> Note that whole virtio_find_vqs_ctx() is going to be eventually removed
> at the and of this patchset.
> 
> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
> ---
>  include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
>  1 file changed, 48 insertions(+), 3 deletions(-)
> 
> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
> index 82a1d798b2f1..21029afeede1 100644
> --- a/include/linux/virtio_config.h
> +++ b/include/linux/virtio_config.h
> @@ -18,6 +18,16 @@ struct virtio_shm_region {
>  
>  typedef void vq_callback_t(struct virtqueue *);
>  
> +struct virtio_queue_info {

I'd do virtio_queue_info -> virtqueue_info

linux$ git grep virtqueue_|wc -l
734
linux$ git grep virtio_queue_|wc -l
7



> +	const char *name; /* mainly for debugging, may be NULL for vq

Capital M pls.
vq -> a virtqueue

> +			   * unused by driver.
> +			   */
> +	vq_callback_t *callback; /* May be NULL for vq that do

do -> does

> +				  * not need a callback.
> +				  */


        /*
         * Use this style for comments
	 * which do not fit on one line, please.
         */
	int and_the_code_comes_here_afterwards;



	
> +	bool ctx;
> +};
> +
>  /**
>   * struct virtio_config_ops - operations for configuring a virtio device
>   * Note: Do not assume that a transport implements all of the operations
> @@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
>   *	names: array of virtqueue names (mainly for debugging)
>   *		include a NULL entry for vqs unused by driver
>   *	Returns 0 on success or error status
> + * @find_vqs_info: find virtqueues and instantiate them.
> + *	vdev: the virtio_device
> + *	nvqs: the number of virtqueues to find
> + *	vqs: on success, includes new virtqueues
> + *	vqs_info: array of virtqueue info structures

See, here you actually said "virtqueue info"

> + *	Returns 0 on success or error status
>   * @del_vqs: free virtqueues found by find_vqs().
>   * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
>   *      The function guarantees that all memory operations on the
> @@ -109,6 +125,10 @@ struct virtio_config_ops {
>  			struct virtqueue *vqs[], vq_callback_t *callbacks[],
>  			const char * const names[], const bool *ctx,
>  			struct irq_affinity *desc);
> +	int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
> +			     struct virtqueue *vqs[],
> +			     struct virtio_queue_info vqs_info[],
> +			     struct irq_affinity *desc);
>  	void (*del_vqs)(struct virtio_device *);
>  	void (*synchronize_cbs)(struct virtio_device *);
>  	u64 (*get_features)(struct virtio_device *vdev);
> @@ -117,7 +137,7 @@ struct virtio_config_ops {
>  	int (*set_vq_affinity)(struct virtqueue *vq,
>  			       const struct cpumask *cpu_mask);
>  	const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
> -			int index);
> +						 int index);
>  	bool (*get_shm_region)(struct virtio_device *vdev,
>  			       struct virtio_shm_region *region, u8 id);
>  	int (*disable_vq_and_reset)(struct virtqueue *vq);
> @@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
>  	return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
>  }
>  
> +static inline
> +int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
> +			 struct virtqueue *vqs[],
> +			 struct virtio_queue_info vqs_info[],
> +			 struct irq_affinity *desc)
> +{
> +	return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
> +}
> +
>  static inline
>  int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
>  			struct virtqueue *vqs[], vq_callback_t *callbacks[],
>  			const char * const names[], const bool *ctx,
>  			struct irq_affinity *desc)
>  {
> -	return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
> -				      desc);
> +	struct virtio_queue_info *vqs_info;
> +	int err, i;
> +
> +	if (!vdev->config->find_vqs_info)
> +		return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
> +					      names, ctx, desc);
> +
> +	vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
> +	if (!vqs_info)
> +		return -ENOMEM;
> +	for (i = 0; i < nvqs; i++) {
> +		vqs_info[i].name = names[i];
> +		vqs_info[i].callback = callbacks[i];
> +		vqs_info[i].ctx = ctx ? ctx[i] : false;
> +	}
> +	err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
> +	kfree(vqs_info);
> +	return err;
>  }
>  
>  static inline
> -- 
> 2.45.2


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info()
  2024-07-03 12:39 ` [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
@ 2024-07-03 13:11   ` Michael S. Tsirkin
  2024-07-03 13:22     ` Jiri Pirko
  0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-03 13:11 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
	hengqi

On Wed, Jul 03, 2024 at 02:39:11PM +0200, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@nvidia.com>
> 
> Instead of passing separate names and callbacks arrays
> to virtio_find_vqs(), have one of virtual_queue_info structs and
> pass it to virtio_find_vqs_info().
> 
> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
> ---
>  arch/um/drivers/virt-pci.c                    |  8 ++++---
>  drivers/bluetooth/virtio_bt.c                 | 14 ++++-------
>  drivers/firmware/arm_scmi/virtio.c            | 11 ++++-----
>  drivers/gpio/gpio-virtio.c                    | 10 ++++----
>  drivers/gpu/drm/virtio/virtgpu_kms.c          |  9 ++++----
>  drivers/iommu/virtio-iommu.c                  | 11 ++++-----
>  drivers/net/wireless/virtual/mac80211_hwsim.c | 14 ++++-------
>  drivers/rpmsg/virtio_rpmsg_bus.c              |  8 ++++---
>  drivers/virtio/virtio_input.c                 |  9 ++++----
>  net/vmw_vsock/virtio_transport.c              | 17 +++++---------
>  sound/virtio/virtio_card.c                    | 23 ++++++++-----------
>  11 files changed, 59 insertions(+), 75 deletions(-)
> 
> diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
> index 7cb503469bbd..3df2ea53471a 100644
> --- a/arch/um/drivers/virt-pci.c
> +++ b/arch/um/drivers/virt-pci.c
> @@ -567,12 +567,14 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
>  
>  static int um_pci_init_vqs(struct um_pci_device *dev)
>  {
> +	struct virtio_queue_info vqs_info[] = {
> +		{ "cmd", um_pci_cmd_vq_cb },
> +		{ "irq", um_pci_irq_vq_cb },
> +	};
>  	struct virtqueue *vqs[2];
> -	static const char *const names[2] = { "cmd", "irq" };
> -	vq_callback_t *cbs[2] = { um_pci_cmd_vq_cb, um_pci_irq_vq_cb };
>  	int err, i;
>  
> -	err = virtio_find_vqs(dev->vdev, 2, vqs, cbs, names, NULL);
> +	err = virtio_find_vqs_info(dev->vdev, 2, vqs, vqs_info, NULL);
>  	if (err)
>  		return err;
>  
> diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c
> index 463b49ca2492..6481f9fe24c4 100644
> --- a/drivers/bluetooth/virtio_bt.c
> +++ b/drivers/bluetooth/virtio_bt.c
> @@ -254,13 +254,9 @@ static void virtbt_rx_done(struct virtqueue *vq)
>  
>  static int virtbt_probe(struct virtio_device *vdev)
>  {
> -	vq_callback_t *callbacks[VIRTBT_NUM_VQS] = {
> -		[VIRTBT_VQ_TX] = virtbt_tx_done,
> -		[VIRTBT_VQ_RX] = virtbt_rx_done,
> -	};
> -	const char *names[VIRTBT_NUM_VQS] = {
> -		[VIRTBT_VQ_TX] = "tx",
> -		[VIRTBT_VQ_RX] = "rx",
> +	struct virtio_queue_info vqs_info[VIRTBT_NUM_VQS] = {
> +		[VIRTBT_VQ_TX] = { "tx", virtbt_tx_done },
> +		[VIRTBT_VQ_RX] = { "rx", virtbt_rx_done },
>  	};
>  	struct virtio_bluetooth *vbt;
>  	struct hci_dev *hdev;
> @@ -289,8 +285,8 @@ static int virtbt_probe(struct virtio_device *vdev)
>  
>  	INIT_WORK(&vbt->rx, virtbt_rx_work);
>  
> -	err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, callbacks,
> -			      names, NULL);
> +	err = virtio_find_vqs_info(vdev, VIRTBT_NUM_VQS, vbt->vqs,
> +				   vqs_info, NULL);
>  	if (err)
>  		return err;
>  
> diff --git a/drivers/firmware/arm_scmi/virtio.c b/drivers/firmware/arm_scmi/virtio.c
> index 4892058445ce..a6ae59c03308 100644
> --- a/drivers/firmware/arm_scmi/virtio.c
> +++ b/drivers/firmware/arm_scmi/virtio.c
> @@ -354,11 +354,9 @@ static void scmi_vio_deferred_tx_worker(struct work_struct *work)
>  	scmi_vio_channel_release(vioch);
>  }
>  
> -static const char *const scmi_vio_vqueue_names[] = { "tx", "rx" };
> -
> -static vq_callback_t *scmi_vio_complete_callbacks[] = {
> -	scmi_vio_complete_cb,
> -	scmi_vio_complete_cb
> +static struct virtio_queue_info scmi_vio_vqs_info[] = {
> +	{ "tx", scmi_vio_complete_cb },
> +	{ "rx", scmi_vio_complete_cb },
>  };
>  
>  static unsigned int virtio_get_max_msg(struct scmi_chan_info *base_cinfo)
> @@ -831,8 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
>  	if (have_vq_rx)
>  		channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
>  
> -	ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_complete_callbacks,
> -			      scmi_vio_vqueue_names, NULL);
> +	ret = virtio_find_vqs_info(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
>  	if (ret) {
>  		dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
>  		return ret;
> diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c
> index 9fae8e396c58..a45b392358c4 100644
> --- a/drivers/gpio/gpio-virtio.c
> +++ b/drivers/gpio/gpio-virtio.c
> @@ -457,15 +457,15 @@ static void virtio_gpio_free_vqs(struct virtio_device *vdev)
>  static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
>  				 struct virtio_device *vdev)
>  {
> -	const char * const names[] = { "requestq", "eventq" };
> -	vq_callback_t *cbs[] = {
> -		virtio_gpio_request_vq,
> -		virtio_gpio_event_vq,
> +	struct virtio_queue_info vqs_info[] = {
> +		{ "requestq", virtio_gpio_request_vq },
> +		{ "eventq", virtio_gpio_event_vq },
>  	};

I'd maybe do struct virtio_queue_info vqs_info[2]
so it's clear array is the right size. 
Not a new issue so can be a separate cleanup.

>  	struct virtqueue *vqs[2] = { NULL, NULL };
>  	int ret;
>  
> -	ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs, cbs, names, NULL);
> +	ret = virtio_find_vqs_info(vdev, vgpio->irq_lines ? 2 : 1, vqs,
> +				   vqs_info, NULL);
>  	if (ret) {
>  		dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
>  		return ret;
> diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
> index 5a3b5aaed1f3..938c08a707eb 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_kms.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
> @@ -116,11 +116,10 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev,
>  
>  int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
>  {
> -	static vq_callback_t *callbacks[] = {
> -		virtio_gpu_ctrl_ack, virtio_gpu_cursor_ack
> +	struct virtio_queue_info vqs_info[] = {
> +		{ "control", virtio_gpu_ctrl_ack },
> +		{ "cursor", virtio_gpu_cursor_ack },
>  	};

I'd maybe do struct virtio_queue_info vqs_info[2]
so it's clear array is the right size. 
Not a new issue so can be a separate cleanup.

> -	static const char * const names[] = { "control", "cursor" };
> -
>  	struct virtio_gpu_device *vgdev;
>  	/* this will expand later */
>  	struct virtqueue *vqs[2];
> @@ -207,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
>  	DRM_INFO("features: %ccontext_init\n",
>  		 vgdev->has_context_init ? '+' : '-');
>  
> -	ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
> +	ret = virtio_find_vqs_info(vgdev->vdev, 2, vqs, vqs_info, NULL);
>  	if (ret) {
>  		DRM_ERROR("failed to find virt queues\n");
>  		goto err_vqs;
> diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
> index 9ed8958a42bf..ef77c1efc767 100644
> --- a/drivers/iommu/virtio-iommu.c
> +++ b/drivers/iommu/virtio-iommu.c
> @@ -1094,14 +1094,13 @@ static struct iommu_ops viommu_ops = {
>  static int viommu_init_vqs(struct viommu_dev *viommu)
>  {
>  	struct virtio_device *vdev = dev_to_virtio(viommu->dev);
> -	const char *names[] = { "request", "event" };
> -	vq_callback_t *callbacks[] = {
> -		NULL, /* No async requests */
> -		viommu_event_handler,
> +	struct virtio_queue_info vqs_info[] = {

I'd maybe do struct virtio_queue_info vqs_info[VIOMMU_NR_VQS]
so it's clear array is the right size. 
Not a new issue so can be a separate cleanup.

> +		{ "request" },

Let's keep the comment here:
		{ "request", NULL /* No async requests */ },


> +		{ "event", viommu_event_handler },
>  	};
>  
> -	return virtio_find_vqs(vdev, VIOMMU_NR_VQS, viommu->vqs, callbacks,
> -			       names, NULL);
> +	return virtio_find_vqs_info(vdev, VIOMMU_NR_VQS, viommu->vqs,
> +				    vqs_info, NULL);
>  }
>  
>  static int viommu_fill_evtq(struct viommu_dev *viommu)
> diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
> index 20fa21bb4d1c..565c091f1ba5 100644
> --- a/drivers/net/wireless/virtual/mac80211_hwsim.c
> +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
> @@ -6558,17 +6558,13 @@ static void hwsim_virtio_rx_done(struct virtqueue *vq)
>  
>  static int init_vqs(struct virtio_device *vdev)
>  {
> -	vq_callback_t *callbacks[HWSIM_NUM_VQS] = {
> -		[HWSIM_VQ_TX] = hwsim_virtio_tx_done,
> -		[HWSIM_VQ_RX] = hwsim_virtio_rx_done,
> -	};
> -	const char *names[HWSIM_NUM_VQS] = {
> -		[HWSIM_VQ_TX] = "tx",
> -		[HWSIM_VQ_RX] = "rx",
> +	struct virtio_queue_info vqs_info[HWSIM_NUM_VQS] = {
> +		[HWSIM_VQ_TX] = { "tx", hwsim_virtio_tx_done },
> +		[HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
>  	};
>  
> -	return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
> -			       hwsim_vqs, callbacks, names, NULL);
> +	return virtio_find_vqs_info(vdev, HWSIM_NUM_VQS,
> +				    hwsim_vqs, vqs_info, NULL);
>  }
>  
>  static int fill_vq(struct virtqueue *vq)
> diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
> index e9e8c1f7829f..440f1cc9157d 100644
> --- a/drivers/rpmsg/virtio_rpmsg_bus.c
> +++ b/drivers/rpmsg/virtio_rpmsg_bus.c
> @@ -868,8 +868,10 @@ static void rpmsg_virtio_del_ctrl_dev(struct rpmsg_device *rpdev_ctrl)
>  
>  static int rpmsg_probe(struct virtio_device *vdev)
>  {
> -	vq_callback_t *vq_cbs[] = { rpmsg_recv_done, rpmsg_xmit_done };
> -	static const char * const names[] = { "input", "output" };
> +	struct virtio_queue_info vqs_info[] = {

I'd maybe do struct virtio_queue_info vqs_info[2]
so it's clear array is the right size. 
Not a new issue so can be a separate cleanup.

> +		{ "input", rpmsg_recv_done },
> +		{ "output", rpmsg_xmit_done },
> +	};
>  	struct virtqueue *vqs[2];
>  	struct virtproc_info *vrp;
>  	struct virtio_rpmsg_channel *vch = NULL;
> @@ -891,7 +893,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
>  	init_waitqueue_head(&vrp->sendq);
>  
>  	/* We expect two virtqueues, rx and tx (and in this order) */
> -	err = virtio_find_vqs(vdev, 2, vqs, vq_cbs, names, NULL);
> +	err = virtio_find_vqs_info(vdev, 2, vqs, vqs_info, NULL);
>  	if (err)
>  		goto free_vrp;



>  
> diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
> index 1a730d6c0b55..e1491ad9eced 100644
> --- a/drivers/virtio/virtio_input.c
> +++ b/drivers/virtio/virtio_input.c
> @@ -185,13 +185,14 @@ static void virtinput_cfg_abs(struct virtio_input *vi, int abs)
>  
>  static int virtinput_init_vqs(struct virtio_input *vi)
>  {
> +	struct virtio_queue_info vqs_info[] = {
> +		{ "events", virtinput_recv_events },
> +		{ "status", virtinput_recv_status },
> +	};
>  	struct virtqueue *vqs[2];
> -	vq_callback_t *cbs[] = { virtinput_recv_events,
> -				 virtinput_recv_status };
> -	static const char * const names[] = { "events", "status" };
>  	int err;
>  
> -	err = virtio_find_vqs(vi->vdev, 2, vqs, cbs, names, NULL);
> +	err = virtio_find_vqs_info(vi->vdev, 2, vqs, vqs_info, NULL);

ARRAY_SIZE(vqs_info) is now possible instead of 2.
Can be a separate cleanup, though.


>  	if (err)
>  		return err;
>  	vi->evt = vqs[0];
> diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
> index 43d405298857..d303ef4d9898 100644
> --- a/net/vmw_vsock/virtio_transport.c
> +++ b/net/vmw_vsock/virtio_transport.c
> @@ -617,20 +617,15 @@ static void virtio_transport_rx_work(struct work_struct *work)
>  static int virtio_vsock_vqs_init(struct virtio_vsock *vsock)
>  {
>  	struct virtio_device *vdev = vsock->vdev;
> -	static const char * const names[] = {
> -		"rx",
> -		"tx",
> -		"event",
> -	};
> -	vq_callback_t *callbacks[] = {
> -		virtio_vsock_rx_done,
> -		virtio_vsock_tx_done,
> -		virtio_vsock_event_done,
> +	struct virtio_queue_info vqs_info[] = {
> +		{ "rx", virtio_vsock_rx_done },
> +		{ "tx", virtio_vsock_tx_done },
> +		{ "event", virtio_vsock_event_done },
>  	};
>  	int ret;
>  
> -	ret = virtio_find_vqs(vdev, VSOCK_VQ_MAX, vsock->vqs, callbacks, names,
> -			      NULL);
> +	ret = virtio_find_vqs_info(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info,
> +				   NULL);
>  	if (ret < 0)
>  		return ret;
>  
> diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c
> index 7805daea0102..a6b0da6790dc 100644
> --- a/sound/virtio/virtio_card.c
> +++ b/sound/virtio/virtio_card.c
> @@ -110,25 +110,22 @@ static void virtsnd_event_notify_cb(struct virtqueue *vqueue)
>  static int virtsnd_find_vqs(struct virtio_snd *snd)
>  {
>  	struct virtio_device *vdev = snd->vdev;
> -	static vq_callback_t *callbacks[VIRTIO_SND_VQ_MAX] = {
> -		[VIRTIO_SND_VQ_CONTROL] = virtsnd_ctl_notify_cb,
> -		[VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb,
> -		[VIRTIO_SND_VQ_TX] = virtsnd_pcm_tx_notify_cb,
> -		[VIRTIO_SND_VQ_RX] = virtsnd_pcm_rx_notify_cb
> -	};
> -	static const char *names[VIRTIO_SND_VQ_MAX] = {
> -		[VIRTIO_SND_VQ_CONTROL] = "virtsnd-ctl",
> -		[VIRTIO_SND_VQ_EVENT] = "virtsnd-event",
> -		[VIRTIO_SND_VQ_TX] = "virtsnd-tx",
> -		[VIRTIO_SND_VQ_RX] = "virtsnd-rx"
> +	struct virtio_queue_info vqs_info[] = {

Why not
	struct virtio_queue_info vqs_info[VIRTIO_SND_VQ_MAX] ?

otherwise it's not clear all arrays are same size.


> +		[VIRTIO_SND_VQ_CONTROL] = { "virtsnd-ctl",
> +					    virtsnd_ctl_notify_cb },
> +		[VIRTIO_SND_VQ_EVENT] = { "virtsnd-event",
> +					  virtsnd_event_notify_cb },
> +		[VIRTIO_SND_VQ_TX] = { "virtsnd-tx",
> +				       virtsnd_pcm_tx_notify_cb },
> +		[VIRTIO_SND_VQ_RX] = { "virtsnd-rx",
> +				       virtsnd_pcm_rx_notify_cb },
>  	};
>  	struct virtqueue *vqs[VIRTIO_SND_VQ_MAX] = { 0 };
>  	unsigned int i;
>  	unsigned int n;
>  	int rc;
>  
> -	rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, callbacks, names,
> -			     NULL);
> +	rc = virtio_find_vqs_info(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
>  	if (rc) {
>  		dev_err(&vdev->dev, "failed to initialize virtqueues\n");
>  		return rc;
> -- 
> 2.45.2


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info()
  2024-07-03 13:11   ` Michael S. Tsirkin
@ 2024-07-03 13:22     ` Jiri Pirko
  0 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 13:22 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
	hengqi

Wed, Jul 03, 2024 at 03:11:52PM CEST, mst@redhat.com wrote:
>On Wed, Jul 03, 2024 at 02:39:11PM +0200, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@nvidia.com>
>> 
>> Instead of passing separate names and callbacks arrays
>> to virtio_find_vqs(), have one of virtual_queue_info structs and
>> pass it to virtio_find_vqs_info().
>> 
>> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
>> ---
>>  arch/um/drivers/virt-pci.c                    |  8 ++++---
>>  drivers/bluetooth/virtio_bt.c                 | 14 ++++-------
>>  drivers/firmware/arm_scmi/virtio.c            | 11 ++++-----
>>  drivers/gpio/gpio-virtio.c                    | 10 ++++----
>>  drivers/gpu/drm/virtio/virtgpu_kms.c          |  9 ++++----
>>  drivers/iommu/virtio-iommu.c                  | 11 ++++-----
>>  drivers/net/wireless/virtual/mac80211_hwsim.c | 14 ++++-------
>>  drivers/rpmsg/virtio_rpmsg_bus.c              |  8 ++++---
>>  drivers/virtio/virtio_input.c                 |  9 ++++----
>>  net/vmw_vsock/virtio_transport.c              | 17 +++++---------
>>  sound/virtio/virtio_card.c                    | 23 ++++++++-----------
>>  11 files changed, 59 insertions(+), 75 deletions(-)
>> 
>> diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
>> index 7cb503469bbd..3df2ea53471a 100644
>> --- a/arch/um/drivers/virt-pci.c
>> +++ b/arch/um/drivers/virt-pci.c
>> @@ -567,12 +567,14 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
>>  
>>  static int um_pci_init_vqs(struct um_pci_device *dev)
>>  {
>> +	struct virtio_queue_info vqs_info[] = {
>> +		{ "cmd", um_pci_cmd_vq_cb },
>> +		{ "irq", um_pci_irq_vq_cb },
>> +	};
>>  	struct virtqueue *vqs[2];
>> -	static const char *const names[2] = { "cmd", "irq" };
>> -	vq_callback_t *cbs[2] = { um_pci_cmd_vq_cb, um_pci_irq_vq_cb };
>>  	int err, i;
>>  
>> -	err = virtio_find_vqs(dev->vdev, 2, vqs, cbs, names, NULL);
>> +	err = virtio_find_vqs_info(dev->vdev, 2, vqs, vqs_info, NULL);
>>  	if (err)
>>  		return err;
>>  
>> diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c
>> index 463b49ca2492..6481f9fe24c4 100644
>> --- a/drivers/bluetooth/virtio_bt.c
>> +++ b/drivers/bluetooth/virtio_bt.c
>> @@ -254,13 +254,9 @@ static void virtbt_rx_done(struct virtqueue *vq)
>>  
>>  static int virtbt_probe(struct virtio_device *vdev)
>>  {
>> -	vq_callback_t *callbacks[VIRTBT_NUM_VQS] = {
>> -		[VIRTBT_VQ_TX] = virtbt_tx_done,
>> -		[VIRTBT_VQ_RX] = virtbt_rx_done,
>> -	};
>> -	const char *names[VIRTBT_NUM_VQS] = {
>> -		[VIRTBT_VQ_TX] = "tx",
>> -		[VIRTBT_VQ_RX] = "rx",
>> +	struct virtio_queue_info vqs_info[VIRTBT_NUM_VQS] = {
>> +		[VIRTBT_VQ_TX] = { "tx", virtbt_tx_done },
>> +		[VIRTBT_VQ_RX] = { "rx", virtbt_rx_done },
>>  	};
>>  	struct virtio_bluetooth *vbt;
>>  	struct hci_dev *hdev;
>> @@ -289,8 +285,8 @@ static int virtbt_probe(struct virtio_device *vdev)
>>  
>>  	INIT_WORK(&vbt->rx, virtbt_rx_work);
>>  
>> -	err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, callbacks,
>> -			      names, NULL);
>> +	err = virtio_find_vqs_info(vdev, VIRTBT_NUM_VQS, vbt->vqs,
>> +				   vqs_info, NULL);
>>  	if (err)
>>  		return err;
>>  
>> diff --git a/drivers/firmware/arm_scmi/virtio.c b/drivers/firmware/arm_scmi/virtio.c
>> index 4892058445ce..a6ae59c03308 100644
>> --- a/drivers/firmware/arm_scmi/virtio.c
>> +++ b/drivers/firmware/arm_scmi/virtio.c
>> @@ -354,11 +354,9 @@ static void scmi_vio_deferred_tx_worker(struct work_struct *work)
>>  	scmi_vio_channel_release(vioch);
>>  }
>>  
>> -static const char *const scmi_vio_vqueue_names[] = { "tx", "rx" };
>> -
>> -static vq_callback_t *scmi_vio_complete_callbacks[] = {
>> -	scmi_vio_complete_cb,
>> -	scmi_vio_complete_cb
>> +static struct virtio_queue_info scmi_vio_vqs_info[] = {
>> +	{ "tx", scmi_vio_complete_cb },
>> +	{ "rx", scmi_vio_complete_cb },
>>  };
>>  
>>  static unsigned int virtio_get_max_msg(struct scmi_chan_info *base_cinfo)
>> @@ -831,8 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
>>  	if (have_vq_rx)
>>  		channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
>>  
>> -	ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_complete_callbacks,
>> -			      scmi_vio_vqueue_names, NULL);
>> +	ret = virtio_find_vqs_info(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
>>  	if (ret) {
>>  		dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
>>  		return ret;
>> diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c
>> index 9fae8e396c58..a45b392358c4 100644
>> --- a/drivers/gpio/gpio-virtio.c
>> +++ b/drivers/gpio/gpio-virtio.c
>> @@ -457,15 +457,15 @@ static void virtio_gpio_free_vqs(struct virtio_device *vdev)
>>  static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
>>  				 struct virtio_device *vdev)
>>  {
>> -	const char * const names[] = { "requestq", "eventq" };
>> -	vq_callback_t *cbs[] = {
>> -		virtio_gpio_request_vq,
>> -		virtio_gpio_event_vq,
>> +	struct virtio_queue_info vqs_info[] = {
>> +		{ "requestq", virtio_gpio_request_vq },
>> +		{ "eventq", virtio_gpio_event_vq },
>>  	};
>
>I'd maybe do struct virtio_queue_info vqs_info[2]
>so it's clear array is the right size. 
>Not a new issue so can be a separate cleanup.

Yeah, I maintain the same code regarding this as the original in this
patch. I agree for the separate cleanup.


>
>>  	struct virtqueue *vqs[2] = { NULL, NULL };
>>  	int ret;
>>  
>> -	ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs, cbs, names, NULL);
>> +	ret = virtio_find_vqs_info(vdev, vgpio->irq_lines ? 2 : 1, vqs,
>> +				   vqs_info, NULL);
>>  	if (ret) {
>>  		dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
>>  		return ret;
>> diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
>> index 5a3b5aaed1f3..938c08a707eb 100644
>> --- a/drivers/gpu/drm/virtio/virtgpu_kms.c
>> +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
>> @@ -116,11 +116,10 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev,
>>  
>>  int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
>>  {
>> -	static vq_callback_t *callbacks[] = {
>> -		virtio_gpu_ctrl_ack, virtio_gpu_cursor_ack
>> +	struct virtio_queue_info vqs_info[] = {
>> +		{ "control", virtio_gpu_ctrl_ack },
>> +		{ "cursor", virtio_gpu_cursor_ack },
>>  	};
>
>I'd maybe do struct virtio_queue_info vqs_info[2]
>so it's clear array is the right size. 
>Not a new issue so can be a separate cleanup.
>
>> -	static const char * const names[] = { "control", "cursor" };
>> -
>>  	struct virtio_gpu_device *vgdev;
>>  	/* this will expand later */
>>  	struct virtqueue *vqs[2];
>> @@ -207,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
>>  	DRM_INFO("features: %ccontext_init\n",
>>  		 vgdev->has_context_init ? '+' : '-');
>>  
>> -	ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
>> +	ret = virtio_find_vqs_info(vgdev->vdev, 2, vqs, vqs_info, NULL);
>>  	if (ret) {
>>  		DRM_ERROR("failed to find virt queues\n");
>>  		goto err_vqs;
>> diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
>> index 9ed8958a42bf..ef77c1efc767 100644
>> --- a/drivers/iommu/virtio-iommu.c
>> +++ b/drivers/iommu/virtio-iommu.c
>> @@ -1094,14 +1094,13 @@ static struct iommu_ops viommu_ops = {
>>  static int viommu_init_vqs(struct viommu_dev *viommu)
>>  {
>>  	struct virtio_device *vdev = dev_to_virtio(viommu->dev);
>> -	const char *names[] = { "request", "event" };
>> -	vq_callback_t *callbacks[] = {
>> -		NULL, /* No async requests */
>> -		viommu_event_handler,
>> +	struct virtio_queue_info vqs_info[] = {
>
>I'd maybe do struct virtio_queue_info vqs_info[VIOMMU_NR_VQS]
>so it's clear array is the right size. 
>Not a new issue so can be a separate cleanup.
>
>> +		{ "request" },
>
>Let's keep the comment here:
>		{ "request", NULL /* No async requests */ },
>
>
>> +		{ "event", viommu_event_handler },
>>  	};
>>  
>> -	return virtio_find_vqs(vdev, VIOMMU_NR_VQS, viommu->vqs, callbacks,
>> -			       names, NULL);
>> +	return virtio_find_vqs_info(vdev, VIOMMU_NR_VQS, viommu->vqs,
>> +				    vqs_info, NULL);
>>  }
>>  
>>  static int viommu_fill_evtq(struct viommu_dev *viommu)
>> diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
>> index 20fa21bb4d1c..565c091f1ba5 100644
>> --- a/drivers/net/wireless/virtual/mac80211_hwsim.c
>> +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
>> @@ -6558,17 +6558,13 @@ static void hwsim_virtio_rx_done(struct virtqueue *vq)
>>  
>>  static int init_vqs(struct virtio_device *vdev)
>>  {
>> -	vq_callback_t *callbacks[HWSIM_NUM_VQS] = {
>> -		[HWSIM_VQ_TX] = hwsim_virtio_tx_done,
>> -		[HWSIM_VQ_RX] = hwsim_virtio_rx_done,
>> -	};
>> -	const char *names[HWSIM_NUM_VQS] = {
>> -		[HWSIM_VQ_TX] = "tx",
>> -		[HWSIM_VQ_RX] = "rx",
>> +	struct virtio_queue_info vqs_info[HWSIM_NUM_VQS] = {
>> +		[HWSIM_VQ_TX] = { "tx", hwsim_virtio_tx_done },
>> +		[HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
>>  	};
>>  
>> -	return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
>> -			       hwsim_vqs, callbacks, names, NULL);
>> +	return virtio_find_vqs_info(vdev, HWSIM_NUM_VQS,
>> +				    hwsim_vqs, vqs_info, NULL);
>>  }
>>  
>>  static int fill_vq(struct virtqueue *vq)
>> diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
>> index e9e8c1f7829f..440f1cc9157d 100644
>> --- a/drivers/rpmsg/virtio_rpmsg_bus.c
>> +++ b/drivers/rpmsg/virtio_rpmsg_bus.c
>> @@ -868,8 +868,10 @@ static void rpmsg_virtio_del_ctrl_dev(struct rpmsg_device *rpdev_ctrl)
>>  
>>  static int rpmsg_probe(struct virtio_device *vdev)
>>  {
>> -	vq_callback_t *vq_cbs[] = { rpmsg_recv_done, rpmsg_xmit_done };
>> -	static const char * const names[] = { "input", "output" };
>> +	struct virtio_queue_info vqs_info[] = {
>
>I'd maybe do struct virtio_queue_info vqs_info[2]
>so it's clear array is the right size. 
>Not a new issue so can be a separate cleanup.
>
>> +		{ "input", rpmsg_recv_done },
>> +		{ "output", rpmsg_xmit_done },
>> +	};
>>  	struct virtqueue *vqs[2];
>>  	struct virtproc_info *vrp;
>>  	struct virtio_rpmsg_channel *vch = NULL;
>> @@ -891,7 +893,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
>>  	init_waitqueue_head(&vrp->sendq);
>>  
>>  	/* We expect two virtqueues, rx and tx (and in this order) */
>> -	err = virtio_find_vqs(vdev, 2, vqs, vq_cbs, names, NULL);
>> +	err = virtio_find_vqs_info(vdev, 2, vqs, vqs_info, NULL);
>>  	if (err)
>>  		goto free_vrp;
>
>
>
>>  
>> diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
>> index 1a730d6c0b55..e1491ad9eced 100644
>> --- a/drivers/virtio/virtio_input.c
>> +++ b/drivers/virtio/virtio_input.c
>> @@ -185,13 +185,14 @@ static void virtinput_cfg_abs(struct virtio_input *vi, int abs)
>>  
>>  static int virtinput_init_vqs(struct virtio_input *vi)
>>  {
>> +	struct virtio_queue_info vqs_info[] = {
>> +		{ "events", virtinput_recv_events },
>> +		{ "status", virtinput_recv_status },
>> +	};
>>  	struct virtqueue *vqs[2];
>> -	vq_callback_t *cbs[] = { virtinput_recv_events,
>> -				 virtinput_recv_status };
>> -	static const char * const names[] = { "events", "status" };
>>  	int err;
>>  
>> -	err = virtio_find_vqs(vi->vdev, 2, vqs, cbs, names, NULL);
>> +	err = virtio_find_vqs_info(vi->vdev, 2, vqs, vqs_info, NULL);
>
>ARRAY_SIZE(vqs_info) is now possible instead of 2.
>Can be a separate cleanup, though.

Yeah, agreed.


>
>
>>  	if (err)
>>  		return err;
>>  	vi->evt = vqs[0];
>> diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
>> index 43d405298857..d303ef4d9898 100644
>> --- a/net/vmw_vsock/virtio_transport.c
>> +++ b/net/vmw_vsock/virtio_transport.c
>> @@ -617,20 +617,15 @@ static void virtio_transport_rx_work(struct work_struct *work)
>>  static int virtio_vsock_vqs_init(struct virtio_vsock *vsock)
>>  {
>>  	struct virtio_device *vdev = vsock->vdev;
>> -	static const char * const names[] = {
>> -		"rx",
>> -		"tx",
>> -		"event",
>> -	};
>> -	vq_callback_t *callbacks[] = {
>> -		virtio_vsock_rx_done,
>> -		virtio_vsock_tx_done,
>> -		virtio_vsock_event_done,
>> +	struct virtio_queue_info vqs_info[] = {
>> +		{ "rx", virtio_vsock_rx_done },
>> +		{ "tx", virtio_vsock_tx_done },
>> +		{ "event", virtio_vsock_event_done },
>>  	};
>>  	int ret;
>>  
>> -	ret = virtio_find_vqs(vdev, VSOCK_VQ_MAX, vsock->vqs, callbacks, names,
>> -			      NULL);
>> +	ret = virtio_find_vqs_info(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info,
>> +				   NULL);
>>  	if (ret < 0)
>>  		return ret;
>>  
>> diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c
>> index 7805daea0102..a6b0da6790dc 100644
>> --- a/sound/virtio/virtio_card.c
>> +++ b/sound/virtio/virtio_card.c
>> @@ -110,25 +110,22 @@ static void virtsnd_event_notify_cb(struct virtqueue *vqueue)
>>  static int virtsnd_find_vqs(struct virtio_snd *snd)
>>  {
>>  	struct virtio_device *vdev = snd->vdev;
>> -	static vq_callback_t *callbacks[VIRTIO_SND_VQ_MAX] = {
>> -		[VIRTIO_SND_VQ_CONTROL] = virtsnd_ctl_notify_cb,
>> -		[VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb,
>> -		[VIRTIO_SND_VQ_TX] = virtsnd_pcm_tx_notify_cb,
>> -		[VIRTIO_SND_VQ_RX] = virtsnd_pcm_rx_notify_cb
>> -	};
>> -	static const char *names[VIRTIO_SND_VQ_MAX] = {
>> -		[VIRTIO_SND_VQ_CONTROL] = "virtsnd-ctl",
>> -		[VIRTIO_SND_VQ_EVENT] = "virtsnd-event",
>> -		[VIRTIO_SND_VQ_TX] = "virtsnd-tx",
>> -		[VIRTIO_SND_VQ_RX] = "virtsnd-rx"
>> +	struct virtio_queue_info vqs_info[] = {
>
>Why not
>	struct virtio_queue_info vqs_info[VIRTIO_SND_VQ_MAX] ?
>
>otherwise it's not clear all arrays are same size.

True. My mistake. I will fix this in v2.


>
>
>> +		[VIRTIO_SND_VQ_CONTROL] = { "virtsnd-ctl",
>> +					    virtsnd_ctl_notify_cb },
>> +		[VIRTIO_SND_VQ_EVENT] = { "virtsnd-event",
>> +					  virtsnd_event_notify_cb },
>> +		[VIRTIO_SND_VQ_TX] = { "virtsnd-tx",
>> +				       virtsnd_pcm_tx_notify_cb },
>> +		[VIRTIO_SND_VQ_RX] = { "virtsnd-rx",
>> +				       virtsnd_pcm_rx_notify_cb },
>>  	};
>>  	struct virtqueue *vqs[VIRTIO_SND_VQ_MAX] = { 0 };
>>  	unsigned int i;
>>  	unsigned int n;
>>  	int rc;
>>  
>> -	rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, callbacks, names,
>> -			     NULL);
>> +	rc = virtio_find_vqs_info(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
>>  	if (rc) {
>>  		dev_err(&vdev->dev, "failed to initialize virtqueues\n");
>>  		return rc;
>> -- 
>> 2.45.2
>

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
  2024-07-03 13:02   ` Michael S. Tsirkin
@ 2024-07-03 13:23     ` Jiri Pirko
  0 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 13:23 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
	hengqi

Wed, Jul 03, 2024 at 03:02:58PM CEST, mst@redhat.com wrote:
>On Wed, Jul 03, 2024 at 02:38:58PM +0200, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@nvidia.com>
>> 
>> Introduce a structure virtio_queue_info to carry name, callback and ctx
>> together. In order to allow config implementations to accept config op
>> with array of virtio_queue_info structures, introduce a new
>> find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
>> Note that whole virtio_find_vqs_ctx() is going to be eventually removed
>> at the and of this patchset.
>> 
>> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
>> ---
>>  include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
>>  1 file changed, 48 insertions(+), 3 deletions(-)
>> 
>> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
>> index 82a1d798b2f1..21029afeede1 100644
>> --- a/include/linux/virtio_config.h
>> +++ b/include/linux/virtio_config.h
>> @@ -18,6 +18,16 @@ struct virtio_shm_region {
>>  
>>  typedef void vq_callback_t(struct virtqueue *);
>>  
>> +struct virtio_queue_info {
>
>I'd do virtio_queue_info -> virtqueue_info

Okay.

>
>linux$ git grep virtqueue_|wc -l
>734
>linux$ git grep virtio_queue_|wc -l
>7
>
>
>
>> +	const char *name; /* mainly for debugging, may be NULL for vq
>
>Capital M pls.
>vq -> a virtqueue

Okay.


>
>> +			   * unused by driver.
>> +			   */
>> +	vq_callback_t *callback; /* May be NULL for vq that do
>
>do -> does

Okay.


>
>> +				  * not need a callback.
>> +				  */
>
>
>        /*
>         * Use this style for comments
>	 * which do not fit on one line, please.
>         */
>	int and_the_code_comes_here_afterwards;
>
>
>
>	
>> +	bool ctx;
>> +};
>> +
>>  /**
>>   * struct virtio_config_ops - operations for configuring a virtio device
>>   * Note: Do not assume that a transport implements all of the operations
>> @@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
>>   *	names: array of virtqueue names (mainly for debugging)
>>   *		include a NULL entry for vqs unused by driver
>>   *	Returns 0 on success or error status
>> + * @find_vqs_info: find virtqueues and instantiate them.
>> + *	vdev: the virtio_device
>> + *	nvqs: the number of virtqueues to find
>> + *	vqs: on success, includes new virtqueues
>> + *	vqs_info: array of virtqueue info structures
>
>See, here you actually said "virtqueue info"

:)


>
>> + *	Returns 0 on success or error status
>>   * @del_vqs: free virtqueues found by find_vqs().
>>   * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
>>   *      The function guarantees that all memory operations on the
>> @@ -109,6 +125,10 @@ struct virtio_config_ops {
>>  			struct virtqueue *vqs[], vq_callback_t *callbacks[],
>>  			const char * const names[], const bool *ctx,
>>  			struct irq_affinity *desc);
>> +	int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
>> +			     struct virtqueue *vqs[],
>> +			     struct virtio_queue_info vqs_info[],
>> +			     struct irq_affinity *desc);
>>  	void (*del_vqs)(struct virtio_device *);
>>  	void (*synchronize_cbs)(struct virtio_device *);
>>  	u64 (*get_features)(struct virtio_device *vdev);
>> @@ -117,7 +137,7 @@ struct virtio_config_ops {
>>  	int (*set_vq_affinity)(struct virtqueue *vq,
>>  			       const struct cpumask *cpu_mask);
>>  	const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
>> -			int index);
>> +						 int index);
>>  	bool (*get_shm_region)(struct virtio_device *vdev,
>>  			       struct virtio_shm_region *region, u8 id);
>>  	int (*disable_vq_and_reset)(struct virtqueue *vq);
>> @@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
>>  	return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
>>  }
>>  
>> +static inline
>> +int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
>> +			 struct virtqueue *vqs[],
>> +			 struct virtio_queue_info vqs_info[],
>> +			 struct irq_affinity *desc)
>> +{
>> +	return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
>> +}
>> +
>>  static inline
>>  int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
>>  			struct virtqueue *vqs[], vq_callback_t *callbacks[],
>>  			const char * const names[], const bool *ctx,
>>  			struct irq_affinity *desc)
>>  {
>> -	return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
>> -				      desc);
>> +	struct virtio_queue_info *vqs_info;
>> +	int err, i;
>> +
>> +	if (!vdev->config->find_vqs_info)
>> +		return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
>> +					      names, ctx, desc);
>> +
>> +	vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
>> +	if (!vqs_info)
>> +		return -ENOMEM;
>> +	for (i = 0; i < nvqs; i++) {
>> +		vqs_info[i].name = names[i];
>> +		vqs_info[i].callback = callbacks[i];
>> +		vqs_info[i].ctx = ctx ? ctx[i] : false;
>> +	}
>> +	err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
>> +	kfree(vqs_info);
>> +	return err;
>>  }
>>  
>>  static inline
>> -- 
>> 2.45.2
>

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
  2024-07-03 12:50 ` [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Michael S. Tsirkin
@ 2024-07-03 13:24   ` Jiri Pirko
  2024-07-03 13:37     ` Michael S. Tsirkin
  0 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 13:24 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
	hengqi

Wed, Jul 03, 2024 at 02:50:36PM CEST, mst@redhat.com wrote:
>On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@nvidia.com>
>> 
>> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
>> names, callbacks and ctx (in case of the second one) as separate args.
>> That became inconvenient as the ctx addition showed.
>> 
>> For virtio_net control queue, an indication of queue flavour (slow path)
>> is going to be needed to be passed to PCI transport in order to
>> assign vectors properly, another array added to virtio_find_vqs_ctx()
>> arg list would not be nice and convenient.
>> 
>> Instead, introduce a structure to carry vq callback, name and ctx. Pass
>> array of these structures to virtio_find_vqs() and all the way down to
>> transport find_vqs() op implementation.
>> 
>> That allows to easily extend what needs to be passed down. Also, it
>> makes the code a bit more cleaner. We get rid of separate
>> virtio_find_vqs_ctx() helper.
>> 
>> This patchset does the conversion in steps, using temporary _info() op
>> and helper. Note they are renamed back.
>
>Thanks a lot Jiri, looks very good.
>Some minor comments.

Will fix and send v2 tomorrow. I have my admin queue patchset rebased on
top of this and code will be ready for control queue to benefit from
vector allocation.


>
>
>> Patch #1 does one forgotten conversion to virtio_find_single_vq().
>> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
>> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
>>   introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
>> Patches #5 and #6 convert transports to implement find_vqs_info() op
>>   that accepts array of virtio_queue_info structs.
>> Patch #7 converts virtio_find_single_vq() to use the new way as well.
>> Patch #8 removes original find_vqs() op.
>> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
>>   of conversion this patches does.
>> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
>>   users to use new virtio_find_vqs_info() helper.
>> Patch #18 removes no longer used virtio_find_vqs() and
>>   virtio_find_vqs_ctx() helpers.
>> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
>>   to virtio_find_vqs().
>> 
>> Jiri Pirko (19):
>>   caif_virtio: use virtio_find_single_vq() for single virtqueue finding
>>   virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
>>   virtio: make virtio_find_single_vq() call virtio_find_vqs()
>>   virtio: introduce virtio_queue_info struct and find_vqs_info() config
>>     op
>>   virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
>>   virtio: convert find_vqs() op implementations to find_vqs_info()
>>   virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
>>     directly
>>   virtio: remove the original find_vqs() op
>>   virtio: rename find_vqs_info() op to find_vqs()
>>   virtio_blk: convert to use virtio_find_vqs_info()
>>   virtio_console: convert to use virtio_find_vqs_info()
>>   virtio_crypto: convert to use virtio_find_vqs_info()
>>   virtio_net: convert to use virtio_find_vqs_info()
>>   scsi: virtio_scsi: convert to use virtio_find_vqs_info()
>>   virtiofs: convert to use virtio_find_vqs_info()
>>   virtio_balloon: convert to use virtio_find_vqs_info()
>>   virtio: convert the rest virtio_find_vqs() users to
>>     virtio_find_vqs_info()
>>   virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
>>     helpers
>>   virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
>> 
>>  arch/um/drivers/virt-pci.c                    |  8 ++-
>>  arch/um/drivers/virtio_uml.c                  | 12 ++--
>>  drivers/block/virtio_blk.c                    | 20 +++----
>>  drivers/bluetooth/virtio_bt.c                 | 13 ++--
>>  drivers/char/virtio_console.c                 | 43 ++++++-------
>>  drivers/crypto/virtio/virtio_crypto_core.c    | 31 ++++------
>>  drivers/firmware/arm_scmi/virtio.c            | 11 ++--
>>  drivers/gpio/gpio-virtio.c                    | 10 ++--
>>  drivers/gpu/drm/virtio/virtgpu_kms.c          |  9 ++-
>>  drivers/iommu/virtio-iommu.c                  | 11 ++--
>>  drivers/net/caif/caif_virtio.c                |  8 +--
>>  drivers/net/virtio_net.c                      | 34 ++++-------
>>  drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
>>  drivers/platform/mellanox/mlxbf-tmfifo.c      | 10 ++--
>>  drivers/remoteproc/remoteproc_virtio.c        | 12 ++--
>>  drivers/rpmsg/virtio_rpmsg_bus.c              |  8 ++-
>>  drivers/s390/virtio/virtio_ccw.c              | 13 ++--
>>  drivers/scsi/virtio_scsi.c                    | 32 ++++------
>>  drivers/virtio/virtio_balloon.c               | 32 ++++------
>>  drivers/virtio/virtio_input.c                 |  9 +--
>>  drivers/virtio/virtio_mmio.c                  | 12 ++--
>>  drivers/virtio/virtio_pci_common.c            | 49 ++++++++-------
>>  drivers/virtio/virtio_pci_common.h            |  4 +-
>>  drivers/virtio/virtio_pci_modern.c            |  5 +-
>>  drivers/virtio/virtio_vdpa.c                  | 13 ++--
>>  fs/fuse/virtio_fs.c                           | 22 +++----
>>  include/linux/virtio_config.h                 | 60 +++++++++----------
>>  net/vmw_vsock/virtio_transport.c              | 16 ++---
>>  sound/virtio/virtio_card.c                    | 23 ++++---
>>  29 files changed, 240 insertions(+), 302 deletions(-)
>> 
>> -- 
>> 2.45.2
>

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
  2024-07-03 13:24   ` Jiri Pirko
@ 2024-07-03 13:37     ` Michael S. Tsirkin
  2024-07-04 11:38       ` Xuan Zhuo
  0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-03 13:37 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
	hengqi

On Wed, Jul 03, 2024 at 03:24:51PM +0200, Jiri Pirko wrote:
> Wed, Jul 03, 2024 at 02:50:36PM CEST, mst@redhat.com wrote:
> >On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
> >> From: Jiri Pirko <jiri@nvidia.com>
> >> 
> >> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
> >> names, callbacks and ctx (in case of the second one) as separate args.
> >> That became inconvenient as the ctx addition showed.
> >> 
> >> For virtio_net control queue, an indication of queue flavour (slow path)
> >> is going to be needed to be passed to PCI transport in order to
> >> assign vectors properly, another array added to virtio_find_vqs_ctx()
> >> arg list would not be nice and convenient.
> >> 
> >> Instead, introduce a structure to carry vq callback, name and ctx. Pass
> >> array of these structures to virtio_find_vqs() and all the way down to
> >> transport find_vqs() op implementation.
> >> 
> >> That allows to easily extend what needs to be passed down. Also, it
> >> makes the code a bit more cleaner. We get rid of separate
> >> virtio_find_vqs_ctx() helper.
> >> 
> >> This patchset does the conversion in steps, using temporary _info() op
> >> and helper. Note they are renamed back.
> >
> >Thanks a lot Jiri, looks very good.
> >Some minor comments.
> 
> Will fix and send v2 tomorrow. I have my admin queue patchset rebased on
> top of this and code will be ready for control queue to benefit from
> vector allocation.


Excellent, I hope it makes it in next in time for the next merge window.

> 
> >
> >
> >> Patch #1 does one forgotten conversion to virtio_find_single_vq().
> >> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
> >> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
> >>   introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
> >> Patches #5 and #6 convert transports to implement find_vqs_info() op
> >>   that accepts array of virtio_queue_info structs.
> >> Patch #7 converts virtio_find_single_vq() to use the new way as well.
> >> Patch #8 removes original find_vqs() op.
> >> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
> >>   of conversion this patches does.
> >> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
> >>   users to use new virtio_find_vqs_info() helper.
> >> Patch #18 removes no longer used virtio_find_vqs() and
> >>   virtio_find_vqs_ctx() helpers.
> >> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
> >>   to virtio_find_vqs().
> >> 
> >> Jiri Pirko (19):
> >>   caif_virtio: use virtio_find_single_vq() for single virtqueue finding
> >>   virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
> >>   virtio: make virtio_find_single_vq() call virtio_find_vqs()
> >>   virtio: introduce virtio_queue_info struct and find_vqs_info() config
> >>     op
> >>   virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
> >>   virtio: convert find_vqs() op implementations to find_vqs_info()
> >>   virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
> >>     directly
> >>   virtio: remove the original find_vqs() op
> >>   virtio: rename find_vqs_info() op to find_vqs()
> >>   virtio_blk: convert to use virtio_find_vqs_info()
> >>   virtio_console: convert to use virtio_find_vqs_info()
> >>   virtio_crypto: convert to use virtio_find_vqs_info()
> >>   virtio_net: convert to use virtio_find_vqs_info()
> >>   scsi: virtio_scsi: convert to use virtio_find_vqs_info()
> >>   virtiofs: convert to use virtio_find_vqs_info()
> >>   virtio_balloon: convert to use virtio_find_vqs_info()
> >>   virtio: convert the rest virtio_find_vqs() users to
> >>     virtio_find_vqs_info()
> >>   virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
> >>     helpers
> >>   virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
> >> 
> >>  arch/um/drivers/virt-pci.c                    |  8 ++-
> >>  arch/um/drivers/virtio_uml.c                  | 12 ++--
> >>  drivers/block/virtio_blk.c                    | 20 +++----
> >>  drivers/bluetooth/virtio_bt.c                 | 13 ++--
> >>  drivers/char/virtio_console.c                 | 43 ++++++-------
> >>  drivers/crypto/virtio/virtio_crypto_core.c    | 31 ++++------
> >>  drivers/firmware/arm_scmi/virtio.c            | 11 ++--
> >>  drivers/gpio/gpio-virtio.c                    | 10 ++--
> >>  drivers/gpu/drm/virtio/virtgpu_kms.c          |  9 ++-
> >>  drivers/iommu/virtio-iommu.c                  | 11 ++--
> >>  drivers/net/caif/caif_virtio.c                |  8 +--
> >>  drivers/net/virtio_net.c                      | 34 ++++-------
> >>  drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
> >>  drivers/platform/mellanox/mlxbf-tmfifo.c      | 10 ++--
> >>  drivers/remoteproc/remoteproc_virtio.c        | 12 ++--
> >>  drivers/rpmsg/virtio_rpmsg_bus.c              |  8 ++-
> >>  drivers/s390/virtio/virtio_ccw.c              | 13 ++--
> >>  drivers/scsi/virtio_scsi.c                    | 32 ++++------
> >>  drivers/virtio/virtio_balloon.c               | 32 ++++------
> >>  drivers/virtio/virtio_input.c                 |  9 +--
> >>  drivers/virtio/virtio_mmio.c                  | 12 ++--
> >>  drivers/virtio/virtio_pci_common.c            | 49 ++++++++-------
> >>  drivers/virtio/virtio_pci_common.h            |  4 +-
> >>  drivers/virtio/virtio_pci_modern.c            |  5 +-
> >>  drivers/virtio/virtio_vdpa.c                  | 13 ++--
> >>  fs/fuse/virtio_fs.c                           | 22 +++----
> >>  include/linux/virtio_config.h                 | 60 +++++++++----------
> >>  net/vmw_vsock/virtio_transport.c              | 16 ++---
> >>  sound/virtio/virtio_card.c                    | 23 ++++---
> >>  29 files changed, 240 insertions(+), 302 deletions(-)
> >> 
> >> -- 
> >> 2.45.2
> >


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
  2024-07-03 13:37     ` Michael S. Tsirkin
@ 2024-07-04 11:38       ` Xuan Zhuo
  2024-07-04 12:39         ` Michael S. Tsirkin
  0 siblings, 1 reply; 30+ messages in thread
From: Xuan Zhuo @ 2024-07-04 11:38 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: virtualization, jasowang, eperezma, parav, feliu, hengqi,
	Jiri Pirko

On Wed, 3 Jul 2024 09:37:10 -0400, "Michael S. Tsirkin" <mst@redhat.com> wrote:
> On Wed, Jul 03, 2024 at 03:24:51PM +0200, Jiri Pirko wrote:
> > Wed, Jul 03, 2024 at 02:50:36PM CEST, mst@redhat.com wrote:
> > >On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
> > >> From: Jiri Pirko <jiri@nvidia.com>
> > >>
> > >> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
> > >> names, callbacks and ctx (in case of the second one) as separate args.
> > >> That became inconvenient as the ctx addition showed.
> > >>
> > >> For virtio_net control queue, an indication of queue flavour (slow path)
> > >> is going to be needed to be passed to PCI transport in order to
> > >> assign vectors properly, another array added to virtio_find_vqs_ctx()
> > >> arg list would not be nice and convenient.
> > >>
> > >> Instead, introduce a structure to carry vq callback, name and ctx. Pass
> > >> array of these structures to virtio_find_vqs() and all the way down to
> > >> transport find_vqs() op implementation.
> > >>
> > >> That allows to easily extend what needs to be passed down. Also, it
> > >> makes the code a bit more cleaner. We get rid of separate
> > >> virtio_find_vqs_ctx() helper.
> > >>
> > >> This patchset does the conversion in steps, using temporary _info() op
> > >> and helper. Note they are renamed back.
> > >
> > >Thanks a lot Jiri, looks very good.
> > >Some minor comments.
> >
> > Will fix and send v2 tomorrow. I have my admin queue patchset rebased on
> > top of this and code will be ready for control queue to benefit from
> > vector allocation.
>
>
> Excellent, I hope it makes it in next in time for the next merge window.

Hi, Michael, you know I was working on this.

Is the virtio community already in such a mess?

>
> >
> > >
> > >
> > >> Patch #1 does one forgotten conversion to virtio_find_single_vq().
> > >> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
> > >> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
> > >>   introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
> > >> Patches #5 and #6 convert transports to implement find_vqs_info() op
> > >>   that accepts array of virtio_queue_info structs.
> > >> Patch #7 converts virtio_find_single_vq() to use the new way as well.
> > >> Patch #8 removes original find_vqs() op.
> > >> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
> > >>   of conversion this patches does.
> > >> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
> > >>   users to use new virtio_find_vqs_info() helper.
> > >> Patch #18 removes no longer used virtio_find_vqs() and
> > >>   virtio_find_vqs_ctx() helpers.
> > >> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
> > >>   to virtio_find_vqs().
> > >>
> > >> Jiri Pirko (19):
> > >>   caif_virtio: use virtio_find_single_vq() for single virtqueue finding
> > >>   virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
> > >>   virtio: make virtio_find_single_vq() call virtio_find_vqs()
> > >>   virtio: introduce virtio_queue_info struct and find_vqs_info() config
> > >>     op
> > >>   virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
> > >>   virtio: convert find_vqs() op implementations to find_vqs_info()
> > >>   virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
> > >>     directly
> > >>   virtio: remove the original find_vqs() op
> > >>   virtio: rename find_vqs_info() op to find_vqs()
> > >>   virtio_blk: convert to use virtio_find_vqs_info()
> > >>   virtio_console: convert to use virtio_find_vqs_info()
> > >>   virtio_crypto: convert to use virtio_find_vqs_info()
> > >>   virtio_net: convert to use virtio_find_vqs_info()
> > >>   scsi: virtio_scsi: convert to use virtio_find_vqs_info()
> > >>   virtiofs: convert to use virtio_find_vqs_info()
> > >>   virtio_balloon: convert to use virtio_find_vqs_info()
> > >>   virtio: convert the rest virtio_find_vqs() users to
> > >>     virtio_find_vqs_info()
> > >>   virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
> > >>     helpers
> > >>   virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
> > >>
> > >>  arch/um/drivers/virt-pci.c                    |  8 ++-
> > >>  arch/um/drivers/virtio_uml.c                  | 12 ++--
> > >>  drivers/block/virtio_blk.c                    | 20 +++----
> > >>  drivers/bluetooth/virtio_bt.c                 | 13 ++--
> > >>  drivers/char/virtio_console.c                 | 43 ++++++-------
> > >>  drivers/crypto/virtio/virtio_crypto_core.c    | 31 ++++------
> > >>  drivers/firmware/arm_scmi/virtio.c            | 11 ++--
> > >>  drivers/gpio/gpio-virtio.c                    | 10 ++--
> > >>  drivers/gpu/drm/virtio/virtgpu_kms.c          |  9 ++-
> > >>  drivers/iommu/virtio-iommu.c                  | 11 ++--
> > >>  drivers/net/caif/caif_virtio.c                |  8 +--
> > >>  drivers/net/virtio_net.c                      | 34 ++++-------
> > >>  drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
> > >>  drivers/platform/mellanox/mlxbf-tmfifo.c      | 10 ++--
> > >>  drivers/remoteproc/remoteproc_virtio.c        | 12 ++--
> > >>  drivers/rpmsg/virtio_rpmsg_bus.c              |  8 ++-
> > >>  drivers/s390/virtio/virtio_ccw.c              | 13 ++--
> > >>  drivers/scsi/virtio_scsi.c                    | 32 ++++------
> > >>  drivers/virtio/virtio_balloon.c               | 32 ++++------
> > >>  drivers/virtio/virtio_input.c                 |  9 +--
> > >>  drivers/virtio/virtio_mmio.c                  | 12 ++--
> > >>  drivers/virtio/virtio_pci_common.c            | 49 ++++++++-------
> > >>  drivers/virtio/virtio_pci_common.h            |  4 +-
> > >>  drivers/virtio/virtio_pci_modern.c            |  5 +-
> > >>  drivers/virtio/virtio_vdpa.c                  | 13 ++--
> > >>  fs/fuse/virtio_fs.c                           | 22 +++----
> > >>  include/linux/virtio_config.h                 | 60 +++++++++----------
> > >>  net/vmw_vsock/virtio_transport.c              | 16 ++---
> > >>  sound/virtio/virtio_card.c                    | 23 ++++---
> > >>  29 files changed, 240 insertions(+), 302 deletions(-)
> > >>
> > >> --
> > >> 2.45.2
> > >
>

^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
  2024-07-04 11:38       ` Xuan Zhuo
@ 2024-07-04 12:39         ` Michael S. Tsirkin
  2024-07-04 12:55           ` Jiri Pirko
  0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-04 12:39 UTC (permalink / raw)
  To: Xuan Zhuo
  Cc: virtualization, jasowang, eperezma, parav, feliu, hengqi,
	Jiri Pirko

On Thu, Jul 04, 2024 at 07:38:35PM +0800, Xuan Zhuo wrote:
> On Wed, 3 Jul 2024 09:37:10 -0400, "Michael S. Tsirkin" <mst@redhat.com> wrote:
> > On Wed, Jul 03, 2024 at 03:24:51PM +0200, Jiri Pirko wrote:
> > > Wed, Jul 03, 2024 at 02:50:36PM CEST, mst@redhat.com wrote:
> > > >On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
> > > >> From: Jiri Pirko <jiri@nvidia.com>
> > > >>
> > > >> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
> > > >> names, callbacks and ctx (in case of the second one) as separate args.
> > > >> That became inconvenient as the ctx addition showed.
> > > >>
> > > >> For virtio_net control queue, an indication of queue flavour (slow path)
> > > >> is going to be needed to be passed to PCI transport in order to
> > > >> assign vectors properly, another array added to virtio_find_vqs_ctx()
> > > >> arg list would not be nice and convenient.
> > > >>
> > > >> Instead, introduce a structure to carry vq callback, name and ctx. Pass
> > > >> array of these structures to virtio_find_vqs() and all the way down to
> > > >> transport find_vqs() op implementation.
> > > >>
> > > >> That allows to easily extend what needs to be passed down. Also, it
> > > >> makes the code a bit more cleaner. We get rid of separate
> > > >> virtio_find_vqs_ctx() helper.
> > > >>
> > > >> This patchset does the conversion in steps, using temporary _info() op
> > > >> and helper. Note they are renamed back.
> > > >
> > > >Thanks a lot Jiri, looks very good.
> > > >Some minor comments.
> > >
> > > Will fix and send v2 tomorrow. I have my admin queue patchset rebased on
> > > top of this and code will be ready for control queue to benefit from
> > > vector allocation.
> >
> >
> > Excellent, I hope it makes it in next in time for the next merge window.
> 
> Hi, Michael, you know I was working on this.
> 
> Is the virtio community already in such a mess?

Sorry you feel that way.  Jiri, I think it's fair to add

Suggested-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>

to patches 4 and 10-17.



> >
> > >
> > > >
> > > >
> > > >> Patch #1 does one forgotten conversion to virtio_find_single_vq().
> > > >> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
> > > >> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
> > > >>   introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
> > > >> Patches #5 and #6 convert transports to implement find_vqs_info() op
> > > >>   that accepts array of virtio_queue_info structs.
> > > >> Patch #7 converts virtio_find_single_vq() to use the new way as well.
> > > >> Patch #8 removes original find_vqs() op.
> > > >> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
> > > >>   of conversion this patches does.
> > > >> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
> > > >>   users to use new virtio_find_vqs_info() helper.
> > > >> Patch #18 removes no longer used virtio_find_vqs() and
> > > >>   virtio_find_vqs_ctx() helpers.
> > > >> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
> > > >>   to virtio_find_vqs().
> > > >>
> > > >> Jiri Pirko (19):
> > > >>   caif_virtio: use virtio_find_single_vq() for single virtqueue finding
> > > >>   virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
> > > >>   virtio: make virtio_find_single_vq() call virtio_find_vqs()
> > > >>   virtio: introduce virtio_queue_info struct and find_vqs_info() config
> > > >>     op
> > > >>   virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
> > > >>   virtio: convert find_vqs() op implementations to find_vqs_info()
> > > >>   virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
> > > >>     directly
> > > >>   virtio: remove the original find_vqs() op
> > > >>   virtio: rename find_vqs_info() op to find_vqs()
> > > >>   virtio_blk: convert to use virtio_find_vqs_info()
> > > >>   virtio_console: convert to use virtio_find_vqs_info()
> > > >>   virtio_crypto: convert to use virtio_find_vqs_info()
> > > >>   virtio_net: convert to use virtio_find_vqs_info()
> > > >>   scsi: virtio_scsi: convert to use virtio_find_vqs_info()
> > > >>   virtiofs: convert to use virtio_find_vqs_info()
> > > >>   virtio_balloon: convert to use virtio_find_vqs_info()
> > > >>   virtio: convert the rest virtio_find_vqs() users to
> > > >>     virtio_find_vqs_info()
> > > >>   virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
> > > >>     helpers
> > > >>   virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
> > > >>
> > > >>  arch/um/drivers/virt-pci.c                    |  8 ++-
> > > >>  arch/um/drivers/virtio_uml.c                  | 12 ++--
> > > >>  drivers/block/virtio_blk.c                    | 20 +++----
> > > >>  drivers/bluetooth/virtio_bt.c                 | 13 ++--
> > > >>  drivers/char/virtio_console.c                 | 43 ++++++-------
> > > >>  drivers/crypto/virtio/virtio_crypto_core.c    | 31 ++++------
> > > >>  drivers/firmware/arm_scmi/virtio.c            | 11 ++--
> > > >>  drivers/gpio/gpio-virtio.c                    | 10 ++--
> > > >>  drivers/gpu/drm/virtio/virtgpu_kms.c          |  9 ++-
> > > >>  drivers/iommu/virtio-iommu.c                  | 11 ++--
> > > >>  drivers/net/caif/caif_virtio.c                |  8 +--
> > > >>  drivers/net/virtio_net.c                      | 34 ++++-------
> > > >>  drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
> > > >>  drivers/platform/mellanox/mlxbf-tmfifo.c      | 10 ++--
> > > >>  drivers/remoteproc/remoteproc_virtio.c        | 12 ++--
> > > >>  drivers/rpmsg/virtio_rpmsg_bus.c              |  8 ++-
> > > >>  drivers/s390/virtio/virtio_ccw.c              | 13 ++--
> > > >>  drivers/scsi/virtio_scsi.c                    | 32 ++++------
> > > >>  drivers/virtio/virtio_balloon.c               | 32 ++++------
> > > >>  drivers/virtio/virtio_input.c                 |  9 +--
> > > >>  drivers/virtio/virtio_mmio.c                  | 12 ++--
> > > >>  drivers/virtio/virtio_pci_common.c            | 49 ++++++++-------
> > > >>  drivers/virtio/virtio_pci_common.h            |  4 +-
> > > >>  drivers/virtio/virtio_pci_modern.c            |  5 +-
> > > >>  drivers/virtio/virtio_vdpa.c                  | 13 ++--
> > > >>  fs/fuse/virtio_fs.c                           | 22 +++----
> > > >>  include/linux/virtio_config.h                 | 60 +++++++++----------
> > > >>  net/vmw_vsock/virtio_transport.c              | 16 ++---
> > > >>  sound/virtio/virtio_card.c                    | 23 ++++---
> > > >>  29 files changed, 240 insertions(+), 302 deletions(-)
> > > >>
> > > >> --
> > > >> 2.45.2
> > > >
> >


^ permalink raw reply	[flat|nested] 30+ messages in thread

* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
  2024-07-04 12:39         ` Michael S. Tsirkin
@ 2024-07-04 12:55           ` Jiri Pirko
  0 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 12:55 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: Xuan Zhuo, virtualization, jasowang, eperezma, parav, feliu,
	hengqi

Thu, Jul 04, 2024 at 02:39:36PM CEST, mst@redhat.com wrote:
>On Thu, Jul 04, 2024 at 07:38:35PM +0800, Xuan Zhuo wrote:
>> On Wed, 3 Jul 2024 09:37:10 -0400, "Michael S. Tsirkin" <mst@redhat.com> wrote:
>> > On Wed, Jul 03, 2024 at 03:24:51PM +0200, Jiri Pirko wrote:
>> > > Wed, Jul 03, 2024 at 02:50:36PM CEST, mst@redhat.com wrote:
>> > > >On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
>> > > >> From: Jiri Pirko <jiri@nvidia.com>
>> > > >>
>> > > >> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
>> > > >> names, callbacks and ctx (in case of the second one) as separate args.
>> > > >> That became inconvenient as the ctx addition showed.
>> > > >>
>> > > >> For virtio_net control queue, an indication of queue flavour (slow path)
>> > > >> is going to be needed to be passed to PCI transport in order to
>> > > >> assign vectors properly, another array added to virtio_find_vqs_ctx()
>> > > >> arg list would not be nice and convenient.
>> > > >>
>> > > >> Instead, introduce a structure to carry vq callback, name and ctx. Pass
>> > > >> array of these structures to virtio_find_vqs() and all the way down to
>> > > >> transport find_vqs() op implementation.
>> > > >>
>> > > >> That allows to easily extend what needs to be passed down. Also, it
>> > > >> makes the code a bit more cleaner. We get rid of separate
>> > > >> virtio_find_vqs_ctx() helper.
>> > > >>
>> > > >> This patchset does the conversion in steps, using temporary _info() op
>> > > >> and helper. Note they are renamed back.
>> > > >
>> > > >Thanks a lot Jiri, looks very good.
>> > > >Some minor comments.
>> > >
>> > > Will fix and send v2 tomorrow. I have my admin queue patchset rebased on
>> > > top of this and code will be ready for control queue to benefit from
>> > > vector allocation.
>> >
>> >
>> > Excellent, I hope it makes it in next in time for the next merge window.
>> 
>> Hi, Michael, you know I was working on this.
>> 
>> Is the virtio community already in such a mess?
>
>Sorry you feel that way.  Jiri, I think it's fair to add
>
>Suggested-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
>
>to patches 4 and 10-17.

Sure, no problem.


>
>
>
>> >
>> > >
>> > > >
>> > > >
>> > > >> Patch #1 does one forgotten conversion to virtio_find_single_vq().
>> > > >> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
>> > > >> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
>> > > >>   introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
>> > > >> Patches #5 and #6 convert transports to implement find_vqs_info() op
>> > > >>   that accepts array of virtio_queue_info structs.
>> > > >> Patch #7 converts virtio_find_single_vq() to use the new way as well.
>> > > >> Patch #8 removes original find_vqs() op.
>> > > >> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
>> > > >>   of conversion this patches does.
>> > > >> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
>> > > >>   users to use new virtio_find_vqs_info() helper.
>> > > >> Patch #18 removes no longer used virtio_find_vqs() and
>> > > >>   virtio_find_vqs_ctx() helpers.
>> > > >> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
>> > > >>   to virtio_find_vqs().
>> > > >>
>> > > >> Jiri Pirko (19):
>> > > >>   caif_virtio: use virtio_find_single_vq() for single virtqueue finding
>> > > >>   virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
>> > > >>   virtio: make virtio_find_single_vq() call virtio_find_vqs()
>> > > >>   virtio: introduce virtio_queue_info struct and find_vqs_info() config
>> > > >>     op
>> > > >>   virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
>> > > >>   virtio: convert find_vqs() op implementations to find_vqs_info()
>> > > >>   virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
>> > > >>     directly
>> > > >>   virtio: remove the original find_vqs() op
>> > > >>   virtio: rename find_vqs_info() op to find_vqs()
>> > > >>   virtio_blk: convert to use virtio_find_vqs_info()
>> > > >>   virtio_console: convert to use virtio_find_vqs_info()
>> > > >>   virtio_crypto: convert to use virtio_find_vqs_info()
>> > > >>   virtio_net: convert to use virtio_find_vqs_info()
>> > > >>   scsi: virtio_scsi: convert to use virtio_find_vqs_info()
>> > > >>   virtiofs: convert to use virtio_find_vqs_info()
>> > > >>   virtio_balloon: convert to use virtio_find_vqs_info()
>> > > >>   virtio: convert the rest virtio_find_vqs() users to
>> > > >>     virtio_find_vqs_info()
>> > > >>   virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
>> > > >>     helpers
>> > > >>   virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
>> > > >>
>> > > >>  arch/um/drivers/virt-pci.c                    |  8 ++-
>> > > >>  arch/um/drivers/virtio_uml.c                  | 12 ++--
>> > > >>  drivers/block/virtio_blk.c                    | 20 +++----
>> > > >>  drivers/bluetooth/virtio_bt.c                 | 13 ++--
>> > > >>  drivers/char/virtio_console.c                 | 43 ++++++-------
>> > > >>  drivers/crypto/virtio/virtio_crypto_core.c    | 31 ++++------
>> > > >>  drivers/firmware/arm_scmi/virtio.c            | 11 ++--
>> > > >>  drivers/gpio/gpio-virtio.c                    | 10 ++--
>> > > >>  drivers/gpu/drm/virtio/virtgpu_kms.c          |  9 ++-
>> > > >>  drivers/iommu/virtio-iommu.c                  | 11 ++--
>> > > >>  drivers/net/caif/caif_virtio.c                |  8 +--
>> > > >>  drivers/net/virtio_net.c                      | 34 ++++-------
>> > > >>  drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
>> > > >>  drivers/platform/mellanox/mlxbf-tmfifo.c      | 10 ++--
>> > > >>  drivers/remoteproc/remoteproc_virtio.c        | 12 ++--
>> > > >>  drivers/rpmsg/virtio_rpmsg_bus.c              |  8 ++-
>> > > >>  drivers/s390/virtio/virtio_ccw.c              | 13 ++--
>> > > >>  drivers/scsi/virtio_scsi.c                    | 32 ++++------
>> > > >>  drivers/virtio/virtio_balloon.c               | 32 ++++------
>> > > >>  drivers/virtio/virtio_input.c                 |  9 +--
>> > > >>  drivers/virtio/virtio_mmio.c                  | 12 ++--
>> > > >>  drivers/virtio/virtio_pci_common.c            | 49 ++++++++-------
>> > > >>  drivers/virtio/virtio_pci_common.h            |  4 +-
>> > > >>  drivers/virtio/virtio_pci_modern.c            |  5 +-
>> > > >>  drivers/virtio/virtio_vdpa.c                  | 13 ++--
>> > > >>  fs/fuse/virtio_fs.c                           | 22 +++----
>> > > >>  include/linux/virtio_config.h                 | 60 +++++++++----------
>> > > >>  net/vmw_vsock/virtio_transport.c              | 16 ++---
>> > > >>  sound/virtio/virtio_card.c                    | 23 ++++---
>> > > >>  29 files changed, 240 insertions(+), 302 deletions(-)
>> > > >>
>> > > >> --
>> > > >> 2.45.2
>> > > >
>> >
>

^ permalink raw reply	[flat|nested] 30+ messages in thread

end of thread, other threads:[~2024-07-04 12:55 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx() Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs() Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
2024-07-03 13:02   ` Michael S. Tsirkin
2024-07-03 13:23     ` Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info() Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 08/19] virtio: remove the original find_vqs() op Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 09/19] virtio: rename find_vqs_info() op to find_vqs() Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 10/19] virtio_blk: convert to use virtio_find_vqs_info() Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 11/19] virtio_console: " Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 12/19] virtio_crypto: " Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 13/19] virtio_net: " Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 14/19] scsi: virtio_scsi: " Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 15/19] virtiofs: " Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 16/19] virtio_balloon: " Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
2024-07-03 13:11   ` Michael S. Tsirkin
2024-07-03 13:22     ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs() Jiri Pirko
2024-07-03 12:50 ` [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Michael S. Tsirkin
2024-07-03 13:24   ` Jiri Pirko
2024-07-03 13:37     ` Michael S. Tsirkin
2024-07-04 11:38       ` Xuan Zhuo
2024-07-04 12:39         ` Michael S. Tsirkin
2024-07-04 12:55           ` Jiri Pirko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).