* [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs()
@ 2024-07-04 6:43 Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 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-04 6:43 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().
---
v1->v2:
- added forgotten VIRTIO_SND_VQ_MAX for array size in virtio_card.c
- s/virtio_queue_info/virtqueue_info/
- fixed comments for struct virtqueue_info
- rebased on top of recent code changes (virtio_fs.c)
- see individual patches changelog for more details
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 | 48 ++++++++-------
drivers/virtio/virtio_pci_common.h | 3 +-
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, 238 insertions(+), 302 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH virtio v2 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 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-04 6:43 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 v2 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 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-04 6:43 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 v2 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 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-04 6:43 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 v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (2 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 7:47 ` Michael S. Tsirkin
2024-07-04 6:43 ` [PATCH virtio v2 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-04 6:43 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>
---
v1->v2:
- fixed comments for struct virtqueue_info
- s/virtio_queue_info/virtqueue_info/
---
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..9b975c2830f6 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 virtqueue_info {
+ const char *name; /* Mainly for debugging, may be NULL for a virtqueue
+ * unused by driver.
+ */
+ vq_callback_t *callback; /* May be NULL for vq that does
+ * 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 virtqueue_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 virtqueue_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 virtqueue_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 v2 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (3 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 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-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
drivers/virtio/virtio_pci_common.c | 48 ++++++++++++++++--------------
drivers/virtio/virtio_pci_common.h | 3 +-
drivers/virtio/virtio_pci_legacy.c | 2 +-
drivers/virtio/virtio_pci_modern.c | 9 +++---
4 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
index f6b0b00e4599..3a1b74fb4da4 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 virtqueue_info vqs_info[],
+ bool per_vq_vectors,
+ struct irq_affinity *desc)
{
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+ struct virtqueue_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 virtqueue_info vqs_info[])
{
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+ struct virtqueue_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,24 @@ 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 virtqueue_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..3c4bb2d6163a 100644
--- a/drivers/virtio/virtio_pci_common.h
+++ b/drivers/virtio/virtio_pci_common.h
@@ -127,8 +127,7 @@ 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 virtqueue_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..adba4a29fdf4 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 virtqueue_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 v2 06/19] virtio: convert find_vqs() op implementations to find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (4 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-05 7:43 ` Michael S. Tsirkin
2024-07-04 6:43 ` [PATCH virtio v2 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly Jiri Pirko
` (13 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
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 77faa2cf3a13..c32a51017f9f 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 virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
+ struct virtqueue_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..1497a5a0a68f 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 virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
struct mlxbf_tmfifo_vdev *tm_vdev = mlxbf_vdev_to_tmfifo(vdev);
struct mlxbf_tmfifo_vring *vring;
+ struct virtqueue_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..a82a7c13bdc5 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 virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
+ struct virtqueue_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 d6491fc84e8c..1f1fa70cf09d 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 virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_ccw_device *vcdev = to_vc_device(vdev);
+ struct virtqueue_info *vqi;
dma64_t *indicatorp = NULL;
int ret, i, queue_idx = 0;
struct ccw1 *ccw;
@@ -705,14 +704,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;
@@ -1079,7 +1078,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..533aca85b745 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 virtqueue_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 virtqueue_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..dcf0c2b19a44 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 virtqueue_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 virtqueue_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 v2 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (5 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 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-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
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 9b975c2830f6..eabbc28cdd0f 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 virtqueue_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 v2 08/19] virtio: remove the original find_vqs() op
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (6 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 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-04 6:43 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 eabbc28cdd0f..ad6ac5cf4bd7 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -59,15 +59,6 @@ struct virtqueue_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 virtqueue_info vqs_info[],
@@ -248,10 +235,6 @@ int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue_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 v2 09/19] virtio: rename find_vqs_info() op to find_vqs()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (7 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 08/19] virtio: remove the original find_vqs() op Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 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-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
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 c32a51017f9f..35cc31928bb0 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 1497a5a0a68f..05a68b36ff50 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 a82a7c13bdc5..346888ca1732 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 1f1fa70cf09d..ec0ecdce4808 100644
--- a/drivers/s390/virtio/virtio_ccw.c
+++ b/drivers/s390/virtio/virtio_ccw.c
@@ -1078,7 +1078,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 533aca85b745..54abd3722296 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 adba4a29fdf4..3b5b9499a53a 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 dcf0c2b19a44..138bcc56d156 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 ad6ac5cf4bd7..d325af057d1a 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -59,7 +59,7 @@ struct virtqueue_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 virtqueue_info vqs_info[],
- struct irq_affinity *desc);
+ int (*find_vqs)(struct virtio_device *vdev, unsigned int nvqs,
+ struct virtqueue *vqs[],
+ struct virtqueue_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 virtqueue_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 v2 10/19] virtio_blk: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (8 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 09/19] virtio: rename find_vqs_info() op to find_vqs() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 11/19] virtio_console: " Jiri Pirko
` (9 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
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 2351f411fa46..ca3446503e82 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 virtqueue_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 v2 11/19] virtio_console: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (9 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 10/19] virtio_blk: convert to use virtio_find_vqs_info() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 12/19] virtio_crypto: " Jiri Pirko
` (8 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
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..903d83a1ffe8 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 virtqueue_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 v2 12/19] virtio_crypto: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (10 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 11/19] virtio_console: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 13/19] virtio_net: " Jiri Pirko
` (7 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
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..b8119d1f9931 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 virtqueue_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 v2 13/19] virtio_net: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (11 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 12/19] virtio_crypto: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 14/19] scsi: virtio_scsi: " Jiri Pirko
` (6 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
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 18165faafa92..686ecd819fec 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -5297,9 +5297,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 virtqueue_info *vqs_info;
struct virtqueue **vqs;
- const char **names;
int ret = -ENOMEM;
int total_vqs;
bool *ctx;
@@ -5316,12 +5315,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)
@@ -5332,24 +5328,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;
@@ -5371,10 +5365,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 v2 14/19] scsi: virtio_scsi: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (12 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 13/19] virtio_net: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 15/19] virtiofs: " Jiri Pirko
` (5 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
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..bf9346a66df2 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 virtqueue_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 v2 15/19] virtiofs: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (13 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 14/19] scsi: virtio_scsi: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 16/19] virtio_balloon: " Jiri Pirko
` (4 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
- rebased on top of recent code changes
---
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 728f14e077bd..a335b421f196 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -789,14 +789,13 @@ 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 virtqueue_info *vqs_info;
struct virtqueue **vqs;
- vq_callback_t **callbacks;
/* Specify pre_vectors to ensure that the queues before the
* request queues (e.g. hiprio) don't claim any of the CPUs in
* the multi-queue mapping and interrupt affinities
*/
struct irq_affinity desc = { .pre_vectors = VQ_REQUEST };
- const char **names;
unsigned int i;
int ret = 0;
@@ -814,20 +813,18 @@ 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);
fs->mq_map = kcalloc_node(nr_cpu_ids, sizeof(*fs->mq_map), GFP_KERNEL,
dev_to_node(&vdev->dev));
- if (!vqs || !callbacks || !names || !fs->mq_map) {
+ vqs_info = kcalloc(fs->nvqs, sizeof(*vqs_info), GFP_KERNEL);
+ if (!vqs || !vqs_info || !fs->mq_map) {
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++) {
@@ -835,11 +832,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, &desc);
+ ret = virtio_find_vqs_info(vdev, fs->nvqs, vqs, vqs_info, &desc);
if (ret < 0)
goto out;
@@ -848,8 +845,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 v2 16/19] virtio_balloon: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (14 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 15/19] virtiofs: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 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-04 6:43 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>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
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 9a61febbd2f7..cfa710abf441 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -560,9 +560,8 @@ static void update_balloon_size_func(struct work_struct *work)
static int init_vqs(struct virtio_balloon *vb)
{
+ struct virtqueue_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;
/*
@@ -570,33 +569,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 v2 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (15 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 16/19] virtio_balloon: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers Jiri Pirko
` (2 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 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>
---
v1->v2:
- added forgotten VIRTIO_SND_VQ_MAX for array size in virtio_card.c
- s/virtio_queue_info/virtqueue_info/
---
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..3a668241c0aa 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 virtqueue_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 40bd83825c29..79574855ed54 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 virtqueue_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;
@@ -288,8 +284,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..d7cdefb6bd54 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 virtqueue_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..d11464420797 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 virtqueue_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..1590fc180c66 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 virtqueue_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 36d680826b57..d3c7877a3806 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -1084,14 +1084,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 virtqueue_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 c5d896994e70..7bda786631ba 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -6574,17 +6574,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 virtqueue_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..fb466ef20f07 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 virtqueue_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..6f803dc3d0f9 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 virtqueue_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..3033680fcc98 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 virtqueue_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..109a0008b69e 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 virtqueue_info vqs_info[VIRTIO_SND_VQ_MAX] = {
+ [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 v2 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (16 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs() Jiri Pirko
2024-07-04 11:33 ` [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Xuan Zhuo
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 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 d325af057d1a..939c8dc909a5 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 virtqueue_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 v2 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (17 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 11:33 ` [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Xuan Zhuo
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 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>
---
v1->v2:
- rebased on top of virtqueue_info struct name change
---
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 3a668241c0aa..b16a75c94b8b 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 ca3446503e82..112a9e629ab5 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 79574855ed54..756f292df9e8 100644
--- a/drivers/bluetooth/virtio_bt.c
+++ b/drivers/bluetooth/virtio_bt.c
@@ -284,8 +284,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 903d83a1ffe8..de7d720d99fa 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 b8119d1f9931..d0278eb568b9 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 d7cdefb6bd54..dd3459bdb9cb 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 d11464420797..93544ff62513 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 1590fc180c66..7dfb2006c561 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 d3c7877a3806..b85ce6310ddb 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -1089,8 +1089,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 686ecd819fec..a42331d89da2 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -5343,7 +5343,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 7bda786631ba..f2e58d246284 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -6579,8 +6579,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 fb466ef20f07..89d7a3b8c48b 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 bf9346a66df2..8471f38b730e 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 cfa710abf441..54469277ca30 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -587,8 +587,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 6f803dc3d0f9..a5d63269f20b 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 a335b421f196..dd5260141615 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -836,7 +836,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, &desc);
+ ret = virtio_find_vqs(vdev, fs->nvqs, vqs, vqs_info, &desc);
if (ret < 0)
goto out;
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 939c8dc909a5..8efba71615a4 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 virtqueue_info vqs_info[],
- struct irq_affinity *desc)
+int virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
+ struct virtqueue *vqs[],
+ struct virtqueue_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 3033680fcc98..64a07acfef12 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 109a0008b69e..965209e1d872 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 v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 6:43 ` [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
@ 2024-07-04 7:47 ` Michael S. Tsirkin
2024-07-04 9:42 ` Jiri Pirko
2024-07-04 11:06 ` Jiri Pirko
0 siblings, 2 replies; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-04 7:47 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
On Thu, Jul 04, 2024 at 08:43:35AM +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>
> ---
> v1->v2:
> - fixed comments for struct virtqueue_info
> - s/virtio_queue_info/virtqueue_info/
> ---
> 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..9b975c2830f6 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 virtqueue_info {
> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
> + * unused by driver.
> + */
> + vq_callback_t *callback; /* May be NULL for vq that does
> + * not need a callback.
> + */
> + bool ctx;
/*
* Always
* like this
* outside of netdev code
* and it comes before the code being documented
*/
/* Never
* like this
*/
Also "may be null" is a bit confusing - it has to be null
for such a vq.
Thus:
/*
* name: mainly for debugging, NULL for a virtqueue
* unused by the driver.
*/
const char *name;
and similarly for the callback.
> +};
> +
> /**
> * 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 virtqueue_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 virtqueue_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 virtqueue_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 v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 7:47 ` Michael S. Tsirkin
@ 2024-07-04 9:42 ` Jiri Pirko
2024-07-04 11:06 ` Jiri Pirko
1 sibling, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 9:42 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Thu, Jul 04, 2024 at 09:47:09AM CEST, mst@redhat.com wrote:
>On Thu, Jul 04, 2024 at 08:43:35AM +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>
>> ---
>> v1->v2:
>> - fixed comments for struct virtqueue_info
>> - s/virtio_queue_info/virtqueue_info/
>> ---
>> 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..9b975c2830f6 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 virtqueue_info {
>> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
>> + * unused by driver.
>> + */
>> + vq_callback_t *callback; /* May be NULL for vq that does
>> + * not need a callback.
>> + */
>> + bool ctx;
>
>
> /*
> * Always
> * like this
> * outside of netdev code
> * and it comes before the code being documented
> */
Ah, yeah.
I wonder howcome checkpatch does not warn.
>
> /* Never
> * like this
> */
>
>
>Also "may be null" is a bit confusing - it has to be null
>for such a vq.
>
>Thus:
>
> /*
> * name: mainly for debugging, NULL for a virtqueue
> * unused by the driver.
> */
Okay.
> const char *name;
>
>and similarly for the callback.
Yes.
Will send v3 later today if there are no more comments.
Thanks!
>
>
>
>> +};
>> +
>> /**
>> * 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 virtqueue_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 virtqueue_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 virtqueue_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 v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 7:47 ` Michael S. Tsirkin
2024-07-04 9:42 ` Jiri Pirko
@ 2024-07-04 11:06 ` Jiri Pirko
2024-07-04 11:28 ` Michael S. Tsirkin
1 sibling, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 11:06 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Thu, Jul 04, 2024 at 09:47:09AM CEST, mst@redhat.com wrote:
>On Thu, Jul 04, 2024 at 08:43:35AM +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>
>> ---
>> v1->v2:
>> - fixed comments for struct virtqueue_info
>> - s/virtio_queue_info/virtqueue_info/
>> ---
>> 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..9b975c2830f6 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 virtqueue_info {
>> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
>> + * unused by driver.
>> + */
>> + vq_callback_t *callback; /* May be NULL for vq that does
>> + * not need a callback.
>> + */
>> + bool ctx;
>
>
> /*
> * Always
> * like this
> * outside of netdev code
> * and it comes before the code being documented
> */
>
> /* Never
> * like this
> */
How about to properly document the struct instead like this:
/**
* struct virtqueue_info - info for a virtqueue passed to find_vqs()
* @name: mainly for debugging, NULL for a virtqueue
* unused by the driver
* @callback: NULL for a virtqueue that does not need a callback
* @ctx: true to allow to maintain extra context per virtqueue
*/
struct virtqueue_info {
const char *name;
vq_callback_t *callback;
bool ctx;
};
>
>
>Also "may be null" is a bit confusing - it has to be null
>for such a vq.
>
>Thus:
>
> /*
> * name: mainly for debugging, NULL for a virtqueue
> * unused by the driver.
> */
> const char *name;
>
>and similarly for the callback.
>
>
>
>> +};
>> +
>> /**
>> * 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 virtqueue_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 virtqueue_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 virtqueue_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 v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 11:06 ` Jiri Pirko
@ 2024-07-04 11:28 ` Michael S. Tsirkin
2024-07-04 13:00 ` Jiri Pirko
0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-04 11:28 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
On Thu, Jul 04, 2024 at 01:06:12PM +0200, Jiri Pirko wrote:
> Thu, Jul 04, 2024 at 09:47:09AM CEST, mst@redhat.com wrote:
> >On Thu, Jul 04, 2024 at 08:43:35AM +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>
> >> ---
> >> v1->v2:
> >> - fixed comments for struct virtqueue_info
> >> - s/virtio_queue_info/virtqueue_info/
> >> ---
> >> 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..9b975c2830f6 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 virtqueue_info {
> >> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
> >> + * unused by driver.
> >> + */
> >> + vq_callback_t *callback; /* May be NULL for vq that does
> >> + * not need a callback.
> >> + */
> >> + bool ctx;
> >
> >
> > /*
> > * Always
> > * like this
> > * outside of netdev code
> > * and it comes before the code being documented
> > */
> >
> > /* Never
> > * like this
> > */
>
>
> How about to properly document the struct instead like this:
> /**
> * struct virtqueue_info - info for a virtqueue passed to find_vqs()
> * @name: mainly for debugging, NULL for a virtqueue
> * unused by the driver
> * @callback: NULL for a virtqueue that does not need a callback
> * @ctx: true to allow to maintain extra context per virtqueue
> */
> struct virtqueue_info {
> const char *name;
> vq_callback_t *callback;
> bool ctx;
> };
Sure. And actually include the explanation what the fields are then?
@name: virtqueue description
@callback: a callback to invoke on a used buffer notification
>
>
> >
> >
> >Also "may be null" is a bit confusing - it has to be null
> >for such a vq.
> >
> >Thus:
> >
> > /*
> > * name: mainly for debugging, NULL for a virtqueue
> > * unused by the driver.
> > */
> > const char *name;
> >
> >and similarly for the callback.
> >
> >
> >
> >> +};
> >> +
> >> /**
> >> * 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 virtqueue_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 virtqueue_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 virtqueue_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 v2 00/19] virtio: consolidate vq info args of find_vqs()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (18 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs() Jiri Pirko
@ 2024-07-04 11:33 ` Xuan Zhuo
2024-07-04 13:04 ` Jiri Pirko
19 siblings, 1 reply; 30+ messages in thread
From: Xuan Zhuo @ 2024-07-04 11:33 UTC (permalink / raw)
To: Jiri Pirko; +Cc: mst, jasowang, eperezma, parav, feliu, hengqi, virtualization
Do you know this: http://lore.kernel.org/all/20240424091533.86949-1-xuanzhuo@linux.alibaba.com
This seems to do the same thing. That works in process.
Thanks.
On Thu, 4 Jul 2024 08:43:31 +0200, Jiri Pirko <jiri@resnulli.us> 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.
>
> 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().
>
> ---
> v1->v2:
> - added forgotten VIRTIO_SND_VQ_MAX for array size in virtio_card.c
> - s/virtio_queue_info/virtqueue_info/
> - fixed comments for struct virtqueue_info
> - rebased on top of recent code changes (virtio_fs.c)
> - see individual patches changelog for more details
>
> 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 | 48 ++++++++-------
> drivers/virtio/virtio_pci_common.h | 3 +-
> 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, 238 insertions(+), 302 deletions(-)
>
> --
> 2.45.2
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 11:28 ` Michael S. Tsirkin
@ 2024-07-04 13:00 ` Jiri Pirko
2024-07-04 14:17 ` Michael S. Tsirkin
0 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 13:00 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Thu, Jul 04, 2024 at 01:28:03PM CEST, mst@redhat.com wrote:
>On Thu, Jul 04, 2024 at 01:06:12PM +0200, Jiri Pirko wrote:
>> Thu, Jul 04, 2024 at 09:47:09AM CEST, mst@redhat.com wrote:
>> >On Thu, Jul 04, 2024 at 08:43:35AM +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>
>> >> ---
>> >> v1->v2:
>> >> - fixed comments for struct virtqueue_info
>> >> - s/virtio_queue_info/virtqueue_info/
>> >> ---
>> >> 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..9b975c2830f6 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 virtqueue_info {
>> >> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
>> >> + * unused by driver.
>> >> + */
>> >> + vq_callback_t *callback; /* May be NULL for vq that does
>> >> + * not need a callback.
>> >> + */
>> >> + bool ctx;
>> >
>> >
>> > /*
>> > * Always
>> > * like this
>> > * outside of netdev code
>> > * and it comes before the code being documented
>> > */
>> >
>> > /* Never
>> > * like this
>> > */
>>
>>
>> How about to properly document the struct instead like this:
>> /**
>> * struct virtqueue_info - info for a virtqueue passed to find_vqs()
>> * @name: mainly for debugging, NULL for a virtqueue
>> * unused by the driver
>> * @callback: NULL for a virtqueue that does not need a callback
>> * @ctx: true to allow to maintain extra context per virtqueue
>> */
>> struct virtqueue_info {
>> const char *name;
>> vq_callback_t *callback;
>> bool ctx;
>> };
>
>Sure. And actually include the explanation what the fields are then?
>@name: virtqueue description
>@callback: a callback to invoke on a used buffer notification
Okay, how about:
/**
* struct virtqueue_info - Info for a virtqueue passed to find_vqs().
* @name: virtqueue description. Used mainly for debugging, NULL for
* a virtqueue unused by the driver.
* @callback: A callback to invoke on a used buffer notification.
* NULL for a virtqueue that does not need a callback.
* @ctx: A flag to indicate to maintain an extra context per virtqueue.
*/
struct virtqueue_info {
const char *name;
vq_callback_t *callback;
bool ctx;
};
?
>
>
>>
>>
>> >
>> >
>> >Also "may be null" is a bit confusing - it has to be null
>> >for such a vq.
>> >
>> >Thus:
>> >
>> > /*
>> > * name: mainly for debugging, NULL for a virtqueue
>> > * unused by the driver.
>> > */
>> > const char *name;
>> >
>> >and similarly for the callback.
>> >
>> >
>> >
>> >> +};
>> >> +
>> >> /**
>> >> * 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 virtqueue_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 virtqueue_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 virtqueue_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 v2 00/19] virtio: consolidate vq info args of find_vqs()
2024-07-04 11:33 ` [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Xuan Zhuo
@ 2024-07-04 13:04 ` Jiri Pirko
0 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 13:04 UTC (permalink / raw)
To: Xuan Zhuo; +Cc: mst, jasowang, eperezma, parav, feliu, hengqi, virtualization
Thu, Jul 04, 2024 at 01:33:29PM CEST, xuanzhuo@linux.alibaba.com wrote:
>Do you know this: http://lore.kernel.org/all/20240424091533.86949-1-xuanzhuo@linux.alibaba.com
>
>This seems to do the same thing. That works in process.
No clue about this. But your patchset is working thing on a slightly
different level. Still applicable on top of mine, I don't see any
problem.
>
>Thanks.
>
>On Thu, 4 Jul 2024 08:43:31 +0200, Jiri Pirko <jiri@resnulli.us> 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.
>>
>> 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().
>>
>> ---
>> v1->v2:
>> - added forgotten VIRTIO_SND_VQ_MAX for array size in virtio_card.c
>> - s/virtio_queue_info/virtqueue_info/
>> - fixed comments for struct virtqueue_info
>> - rebased on top of recent code changes (virtio_fs.c)
>> - see individual patches changelog for more details
>>
>> 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 | 48 ++++++++-------
>> drivers/virtio/virtio_pci_common.h | 3 +-
>> 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, 238 insertions(+), 302 deletions(-)
>>
>> --
>> 2.45.2
>>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 13:00 ` Jiri Pirko
@ 2024-07-04 14:17 ` Michael S. Tsirkin
0 siblings, 0 replies; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-04 14:17 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
On Thu, Jul 04, 2024 at 03:00:01PM +0200, Jiri Pirko wrote:
> Thu, Jul 04, 2024 at 01:28:03PM CEST, mst@redhat.com wrote:
> >On Thu, Jul 04, 2024 at 01:06:12PM +0200, Jiri Pirko wrote:
> >> Thu, Jul 04, 2024 at 09:47:09AM CEST, mst@redhat.com wrote:
> >> >On Thu, Jul 04, 2024 at 08:43:35AM +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>
> >> >> ---
> >> >> v1->v2:
> >> >> - fixed comments for struct virtqueue_info
> >> >> - s/virtio_queue_info/virtqueue_info/
> >> >> ---
> >> >> 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..9b975c2830f6 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 virtqueue_info {
> >> >> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
> >> >> + * unused by driver.
> >> >> + */
> >> >> + vq_callback_t *callback; /* May be NULL for vq that does
> >> >> + * not need a callback.
> >> >> + */
> >> >> + bool ctx;
> >> >
> >> >
> >> > /*
> >> > * Always
> >> > * like this
> >> > * outside of netdev code
> >> > * and it comes before the code being documented
> >> > */
> >> >
> >> > /* Never
> >> > * like this
> >> > */
> >>
> >>
> >> How about to properly document the struct instead like this:
> >> /**
> >> * struct virtqueue_info - info for a virtqueue passed to find_vqs()
> >> * @name: mainly for debugging, NULL for a virtqueue
> >> * unused by the driver
> >> * @callback: NULL for a virtqueue that does not need a callback
> >> * @ctx: true to allow to maintain extra context per virtqueue
> >> */
> >> struct virtqueue_info {
> >> const char *name;
> >> vq_callback_t *callback;
> >> bool ctx;
> >> };
> >
> >Sure. And actually include the explanation what the fields are then?
> >@name: virtqueue description
> >@callback: a callback to invoke on a used buffer notification
>
> Okay, how about:
>
> /**
> * struct virtqueue_info - Info for a virtqueue passed to find_vqs().
> * @name: virtqueue description. Used mainly for debugging, NULL for
> * a virtqueue unused by the driver.
> * @callback: A callback to invoke on a used buffer notification.
> * NULL for a virtqueue that does not need a callback.
> * @ctx: A flag to indicate to maintain an extra context per virtqueue.
> */
> struct virtqueue_info {
> const char *name;
> vq_callback_t *callback;
> bool ctx;
> };
>
>
> ?
Looks good to me.
>
>
> >
> >
> >>
> >>
> >> >
> >> >
> >> >Also "may be null" is a bit confusing - it has to be null
> >> >for such a vq.
> >> >
> >> >Thus:
> >> >
> >> > /*
> >> > * name: mainly for debugging, NULL for a virtqueue
> >> > * unused by the driver.
> >> > */
> >> > const char *name;
> >> >
> >> >and similarly for the callback.
> >> >
> >> >
> >> >
> >> >> +};
> >> >> +
> >> >> /**
> >> >> * 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 virtqueue_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 virtqueue_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 virtqueue_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 v2 06/19] virtio: convert find_vqs() op implementations to find_vqs_info()
2024-07-04 6:43 ` [PATCH virtio v2 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
@ 2024-07-05 7:43 ` Michael S. Tsirkin
2024-07-08 7:26 ` Jiri Pirko
0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-05 7:43 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
This is the riskiest patch.
Jiri, I'd ask you to cross-build it before posting,
wasn't done here.
On Thu, Jul 04, 2024 at 08:43:37AM +0200, Jiri Pirko wrote:
> 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>
> ---
> v1->v2:
> - s/virtio_queue_info/virtqueue_info/
> ---
> 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 77faa2cf3a13..c32a51017f9f 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 virtqueue_info vqs_info[],
> struct irq_affinity *desc)
> {
> struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
> + struct virtqueue_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];
vqi better declared here, it's unused outside the loop.
same elsewhere.
> + 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..1497a5a0a68f 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 virtqueue_info vqs_info[],
> struct irq_affinity *desc)
> {
> struct mlxbf_tmfifo_vdev *tm_vdev = mlxbf_vdev_to_tmfifo(vdev);
> struct mlxbf_tmfifo_vring *vring;
> + struct virtqueue_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..a82a7c13bdc5 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 virtqueue_info vqs_info[],
> struct irq_affinity *desc)
> {
> + struct virtqueue_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 d6491fc84e8c..1f1fa70cf09d 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 virtqueue_info vqs_info[],
> struct irq_affinity *desc)
> {
> struct virtio_ccw_device *vcdev = to_vc_device(vdev);
> + struct virtqueue_info *vqi;
> dma64_t *indicatorp = NULL;
> int ret, i, queue_idx = 0;
> struct ccw1 *ccw;
> @@ -705,14 +704,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) {
typo. we got lucky you didn't write vqs_info otherwise
it would build but not work correctly.
> 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;
> @@ -1079,7 +1078,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..533aca85b745 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 virtqueue_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 virtqueue_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..dcf0c2b19a44 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 virtqueue_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 virtqueue_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 [flat|nested] 30+ messages in thread
* Re: [PATCH virtio v2 06/19] virtio: convert find_vqs() op implementations to find_vqs_info()
2024-07-05 7:43 ` Michael S. Tsirkin
@ 2024-07-08 7:26 ` Jiri Pirko
0 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-08 7:26 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Fri, Jul 05, 2024 at 09:43:41AM CEST, mst@redhat.com wrote:
>This is the riskiest patch.
>Jiri, I'd ask you to cross-build it before posting,
>wasn't done here.
I relied on buildbot to do that. I didn't receive any issues from him.
Will try to build manually.
>
>On Thu, Jul 04, 2024 at 08:43:37AM +0200, Jiri Pirko wrote:
>> 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>
>> ---
>> v1->v2:
>> - s/virtio_queue_info/virtqueue_info/
>> ---
>> 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 77faa2cf3a13..c32a51017f9f 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 virtqueue_info vqs_info[],
>> struct irq_affinity *desc)
>> {
>> struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
>> + struct virtqueue_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];
>
>vqi better declared here, it's unused outside the loop.
>same elsewhere.
Why not.
>
>> + 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..1497a5a0a68f 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 virtqueue_info vqs_info[],
>> struct irq_affinity *desc)
>> {
>> struct mlxbf_tmfifo_vdev *tm_vdev = mlxbf_vdev_to_tmfifo(vdev);
>> struct mlxbf_tmfifo_vring *vring;
>> + struct virtqueue_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..a82a7c13bdc5 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 virtqueue_info vqs_info[],
>> struct irq_affinity *desc)
>> {
>> + struct virtqueue_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 d6491fc84e8c..1f1fa70cf09d 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 virtqueue_info vqs_info[],
>> struct irq_affinity *desc)
>> {
>> struct virtio_ccw_device *vcdev = to_vc_device(vdev);
>> + struct virtqueue_info *vqi;
>> dma64_t *indicatorp = NULL;
>> int ret, i, queue_idx = 0;
>> struct ccw1 *ccw;
>> @@ -705,14 +704,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) {
>
>typo. we got lucky you didn't write vqs_info otherwise
>it would build but not work correctly.
Will fix.
>
>
>> 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;
>> @@ -1079,7 +1078,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..533aca85b745 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 virtqueue_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 virtqueue_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..dcf0c2b19a44 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 virtqueue_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 virtqueue_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 [flat|nested] 30+ messages in thread
end of thread, other threads:[~2024-07-08 7:27 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
2024-07-04 7:47 ` Michael S. Tsirkin
2024-07-04 9:42 ` Jiri Pirko
2024-07-04 11:06 ` Jiri Pirko
2024-07-04 11:28 ` Michael S. Tsirkin
2024-07-04 13:00 ` Jiri Pirko
2024-07-04 14:17 ` Michael S. Tsirkin
2024-07-04 6:43 ` [PATCH virtio v2 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
2024-07-05 7:43 ` Michael S. Tsirkin
2024-07-08 7:26 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 08/19] virtio: remove the original find_vqs() op Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 09/19] virtio: rename find_vqs_info() op to find_vqs() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 10/19] virtio_blk: convert to use virtio_find_vqs_info() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 11/19] virtio_console: " Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 12/19] virtio_crypto: " Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 13/19] virtio_net: " Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 14/19] scsi: virtio_scsi: " Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 15/19] virtiofs: " Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 16/19] virtio_balloon: " Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs() Jiri Pirko
2024-07-04 11:33 ` [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Xuan Zhuo
2024-07-04 13:04 ` 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).