* [PATCH virtio 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
@ 2024-07-03 12:38 ` Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx() Jiri Pirko
` (18 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Since caif uses only one queue, convert to virtio_find_single_vq()
helper which is made for this purpose.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
drivers/net/caif/caif_virtio.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/caif/caif_virtio.c b/drivers/net/caif/caif_virtio.c
index 99d984851fef..7fea00c7ca8a 100644
--- a/drivers/net/caif/caif_virtio.c
+++ b/drivers/net/caif/caif_virtio.c
@@ -646,9 +646,7 @@ static inline void debugfs_init(struct cfv_info *cfv)
/* Setup CAIF for the a virtio device */
static int cfv_probe(struct virtio_device *vdev)
{
- vq_callback_t *vq_cbs = cfv_release_cb;
vrh_callback_t *vrh_cbs = cfv_recv;
- const char *names = "output";
const char *cfv_netdev_name = "cfvrt";
struct net_device *netdev;
struct cfv_info *cfv;
@@ -675,9 +673,11 @@ static int cfv_probe(struct virtio_device *vdev)
goto err;
/* Get the TX virtio ring. This is a "guest side vring". */
- err = virtio_find_vqs(vdev, 1, &cfv->vq_tx, &vq_cbs, &names, NULL);
- if (err)
+ cfv->vq_tx = virtio_find_single_vq(vdev, cfv_release_cb, "output");
+ if (IS_ERR(cfv->vq_tx)) {
+ err = PTR_ERR(cfv->vq_tx);
goto err;
+ }
/* Get the CAIF configuration from virtio config space, if available */
if (vdev->config->get) {
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
@ 2024-07-03 12:38 ` Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs() Jiri Pirko
` (17 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
In order to prepare for conversion of virtio_find_vqs*() arguments, make
virtio_find_vqs() to call virtio_find_vqs_ctx() instead of op directly.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
include/linux/virtio_config.h | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index da9b271b54db..d19eaf6bafbf 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -225,22 +225,23 @@ struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
}
static inline
-int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
+int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[],
+ const char * const names[], const bool *ctx,
struct irq_affinity *desc)
{
- return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, NULL, desc);
+ return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
+ desc);
}
static inline
-int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
+int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
+ const char * const names[],
struct irq_affinity *desc)
{
- return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
- desc);
+ return virtio_find_vqs_ctx(vdev, nvqs, vqs, callbacks,
+ names, NULL, desc);
}
/**
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx() Jiri Pirko
@ 2024-07-03 12:38 ` Jiri Pirko
2024-07-03 12:38 ` [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
` (16 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
In order to prepare for conversion of virtio_find_vqs*() arguments, make
virtio_find_single_vq() to call virtio_find_vqs() instead of
op directly.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
include/linux/virtio_config.h | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index d19eaf6bafbf..82a1d798b2f1 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -210,20 +210,6 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
}
-static inline
-struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
- vq_callback_t *c, const char *n)
-{
- vq_callback_t *callbacks[] = { c };
- const char *names[] = { n };
- struct virtqueue *vq;
- int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names, NULL,
- NULL);
- if (err < 0)
- return ERR_PTR(err);
- return vq;
-}
-
static inline
int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[], vq_callback_t *callbacks[],
@@ -244,6 +230,20 @@ int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
names, NULL, desc);
}
+static inline
+struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
+ vq_callback_t *c, const char *n)
+{
+ vq_callback_t *callbacks[] = { c };
+ const char *names[] = { n };
+ struct virtqueue *vq;
+ int err = virtio_find_vqs(vdev, 1, &vq, callbacks, names, NULL);
+
+ if (err < 0)
+ return ERR_PTR(err);
+ return vq;
+}
+
/**
* virtio_synchronize_cbs - synchronize with virtqueue callbacks
* @dev: the virtio device
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (2 preceding siblings ...)
2024-07-03 12:38 ` [PATCH virtio 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs() Jiri Pirko
@ 2024-07-03 12:38 ` Jiri Pirko
2024-07-03 13:02 ` Michael S. Tsirkin
2024-07-03 12:38 ` [PATCH virtio 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info() Jiri Pirko
` (15 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Introduce a structure virtio_queue_info to carry name, callback and ctx
together. In order to allow config implementations to accept config op
with array of virtio_queue_info structures, introduce a new
find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
Note that whole virtio_find_vqs_ctx() is going to be eventually removed
at the and of this patchset.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
1 file changed, 48 insertions(+), 3 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 82a1d798b2f1..21029afeede1 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -18,6 +18,16 @@ struct virtio_shm_region {
typedef void vq_callback_t(struct virtqueue *);
+struct virtio_queue_info {
+ const char *name; /* mainly for debugging, may be NULL for vq
+ * unused by driver.
+ */
+ vq_callback_t *callback; /* May be NULL for vq that do
+ * not need a callback.
+ */
+ bool ctx;
+};
+
/**
* struct virtio_config_ops - operations for configuring a virtio device
* Note: Do not assume that a transport implements all of the operations
@@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
* names: array of virtqueue names (mainly for debugging)
* include a NULL entry for vqs unused by driver
* Returns 0 on success or error status
+ * @find_vqs_info: find virtqueues and instantiate them.
+ * vdev: the virtio_device
+ * nvqs: the number of virtqueues to find
+ * vqs: on success, includes new virtqueues
+ * vqs_info: array of virtqueue info structures
+ * Returns 0 on success or error status
* @del_vqs: free virtqueues found by find_vqs().
* @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
* The function guarantees that all memory operations on the
@@ -109,6 +125,10 @@ struct virtio_config_ops {
struct virtqueue *vqs[], vq_callback_t *callbacks[],
const char * const names[], const bool *ctx,
struct irq_affinity *desc);
+ int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
+ struct virtqueue *vqs[],
+ struct virtio_queue_info vqs_info[],
+ struct irq_affinity *desc);
void (*del_vqs)(struct virtio_device *);
void (*synchronize_cbs)(struct virtio_device *);
u64 (*get_features)(struct virtio_device *vdev);
@@ -117,7 +137,7 @@ struct virtio_config_ops {
int (*set_vq_affinity)(struct virtqueue *vq,
const struct cpumask *cpu_mask);
const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
- int index);
+ int index);
bool (*get_shm_region)(struct virtio_device *vdev,
struct virtio_shm_region *region, u8 id);
int (*disable_vq_and_reset)(struct virtqueue *vq);
@@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
}
+static inline
+int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
+ struct virtqueue *vqs[],
+ struct virtio_queue_info vqs_info[],
+ struct irq_affinity *desc)
+{
+ return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
+}
+
static inline
int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[], vq_callback_t *callbacks[],
const char * const names[], const bool *ctx,
struct irq_affinity *desc)
{
- return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
- desc);
+ struct virtio_queue_info *vqs_info;
+ int err, i;
+
+ if (!vdev->config->find_vqs_info)
+ return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
+ names, ctx, desc);
+
+ vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
+ if (!vqs_info)
+ return -ENOMEM;
+ for (i = 0; i < nvqs; i++) {
+ vqs_info[i].name = names[i];
+ vqs_info[i].callback = callbacks[i];
+ vqs_info[i].ctx = ctx ? ctx[i] : false;
+ }
+ err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
+ kfree(vqs_info);
+ return err;
}
static inline
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-03 12:38 ` [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
@ 2024-07-03 13:02 ` Michael S. Tsirkin
2024-07-03 13:23 ` Jiri Pirko
0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-03 13:02 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
On Wed, Jul 03, 2024 at 02:38:58PM +0200, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@nvidia.com>
>
> Introduce a structure virtio_queue_info to carry name, callback and ctx
> together. In order to allow config implementations to accept config op
> with array of virtio_queue_info structures, introduce a new
> find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
> Note that whole virtio_find_vqs_ctx() is going to be eventually removed
> at the and of this patchset.
>
> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
> ---
> include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
> 1 file changed, 48 insertions(+), 3 deletions(-)
>
> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
> index 82a1d798b2f1..21029afeede1 100644
> --- a/include/linux/virtio_config.h
> +++ b/include/linux/virtio_config.h
> @@ -18,6 +18,16 @@ struct virtio_shm_region {
>
> typedef void vq_callback_t(struct virtqueue *);
>
> +struct virtio_queue_info {
I'd do virtio_queue_info -> virtqueue_info
linux$ git grep virtqueue_|wc -l
734
linux$ git grep virtio_queue_|wc -l
7
> + const char *name; /* mainly for debugging, may be NULL for vq
Capital M pls.
vq -> a virtqueue
> + * unused by driver.
> + */
> + vq_callback_t *callback; /* May be NULL for vq that do
do -> does
> + * not need a callback.
> + */
/*
* Use this style for comments
* which do not fit on one line, please.
*/
int and_the_code_comes_here_afterwards;
> + bool ctx;
> +};
> +
> /**
> * struct virtio_config_ops - operations for configuring a virtio device
> * Note: Do not assume that a transport implements all of the operations
> @@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
> * names: array of virtqueue names (mainly for debugging)
> * include a NULL entry for vqs unused by driver
> * Returns 0 on success or error status
> + * @find_vqs_info: find virtqueues and instantiate them.
> + * vdev: the virtio_device
> + * nvqs: the number of virtqueues to find
> + * vqs: on success, includes new virtqueues
> + * vqs_info: array of virtqueue info structures
See, here you actually said "virtqueue info"
> + * Returns 0 on success or error status
> * @del_vqs: free virtqueues found by find_vqs().
> * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
> * The function guarantees that all memory operations on the
> @@ -109,6 +125,10 @@ struct virtio_config_ops {
> struct virtqueue *vqs[], vq_callback_t *callbacks[],
> const char * const names[], const bool *ctx,
> struct irq_affinity *desc);
> + int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
> + struct virtqueue *vqs[],
> + struct virtio_queue_info vqs_info[],
> + struct irq_affinity *desc);
> void (*del_vqs)(struct virtio_device *);
> void (*synchronize_cbs)(struct virtio_device *);
> u64 (*get_features)(struct virtio_device *vdev);
> @@ -117,7 +137,7 @@ struct virtio_config_ops {
> int (*set_vq_affinity)(struct virtqueue *vq,
> const struct cpumask *cpu_mask);
> const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
> - int index);
> + int index);
> bool (*get_shm_region)(struct virtio_device *vdev,
> struct virtio_shm_region *region, u8 id);
> int (*disable_vq_and_reset)(struct virtqueue *vq);
> @@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
> return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
> }
>
> +static inline
> +int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
> + struct virtqueue *vqs[],
> + struct virtio_queue_info vqs_info[],
> + struct irq_affinity *desc)
> +{
> + return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
> +}
> +
> static inline
> int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
> struct virtqueue *vqs[], vq_callback_t *callbacks[],
> const char * const names[], const bool *ctx,
> struct irq_affinity *desc)
> {
> - return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
> - desc);
> + struct virtio_queue_info *vqs_info;
> + int err, i;
> +
> + if (!vdev->config->find_vqs_info)
> + return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
> + names, ctx, desc);
> +
> + vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
> + if (!vqs_info)
> + return -ENOMEM;
> + for (i = 0; i < nvqs; i++) {
> + vqs_info[i].name = names[i];
> + vqs_info[i].callback = callbacks[i];
> + vqs_info[i].ctx = ctx ? ctx[i] : false;
> + }
> + err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
> + kfree(vqs_info);
> + return err;
> }
>
> static inline
> --
> 2.45.2
^ permalink raw reply [flat|nested] 30+ messages in thread* Re: [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-03 13:02 ` Michael S. Tsirkin
@ 2024-07-03 13:23 ` Jiri Pirko
0 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 13:23 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Wed, Jul 03, 2024 at 03:02:58PM CEST, mst@redhat.com wrote:
>On Wed, Jul 03, 2024 at 02:38:58PM +0200, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@nvidia.com>
>>
>> Introduce a structure virtio_queue_info to carry name, callback and ctx
>> together. In order to allow config implementations to accept config op
>> with array of virtio_queue_info structures, introduce a new
>> find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
>> Note that whole virtio_find_vqs_ctx() is going to be eventually removed
>> at the and of this patchset.
>>
>> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
>> ---
>> include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
>> 1 file changed, 48 insertions(+), 3 deletions(-)
>>
>> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
>> index 82a1d798b2f1..21029afeede1 100644
>> --- a/include/linux/virtio_config.h
>> +++ b/include/linux/virtio_config.h
>> @@ -18,6 +18,16 @@ struct virtio_shm_region {
>>
>> typedef void vq_callback_t(struct virtqueue *);
>>
>> +struct virtio_queue_info {
>
>I'd do virtio_queue_info -> virtqueue_info
Okay.
>
>linux$ git grep virtqueue_|wc -l
>734
>linux$ git grep virtio_queue_|wc -l
>7
>
>
>
>> + const char *name; /* mainly for debugging, may be NULL for vq
>
>Capital M pls.
>vq -> a virtqueue
Okay.
>
>> + * unused by driver.
>> + */
>> + vq_callback_t *callback; /* May be NULL for vq that do
>
>do -> does
Okay.
>
>> + * not need a callback.
>> + */
>
>
> /*
> * Use this style for comments
> * which do not fit on one line, please.
> */
> int and_the_code_comes_here_afterwards;
>
>
>
>
>> + bool ctx;
>> +};
>> +
>> /**
>> * struct virtio_config_ops - operations for configuring a virtio device
>> * Note: Do not assume that a transport implements all of the operations
>> @@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
>> * names: array of virtqueue names (mainly for debugging)
>> * include a NULL entry for vqs unused by driver
>> * Returns 0 on success or error status
>> + * @find_vqs_info: find virtqueues and instantiate them.
>> + * vdev: the virtio_device
>> + * nvqs: the number of virtqueues to find
>> + * vqs: on success, includes new virtqueues
>> + * vqs_info: array of virtqueue info structures
>
>See, here you actually said "virtqueue info"
:)
>
>> + * Returns 0 on success or error status
>> * @del_vqs: free virtqueues found by find_vqs().
>> * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
>> * The function guarantees that all memory operations on the
>> @@ -109,6 +125,10 @@ struct virtio_config_ops {
>> struct virtqueue *vqs[], vq_callback_t *callbacks[],
>> const char * const names[], const bool *ctx,
>> struct irq_affinity *desc);
>> + int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
>> + struct virtqueue *vqs[],
>> + struct virtio_queue_info vqs_info[],
>> + struct irq_affinity *desc);
>> void (*del_vqs)(struct virtio_device *);
>> void (*synchronize_cbs)(struct virtio_device *);
>> u64 (*get_features)(struct virtio_device *vdev);
>> @@ -117,7 +137,7 @@ struct virtio_config_ops {
>> int (*set_vq_affinity)(struct virtqueue *vq,
>> const struct cpumask *cpu_mask);
>> const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
>> - int index);
>> + int index);
>> bool (*get_shm_region)(struct virtio_device *vdev,
>> struct virtio_shm_region *region, u8 id);
>> int (*disable_vq_and_reset)(struct virtqueue *vq);
>> @@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
>> return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
>> }
>>
>> +static inline
>> +int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
>> + struct virtqueue *vqs[],
>> + struct virtio_queue_info vqs_info[],
>> + struct irq_affinity *desc)
>> +{
>> + return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
>> +}
>> +
>> static inline
>> int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
>> struct virtqueue *vqs[], vq_callback_t *callbacks[],
>> const char * const names[], const bool *ctx,
>> struct irq_affinity *desc)
>> {
>> - return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
>> - desc);
>> + struct virtio_queue_info *vqs_info;
>> + int err, i;
>> +
>> + if (!vdev->config->find_vqs_info)
>> + return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
>> + names, ctx, desc);
>> +
>> + vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
>> + if (!vqs_info)
>> + return -ENOMEM;
>> + for (i = 0; i < nvqs; i++) {
>> + vqs_info[i].name = names[i];
>> + vqs_info[i].callback = callbacks[i];
>> + vqs_info[i].ctx = ctx ? ctx[i] : false;
>> + }
>> + err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
>> + kfree(vqs_info);
>> + return err;
>> }
>>
>> static inline
>> --
>> 2.45.2
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH virtio 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (3 preceding siblings ...)
2024-07-03 12:38 ` [PATCH virtio 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
@ 2024-07-03 12:38 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
` (14 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:38 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Convert existing vp_find_vqs() and vp_modern_find_vqs() implementations
to find_vqs_info() config op.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
drivers/virtio/virtio_pci_common.c | 49 ++++++++++++++++--------------
drivers/virtio/virtio_pci_common.h | 4 +--
drivers/virtio/virtio_pci_legacy.c | 2 +-
drivers/virtio/virtio_pci_modern.c | 9 +++---
4 files changed, 34 insertions(+), 30 deletions(-)
diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
index f6b0b00e4599..ce9cce6f6a08 100644
--- a/drivers/virtio/virtio_pci_common.c
+++ b/drivers/virtio/virtio_pci_common.c
@@ -285,12 +285,13 @@ void vp_del_vqs(struct virtio_device *vdev)
}
static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], bool per_vq_vectors,
- const bool *ctx,
- struct irq_affinity *desc)
+ struct virtqueue *vqs[],
+ struct virtio_queue_info vqs_info[],
+ bool per_vq_vectors,
+ struct irq_affinity *desc)
{
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+ struct virtio_queue_info *vqi;
u16 msix_vec;
int i, err, nvectors, allocated_vectors, queue_idx = 0;
@@ -301,9 +302,11 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
if (per_vq_vectors) {
/* Best option: one for change interrupt, one per vq. */
nvectors = 1;
- for (i = 0; i < nvqs; ++i)
- if (names[i] && callbacks[i])
+ for (i = 0; i < nvqs; ++i) {
+ vqi = &vqs_info[i];
+ if (vqi->name && vqi->callback)
++nvectors;
+ }
} else {
/* Second best: one for change, shared for all vqs. */
nvectors = 2;
@@ -317,20 +320,20 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
vp_dev->per_vq_vectors = per_vq_vectors;
allocated_vectors = vp_dev->msix_used_vectors;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- if (!callbacks[i])
+ if (!vqi->callback)
msix_vec = VIRTIO_MSI_NO_VECTOR;
else if (vp_dev->per_vq_vectors)
msix_vec = allocated_vectors++;
else
msix_vec = VP_MSIX_VQ_VECTOR;
- vqs[i] = vp_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
- ctx ? ctx[i] : false,
- msix_vec);
+ vqs[i] = vp_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx, msix_vec);
if (IS_ERR(vqs[i])) {
err = PTR_ERR(vqs[i]);
goto error_find;
@@ -343,7 +346,7 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
snprintf(vp_dev->msix_names[msix_vec],
sizeof *vp_dev->msix_names,
"%s-%s",
- dev_name(&vp_dev->vdev.dev), names[i]);
+ dev_name(&vp_dev->vdev.dev), vqi->name);
err = request_irq(pci_irq_vector(vp_dev->pci_dev, msix_vec),
vring_interrupt, 0,
vp_dev->msix_names[msix_vec],
@@ -361,10 +364,11 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
}
static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx)
+ struct virtqueue *vqs[],
+ struct virtio_queue_info vqs_info[])
{
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+ struct virtio_queue_info *vqi;
int i, err, queue_idx = 0;
vp_dev->vqs = kcalloc(nvqs, sizeof(*vp_dev->vqs), GFP_KERNEL);
@@ -379,12 +383,13 @@ static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
vp_dev->intx_enabled = 1;
vp_dev->per_vq_vectors = false;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = vp_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
- ctx ? ctx[i] : false,
+ vqs[i] = vp_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx,
VIRTIO_MSI_NO_VECTOR);
if (IS_ERR(vqs[i])) {
err = PTR_ERR(vqs[i]);
@@ -400,25 +405,25 @@ static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
/* the config->find_vqs() implementation */
int vp_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
+ struct virtqueue *vqs[],
+ struct virtio_queue_info vqs_info[],
struct irq_affinity *desc)
{
int err;
/* Try MSI-X with one vector per queue. */
- err = vp_find_vqs_msix(vdev, nvqs, vqs, callbacks, names, true, ctx, desc);
+ err = vp_find_vqs_msix(vdev, nvqs, vqs, vqs_info, true, desc);
if (!err)
return 0;
/* Fallback: MSI-X with one vector for config, one shared for queues. */
- err = vp_find_vqs_msix(vdev, nvqs, vqs, callbacks, names, false, ctx, desc);
+ err = vp_find_vqs_msix(vdev, nvqs, vqs, vqs_info, false, desc);
if (!err)
return 0;
/* Is there an interrupt? If not give up. */
if (!(to_vp_device(vdev)->pci_dev->irq))
return err;
/* Finally fall back to regular interrupts. */
- return vp_find_vqs_intx(vdev, nvqs, vqs, callbacks, names, ctx);
+ return vp_find_vqs_intx(vdev, nvqs, vqs, vqs_info);
}
const char *vp_bus_name(struct virtio_device *vdev)
diff --git a/drivers/virtio/virtio_pci_common.h b/drivers/virtio/virtio_pci_common.h
index 7fef52bee455..d7e65631b5f6 100644
--- a/drivers/virtio/virtio_pci_common.h
+++ b/drivers/virtio/virtio_pci_common.h
@@ -127,8 +127,8 @@ bool vp_notify(struct virtqueue *vq);
void vp_del_vqs(struct virtio_device *vdev);
/* the config->find_vqs() implementation */
int vp_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
+ struct virtqueue *vqs[],
+ struct virtio_queue_info vqs_info[],
struct irq_affinity *desc);
const char *vp_bus_name(struct virtio_device *vdev);
diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
index d9cbb02b35a1..a9786e38d763 100644
--- a/drivers/virtio/virtio_pci_legacy.c
+++ b/drivers/virtio/virtio_pci_legacy.c
@@ -192,7 +192,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs = vp_find_vqs,
+ .find_vqs_info = vp_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index f62b530aa3b5..20933b9f2568 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -595,13 +595,12 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
static int vp_modern_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
+ struct virtio_queue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
struct virtqueue *vq;
- int rc = vp_find_vqs(vdev, nvqs, vqs, callbacks, names, ctx, desc);
+ int rc = vp_find_vqs(vdev, nvqs, vqs, vqs_info, desc);
if (rc)
return rc;
@@ -782,7 +781,7 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs = vp_modern_find_vqs,
+ .find_vqs_info = vp_modern_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
@@ -804,7 +803,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs = vp_modern_find_vqs,
+ .find_vqs_info = vp_modern_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 06/19] virtio: convert find_vqs() op implementations to find_vqs_info()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (4 preceding siblings ...)
2024-07-03 12:38 ` [PATCH virtio 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info() Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly Jiri Pirko
` (13 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Convert existing find_vqs() transport implementations
to use find_vqs_info() config op.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
arch/um/drivers/virtio_uml.c | 14 ++++++++------
drivers/platform/mellanox/mlxbf-tmfifo.c | 12 ++++++------
drivers/remoteproc/remoteproc_virtio.c | 14 +++++++-------
drivers/s390/virtio/virtio_ccw.c | 15 +++++++--------
drivers/virtio/virtio_mmio.c | 14 +++++++-------
drivers/virtio/virtio_vdpa.c | 15 +++++++--------
6 files changed, 42 insertions(+), 42 deletions(-)
diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
index 8adca2000e51..a87f0bcd36b5 100644
--- a/arch/um/drivers/virtio_uml.c
+++ b/arch/um/drivers/virtio_uml.c
@@ -1014,11 +1014,12 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
}
static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
+ struct virtqueue *vqs[],
+ struct virtio_queue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
+ struct virtio_queue_info *vqi;
int i, queue_idx = 0, rc;
struct virtqueue *vq;
@@ -1031,13 +1032,14 @@ static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
return rc;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = vu_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
- ctx ? ctx[i] : false);
+ vqs[i] = vu_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx);
if (IS_ERR(vqs[i])) {
rc = PTR_ERR(vqs[i]);
goto error_setup;
@@ -1097,7 +1099,7 @@ static const struct virtio_config_ops virtio_uml_config_ops = {
.get_status = vu_get_status,
.set_status = vu_set_status,
.reset = vu_reset,
- .find_vqs = vu_find_vqs,
+ .find_vqs_info = vu_find_vqs,
.del_vqs = vu_del_vqs,
.get_features = vu_get_features,
.finalize_features = vu_finalize_features,
diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
index b8d1e32e97eb..825116bd2db9 100644
--- a/drivers/platform/mellanox/mlxbf-tmfifo.c
+++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
@@ -1058,13 +1058,12 @@ static void mlxbf_tmfifo_virtio_del_vqs(struct virtio_device *vdev)
static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
unsigned int nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[],
- const bool *ctx,
+ struct virtio_queue_info vqs_info[],
struct irq_affinity *desc)
{
struct mlxbf_tmfifo_vdev *tm_vdev = mlxbf_vdev_to_tmfifo(vdev);
struct mlxbf_tmfifo_vring *vring;
+ struct virtio_queue_info *vqi;
struct virtqueue *vq;
int i, ret, size;
@@ -1072,7 +1071,8 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
return -EINVAL;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
ret = -EINVAL;
goto error;
}
@@ -1084,7 +1084,7 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
vq = vring_new_virtqueue(i, vring->num, vring->align, vdev,
false, false, vring->va,
mlxbf_tmfifo_virtio_notify,
- callbacks[i], names[i]);
+ vqi->callback, vqi->name);
if (!vq) {
dev_err(&vdev->dev, "vring_new_virtqueue failed\n");
ret = -ENOMEM;
@@ -1175,7 +1175,7 @@ static void tmfifo_virtio_dev_release(struct device *device)
static const struct virtio_config_ops mlxbf_tmfifo_virtio_config_ops = {
.get_features = mlxbf_tmfifo_virtio_get_features,
.finalize_features = mlxbf_tmfifo_virtio_finalize_features,
- .find_vqs = mlxbf_tmfifo_virtio_find_vqs,
+ .find_vqs_info = mlxbf_tmfifo_virtio_find_vqs,
.del_vqs = mlxbf_tmfifo_virtio_del_vqs,
.reset = mlxbf_tmfifo_virtio_reset,
.set_status = mlxbf_tmfifo_virtio_set_status,
diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
index 25b66b113b69..85a678e99bfb 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -182,21 +182,21 @@ static void rproc_virtio_del_vqs(struct virtio_device *vdev)
static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[],
- const bool * ctx,
+ struct virtio_queue_info vqs_info[],
struct irq_affinity *desc)
{
+ struct virtio_queue_info *vqi;
int i, ret, queue_idx = 0;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = rp_find_vq(vdev, queue_idx++, callbacks[i], names[i],
- ctx ? ctx[i] : false);
+ vqs[i] = rp_find_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx);
if (IS_ERR(vqs[i])) {
ret = PTR_ERR(vqs[i]);
goto error;
@@ -327,7 +327,7 @@ static void rproc_virtio_set(struct virtio_device *vdev, unsigned int offset,
static const struct virtio_config_ops rproc_virtio_config_ops = {
.get_features = rproc_virtio_get_features,
.finalize_features = rproc_virtio_finalize_features,
- .find_vqs = rproc_virtio_find_vqs,
+ .find_vqs_info = rproc_virtio_find_vqs,
.del_vqs = rproc_virtio_del_vqs,
.reset = rproc_virtio_reset,
.set_status = rproc_virtio_set_status,
diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
index d7569f395559..f92303f92c0c 100644
--- a/drivers/s390/virtio/virtio_ccw.c
+++ b/drivers/s390/virtio/virtio_ccw.c
@@ -689,12 +689,11 @@ static int virtio_ccw_register_adapter_ind(struct virtio_ccw_device *vcdev,
static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[],
- const bool *ctx,
+ struct virtio_queue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_ccw_device *vcdev = to_vc_device(vdev);
+ struct virtio_queue_info *vqi;
dma64_t *indicatorp = NULL;
int ret, i, queue_idx = 0;
struct ccw1 *ccw;
@@ -704,14 +703,14 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
return -ENOMEM;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vq_info->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, callbacks[i],
- names[i], ctx ? ctx[i] : false,
- ccw);
+ vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx, ccw);
if (IS_ERR(vqs[i])) {
ret = PTR_ERR(vqs[i]);
vqs[i] = NULL;
@@ -1077,7 +1076,7 @@ static const struct virtio_config_ops virtio_ccw_config_ops = {
.get_status = virtio_ccw_get_status,
.set_status = virtio_ccw_set_status,
.reset = virtio_ccw_reset,
- .find_vqs = virtio_ccw_find_vqs,
+ .find_vqs_info = virtio_ccw_find_vqs,
.del_vqs = virtio_ccw_del_vqs,
.bus_name = virtio_ccw_bus_name,
.synchronize_cbs = virtio_ccw_synchronize_cbs,
diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
index 173596589c71..1aa7988b5f31 100644
--- a/drivers/virtio/virtio_mmio.c
+++ b/drivers/virtio/virtio_mmio.c
@@ -489,13 +489,12 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[],
- const bool *ctx,
+ struct virtio_queue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
int irq = platform_get_irq(vm_dev->pdev, 0);
+ struct virtio_queue_info *vqi;
int i, err, queue_idx = 0;
if (irq < 0)
@@ -510,13 +509,14 @@ static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
enable_irq_wake(irq);
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = vm_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
- ctx ? ctx[i] : false);
+ vqs[i] = vm_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx);
if (IS_ERR(vqs[i])) {
vm_del_vqs(vdev);
return PTR_ERR(vqs[i]);
@@ -570,7 +570,7 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
.get_status = vm_get_status,
.set_status = vm_set_status,
.reset = vm_reset,
- .find_vqs = vm_find_vqs,
+ .find_vqs_info = vm_find_vqs,
.del_vqs = vm_del_vqs,
.get_features = vm_get_features,
.finalize_features = vm_finalize_features,
diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
index e803db0da307..39db3b8ac85b 100644
--- a/drivers/virtio/virtio_vdpa.c
+++ b/drivers/virtio/virtio_vdpa.c
@@ -358,15 +358,14 @@ create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd)
static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[],
- const bool *ctx,
+ struct virtio_queue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_vdpa_device *vd_dev = to_virtio_vdpa_device(vdev);
struct vdpa_device *vdpa = vd_get_vdpa(vdev);
const struct vdpa_config_ops *ops = vdpa->config;
struct irq_affinity default_affd = { 0 };
+ struct virtio_queue_info *vqi;
struct cpumask *masks;
struct vdpa_callback cb;
bool has_affinity = desc && ops->set_vq_affinity;
@@ -379,14 +378,14 @@ static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
}
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++,
- callbacks[i], names[i], ctx ?
- ctx[i] : false);
+ vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx);
if (IS_ERR(vqs[i])) {
err = PTR_ERR(vqs[i]);
goto err_setup_vq;
@@ -470,7 +469,7 @@ static const struct virtio_config_ops virtio_vdpa_config_ops = {
.get_status = virtio_vdpa_get_status,
.set_status = virtio_vdpa_set_status,
.reset = virtio_vdpa_reset,
- .find_vqs = virtio_vdpa_find_vqs,
+ .find_vqs_info = virtio_vdpa_find_vqs,
.del_vqs = virtio_vdpa_del_vqs,
.get_features = virtio_vdpa_get_features,
.finalize_features = virtio_vdpa_finalize_features,
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (5 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 08/19] virtio: remove the original find_vqs() op Jiri Pirko
` (12 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Since there are no more implementations of find_vqs() op, call
virtio_find_vqs_info() from virtio_find_single_vq() directly.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
include/linux/virtio_config.h | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 21029afeede1..76bf74a985f6 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -279,10 +279,11 @@ static inline
struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
vq_callback_t *c, const char *n)
{
- vq_callback_t *callbacks[] = { c };
- const char *names[] = { n };
+ struct virtio_queue_info vqs_info[] = {
+ { n, c },
+ };
struct virtqueue *vq;
- int err = virtio_find_vqs(vdev, 1, &vq, callbacks, names, NULL);
+ int err = virtio_find_vqs_info(vdev, 1, &vq, vqs_info, NULL);
if (err < 0)
return ERR_PTR(err);
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 08/19] virtio: remove the original find_vqs() op
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (6 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 09/19] virtio: rename find_vqs_info() op to find_vqs() Jiri Pirko
` (11 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
As it is no longer used, remove it.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
include/linux/virtio_config.h | 17 -----------------
1 file changed, 17 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 76bf74a985f6..48edb88a998d 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -59,15 +59,6 @@ struct virtio_queue_info {
* After this, status and feature negotiation must be done again
* Device must not be reset from its vq/config callbacks, or in
* parallel with being added/removed.
- * @find_vqs: find virtqueues and instantiate them.
- * vdev: the virtio_device
- * nvqs: the number of virtqueues to find
- * vqs: on success, includes new virtqueues
- * callbacks: array of callbacks, for each virtqueue
- * include a NULL entry for vqs that do not need a callback
- * names: array of virtqueue names (mainly for debugging)
- * include a NULL entry for vqs unused by driver
- * Returns 0 on success or error status
* @find_vqs_info: find virtqueues and instantiate them.
* vdev: the virtio_device
* nvqs: the number of virtqueues to find
@@ -121,10 +112,6 @@ struct virtio_config_ops {
u8 (*get_status)(struct virtio_device *vdev);
void (*set_status)(struct virtio_device *vdev, u8 status);
void (*reset)(struct virtio_device *vdev);
- int (*find_vqs)(struct virtio_device *, unsigned nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
- struct irq_affinity *desc);
int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue *vqs[],
struct virtio_queue_info vqs_info[],
@@ -248,10 +235,6 @@ int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
struct virtio_queue_info *vqs_info;
int err, i;
- if (!vdev->config->find_vqs_info)
- return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
- names, ctx, desc);
-
vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
if (!vqs_info)
return -ENOMEM;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 09/19] virtio: rename find_vqs_info() op to find_vqs()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (7 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 08/19] virtio: remove the original find_vqs() op Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 10/19] virtio_blk: convert to use virtio_find_vqs_info() Jiri Pirko
` (10 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Since the original find_vqs() is no longer present, rename
find_vqs_info() back to find_vqs().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
arch/um/drivers/virtio_uml.c | 2 +-
drivers/platform/mellanox/mlxbf-tmfifo.c | 2 +-
drivers/remoteproc/remoteproc_virtio.c | 2 +-
drivers/s390/virtio/virtio_ccw.c | 2 +-
drivers/virtio/virtio_mmio.c | 2 +-
drivers/virtio/virtio_pci_legacy.c | 2 +-
drivers/virtio/virtio_pci_modern.c | 4 ++--
drivers/virtio/virtio_vdpa.c | 2 +-
include/linux/virtio_config.h | 12 ++++++------
9 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
index a87f0bcd36b5..99cded70ecfb 100644
--- a/arch/um/drivers/virtio_uml.c
+++ b/arch/um/drivers/virtio_uml.c
@@ -1099,7 +1099,7 @@ static const struct virtio_config_ops virtio_uml_config_ops = {
.get_status = vu_get_status,
.set_status = vu_set_status,
.reset = vu_reset,
- .find_vqs_info = vu_find_vqs,
+ .find_vqs = vu_find_vqs,
.del_vqs = vu_del_vqs,
.get_features = vu_get_features,
.finalize_features = vu_finalize_features,
diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
index 825116bd2db9..d8f7773875f9 100644
--- a/drivers/platform/mellanox/mlxbf-tmfifo.c
+++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
@@ -1175,7 +1175,7 @@ static void tmfifo_virtio_dev_release(struct device *device)
static const struct virtio_config_ops mlxbf_tmfifo_virtio_config_ops = {
.get_features = mlxbf_tmfifo_virtio_get_features,
.finalize_features = mlxbf_tmfifo_virtio_finalize_features,
- .find_vqs_info = mlxbf_tmfifo_virtio_find_vqs,
+ .find_vqs = mlxbf_tmfifo_virtio_find_vqs,
.del_vqs = mlxbf_tmfifo_virtio_del_vqs,
.reset = mlxbf_tmfifo_virtio_reset,
.set_status = mlxbf_tmfifo_virtio_set_status,
diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
index 85a678e99bfb..dde5fb173e54 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -327,7 +327,7 @@ static void rproc_virtio_set(struct virtio_device *vdev, unsigned int offset,
static const struct virtio_config_ops rproc_virtio_config_ops = {
.get_features = rproc_virtio_get_features,
.finalize_features = rproc_virtio_finalize_features,
- .find_vqs_info = rproc_virtio_find_vqs,
+ .find_vqs = rproc_virtio_find_vqs,
.del_vqs = rproc_virtio_del_vqs,
.reset = rproc_virtio_reset,
.set_status = rproc_virtio_set_status,
diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
index f92303f92c0c..9d111b5992e5 100644
--- a/drivers/s390/virtio/virtio_ccw.c
+++ b/drivers/s390/virtio/virtio_ccw.c
@@ -1076,7 +1076,7 @@ static const struct virtio_config_ops virtio_ccw_config_ops = {
.get_status = virtio_ccw_get_status,
.set_status = virtio_ccw_set_status,
.reset = virtio_ccw_reset,
- .find_vqs_info = virtio_ccw_find_vqs,
+ .find_vqs = virtio_ccw_find_vqs,
.del_vqs = virtio_ccw_del_vqs,
.bus_name = virtio_ccw_bus_name,
.synchronize_cbs = virtio_ccw_synchronize_cbs,
diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
index 1aa7988b5f31..c1951fff8212 100644
--- a/drivers/virtio/virtio_mmio.c
+++ b/drivers/virtio/virtio_mmio.c
@@ -570,7 +570,7 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
.get_status = vm_get_status,
.set_status = vm_set_status,
.reset = vm_reset,
- .find_vqs_info = vm_find_vqs,
+ .find_vqs = vm_find_vqs,
.del_vqs = vm_del_vqs,
.get_features = vm_get_features,
.finalize_features = vm_finalize_features,
diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
index a9786e38d763..d9cbb02b35a1 100644
--- a/drivers/virtio/virtio_pci_legacy.c
+++ b/drivers/virtio/virtio_pci_legacy.c
@@ -192,7 +192,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs_info = vp_find_vqs,
+ .find_vqs = vp_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index 20933b9f2568..787bc534b05c 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -781,7 +781,7 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs_info = vp_modern_find_vqs,
+ .find_vqs = vp_modern_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
@@ -803,7 +803,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs_info = vp_modern_find_vqs,
+ .find_vqs = vp_modern_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
index 39db3b8ac85b..f90ecf587ce2 100644
--- a/drivers/virtio/virtio_vdpa.c
+++ b/drivers/virtio/virtio_vdpa.c
@@ -469,7 +469,7 @@ static const struct virtio_config_ops virtio_vdpa_config_ops = {
.get_status = virtio_vdpa_get_status,
.set_status = virtio_vdpa_set_status,
.reset = virtio_vdpa_reset,
- .find_vqs_info = virtio_vdpa_find_vqs,
+ .find_vqs = virtio_vdpa_find_vqs,
.del_vqs = virtio_vdpa_del_vqs,
.get_features = virtio_vdpa_get_features,
.finalize_features = virtio_vdpa_finalize_features,
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 48edb88a998d..24bbb1805b80 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -59,7 +59,7 @@ struct virtio_queue_info {
* After this, status and feature negotiation must be done again
* Device must not be reset from its vq/config callbacks, or in
* parallel with being added/removed.
- * @find_vqs_info: find virtqueues and instantiate them.
+ * @find_vqs: find virtqueues and instantiate them.
* vdev: the virtio_device
* nvqs: the number of virtqueues to find
* vqs: on success, includes new virtqueues
@@ -112,10 +112,10 @@ struct virtio_config_ops {
u8 (*get_status)(struct virtio_device *vdev);
void (*set_status)(struct virtio_device *vdev, u8 status);
void (*reset)(struct virtio_device *vdev);
- int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[],
- struct virtio_queue_info vqs_info[],
- struct irq_affinity *desc);
+ int (*find_vqs)(struct virtio_device *vdev, unsigned int nvqs,
+ struct virtqueue *vqs[],
+ struct virtio_queue_info vqs_info[],
+ struct irq_affinity *desc);
void (*del_vqs)(struct virtio_device *);
void (*synchronize_cbs)(struct virtio_device *);
u64 (*get_features)(struct virtio_device *vdev);
@@ -223,7 +223,7 @@ int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
struct virtio_queue_info vqs_info[],
struct irq_affinity *desc)
{
- return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
+ return vdev->config->find_vqs(vdev, nvqs, vqs, vqs_info, desc);
}
static inline
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 10/19] virtio_blk: convert to use virtio_find_vqs_info()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (8 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 09/19] virtio: rename find_vqs_info() op to find_vqs() Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 11/19] virtio_console: " Jiri Pirko
` (9 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
drivers/block/virtio_blk.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 46bdbad1ab48..574498280dee 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -964,8 +964,7 @@ static int init_vq(struct virtio_blk *vblk)
{
int err;
unsigned short i;
- vq_callback_t **callbacks;
- const char **names;
+ struct virtio_queue_info *vqs_info;
struct virtqueue **vqs;
unsigned short num_vqs;
unsigned short num_poll_vqs;
@@ -1002,28 +1001,26 @@ static int init_vq(struct virtio_blk *vblk)
if (!vblk->vqs)
return -ENOMEM;
- names = kmalloc_array(num_vqs, sizeof(*names), GFP_KERNEL);
- callbacks = kmalloc_array(num_vqs, sizeof(*callbacks), GFP_KERNEL);
+ vqs_info = kcalloc(num_vqs, sizeof(*vqs_info), GFP_KERNEL);
vqs = kmalloc_array(num_vqs, sizeof(*vqs), GFP_KERNEL);
- if (!names || !callbacks || !vqs) {
+ if (!vqs_info || !vqs) {
err = -ENOMEM;
goto out;
}
for (i = 0; i < num_vqs - num_poll_vqs; i++) {
- callbacks[i] = virtblk_done;
+ vqs_info[i].callback = virtblk_done;
snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req.%u", i);
- names[i] = vblk->vqs[i].name;
+ vqs_info[i].name = vblk->vqs[i].name;
}
for (; i < num_vqs; i++) {
- callbacks[i] = NULL;
snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req_poll.%u", i);
- names[i] = vblk->vqs[i].name;
+ vqs_info[i].name = vblk->vqs[i].name;
}
/* Discover virtqueues and write information to configuration. */
- err = virtio_find_vqs(vdev, num_vqs, vqs, callbacks, names, &desc);
+ err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
if (err)
goto out;
@@ -1035,8 +1032,7 @@ static int init_vq(struct virtio_blk *vblk)
out:
kfree(vqs);
- kfree(callbacks);
- kfree(names);
+ kfree(vqs_info);
if (err)
kfree(vblk->vqs);
return err;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 11/19] virtio_console: convert to use virtio_find_vqs_info()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (9 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 10/19] virtio_blk: convert to use virtio_find_vqs_info() Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 12/19] virtio_crypto: " Jiri Pirko
` (8 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
drivers/char/virtio_console.c | 44 ++++++++++++++---------------------
1 file changed, 18 insertions(+), 26 deletions(-)
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index d9ee2dbc7eab..23dbf1c18c90 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1804,8 +1804,7 @@ static void config_work_handler(struct work_struct *work)
static int init_vqs(struct ports_device *portdev)
{
- vq_callback_t **io_callbacks;
- char **io_names;
+ struct virtio_queue_info *vqs_info;
struct virtqueue **vqs;
u32 i, j, nr_ports, nr_queues;
int err;
@@ -1814,15 +1813,12 @@ static int init_vqs(struct ports_device *portdev)
nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;
vqs = kmalloc_array(nr_queues, sizeof(struct virtqueue *), GFP_KERNEL);
- io_callbacks = kmalloc_array(nr_queues, sizeof(vq_callback_t *),
- GFP_KERNEL);
- io_names = kmalloc_array(nr_queues, sizeof(char *), GFP_KERNEL);
+ vqs_info = kcalloc(nr_queues, sizeof(*vqs_info), GFP_KERNEL);
portdev->in_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
GFP_KERNEL);
portdev->out_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
GFP_KERNEL);
- if (!vqs || !io_callbacks || !io_names || !portdev->in_vqs ||
- !portdev->out_vqs) {
+ if (!vqs || !vqs_info || !portdev->in_vqs || !portdev->out_vqs) {
err = -ENOMEM;
goto free;
}
@@ -1833,30 +1829,28 @@ static int init_vqs(struct ports_device *portdev)
* 0 before others.
*/
j = 0;
- io_callbacks[j] = in_intr;
- io_callbacks[j + 1] = out_intr;
- io_names[j] = "input";
- io_names[j + 1] = "output";
+ vqs_info[j].callback = in_intr;
+ vqs_info[j + 1].callback = out_intr;
+ vqs_info[j].name = "input";
+ vqs_info[j + 1].name = "output";
j += 2;
if (use_multiport(portdev)) {
- io_callbacks[j] = control_intr;
- io_callbacks[j + 1] = NULL;
- io_names[j] = "control-i";
- io_names[j + 1] = "control-o";
+ vqs_info[j].callback = control_intr;
+ vqs_info[j].name = "control-i";
+ vqs_info[j + 1].name = "control-o";
for (i = 1; i < nr_ports; i++) {
j += 2;
- io_callbacks[j] = in_intr;
- io_callbacks[j + 1] = out_intr;
- io_names[j] = "input";
- io_names[j + 1] = "output";
+ vqs_info[j].callback = in_intr;
+ vqs_info[j + 1].callback = out_intr;
+ vqs_info[j].name = "input";
+ vqs_info[j + 1].name = "output";
}
}
/* Find the queues. */
- err = virtio_find_vqs(portdev->vdev, nr_queues, vqs,
- io_callbacks,
- (const char **)io_names, NULL);
+ err = virtio_find_vqs_info(portdev->vdev, nr_queues, vqs,
+ vqs_info, NULL);
if (err)
goto free;
@@ -1874,8 +1868,7 @@ static int init_vqs(struct ports_device *portdev)
portdev->out_vqs[i] = vqs[j + 1];
}
}
- kfree(io_names);
- kfree(io_callbacks);
+ kfree(vqs_info);
kfree(vqs);
return 0;
@@ -1883,8 +1876,7 @@ static int init_vqs(struct ports_device *portdev)
free:
kfree(portdev->out_vqs);
kfree(portdev->in_vqs);
- kfree(io_names);
- kfree(io_callbacks);
+ kfree(vqs_info);
kfree(vqs);
return err;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 12/19] virtio_crypto: convert to use virtio_find_vqs_info()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (10 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 11/19] virtio_console: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 13/19] virtio_net: " Jiri Pirko
` (7 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
drivers/crypto/virtio/virtio_crypto_core.c | 31 +++++++++-------------
1 file changed, 12 insertions(+), 19 deletions(-)
diff --git a/drivers/crypto/virtio/virtio_crypto_core.c b/drivers/crypto/virtio/virtio_crypto_core.c
index 30cd040aa03b..800d5c2a688c 100644
--- a/drivers/crypto/virtio/virtio_crypto_core.c
+++ b/drivers/crypto/virtio/virtio_crypto_core.c
@@ -96,11 +96,10 @@ static void virtcrypto_dataq_callback(struct virtqueue *vq)
static int virtcrypto_find_vqs(struct virtio_crypto *vi)
{
- vq_callback_t **callbacks;
+ struct virtio_queue_info *vqs_info;
struct virtqueue **vqs;
int ret = -ENOMEM;
int i, total_vqs;
- const char **names;
struct device *dev = &vi->vdev->dev;
/*
@@ -114,26 +113,23 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
vqs = kcalloc(total_vqs, sizeof(*vqs), GFP_KERNEL);
if (!vqs)
goto err_vq;
- callbacks = kcalloc(total_vqs, sizeof(*callbacks), GFP_KERNEL);
- if (!callbacks)
- goto err_callback;
- names = kcalloc(total_vqs, sizeof(*names), GFP_KERNEL);
- if (!names)
- goto err_names;
+ vqs_info = kcalloc(total_vqs, sizeof(*vqs_info), GFP_KERNEL);
+ if (!vqs_info)
+ goto err_vqs_info;
/* Parameters for control virtqueue */
- callbacks[total_vqs - 1] = virtcrypto_ctrlq_callback;
- names[total_vqs - 1] = "controlq";
+ vqs_info[total_vqs - 1].callback = virtcrypto_ctrlq_callback;
+ vqs_info[total_vqs - 1].name = "controlq";
/* Allocate/initialize parameters for data virtqueues */
for (i = 0; i < vi->max_data_queues; i++) {
- callbacks[i] = virtcrypto_dataq_callback;
+ vqs_info[i].callback = virtcrypto_dataq_callback;
snprintf(vi->data_vq[i].name, sizeof(vi->data_vq[i].name),
"dataq.%d", i);
- names[i] = vi->data_vq[i].name;
+ vqs_info[i].name = vi->data_vq[i].name;
}
- ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, callbacks, names, NULL);
+ ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
if (ret)
goto err_find;
@@ -153,18 +149,15 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
(unsigned long)&vi->data_vq[i]);
}
- kfree(names);
- kfree(callbacks);
+ kfree(vqs_info);
kfree(vqs);
return 0;
err_engine:
err_find:
- kfree(names);
-err_names:
- kfree(callbacks);
-err_callback:
+ kfree(vqs_info);
+err_vqs_info:
kfree(vqs);
err_vq:
return ret;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 13/19] virtio_net: convert to use virtio_find_vqs_info()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (11 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 12/19] virtio_crypto: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 14/19] scsi: virtio_scsi: " Jiri Pirko
` (6 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs_ctx(), allocate one of virtual_queue_info structs
and pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
drivers/net/virtio_net.c | 34 +++++++++++++---------------------
1 file changed, 13 insertions(+), 21 deletions(-)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 283b34d50296..3e367c7b88a0 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -4351,9 +4351,8 @@ static unsigned int mergeable_min_buf_len(struct virtnet_info *vi, struct virtqu
static int virtnet_find_vqs(struct virtnet_info *vi)
{
- vq_callback_t **callbacks;
+ struct virtio_queue_info *vqs_info;
struct virtqueue **vqs;
- const char **names;
int ret = -ENOMEM;
int total_vqs;
bool *ctx;
@@ -4370,12 +4369,9 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
vqs = kcalloc(total_vqs, sizeof(*vqs), GFP_KERNEL);
if (!vqs)
goto err_vq;
- callbacks = kmalloc_array(total_vqs, sizeof(*callbacks), GFP_KERNEL);
- if (!callbacks)
- goto err_callback;
- names = kmalloc_array(total_vqs, sizeof(*names), GFP_KERNEL);
- if (!names)
- goto err_names;
+ vqs_info = kcalloc(total_vqs, sizeof(*vqs_info), GFP_KERNEL);
+ if (!vqs_info)
+ goto err_vqs_info;
if (!vi->big_packets || vi->mergeable_rx_bufs) {
ctx = kcalloc(total_vqs, sizeof(*ctx), GFP_KERNEL);
if (!ctx)
@@ -4386,24 +4382,22 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
/* Parameters for control virtqueue, if any */
if (vi->has_cvq) {
- callbacks[total_vqs - 1] = NULL;
- names[total_vqs - 1] = "control";
+ vqs_info[total_vqs - 1].name = "control";
}
/* Allocate/initialize parameters for send/receive virtqueues */
for (i = 0; i < vi->max_queue_pairs; i++) {
- callbacks[rxq2vq(i)] = skb_recv_done;
- callbacks[txq2vq(i)] = skb_xmit_done;
+ vqs_info[rxq2vq(i)].callback = skb_recv_done;
+ vqs_info[txq2vq(i)].callback = skb_xmit_done;
sprintf(vi->rq[i].name, "input.%u", i);
sprintf(vi->sq[i].name, "output.%u", i);
- names[rxq2vq(i)] = vi->rq[i].name;
- names[txq2vq(i)] = vi->sq[i].name;
+ vqs_info[rxq2vq(i)].name = vi->rq[i].name;
+ vqs_info[txq2vq(i)].name = vi->sq[i].name;
if (ctx)
- ctx[rxq2vq(i)] = true;
+ vqs_info[rxq2vq(i)].ctx = true;
}
- ret = virtio_find_vqs_ctx(vi->vdev, total_vqs, vqs, callbacks,
- names, ctx, NULL);
+ ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
if (ret)
goto err_find;
@@ -4425,10 +4419,8 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
err_find:
kfree(ctx);
err_ctx:
- kfree(names);
-err_names:
- kfree(callbacks);
-err_callback:
+ kfree(vqs_info);
+err_vqs_info:
kfree(vqs);
err_vq:
return ret;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 14/19] scsi: virtio_scsi: convert to use virtio_find_vqs_info()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (12 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 13/19] virtio_net: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 15/19] virtiofs: " Jiri Pirko
` (5 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
drivers/scsi/virtio_scsi.c | 32 +++++++++++++-------------------
1 file changed, 13 insertions(+), 19 deletions(-)
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 89ca26945721..416c6820b537 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -841,19 +841,16 @@ static int virtscsi_init(struct virtio_device *vdev,
int err;
u32 i;
u32 num_vqs, num_poll_vqs, num_req_vqs;
- vq_callback_t **callbacks;
- const char **names;
+ struct virtio_queue_info *vqs_info;
struct virtqueue **vqs;
struct irq_affinity desc = { .pre_vectors = 2 };
num_req_vqs = vscsi->num_queues;
num_vqs = num_req_vqs + VIRTIO_SCSI_VQ_BASE;
vqs = kmalloc_array(num_vqs, sizeof(struct virtqueue *), GFP_KERNEL);
- callbacks = kmalloc_array(num_vqs, sizeof(vq_callback_t *),
- GFP_KERNEL);
- names = kmalloc_array(num_vqs, sizeof(char *), GFP_KERNEL);
+ vqs_info = kcalloc(num_vqs, sizeof(*vqs_info), GFP_KERNEL);
- if (!callbacks || !vqs || !names) {
+ if (!vqs || !vqs_info) {
err = -ENOMEM;
goto out;
}
@@ -869,22 +866,20 @@ static int virtscsi_init(struct virtio_device *vdev,
vscsi->io_queues[HCTX_TYPE_READ],
vscsi->io_queues[HCTX_TYPE_POLL]);
- callbacks[0] = virtscsi_ctrl_done;
- callbacks[1] = virtscsi_event_done;
- names[0] = "control";
- names[1] = "event";
+ vqs_info[0].callback = virtscsi_ctrl_done;
+ vqs_info[0].name = "control";
+ vqs_info[1].callback = virtscsi_event_done;
+ vqs_info[1].name = "event";
for (i = VIRTIO_SCSI_VQ_BASE; i < num_vqs - num_poll_vqs; i++) {
- callbacks[i] = virtscsi_req_done;
- names[i] = "request";
+ vqs_info[i].callback = virtscsi_req_done;
+ vqs_info[i].name = "request";
}
- for (; i < num_vqs; i++) {
- callbacks[i] = NULL;
- names[i] = "request_poll";
- }
+ for (; i < num_vqs; i++)
+ vqs_info[i].name = "request_poll";
/* Discover virtqueues and write information to configuration. */
- err = virtio_find_vqs(vdev, num_vqs, vqs, callbacks, names, &desc);
+ err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
if (err)
goto out;
@@ -900,8 +895,7 @@ static int virtscsi_init(struct virtio_device *vdev,
err = 0;
out:
- kfree(names);
- kfree(callbacks);
+ kfree(vqs_info);
kfree(vqs);
if (err)
virtscsi_remove_vqs(vdev);
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 15/19] virtiofs: convert to use virtio_find_vqs_info()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (13 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 14/19] scsi: virtio_scsi: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 16/19] virtio_balloon: " Jiri Pirko
` (4 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
fs/fuse/virtio_fs.c | 22 +++++++++-------------
1 file changed, 9 insertions(+), 13 deletions(-)
diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
index ca7b64f9c3c7..466d4888d664 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -740,9 +740,8 @@ static void virtio_fs_init_vq(struct virtio_fs_vq *fsvq, char *name,
static int virtio_fs_setup_vqs(struct virtio_device *vdev,
struct virtio_fs *fs)
{
+ struct virtio_queue_info *vqs_info;
struct virtqueue **vqs;
- vq_callback_t **callbacks;
- const char **names;
unsigned int i;
int ret = 0;
@@ -757,18 +756,16 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
return -ENOMEM;
vqs = kmalloc_array(fs->nvqs, sizeof(vqs[VQ_HIPRIO]), GFP_KERNEL);
- callbacks = kmalloc_array(fs->nvqs, sizeof(callbacks[VQ_HIPRIO]),
- GFP_KERNEL);
- names = kmalloc_array(fs->nvqs, sizeof(names[VQ_HIPRIO]), GFP_KERNEL);
- if (!vqs || !callbacks || !names) {
+ vqs_info = kcalloc(fs->nvqs, sizeof(*vqs_info), GFP_KERNEL);
+ if (!vqs || !vqs_info) {
ret = -ENOMEM;
goto out;
}
/* Initialize the hiprio/forget request virtqueue */
- callbacks[VQ_HIPRIO] = virtio_fs_vq_done;
+ vqs_info[VQ_HIPRIO].callback = virtio_fs_vq_done;
virtio_fs_init_vq(&fs->vqs[VQ_HIPRIO], "hiprio", VQ_HIPRIO);
- names[VQ_HIPRIO] = fs->vqs[VQ_HIPRIO].name;
+ vqs_info[VQ_HIPRIO].name = fs->vqs[VQ_HIPRIO].name;
/* Initialize the requests virtqueues */
for (i = VQ_REQUEST; i < fs->nvqs; i++) {
@@ -776,11 +773,11 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
snprintf(vq_name, VQ_NAME_LEN, "requests.%u", i - VQ_REQUEST);
virtio_fs_init_vq(&fs->vqs[i], vq_name, VQ_REQUEST);
- callbacks[i] = virtio_fs_vq_done;
- names[i] = fs->vqs[i].name;
+ vqs_info[i].callback = virtio_fs_vq_done;
+ vqs_info[i].name = fs->vqs[i].name;
}
- ret = virtio_find_vqs(vdev, fs->nvqs, vqs, callbacks, names, NULL);
+ ret = virtio_find_vqs_info(vdev, fs->nvqs, vqs, vqs_info, NULL);
if (ret < 0)
goto out;
@@ -789,8 +786,7 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
virtio_fs_start_all_queues(fs);
out:
- kfree(names);
- kfree(callbacks);
+ kfree(vqs_info);
kfree(vqs);
if (ret)
kfree(fs->vqs);
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 16/19] virtio_balloon: convert to use virtio_find_vqs_info()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (14 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 15/19] virtiofs: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
` (3 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), have one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
drivers/virtio/virtio_balloon.c | 34 +++++++++++++--------------------
1 file changed, 13 insertions(+), 21 deletions(-)
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index c0a63638f95e..02ae30cc96ec 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -545,9 +545,8 @@ static void update_balloon_size_func(struct work_struct *work)
static int init_vqs(struct virtio_balloon *vb)
{
+ struct virtio_queue_info vqs_info[VIRTIO_BALLOON_VQ_MAX] = {};
struct virtqueue *vqs[VIRTIO_BALLOON_VQ_MAX];
- vq_callback_t *callbacks[VIRTIO_BALLOON_VQ_MAX];
- const char *names[VIRTIO_BALLOON_VQ_MAX];
int err;
/*
@@ -555,33 +554,26 @@ static int init_vqs(struct virtio_balloon *vb)
* will be NULL if the related feature is not enabled, which will
* cause no allocation for the corresponding virtqueue in find_vqs.
*/
- callbacks[VIRTIO_BALLOON_VQ_INFLATE] = balloon_ack;
- names[VIRTIO_BALLOON_VQ_INFLATE] = "inflate";
- callbacks[VIRTIO_BALLOON_VQ_DEFLATE] = balloon_ack;
- names[VIRTIO_BALLOON_VQ_DEFLATE] = "deflate";
- callbacks[VIRTIO_BALLOON_VQ_STATS] = NULL;
- names[VIRTIO_BALLOON_VQ_STATS] = NULL;
- callbacks[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
- names[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
- names[VIRTIO_BALLOON_VQ_REPORTING] = NULL;
+ vqs_info[VIRTIO_BALLOON_VQ_INFLATE].callback = balloon_ack;
+ vqs_info[VIRTIO_BALLOON_VQ_INFLATE].name = "inflate";
+ vqs_info[VIRTIO_BALLOON_VQ_DEFLATE].callback = balloon_ack;
+ vqs_info[VIRTIO_BALLOON_VQ_DEFLATE].name = "deflate";
if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ)) {
- names[VIRTIO_BALLOON_VQ_STATS] = "stats";
- callbacks[VIRTIO_BALLOON_VQ_STATS] = stats_request;
+ vqs_info[VIRTIO_BALLOON_VQ_STATS].name = "stats";
+ vqs_info[VIRTIO_BALLOON_VQ_STATS].callback = stats_request;
}
- if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) {
- names[VIRTIO_BALLOON_VQ_FREE_PAGE] = "free_page_vq";
- callbacks[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
- }
+ if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT))
+ vqs_info[VIRTIO_BALLOON_VQ_FREE_PAGE].name = "free_page_vq";
if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_REPORTING)) {
- names[VIRTIO_BALLOON_VQ_REPORTING] = "reporting_vq";
- callbacks[VIRTIO_BALLOON_VQ_REPORTING] = balloon_ack;
+ vqs_info[VIRTIO_BALLOON_VQ_REPORTING].name = "reporting_vq";
+ vqs_info[VIRTIO_BALLOON_VQ_REPORTING].callback = balloon_ack;
}
- err = virtio_find_vqs(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
- callbacks, names, NULL);
+ err = virtio_find_vqs_info(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
+ vqs_info, NULL);
if (err)
return err;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (15 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 16/19] virtio_balloon: " Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 13:11 ` Michael S. Tsirkin
2024-07-03 12:39 ` [PATCH virtio 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers Jiri Pirko
` (2 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), have one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
arch/um/drivers/virt-pci.c | 8 ++++---
drivers/bluetooth/virtio_bt.c | 14 ++++-------
drivers/firmware/arm_scmi/virtio.c | 11 ++++-----
drivers/gpio/gpio-virtio.c | 10 ++++----
drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++++----
drivers/iommu/virtio-iommu.c | 11 ++++-----
drivers/net/wireless/virtual/mac80211_hwsim.c | 14 ++++-------
drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++++---
drivers/virtio/virtio_input.c | 9 ++++----
net/vmw_vsock/virtio_transport.c | 17 +++++---------
sound/virtio/virtio_card.c | 23 ++++++++-----------
11 files changed, 59 insertions(+), 75 deletions(-)
diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
index 7cb503469bbd..3df2ea53471a 100644
--- a/arch/um/drivers/virt-pci.c
+++ b/arch/um/drivers/virt-pci.c
@@ -567,12 +567,14 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
static int um_pci_init_vqs(struct um_pci_device *dev)
{
+ struct virtio_queue_info vqs_info[] = {
+ { "cmd", um_pci_cmd_vq_cb },
+ { "irq", um_pci_irq_vq_cb },
+ };
struct virtqueue *vqs[2];
- static const char *const names[2] = { "cmd", "irq" };
- vq_callback_t *cbs[2] = { um_pci_cmd_vq_cb, um_pci_irq_vq_cb };
int err, i;
- err = virtio_find_vqs(dev->vdev, 2, vqs, cbs, names, NULL);
+ err = virtio_find_vqs_info(dev->vdev, 2, vqs, vqs_info, NULL);
if (err)
return err;
diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c
index 463b49ca2492..6481f9fe24c4 100644
--- a/drivers/bluetooth/virtio_bt.c
+++ b/drivers/bluetooth/virtio_bt.c
@@ -254,13 +254,9 @@ static void virtbt_rx_done(struct virtqueue *vq)
static int virtbt_probe(struct virtio_device *vdev)
{
- vq_callback_t *callbacks[VIRTBT_NUM_VQS] = {
- [VIRTBT_VQ_TX] = virtbt_tx_done,
- [VIRTBT_VQ_RX] = virtbt_rx_done,
- };
- const char *names[VIRTBT_NUM_VQS] = {
- [VIRTBT_VQ_TX] = "tx",
- [VIRTBT_VQ_RX] = "rx",
+ struct virtio_queue_info vqs_info[VIRTBT_NUM_VQS] = {
+ [VIRTBT_VQ_TX] = { "tx", virtbt_tx_done },
+ [VIRTBT_VQ_RX] = { "rx", virtbt_rx_done },
};
struct virtio_bluetooth *vbt;
struct hci_dev *hdev;
@@ -289,8 +285,8 @@ static int virtbt_probe(struct virtio_device *vdev)
INIT_WORK(&vbt->rx, virtbt_rx_work);
- err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, callbacks,
- names, NULL);
+ err = virtio_find_vqs_info(vdev, VIRTBT_NUM_VQS, vbt->vqs,
+ vqs_info, NULL);
if (err)
return err;
diff --git a/drivers/firmware/arm_scmi/virtio.c b/drivers/firmware/arm_scmi/virtio.c
index 4892058445ce..a6ae59c03308 100644
--- a/drivers/firmware/arm_scmi/virtio.c
+++ b/drivers/firmware/arm_scmi/virtio.c
@@ -354,11 +354,9 @@ static void scmi_vio_deferred_tx_worker(struct work_struct *work)
scmi_vio_channel_release(vioch);
}
-static const char *const scmi_vio_vqueue_names[] = { "tx", "rx" };
-
-static vq_callback_t *scmi_vio_complete_callbacks[] = {
- scmi_vio_complete_cb,
- scmi_vio_complete_cb
+static struct virtio_queue_info scmi_vio_vqs_info[] = {
+ { "tx", scmi_vio_complete_cb },
+ { "rx", scmi_vio_complete_cb },
};
static unsigned int virtio_get_max_msg(struct scmi_chan_info *base_cinfo)
@@ -831,8 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
if (have_vq_rx)
channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
- ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_complete_callbacks,
- scmi_vio_vqueue_names, NULL);
+ ret = virtio_find_vqs_info(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
if (ret) {
dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
return ret;
diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c
index 9fae8e396c58..a45b392358c4 100644
--- a/drivers/gpio/gpio-virtio.c
+++ b/drivers/gpio/gpio-virtio.c
@@ -457,15 +457,15 @@ static void virtio_gpio_free_vqs(struct virtio_device *vdev)
static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
struct virtio_device *vdev)
{
- const char * const names[] = { "requestq", "eventq" };
- vq_callback_t *cbs[] = {
- virtio_gpio_request_vq,
- virtio_gpio_event_vq,
+ struct virtio_queue_info vqs_info[] = {
+ { "requestq", virtio_gpio_request_vq },
+ { "eventq", virtio_gpio_event_vq },
};
struct virtqueue *vqs[2] = { NULL, NULL };
int ret;
- ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs, cbs, names, NULL);
+ ret = virtio_find_vqs_info(vdev, vgpio->irq_lines ? 2 : 1, vqs,
+ vqs_info, NULL);
if (ret) {
dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
return ret;
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 5a3b5aaed1f3..938c08a707eb 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -116,11 +116,10 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev,
int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
{
- static vq_callback_t *callbacks[] = {
- virtio_gpu_ctrl_ack, virtio_gpu_cursor_ack
+ struct virtio_queue_info vqs_info[] = {
+ { "control", virtio_gpu_ctrl_ack },
+ { "cursor", virtio_gpu_cursor_ack },
};
- static const char * const names[] = { "control", "cursor" };
-
struct virtio_gpu_device *vgdev;
/* this will expand later */
struct virtqueue *vqs[2];
@@ -207,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
DRM_INFO("features: %ccontext_init\n",
vgdev->has_context_init ? '+' : '-');
- ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
+ ret = virtio_find_vqs_info(vgdev->vdev, 2, vqs, vqs_info, NULL);
if (ret) {
DRM_ERROR("failed to find virt queues\n");
goto err_vqs;
diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
index 9ed8958a42bf..ef77c1efc767 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -1094,14 +1094,13 @@ static struct iommu_ops viommu_ops = {
static int viommu_init_vqs(struct viommu_dev *viommu)
{
struct virtio_device *vdev = dev_to_virtio(viommu->dev);
- const char *names[] = { "request", "event" };
- vq_callback_t *callbacks[] = {
- NULL, /* No async requests */
- viommu_event_handler,
+ struct virtio_queue_info vqs_info[] = {
+ { "request" },
+ { "event", viommu_event_handler },
};
- return virtio_find_vqs(vdev, VIOMMU_NR_VQS, viommu->vqs, callbacks,
- names, NULL);
+ return virtio_find_vqs_info(vdev, VIOMMU_NR_VQS, viommu->vqs,
+ vqs_info, NULL);
}
static int viommu_fill_evtq(struct viommu_dev *viommu)
diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
index 20fa21bb4d1c..565c091f1ba5 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -6558,17 +6558,13 @@ static void hwsim_virtio_rx_done(struct virtqueue *vq)
static int init_vqs(struct virtio_device *vdev)
{
- vq_callback_t *callbacks[HWSIM_NUM_VQS] = {
- [HWSIM_VQ_TX] = hwsim_virtio_tx_done,
- [HWSIM_VQ_RX] = hwsim_virtio_rx_done,
- };
- const char *names[HWSIM_NUM_VQS] = {
- [HWSIM_VQ_TX] = "tx",
- [HWSIM_VQ_RX] = "rx",
+ struct virtio_queue_info vqs_info[HWSIM_NUM_VQS] = {
+ [HWSIM_VQ_TX] = { "tx", hwsim_virtio_tx_done },
+ [HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
};
- return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
- hwsim_vqs, callbacks, names, NULL);
+ return virtio_find_vqs_info(vdev, HWSIM_NUM_VQS,
+ hwsim_vqs, vqs_info, NULL);
}
static int fill_vq(struct virtqueue *vq)
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index e9e8c1f7829f..440f1cc9157d 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -868,8 +868,10 @@ static void rpmsg_virtio_del_ctrl_dev(struct rpmsg_device *rpdev_ctrl)
static int rpmsg_probe(struct virtio_device *vdev)
{
- vq_callback_t *vq_cbs[] = { rpmsg_recv_done, rpmsg_xmit_done };
- static const char * const names[] = { "input", "output" };
+ struct virtio_queue_info vqs_info[] = {
+ { "input", rpmsg_recv_done },
+ { "output", rpmsg_xmit_done },
+ };
struct virtqueue *vqs[2];
struct virtproc_info *vrp;
struct virtio_rpmsg_channel *vch = NULL;
@@ -891,7 +893,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
init_waitqueue_head(&vrp->sendq);
/* We expect two virtqueues, rx and tx (and in this order) */
- err = virtio_find_vqs(vdev, 2, vqs, vq_cbs, names, NULL);
+ err = virtio_find_vqs_info(vdev, 2, vqs, vqs_info, NULL);
if (err)
goto free_vrp;
diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
index 1a730d6c0b55..e1491ad9eced 100644
--- a/drivers/virtio/virtio_input.c
+++ b/drivers/virtio/virtio_input.c
@@ -185,13 +185,14 @@ static void virtinput_cfg_abs(struct virtio_input *vi, int abs)
static int virtinput_init_vqs(struct virtio_input *vi)
{
+ struct virtio_queue_info vqs_info[] = {
+ { "events", virtinput_recv_events },
+ { "status", virtinput_recv_status },
+ };
struct virtqueue *vqs[2];
- vq_callback_t *cbs[] = { virtinput_recv_events,
- virtinput_recv_status };
- static const char * const names[] = { "events", "status" };
int err;
- err = virtio_find_vqs(vi->vdev, 2, vqs, cbs, names, NULL);
+ err = virtio_find_vqs_info(vi->vdev, 2, vqs, vqs_info, NULL);
if (err)
return err;
vi->evt = vqs[0];
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index 43d405298857..d303ef4d9898 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -617,20 +617,15 @@ static void virtio_transport_rx_work(struct work_struct *work)
static int virtio_vsock_vqs_init(struct virtio_vsock *vsock)
{
struct virtio_device *vdev = vsock->vdev;
- static const char * const names[] = {
- "rx",
- "tx",
- "event",
- };
- vq_callback_t *callbacks[] = {
- virtio_vsock_rx_done,
- virtio_vsock_tx_done,
- virtio_vsock_event_done,
+ struct virtio_queue_info vqs_info[] = {
+ { "rx", virtio_vsock_rx_done },
+ { "tx", virtio_vsock_tx_done },
+ { "event", virtio_vsock_event_done },
};
int ret;
- ret = virtio_find_vqs(vdev, VSOCK_VQ_MAX, vsock->vqs, callbacks, names,
- NULL);
+ ret = virtio_find_vqs_info(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info,
+ NULL);
if (ret < 0)
return ret;
diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c
index 7805daea0102..a6b0da6790dc 100644
--- a/sound/virtio/virtio_card.c
+++ b/sound/virtio/virtio_card.c
@@ -110,25 +110,22 @@ static void virtsnd_event_notify_cb(struct virtqueue *vqueue)
static int virtsnd_find_vqs(struct virtio_snd *snd)
{
struct virtio_device *vdev = snd->vdev;
- static vq_callback_t *callbacks[VIRTIO_SND_VQ_MAX] = {
- [VIRTIO_SND_VQ_CONTROL] = virtsnd_ctl_notify_cb,
- [VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb,
- [VIRTIO_SND_VQ_TX] = virtsnd_pcm_tx_notify_cb,
- [VIRTIO_SND_VQ_RX] = virtsnd_pcm_rx_notify_cb
- };
- static const char *names[VIRTIO_SND_VQ_MAX] = {
- [VIRTIO_SND_VQ_CONTROL] = "virtsnd-ctl",
- [VIRTIO_SND_VQ_EVENT] = "virtsnd-event",
- [VIRTIO_SND_VQ_TX] = "virtsnd-tx",
- [VIRTIO_SND_VQ_RX] = "virtsnd-rx"
+ struct virtio_queue_info vqs_info[] = {
+ [VIRTIO_SND_VQ_CONTROL] = { "virtsnd-ctl",
+ virtsnd_ctl_notify_cb },
+ [VIRTIO_SND_VQ_EVENT] = { "virtsnd-event",
+ virtsnd_event_notify_cb },
+ [VIRTIO_SND_VQ_TX] = { "virtsnd-tx",
+ virtsnd_pcm_tx_notify_cb },
+ [VIRTIO_SND_VQ_RX] = { "virtsnd-rx",
+ virtsnd_pcm_rx_notify_cb },
};
struct virtqueue *vqs[VIRTIO_SND_VQ_MAX] = { 0 };
unsigned int i;
unsigned int n;
int rc;
- rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, callbacks, names,
- NULL);
+ rc = virtio_find_vqs_info(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
if (rc) {
dev_err(&vdev->dev, "failed to initialize virtqueues\n");
return rc;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info()
2024-07-03 12:39 ` [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
@ 2024-07-03 13:11 ` Michael S. Tsirkin
2024-07-03 13:22 ` Jiri Pirko
0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-03 13:11 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
On Wed, Jul 03, 2024 at 02:39:11PM +0200, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@nvidia.com>
>
> Instead of passing separate names and callbacks arrays
> to virtio_find_vqs(), have one of virtual_queue_info structs and
> pass it to virtio_find_vqs_info().
>
> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
> ---
> arch/um/drivers/virt-pci.c | 8 ++++---
> drivers/bluetooth/virtio_bt.c | 14 ++++-------
> drivers/firmware/arm_scmi/virtio.c | 11 ++++-----
> drivers/gpio/gpio-virtio.c | 10 ++++----
> drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++++----
> drivers/iommu/virtio-iommu.c | 11 ++++-----
> drivers/net/wireless/virtual/mac80211_hwsim.c | 14 ++++-------
> drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++++---
> drivers/virtio/virtio_input.c | 9 ++++----
> net/vmw_vsock/virtio_transport.c | 17 +++++---------
> sound/virtio/virtio_card.c | 23 ++++++++-----------
> 11 files changed, 59 insertions(+), 75 deletions(-)
>
> diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
> index 7cb503469bbd..3df2ea53471a 100644
> --- a/arch/um/drivers/virt-pci.c
> +++ b/arch/um/drivers/virt-pci.c
> @@ -567,12 +567,14 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
>
> static int um_pci_init_vqs(struct um_pci_device *dev)
> {
> + struct virtio_queue_info vqs_info[] = {
> + { "cmd", um_pci_cmd_vq_cb },
> + { "irq", um_pci_irq_vq_cb },
> + };
> struct virtqueue *vqs[2];
> - static const char *const names[2] = { "cmd", "irq" };
> - vq_callback_t *cbs[2] = { um_pci_cmd_vq_cb, um_pci_irq_vq_cb };
> int err, i;
>
> - err = virtio_find_vqs(dev->vdev, 2, vqs, cbs, names, NULL);
> + err = virtio_find_vqs_info(dev->vdev, 2, vqs, vqs_info, NULL);
> if (err)
> return err;
>
> diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c
> index 463b49ca2492..6481f9fe24c4 100644
> --- a/drivers/bluetooth/virtio_bt.c
> +++ b/drivers/bluetooth/virtio_bt.c
> @@ -254,13 +254,9 @@ static void virtbt_rx_done(struct virtqueue *vq)
>
> static int virtbt_probe(struct virtio_device *vdev)
> {
> - vq_callback_t *callbacks[VIRTBT_NUM_VQS] = {
> - [VIRTBT_VQ_TX] = virtbt_tx_done,
> - [VIRTBT_VQ_RX] = virtbt_rx_done,
> - };
> - const char *names[VIRTBT_NUM_VQS] = {
> - [VIRTBT_VQ_TX] = "tx",
> - [VIRTBT_VQ_RX] = "rx",
> + struct virtio_queue_info vqs_info[VIRTBT_NUM_VQS] = {
> + [VIRTBT_VQ_TX] = { "tx", virtbt_tx_done },
> + [VIRTBT_VQ_RX] = { "rx", virtbt_rx_done },
> };
> struct virtio_bluetooth *vbt;
> struct hci_dev *hdev;
> @@ -289,8 +285,8 @@ static int virtbt_probe(struct virtio_device *vdev)
>
> INIT_WORK(&vbt->rx, virtbt_rx_work);
>
> - err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, callbacks,
> - names, NULL);
> + err = virtio_find_vqs_info(vdev, VIRTBT_NUM_VQS, vbt->vqs,
> + vqs_info, NULL);
> if (err)
> return err;
>
> diff --git a/drivers/firmware/arm_scmi/virtio.c b/drivers/firmware/arm_scmi/virtio.c
> index 4892058445ce..a6ae59c03308 100644
> --- a/drivers/firmware/arm_scmi/virtio.c
> +++ b/drivers/firmware/arm_scmi/virtio.c
> @@ -354,11 +354,9 @@ static void scmi_vio_deferred_tx_worker(struct work_struct *work)
> scmi_vio_channel_release(vioch);
> }
>
> -static const char *const scmi_vio_vqueue_names[] = { "tx", "rx" };
> -
> -static vq_callback_t *scmi_vio_complete_callbacks[] = {
> - scmi_vio_complete_cb,
> - scmi_vio_complete_cb
> +static struct virtio_queue_info scmi_vio_vqs_info[] = {
> + { "tx", scmi_vio_complete_cb },
> + { "rx", scmi_vio_complete_cb },
> };
>
> static unsigned int virtio_get_max_msg(struct scmi_chan_info *base_cinfo)
> @@ -831,8 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
> if (have_vq_rx)
> channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
>
> - ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_complete_callbacks,
> - scmi_vio_vqueue_names, NULL);
> + ret = virtio_find_vqs_info(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
> if (ret) {
> dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
> return ret;
> diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c
> index 9fae8e396c58..a45b392358c4 100644
> --- a/drivers/gpio/gpio-virtio.c
> +++ b/drivers/gpio/gpio-virtio.c
> @@ -457,15 +457,15 @@ static void virtio_gpio_free_vqs(struct virtio_device *vdev)
> static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
> struct virtio_device *vdev)
> {
> - const char * const names[] = { "requestq", "eventq" };
> - vq_callback_t *cbs[] = {
> - virtio_gpio_request_vq,
> - virtio_gpio_event_vq,
> + struct virtio_queue_info vqs_info[] = {
> + { "requestq", virtio_gpio_request_vq },
> + { "eventq", virtio_gpio_event_vq },
> };
I'd maybe do struct virtio_queue_info vqs_info[2]
so it's clear array is the right size.
Not a new issue so can be a separate cleanup.
> struct virtqueue *vqs[2] = { NULL, NULL };
> int ret;
>
> - ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs, cbs, names, NULL);
> + ret = virtio_find_vqs_info(vdev, vgpio->irq_lines ? 2 : 1, vqs,
> + vqs_info, NULL);
> if (ret) {
> dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
> return ret;
> diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
> index 5a3b5aaed1f3..938c08a707eb 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_kms.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
> @@ -116,11 +116,10 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev,
>
> int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
> {
> - static vq_callback_t *callbacks[] = {
> - virtio_gpu_ctrl_ack, virtio_gpu_cursor_ack
> + struct virtio_queue_info vqs_info[] = {
> + { "control", virtio_gpu_ctrl_ack },
> + { "cursor", virtio_gpu_cursor_ack },
> };
I'd maybe do struct virtio_queue_info vqs_info[2]
so it's clear array is the right size.
Not a new issue so can be a separate cleanup.
> - static const char * const names[] = { "control", "cursor" };
> -
> struct virtio_gpu_device *vgdev;
> /* this will expand later */
> struct virtqueue *vqs[2];
> @@ -207,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
> DRM_INFO("features: %ccontext_init\n",
> vgdev->has_context_init ? '+' : '-');
>
> - ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
> + ret = virtio_find_vqs_info(vgdev->vdev, 2, vqs, vqs_info, NULL);
> if (ret) {
> DRM_ERROR("failed to find virt queues\n");
> goto err_vqs;
> diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
> index 9ed8958a42bf..ef77c1efc767 100644
> --- a/drivers/iommu/virtio-iommu.c
> +++ b/drivers/iommu/virtio-iommu.c
> @@ -1094,14 +1094,13 @@ static struct iommu_ops viommu_ops = {
> static int viommu_init_vqs(struct viommu_dev *viommu)
> {
> struct virtio_device *vdev = dev_to_virtio(viommu->dev);
> - const char *names[] = { "request", "event" };
> - vq_callback_t *callbacks[] = {
> - NULL, /* No async requests */
> - viommu_event_handler,
> + struct virtio_queue_info vqs_info[] = {
I'd maybe do struct virtio_queue_info vqs_info[VIOMMU_NR_VQS]
so it's clear array is the right size.
Not a new issue so can be a separate cleanup.
> + { "request" },
Let's keep the comment here:
{ "request", NULL /* No async requests */ },
> + { "event", viommu_event_handler },
> };
>
> - return virtio_find_vqs(vdev, VIOMMU_NR_VQS, viommu->vqs, callbacks,
> - names, NULL);
> + return virtio_find_vqs_info(vdev, VIOMMU_NR_VQS, viommu->vqs,
> + vqs_info, NULL);
> }
>
> static int viommu_fill_evtq(struct viommu_dev *viommu)
> diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
> index 20fa21bb4d1c..565c091f1ba5 100644
> --- a/drivers/net/wireless/virtual/mac80211_hwsim.c
> +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
> @@ -6558,17 +6558,13 @@ static void hwsim_virtio_rx_done(struct virtqueue *vq)
>
> static int init_vqs(struct virtio_device *vdev)
> {
> - vq_callback_t *callbacks[HWSIM_NUM_VQS] = {
> - [HWSIM_VQ_TX] = hwsim_virtio_tx_done,
> - [HWSIM_VQ_RX] = hwsim_virtio_rx_done,
> - };
> - const char *names[HWSIM_NUM_VQS] = {
> - [HWSIM_VQ_TX] = "tx",
> - [HWSIM_VQ_RX] = "rx",
> + struct virtio_queue_info vqs_info[HWSIM_NUM_VQS] = {
> + [HWSIM_VQ_TX] = { "tx", hwsim_virtio_tx_done },
> + [HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
> };
>
> - return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
> - hwsim_vqs, callbacks, names, NULL);
> + return virtio_find_vqs_info(vdev, HWSIM_NUM_VQS,
> + hwsim_vqs, vqs_info, NULL);
> }
>
> static int fill_vq(struct virtqueue *vq)
> diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
> index e9e8c1f7829f..440f1cc9157d 100644
> --- a/drivers/rpmsg/virtio_rpmsg_bus.c
> +++ b/drivers/rpmsg/virtio_rpmsg_bus.c
> @@ -868,8 +868,10 @@ static void rpmsg_virtio_del_ctrl_dev(struct rpmsg_device *rpdev_ctrl)
>
> static int rpmsg_probe(struct virtio_device *vdev)
> {
> - vq_callback_t *vq_cbs[] = { rpmsg_recv_done, rpmsg_xmit_done };
> - static const char * const names[] = { "input", "output" };
> + struct virtio_queue_info vqs_info[] = {
I'd maybe do struct virtio_queue_info vqs_info[2]
so it's clear array is the right size.
Not a new issue so can be a separate cleanup.
> + { "input", rpmsg_recv_done },
> + { "output", rpmsg_xmit_done },
> + };
> struct virtqueue *vqs[2];
> struct virtproc_info *vrp;
> struct virtio_rpmsg_channel *vch = NULL;
> @@ -891,7 +893,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
> init_waitqueue_head(&vrp->sendq);
>
> /* We expect two virtqueues, rx and tx (and in this order) */
> - err = virtio_find_vqs(vdev, 2, vqs, vq_cbs, names, NULL);
> + err = virtio_find_vqs_info(vdev, 2, vqs, vqs_info, NULL);
> if (err)
> goto free_vrp;
>
> diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
> index 1a730d6c0b55..e1491ad9eced 100644
> --- a/drivers/virtio/virtio_input.c
> +++ b/drivers/virtio/virtio_input.c
> @@ -185,13 +185,14 @@ static void virtinput_cfg_abs(struct virtio_input *vi, int abs)
>
> static int virtinput_init_vqs(struct virtio_input *vi)
> {
> + struct virtio_queue_info vqs_info[] = {
> + { "events", virtinput_recv_events },
> + { "status", virtinput_recv_status },
> + };
> struct virtqueue *vqs[2];
> - vq_callback_t *cbs[] = { virtinput_recv_events,
> - virtinput_recv_status };
> - static const char * const names[] = { "events", "status" };
> int err;
>
> - err = virtio_find_vqs(vi->vdev, 2, vqs, cbs, names, NULL);
> + err = virtio_find_vqs_info(vi->vdev, 2, vqs, vqs_info, NULL);
ARRAY_SIZE(vqs_info) is now possible instead of 2.
Can be a separate cleanup, though.
> if (err)
> return err;
> vi->evt = vqs[0];
> diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
> index 43d405298857..d303ef4d9898 100644
> --- a/net/vmw_vsock/virtio_transport.c
> +++ b/net/vmw_vsock/virtio_transport.c
> @@ -617,20 +617,15 @@ static void virtio_transport_rx_work(struct work_struct *work)
> static int virtio_vsock_vqs_init(struct virtio_vsock *vsock)
> {
> struct virtio_device *vdev = vsock->vdev;
> - static const char * const names[] = {
> - "rx",
> - "tx",
> - "event",
> - };
> - vq_callback_t *callbacks[] = {
> - virtio_vsock_rx_done,
> - virtio_vsock_tx_done,
> - virtio_vsock_event_done,
> + struct virtio_queue_info vqs_info[] = {
> + { "rx", virtio_vsock_rx_done },
> + { "tx", virtio_vsock_tx_done },
> + { "event", virtio_vsock_event_done },
> };
> int ret;
>
> - ret = virtio_find_vqs(vdev, VSOCK_VQ_MAX, vsock->vqs, callbacks, names,
> - NULL);
> + ret = virtio_find_vqs_info(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info,
> + NULL);
> if (ret < 0)
> return ret;
>
> diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c
> index 7805daea0102..a6b0da6790dc 100644
> --- a/sound/virtio/virtio_card.c
> +++ b/sound/virtio/virtio_card.c
> @@ -110,25 +110,22 @@ static void virtsnd_event_notify_cb(struct virtqueue *vqueue)
> static int virtsnd_find_vqs(struct virtio_snd *snd)
> {
> struct virtio_device *vdev = snd->vdev;
> - static vq_callback_t *callbacks[VIRTIO_SND_VQ_MAX] = {
> - [VIRTIO_SND_VQ_CONTROL] = virtsnd_ctl_notify_cb,
> - [VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb,
> - [VIRTIO_SND_VQ_TX] = virtsnd_pcm_tx_notify_cb,
> - [VIRTIO_SND_VQ_RX] = virtsnd_pcm_rx_notify_cb
> - };
> - static const char *names[VIRTIO_SND_VQ_MAX] = {
> - [VIRTIO_SND_VQ_CONTROL] = "virtsnd-ctl",
> - [VIRTIO_SND_VQ_EVENT] = "virtsnd-event",
> - [VIRTIO_SND_VQ_TX] = "virtsnd-tx",
> - [VIRTIO_SND_VQ_RX] = "virtsnd-rx"
> + struct virtio_queue_info vqs_info[] = {
Why not
struct virtio_queue_info vqs_info[VIRTIO_SND_VQ_MAX] ?
otherwise it's not clear all arrays are same size.
> + [VIRTIO_SND_VQ_CONTROL] = { "virtsnd-ctl",
> + virtsnd_ctl_notify_cb },
> + [VIRTIO_SND_VQ_EVENT] = { "virtsnd-event",
> + virtsnd_event_notify_cb },
> + [VIRTIO_SND_VQ_TX] = { "virtsnd-tx",
> + virtsnd_pcm_tx_notify_cb },
> + [VIRTIO_SND_VQ_RX] = { "virtsnd-rx",
> + virtsnd_pcm_rx_notify_cb },
> };
> struct virtqueue *vqs[VIRTIO_SND_VQ_MAX] = { 0 };
> unsigned int i;
> unsigned int n;
> int rc;
>
> - rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, callbacks, names,
> - NULL);
> + rc = virtio_find_vqs_info(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
> if (rc) {
> dev_err(&vdev->dev, "failed to initialize virtqueues\n");
> return rc;
> --
> 2.45.2
^ permalink raw reply [flat|nested] 30+ messages in thread* Re: [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info()
2024-07-03 13:11 ` Michael S. Tsirkin
@ 2024-07-03 13:22 ` Jiri Pirko
0 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 13:22 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Wed, Jul 03, 2024 at 03:11:52PM CEST, mst@redhat.com wrote:
>On Wed, Jul 03, 2024 at 02:39:11PM +0200, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@nvidia.com>
>>
>> Instead of passing separate names and callbacks arrays
>> to virtio_find_vqs(), have one of virtual_queue_info structs and
>> pass it to virtio_find_vqs_info().
>>
>> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
>> ---
>> arch/um/drivers/virt-pci.c | 8 ++++---
>> drivers/bluetooth/virtio_bt.c | 14 ++++-------
>> drivers/firmware/arm_scmi/virtio.c | 11 ++++-----
>> drivers/gpio/gpio-virtio.c | 10 ++++----
>> drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++++----
>> drivers/iommu/virtio-iommu.c | 11 ++++-----
>> drivers/net/wireless/virtual/mac80211_hwsim.c | 14 ++++-------
>> drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++++---
>> drivers/virtio/virtio_input.c | 9 ++++----
>> net/vmw_vsock/virtio_transport.c | 17 +++++---------
>> sound/virtio/virtio_card.c | 23 ++++++++-----------
>> 11 files changed, 59 insertions(+), 75 deletions(-)
>>
>> diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
>> index 7cb503469bbd..3df2ea53471a 100644
>> --- a/arch/um/drivers/virt-pci.c
>> +++ b/arch/um/drivers/virt-pci.c
>> @@ -567,12 +567,14 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
>>
>> static int um_pci_init_vqs(struct um_pci_device *dev)
>> {
>> + struct virtio_queue_info vqs_info[] = {
>> + { "cmd", um_pci_cmd_vq_cb },
>> + { "irq", um_pci_irq_vq_cb },
>> + };
>> struct virtqueue *vqs[2];
>> - static const char *const names[2] = { "cmd", "irq" };
>> - vq_callback_t *cbs[2] = { um_pci_cmd_vq_cb, um_pci_irq_vq_cb };
>> int err, i;
>>
>> - err = virtio_find_vqs(dev->vdev, 2, vqs, cbs, names, NULL);
>> + err = virtio_find_vqs_info(dev->vdev, 2, vqs, vqs_info, NULL);
>> if (err)
>> return err;
>>
>> diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c
>> index 463b49ca2492..6481f9fe24c4 100644
>> --- a/drivers/bluetooth/virtio_bt.c
>> +++ b/drivers/bluetooth/virtio_bt.c
>> @@ -254,13 +254,9 @@ static void virtbt_rx_done(struct virtqueue *vq)
>>
>> static int virtbt_probe(struct virtio_device *vdev)
>> {
>> - vq_callback_t *callbacks[VIRTBT_NUM_VQS] = {
>> - [VIRTBT_VQ_TX] = virtbt_tx_done,
>> - [VIRTBT_VQ_RX] = virtbt_rx_done,
>> - };
>> - const char *names[VIRTBT_NUM_VQS] = {
>> - [VIRTBT_VQ_TX] = "tx",
>> - [VIRTBT_VQ_RX] = "rx",
>> + struct virtio_queue_info vqs_info[VIRTBT_NUM_VQS] = {
>> + [VIRTBT_VQ_TX] = { "tx", virtbt_tx_done },
>> + [VIRTBT_VQ_RX] = { "rx", virtbt_rx_done },
>> };
>> struct virtio_bluetooth *vbt;
>> struct hci_dev *hdev;
>> @@ -289,8 +285,8 @@ static int virtbt_probe(struct virtio_device *vdev)
>>
>> INIT_WORK(&vbt->rx, virtbt_rx_work);
>>
>> - err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, callbacks,
>> - names, NULL);
>> + err = virtio_find_vqs_info(vdev, VIRTBT_NUM_VQS, vbt->vqs,
>> + vqs_info, NULL);
>> if (err)
>> return err;
>>
>> diff --git a/drivers/firmware/arm_scmi/virtio.c b/drivers/firmware/arm_scmi/virtio.c
>> index 4892058445ce..a6ae59c03308 100644
>> --- a/drivers/firmware/arm_scmi/virtio.c
>> +++ b/drivers/firmware/arm_scmi/virtio.c
>> @@ -354,11 +354,9 @@ static void scmi_vio_deferred_tx_worker(struct work_struct *work)
>> scmi_vio_channel_release(vioch);
>> }
>>
>> -static const char *const scmi_vio_vqueue_names[] = { "tx", "rx" };
>> -
>> -static vq_callback_t *scmi_vio_complete_callbacks[] = {
>> - scmi_vio_complete_cb,
>> - scmi_vio_complete_cb
>> +static struct virtio_queue_info scmi_vio_vqs_info[] = {
>> + { "tx", scmi_vio_complete_cb },
>> + { "rx", scmi_vio_complete_cb },
>> };
>>
>> static unsigned int virtio_get_max_msg(struct scmi_chan_info *base_cinfo)
>> @@ -831,8 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
>> if (have_vq_rx)
>> channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
>>
>> - ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_complete_callbacks,
>> - scmi_vio_vqueue_names, NULL);
>> + ret = virtio_find_vqs_info(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
>> if (ret) {
>> dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
>> return ret;
>> diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c
>> index 9fae8e396c58..a45b392358c4 100644
>> --- a/drivers/gpio/gpio-virtio.c
>> +++ b/drivers/gpio/gpio-virtio.c
>> @@ -457,15 +457,15 @@ static void virtio_gpio_free_vqs(struct virtio_device *vdev)
>> static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
>> struct virtio_device *vdev)
>> {
>> - const char * const names[] = { "requestq", "eventq" };
>> - vq_callback_t *cbs[] = {
>> - virtio_gpio_request_vq,
>> - virtio_gpio_event_vq,
>> + struct virtio_queue_info vqs_info[] = {
>> + { "requestq", virtio_gpio_request_vq },
>> + { "eventq", virtio_gpio_event_vq },
>> };
>
>I'd maybe do struct virtio_queue_info vqs_info[2]
>so it's clear array is the right size.
>Not a new issue so can be a separate cleanup.
Yeah, I maintain the same code regarding this as the original in this
patch. I agree for the separate cleanup.
>
>> struct virtqueue *vqs[2] = { NULL, NULL };
>> int ret;
>>
>> - ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs, cbs, names, NULL);
>> + ret = virtio_find_vqs_info(vdev, vgpio->irq_lines ? 2 : 1, vqs,
>> + vqs_info, NULL);
>> if (ret) {
>> dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
>> return ret;
>> diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
>> index 5a3b5aaed1f3..938c08a707eb 100644
>> --- a/drivers/gpu/drm/virtio/virtgpu_kms.c
>> +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
>> @@ -116,11 +116,10 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev,
>>
>> int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
>> {
>> - static vq_callback_t *callbacks[] = {
>> - virtio_gpu_ctrl_ack, virtio_gpu_cursor_ack
>> + struct virtio_queue_info vqs_info[] = {
>> + { "control", virtio_gpu_ctrl_ack },
>> + { "cursor", virtio_gpu_cursor_ack },
>> };
>
>I'd maybe do struct virtio_queue_info vqs_info[2]
>so it's clear array is the right size.
>Not a new issue so can be a separate cleanup.
>
>> - static const char * const names[] = { "control", "cursor" };
>> -
>> struct virtio_gpu_device *vgdev;
>> /* this will expand later */
>> struct virtqueue *vqs[2];
>> @@ -207,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
>> DRM_INFO("features: %ccontext_init\n",
>> vgdev->has_context_init ? '+' : '-');
>>
>> - ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
>> + ret = virtio_find_vqs_info(vgdev->vdev, 2, vqs, vqs_info, NULL);
>> if (ret) {
>> DRM_ERROR("failed to find virt queues\n");
>> goto err_vqs;
>> diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
>> index 9ed8958a42bf..ef77c1efc767 100644
>> --- a/drivers/iommu/virtio-iommu.c
>> +++ b/drivers/iommu/virtio-iommu.c
>> @@ -1094,14 +1094,13 @@ static struct iommu_ops viommu_ops = {
>> static int viommu_init_vqs(struct viommu_dev *viommu)
>> {
>> struct virtio_device *vdev = dev_to_virtio(viommu->dev);
>> - const char *names[] = { "request", "event" };
>> - vq_callback_t *callbacks[] = {
>> - NULL, /* No async requests */
>> - viommu_event_handler,
>> + struct virtio_queue_info vqs_info[] = {
>
>I'd maybe do struct virtio_queue_info vqs_info[VIOMMU_NR_VQS]
>so it's clear array is the right size.
>Not a new issue so can be a separate cleanup.
>
>> + { "request" },
>
>Let's keep the comment here:
> { "request", NULL /* No async requests */ },
>
>
>> + { "event", viommu_event_handler },
>> };
>>
>> - return virtio_find_vqs(vdev, VIOMMU_NR_VQS, viommu->vqs, callbacks,
>> - names, NULL);
>> + return virtio_find_vqs_info(vdev, VIOMMU_NR_VQS, viommu->vqs,
>> + vqs_info, NULL);
>> }
>>
>> static int viommu_fill_evtq(struct viommu_dev *viommu)
>> diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
>> index 20fa21bb4d1c..565c091f1ba5 100644
>> --- a/drivers/net/wireless/virtual/mac80211_hwsim.c
>> +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
>> @@ -6558,17 +6558,13 @@ static void hwsim_virtio_rx_done(struct virtqueue *vq)
>>
>> static int init_vqs(struct virtio_device *vdev)
>> {
>> - vq_callback_t *callbacks[HWSIM_NUM_VQS] = {
>> - [HWSIM_VQ_TX] = hwsim_virtio_tx_done,
>> - [HWSIM_VQ_RX] = hwsim_virtio_rx_done,
>> - };
>> - const char *names[HWSIM_NUM_VQS] = {
>> - [HWSIM_VQ_TX] = "tx",
>> - [HWSIM_VQ_RX] = "rx",
>> + struct virtio_queue_info vqs_info[HWSIM_NUM_VQS] = {
>> + [HWSIM_VQ_TX] = { "tx", hwsim_virtio_tx_done },
>> + [HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
>> };
>>
>> - return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
>> - hwsim_vqs, callbacks, names, NULL);
>> + return virtio_find_vqs_info(vdev, HWSIM_NUM_VQS,
>> + hwsim_vqs, vqs_info, NULL);
>> }
>>
>> static int fill_vq(struct virtqueue *vq)
>> diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
>> index e9e8c1f7829f..440f1cc9157d 100644
>> --- a/drivers/rpmsg/virtio_rpmsg_bus.c
>> +++ b/drivers/rpmsg/virtio_rpmsg_bus.c
>> @@ -868,8 +868,10 @@ static void rpmsg_virtio_del_ctrl_dev(struct rpmsg_device *rpdev_ctrl)
>>
>> static int rpmsg_probe(struct virtio_device *vdev)
>> {
>> - vq_callback_t *vq_cbs[] = { rpmsg_recv_done, rpmsg_xmit_done };
>> - static const char * const names[] = { "input", "output" };
>> + struct virtio_queue_info vqs_info[] = {
>
>I'd maybe do struct virtio_queue_info vqs_info[2]
>so it's clear array is the right size.
>Not a new issue so can be a separate cleanup.
>
>> + { "input", rpmsg_recv_done },
>> + { "output", rpmsg_xmit_done },
>> + };
>> struct virtqueue *vqs[2];
>> struct virtproc_info *vrp;
>> struct virtio_rpmsg_channel *vch = NULL;
>> @@ -891,7 +893,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
>> init_waitqueue_head(&vrp->sendq);
>>
>> /* We expect two virtqueues, rx and tx (and in this order) */
>> - err = virtio_find_vqs(vdev, 2, vqs, vq_cbs, names, NULL);
>> + err = virtio_find_vqs_info(vdev, 2, vqs, vqs_info, NULL);
>> if (err)
>> goto free_vrp;
>
>
>
>>
>> diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
>> index 1a730d6c0b55..e1491ad9eced 100644
>> --- a/drivers/virtio/virtio_input.c
>> +++ b/drivers/virtio/virtio_input.c
>> @@ -185,13 +185,14 @@ static void virtinput_cfg_abs(struct virtio_input *vi, int abs)
>>
>> static int virtinput_init_vqs(struct virtio_input *vi)
>> {
>> + struct virtio_queue_info vqs_info[] = {
>> + { "events", virtinput_recv_events },
>> + { "status", virtinput_recv_status },
>> + };
>> struct virtqueue *vqs[2];
>> - vq_callback_t *cbs[] = { virtinput_recv_events,
>> - virtinput_recv_status };
>> - static const char * const names[] = { "events", "status" };
>> int err;
>>
>> - err = virtio_find_vqs(vi->vdev, 2, vqs, cbs, names, NULL);
>> + err = virtio_find_vqs_info(vi->vdev, 2, vqs, vqs_info, NULL);
>
>ARRAY_SIZE(vqs_info) is now possible instead of 2.
>Can be a separate cleanup, though.
Yeah, agreed.
>
>
>> if (err)
>> return err;
>> vi->evt = vqs[0];
>> diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
>> index 43d405298857..d303ef4d9898 100644
>> --- a/net/vmw_vsock/virtio_transport.c
>> +++ b/net/vmw_vsock/virtio_transport.c
>> @@ -617,20 +617,15 @@ static void virtio_transport_rx_work(struct work_struct *work)
>> static int virtio_vsock_vqs_init(struct virtio_vsock *vsock)
>> {
>> struct virtio_device *vdev = vsock->vdev;
>> - static const char * const names[] = {
>> - "rx",
>> - "tx",
>> - "event",
>> - };
>> - vq_callback_t *callbacks[] = {
>> - virtio_vsock_rx_done,
>> - virtio_vsock_tx_done,
>> - virtio_vsock_event_done,
>> + struct virtio_queue_info vqs_info[] = {
>> + { "rx", virtio_vsock_rx_done },
>> + { "tx", virtio_vsock_tx_done },
>> + { "event", virtio_vsock_event_done },
>> };
>> int ret;
>>
>> - ret = virtio_find_vqs(vdev, VSOCK_VQ_MAX, vsock->vqs, callbacks, names,
>> - NULL);
>> + ret = virtio_find_vqs_info(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info,
>> + NULL);
>> if (ret < 0)
>> return ret;
>>
>> diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c
>> index 7805daea0102..a6b0da6790dc 100644
>> --- a/sound/virtio/virtio_card.c
>> +++ b/sound/virtio/virtio_card.c
>> @@ -110,25 +110,22 @@ static void virtsnd_event_notify_cb(struct virtqueue *vqueue)
>> static int virtsnd_find_vqs(struct virtio_snd *snd)
>> {
>> struct virtio_device *vdev = snd->vdev;
>> - static vq_callback_t *callbacks[VIRTIO_SND_VQ_MAX] = {
>> - [VIRTIO_SND_VQ_CONTROL] = virtsnd_ctl_notify_cb,
>> - [VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb,
>> - [VIRTIO_SND_VQ_TX] = virtsnd_pcm_tx_notify_cb,
>> - [VIRTIO_SND_VQ_RX] = virtsnd_pcm_rx_notify_cb
>> - };
>> - static const char *names[VIRTIO_SND_VQ_MAX] = {
>> - [VIRTIO_SND_VQ_CONTROL] = "virtsnd-ctl",
>> - [VIRTIO_SND_VQ_EVENT] = "virtsnd-event",
>> - [VIRTIO_SND_VQ_TX] = "virtsnd-tx",
>> - [VIRTIO_SND_VQ_RX] = "virtsnd-rx"
>> + struct virtio_queue_info vqs_info[] = {
>
>Why not
> struct virtio_queue_info vqs_info[VIRTIO_SND_VQ_MAX] ?
>
>otherwise it's not clear all arrays are same size.
True. My mistake. I will fix this in v2.
>
>
>> + [VIRTIO_SND_VQ_CONTROL] = { "virtsnd-ctl",
>> + virtsnd_ctl_notify_cb },
>> + [VIRTIO_SND_VQ_EVENT] = { "virtsnd-event",
>> + virtsnd_event_notify_cb },
>> + [VIRTIO_SND_VQ_TX] = { "virtsnd-tx",
>> + virtsnd_pcm_tx_notify_cb },
>> + [VIRTIO_SND_VQ_RX] = { "virtsnd-rx",
>> + virtsnd_pcm_rx_notify_cb },
>> };
>> struct virtqueue *vqs[VIRTIO_SND_VQ_MAX] = { 0 };
>> unsigned int i;
>> unsigned int n;
>> int rc;
>>
>> - rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, callbacks, names,
>> - NULL);
>> + rc = virtio_find_vqs_info(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
>> if (rc) {
>> dev_err(&vdev->dev, "failed to initialize virtqueues\n");
>> return rc;
>> --
>> 2.45.2
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH virtio 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (16 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:39 ` [PATCH virtio 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs() Jiri Pirko
2024-07-03 12:50 ` [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Michael S. Tsirkin
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
All callers of virtio_find_vqs() and virtio_find_vqs_ctx() were
converted to use virtio_find_vqs_info(). Remove no longer used helpers.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
include/linux/virtio_config.h | 32 --------------------------------
1 file changed, 32 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 24bbb1805b80..639d68e95580 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -226,38 +226,6 @@ int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
return vdev->config->find_vqs(vdev, nvqs, vqs, vqs_info, desc);
}
-static inline
-int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
- struct irq_affinity *desc)
-{
- struct virtio_queue_info *vqs_info;
- int err, i;
-
- vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
- if (!vqs_info)
- return -ENOMEM;
- for (i = 0; i < nvqs; i++) {
- vqs_info[i].name = names[i];
- vqs_info[i].callback = callbacks[i];
- vqs_info[i].ctx = ctx ? ctx[i] : false;
- }
- err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
- kfree(vqs_info);
- return err;
-}
-
-static inline
-int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[],
- struct irq_affinity *desc)
-{
- return virtio_find_vqs_ctx(vdev, nvqs, vqs, callbacks,
- names, NULL, desc);
-}
-
static inline
struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
vq_callback_t *c, const char *n)
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (17 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers Jiri Pirko
@ 2024-07-03 12:39 ` Jiri Pirko
2024-07-03 12:50 ` [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Michael S. Tsirkin
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 12:39 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Since the original virtio_find_vqs() is no longer present, rename
virtio_find_vqs_info() back to virtio_find_vqs().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
arch/um/drivers/virt-pci.c | 2 +-
drivers/block/virtio_blk.c | 2 +-
drivers/bluetooth/virtio_bt.c | 3 +--
drivers/char/virtio_console.c | 3 +--
drivers/crypto/virtio/virtio_crypto_core.c | 2 +-
drivers/firmware/arm_scmi/virtio.c | 2 +-
drivers/gpio/gpio-virtio.c | 4 ++--
drivers/gpu/drm/virtio/virtgpu_kms.c | 2 +-
drivers/iommu/virtio-iommu.c | 4 ++--
drivers/net/virtio_net.c | 2 +-
drivers/net/wireless/virtual/mac80211_hwsim.c | 4 ++--
drivers/rpmsg/virtio_rpmsg_bus.c | 2 +-
drivers/scsi/virtio_scsi.c | 2 +-
drivers/virtio/virtio_balloon.c | 4 ++--
drivers/virtio/virtio_input.c | 2 +-
fs/fuse/virtio_fs.c | 2 +-
include/linux/virtio_config.h | 10 +++++-----
net/vmw_vsock/virtio_transport.c | 3 +--
sound/virtio/virtio_card.c | 2 +-
19 files changed, 27 insertions(+), 30 deletions(-)
diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
index 3df2ea53471a..643b52d957d9 100644
--- a/arch/um/drivers/virt-pci.c
+++ b/arch/um/drivers/virt-pci.c
@@ -574,7 +574,7 @@ static int um_pci_init_vqs(struct um_pci_device *dev)
struct virtqueue *vqs[2];
int err, i;
- err = virtio_find_vqs_info(dev->vdev, 2, vqs, vqs_info, NULL);
+ err = virtio_find_vqs(dev->vdev, 2, vqs, vqs_info, NULL);
if (err)
return err;
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 574498280dee..96f5fffee4b9 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -1020,7 +1020,7 @@ static int init_vq(struct virtio_blk *vblk)
}
/* Discover virtqueues and write information to configuration. */
- err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
+ err = virtio_find_vqs(vdev, num_vqs, vqs, vqs_info, &desc);
if (err)
goto out;
diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c
index 6481f9fe24c4..a9a82c358cb9 100644
--- a/drivers/bluetooth/virtio_bt.c
+++ b/drivers/bluetooth/virtio_bt.c
@@ -285,8 +285,7 @@ static int virtbt_probe(struct virtio_device *vdev)
INIT_WORK(&vbt->rx, virtbt_rx_work);
- err = virtio_find_vqs_info(vdev, VIRTBT_NUM_VQS, vbt->vqs,
- vqs_info, NULL);
+ err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, vqs_info, NULL);
if (err)
return err;
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 23dbf1c18c90..b69fb675883c 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1849,8 +1849,7 @@ static int init_vqs(struct ports_device *portdev)
}
}
/* Find the queues. */
- err = virtio_find_vqs_info(portdev->vdev, nr_queues, vqs,
- vqs_info, NULL);
+ err = virtio_find_vqs(portdev->vdev, nr_queues, vqs, vqs_info, NULL);
if (err)
goto free;
diff --git a/drivers/crypto/virtio/virtio_crypto_core.c b/drivers/crypto/virtio/virtio_crypto_core.c
index 800d5c2a688c..fb7853fdad3a 100644
--- a/drivers/crypto/virtio/virtio_crypto_core.c
+++ b/drivers/crypto/virtio/virtio_crypto_core.c
@@ -129,7 +129,7 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
vqs_info[i].name = vi->data_vq[i].name;
}
- ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
+ ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, vqs_info, NULL);
if (ret)
goto err_find;
diff --git a/drivers/firmware/arm_scmi/virtio.c b/drivers/firmware/arm_scmi/virtio.c
index a6ae59c03308..0ee745762a43 100644
--- a/drivers/firmware/arm_scmi/virtio.c
+++ b/drivers/firmware/arm_scmi/virtio.c
@@ -829,7 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
if (have_vq_rx)
channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
- ret = virtio_find_vqs_info(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
+ ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
if (ret) {
dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
return ret;
diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c
index a45b392358c4..c0a0913d62c7 100644
--- a/drivers/gpio/gpio-virtio.c
+++ b/drivers/gpio/gpio-virtio.c
@@ -464,8 +464,8 @@ static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
struct virtqueue *vqs[2] = { NULL, NULL };
int ret;
- ret = virtio_find_vqs_info(vdev, vgpio->irq_lines ? 2 : 1, vqs,
- vqs_info, NULL);
+ ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs,
+ vqs_info, NULL);
if (ret) {
dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
return ret;
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 938c08a707eb..ebb6ece2aec3 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -206,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
DRM_INFO("features: %ccontext_init\n",
vgdev->has_context_init ? '+' : '-');
- ret = virtio_find_vqs_info(vgdev->vdev, 2, vqs, vqs_info, NULL);
+ ret = virtio_find_vqs(vgdev->vdev, 2, vqs, vqs_info, NULL);
if (ret) {
DRM_ERROR("failed to find virt queues\n");
goto err_vqs;
diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
index ef77c1efc767..9f713789cd4a 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -1099,8 +1099,8 @@ static int viommu_init_vqs(struct viommu_dev *viommu)
{ "event", viommu_event_handler },
};
- return virtio_find_vqs_info(vdev, VIOMMU_NR_VQS, viommu->vqs,
- vqs_info, NULL);
+ return virtio_find_vqs(vdev, VIOMMU_NR_VQS, viommu->vqs,
+ vqs_info, NULL);
}
static int viommu_fill_evtq(struct viommu_dev *viommu)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 3e367c7b88a0..981703972483 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -4397,7 +4397,7 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
vqs_info[rxq2vq(i)].ctx = true;
}
- ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
+ ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, vqs_info, NULL);
if (ret)
goto err_find;
diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
index 565c091f1ba5..7782fc59701a 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -6563,8 +6563,8 @@ static int init_vqs(struct virtio_device *vdev)
[HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
};
- return virtio_find_vqs_info(vdev, HWSIM_NUM_VQS,
- hwsim_vqs, vqs_info, NULL);
+ return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
+ hwsim_vqs, vqs_info, NULL);
}
static int fill_vq(struct virtqueue *vq)
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index 440f1cc9157d..32e8a546edf3 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -893,7 +893,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
init_waitqueue_head(&vrp->sendq);
/* We expect two virtqueues, rx and tx (and in this order) */
- err = virtio_find_vqs_info(vdev, 2, vqs, vqs_info, NULL);
+ err = virtio_find_vqs(vdev, 2, vqs, vqs_info, NULL);
if (err)
goto free_vrp;
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 416c6820b537..25db62f01be9 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -879,7 +879,7 @@ static int virtscsi_init(struct virtio_device *vdev,
vqs_info[i].name = "request_poll";
/* Discover virtqueues and write information to configuration. */
- err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
+ err = virtio_find_vqs(vdev, num_vqs, vqs, vqs_info, &desc);
if (err)
goto out;
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index 02ae30cc96ec..49719d74449b 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -572,8 +572,8 @@ static int init_vqs(struct virtio_balloon *vb)
vqs_info[VIRTIO_BALLOON_VQ_REPORTING].callback = balloon_ack;
}
- err = virtio_find_vqs_info(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
- vqs_info, NULL);
+ err = virtio_find_vqs(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
+ vqs_info, NULL);
if (err)
return err;
diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
index e1491ad9eced..2cd1df0b6533 100644
--- a/drivers/virtio/virtio_input.c
+++ b/drivers/virtio/virtio_input.c
@@ -192,7 +192,7 @@ static int virtinput_init_vqs(struct virtio_input *vi)
struct virtqueue *vqs[2];
int err;
- err = virtio_find_vqs_info(vi->vdev, 2, vqs, vqs_info, NULL);
+ err = virtio_find_vqs(vi->vdev, 2, vqs, vqs_info, NULL);
if (err)
return err;
vi->evt = vqs[0];
diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
index 466d4888d664..0424eb15867c 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -777,7 +777,7 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
vqs_info[i].name = fs->vqs[i].name;
}
- ret = virtio_find_vqs_info(vdev, fs->nvqs, vqs, vqs_info, NULL);
+ ret = virtio_find_vqs(vdev, fs->nvqs, vqs, vqs_info, NULL);
if (ret < 0)
goto out;
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 639d68e95580..3c48f1ff6efc 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -218,10 +218,10 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
}
static inline
-int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[],
- struct virtio_queue_info vqs_info[],
- struct irq_affinity *desc)
+int virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
+ struct virtqueue *vqs[],
+ struct virtio_queue_info vqs_info[],
+ struct irq_affinity *desc)
{
return vdev->config->find_vqs(vdev, nvqs, vqs, vqs_info, desc);
}
@@ -234,7 +234,7 @@ struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
{ n, c },
};
struct virtqueue *vq;
- int err = virtio_find_vqs_info(vdev, 1, &vq, vqs_info, NULL);
+ int err = virtio_find_vqs(vdev, 1, &vq, vqs_info, NULL);
if (err < 0)
return ERR_PTR(err);
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index d303ef4d9898..3e957cf65412 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -624,8 +624,7 @@ static int virtio_vsock_vqs_init(struct virtio_vsock *vsock)
};
int ret;
- ret = virtio_find_vqs_info(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info,
- NULL);
+ ret = virtio_find_vqs(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info, NULL);
if (ret < 0)
return ret;
diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c
index a6b0da6790dc..ae560365439b 100644
--- a/sound/virtio/virtio_card.c
+++ b/sound/virtio/virtio_card.c
@@ -125,7 +125,7 @@ static int virtsnd_find_vqs(struct virtio_snd *snd)
unsigned int n;
int rc;
- rc = virtio_find_vqs_info(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
+ rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
if (rc) {
dev_err(&vdev->dev, "failed to initialize virtqueues\n");
return rc;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
2024-07-03 12:38 [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (18 preceding siblings ...)
2024-07-03 12:39 ` [PATCH virtio 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs() Jiri Pirko
@ 2024-07-03 12:50 ` Michael S. Tsirkin
2024-07-03 13:24 ` Jiri Pirko
19 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-03 12:50 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@nvidia.com>
>
> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
> names, callbacks and ctx (in case of the second one) as separate args.
> That became inconvenient as the ctx addition showed.
>
> For virtio_net control queue, an indication of queue flavour (slow path)
> is going to be needed to be passed to PCI transport in order to
> assign vectors properly, another array added to virtio_find_vqs_ctx()
> arg list would not be nice and convenient.
>
> Instead, introduce a structure to carry vq callback, name and ctx. Pass
> array of these structures to virtio_find_vqs() and all the way down to
> transport find_vqs() op implementation.
>
> That allows to easily extend what needs to be passed down. Also, it
> makes the code a bit more cleaner. We get rid of separate
> virtio_find_vqs_ctx() helper.
>
> This patchset does the conversion in steps, using temporary _info() op
> and helper. Note they are renamed back.
Thanks a lot Jiri, looks very good.
Some minor comments.
> Patch #1 does one forgotten conversion to virtio_find_single_vq().
> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
> introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
> Patches #5 and #6 convert transports to implement find_vqs_info() op
> that accepts array of virtio_queue_info structs.
> Patch #7 converts virtio_find_single_vq() to use the new way as well.
> Patch #8 removes original find_vqs() op.
> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
> of conversion this patches does.
> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
> users to use new virtio_find_vqs_info() helper.
> Patch #18 removes no longer used virtio_find_vqs() and
> virtio_find_vqs_ctx() helpers.
> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
> to virtio_find_vqs().
>
> Jiri Pirko (19):
> caif_virtio: use virtio_find_single_vq() for single virtqueue finding
> virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
> virtio: make virtio_find_single_vq() call virtio_find_vqs()
> virtio: introduce virtio_queue_info struct and find_vqs_info() config
> op
> virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
> virtio: convert find_vqs() op implementations to find_vqs_info()
> virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
> directly
> virtio: remove the original find_vqs() op
> virtio: rename find_vqs_info() op to find_vqs()
> virtio_blk: convert to use virtio_find_vqs_info()
> virtio_console: convert to use virtio_find_vqs_info()
> virtio_crypto: convert to use virtio_find_vqs_info()
> virtio_net: convert to use virtio_find_vqs_info()
> scsi: virtio_scsi: convert to use virtio_find_vqs_info()
> virtiofs: convert to use virtio_find_vqs_info()
> virtio_balloon: convert to use virtio_find_vqs_info()
> virtio: convert the rest virtio_find_vqs() users to
> virtio_find_vqs_info()
> virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
> helpers
> virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
>
> arch/um/drivers/virt-pci.c | 8 ++-
> arch/um/drivers/virtio_uml.c | 12 ++--
> drivers/block/virtio_blk.c | 20 +++----
> drivers/bluetooth/virtio_bt.c | 13 ++--
> drivers/char/virtio_console.c | 43 ++++++-------
> drivers/crypto/virtio/virtio_crypto_core.c | 31 ++++------
> drivers/firmware/arm_scmi/virtio.c | 11 ++--
> drivers/gpio/gpio-virtio.c | 10 ++--
> drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++-
> drivers/iommu/virtio-iommu.c | 11 ++--
> drivers/net/caif/caif_virtio.c | 8 +--
> drivers/net/virtio_net.c | 34 ++++-------
> drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
> drivers/platform/mellanox/mlxbf-tmfifo.c | 10 ++--
> drivers/remoteproc/remoteproc_virtio.c | 12 ++--
> drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++-
> drivers/s390/virtio/virtio_ccw.c | 13 ++--
> drivers/scsi/virtio_scsi.c | 32 ++++------
> drivers/virtio/virtio_balloon.c | 32 ++++------
> drivers/virtio/virtio_input.c | 9 +--
> drivers/virtio/virtio_mmio.c | 12 ++--
> drivers/virtio/virtio_pci_common.c | 49 ++++++++-------
> drivers/virtio/virtio_pci_common.h | 4 +-
> drivers/virtio/virtio_pci_modern.c | 5 +-
> drivers/virtio/virtio_vdpa.c | 13 ++--
> fs/fuse/virtio_fs.c | 22 +++----
> include/linux/virtio_config.h | 60 +++++++++----------
> net/vmw_vsock/virtio_transport.c | 16 ++---
> sound/virtio/virtio_card.c | 23 ++++---
> 29 files changed, 240 insertions(+), 302 deletions(-)
>
> --
> 2.45.2
^ permalink raw reply [flat|nested] 30+ messages in thread* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
2024-07-03 12:50 ` [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs() Michael S. Tsirkin
@ 2024-07-03 13:24 ` Jiri Pirko
2024-07-03 13:37 ` Michael S. Tsirkin
0 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-03 13:24 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Wed, Jul 03, 2024 at 02:50:36PM CEST, mst@redhat.com wrote:
>On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@nvidia.com>
>>
>> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
>> names, callbacks and ctx (in case of the second one) as separate args.
>> That became inconvenient as the ctx addition showed.
>>
>> For virtio_net control queue, an indication of queue flavour (slow path)
>> is going to be needed to be passed to PCI transport in order to
>> assign vectors properly, another array added to virtio_find_vqs_ctx()
>> arg list would not be nice and convenient.
>>
>> Instead, introduce a structure to carry vq callback, name and ctx. Pass
>> array of these structures to virtio_find_vqs() and all the way down to
>> transport find_vqs() op implementation.
>>
>> That allows to easily extend what needs to be passed down. Also, it
>> makes the code a bit more cleaner. We get rid of separate
>> virtio_find_vqs_ctx() helper.
>>
>> This patchset does the conversion in steps, using temporary _info() op
>> and helper. Note they are renamed back.
>
>Thanks a lot Jiri, looks very good.
>Some minor comments.
Will fix and send v2 tomorrow. I have my admin queue patchset rebased on
top of this and code will be ready for control queue to benefit from
vector allocation.
>
>
>> Patch #1 does one forgotten conversion to virtio_find_single_vq().
>> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
>> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
>> introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
>> Patches #5 and #6 convert transports to implement find_vqs_info() op
>> that accepts array of virtio_queue_info structs.
>> Patch #7 converts virtio_find_single_vq() to use the new way as well.
>> Patch #8 removes original find_vqs() op.
>> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
>> of conversion this patches does.
>> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
>> users to use new virtio_find_vqs_info() helper.
>> Patch #18 removes no longer used virtio_find_vqs() and
>> virtio_find_vqs_ctx() helpers.
>> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
>> to virtio_find_vqs().
>>
>> Jiri Pirko (19):
>> caif_virtio: use virtio_find_single_vq() for single virtqueue finding
>> virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
>> virtio: make virtio_find_single_vq() call virtio_find_vqs()
>> virtio: introduce virtio_queue_info struct and find_vqs_info() config
>> op
>> virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
>> virtio: convert find_vqs() op implementations to find_vqs_info()
>> virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
>> directly
>> virtio: remove the original find_vqs() op
>> virtio: rename find_vqs_info() op to find_vqs()
>> virtio_blk: convert to use virtio_find_vqs_info()
>> virtio_console: convert to use virtio_find_vqs_info()
>> virtio_crypto: convert to use virtio_find_vqs_info()
>> virtio_net: convert to use virtio_find_vqs_info()
>> scsi: virtio_scsi: convert to use virtio_find_vqs_info()
>> virtiofs: convert to use virtio_find_vqs_info()
>> virtio_balloon: convert to use virtio_find_vqs_info()
>> virtio: convert the rest virtio_find_vqs() users to
>> virtio_find_vqs_info()
>> virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
>> helpers
>> virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
>>
>> arch/um/drivers/virt-pci.c | 8 ++-
>> arch/um/drivers/virtio_uml.c | 12 ++--
>> drivers/block/virtio_blk.c | 20 +++----
>> drivers/bluetooth/virtio_bt.c | 13 ++--
>> drivers/char/virtio_console.c | 43 ++++++-------
>> drivers/crypto/virtio/virtio_crypto_core.c | 31 ++++------
>> drivers/firmware/arm_scmi/virtio.c | 11 ++--
>> drivers/gpio/gpio-virtio.c | 10 ++--
>> drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++-
>> drivers/iommu/virtio-iommu.c | 11 ++--
>> drivers/net/caif/caif_virtio.c | 8 +--
>> drivers/net/virtio_net.c | 34 ++++-------
>> drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
>> drivers/platform/mellanox/mlxbf-tmfifo.c | 10 ++--
>> drivers/remoteproc/remoteproc_virtio.c | 12 ++--
>> drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++-
>> drivers/s390/virtio/virtio_ccw.c | 13 ++--
>> drivers/scsi/virtio_scsi.c | 32 ++++------
>> drivers/virtio/virtio_balloon.c | 32 ++++------
>> drivers/virtio/virtio_input.c | 9 +--
>> drivers/virtio/virtio_mmio.c | 12 ++--
>> drivers/virtio/virtio_pci_common.c | 49 ++++++++-------
>> drivers/virtio/virtio_pci_common.h | 4 +-
>> drivers/virtio/virtio_pci_modern.c | 5 +-
>> drivers/virtio/virtio_vdpa.c | 13 ++--
>> fs/fuse/virtio_fs.c | 22 +++----
>> include/linux/virtio_config.h | 60 +++++++++----------
>> net/vmw_vsock/virtio_transport.c | 16 ++---
>> sound/virtio/virtio_card.c | 23 ++++---
>> 29 files changed, 240 insertions(+), 302 deletions(-)
>>
>> --
>> 2.45.2
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
2024-07-03 13:24 ` Jiri Pirko
@ 2024-07-03 13:37 ` Michael S. Tsirkin
2024-07-04 11:38 ` Xuan Zhuo
0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-03 13:37 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
On Wed, Jul 03, 2024 at 03:24:51PM +0200, Jiri Pirko wrote:
> Wed, Jul 03, 2024 at 02:50:36PM CEST, mst@redhat.com wrote:
> >On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
> >> From: Jiri Pirko <jiri@nvidia.com>
> >>
> >> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
> >> names, callbacks and ctx (in case of the second one) as separate args.
> >> That became inconvenient as the ctx addition showed.
> >>
> >> For virtio_net control queue, an indication of queue flavour (slow path)
> >> is going to be needed to be passed to PCI transport in order to
> >> assign vectors properly, another array added to virtio_find_vqs_ctx()
> >> arg list would not be nice and convenient.
> >>
> >> Instead, introduce a structure to carry vq callback, name and ctx. Pass
> >> array of these structures to virtio_find_vqs() and all the way down to
> >> transport find_vqs() op implementation.
> >>
> >> That allows to easily extend what needs to be passed down. Also, it
> >> makes the code a bit more cleaner. We get rid of separate
> >> virtio_find_vqs_ctx() helper.
> >>
> >> This patchset does the conversion in steps, using temporary _info() op
> >> and helper. Note they are renamed back.
> >
> >Thanks a lot Jiri, looks very good.
> >Some minor comments.
>
> Will fix and send v2 tomorrow. I have my admin queue patchset rebased on
> top of this and code will be ready for control queue to benefit from
> vector allocation.
Excellent, I hope it makes it in next in time for the next merge window.
>
> >
> >
> >> Patch #1 does one forgotten conversion to virtio_find_single_vq().
> >> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
> >> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
> >> introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
> >> Patches #5 and #6 convert transports to implement find_vqs_info() op
> >> that accepts array of virtio_queue_info structs.
> >> Patch #7 converts virtio_find_single_vq() to use the new way as well.
> >> Patch #8 removes original find_vqs() op.
> >> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
> >> of conversion this patches does.
> >> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
> >> users to use new virtio_find_vqs_info() helper.
> >> Patch #18 removes no longer used virtio_find_vqs() and
> >> virtio_find_vqs_ctx() helpers.
> >> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
> >> to virtio_find_vqs().
> >>
> >> Jiri Pirko (19):
> >> caif_virtio: use virtio_find_single_vq() for single virtqueue finding
> >> virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
> >> virtio: make virtio_find_single_vq() call virtio_find_vqs()
> >> virtio: introduce virtio_queue_info struct and find_vqs_info() config
> >> op
> >> virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
> >> virtio: convert find_vqs() op implementations to find_vqs_info()
> >> virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
> >> directly
> >> virtio: remove the original find_vqs() op
> >> virtio: rename find_vqs_info() op to find_vqs()
> >> virtio_blk: convert to use virtio_find_vqs_info()
> >> virtio_console: convert to use virtio_find_vqs_info()
> >> virtio_crypto: convert to use virtio_find_vqs_info()
> >> virtio_net: convert to use virtio_find_vqs_info()
> >> scsi: virtio_scsi: convert to use virtio_find_vqs_info()
> >> virtiofs: convert to use virtio_find_vqs_info()
> >> virtio_balloon: convert to use virtio_find_vqs_info()
> >> virtio: convert the rest virtio_find_vqs() users to
> >> virtio_find_vqs_info()
> >> virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
> >> helpers
> >> virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
> >>
> >> arch/um/drivers/virt-pci.c | 8 ++-
> >> arch/um/drivers/virtio_uml.c | 12 ++--
> >> drivers/block/virtio_blk.c | 20 +++----
> >> drivers/bluetooth/virtio_bt.c | 13 ++--
> >> drivers/char/virtio_console.c | 43 ++++++-------
> >> drivers/crypto/virtio/virtio_crypto_core.c | 31 ++++------
> >> drivers/firmware/arm_scmi/virtio.c | 11 ++--
> >> drivers/gpio/gpio-virtio.c | 10 ++--
> >> drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++-
> >> drivers/iommu/virtio-iommu.c | 11 ++--
> >> drivers/net/caif/caif_virtio.c | 8 +--
> >> drivers/net/virtio_net.c | 34 ++++-------
> >> drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
> >> drivers/platform/mellanox/mlxbf-tmfifo.c | 10 ++--
> >> drivers/remoteproc/remoteproc_virtio.c | 12 ++--
> >> drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++-
> >> drivers/s390/virtio/virtio_ccw.c | 13 ++--
> >> drivers/scsi/virtio_scsi.c | 32 ++++------
> >> drivers/virtio/virtio_balloon.c | 32 ++++------
> >> drivers/virtio/virtio_input.c | 9 +--
> >> drivers/virtio/virtio_mmio.c | 12 ++--
> >> drivers/virtio/virtio_pci_common.c | 49 ++++++++-------
> >> drivers/virtio/virtio_pci_common.h | 4 +-
> >> drivers/virtio/virtio_pci_modern.c | 5 +-
> >> drivers/virtio/virtio_vdpa.c | 13 ++--
> >> fs/fuse/virtio_fs.c | 22 +++----
> >> include/linux/virtio_config.h | 60 +++++++++----------
> >> net/vmw_vsock/virtio_transport.c | 16 ++---
> >> sound/virtio/virtio_card.c | 23 ++++---
> >> 29 files changed, 240 insertions(+), 302 deletions(-)
> >>
> >> --
> >> 2.45.2
> >
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
2024-07-03 13:37 ` Michael S. Tsirkin
@ 2024-07-04 11:38 ` Xuan Zhuo
2024-07-04 12:39 ` Michael S. Tsirkin
0 siblings, 1 reply; 30+ messages in thread
From: Xuan Zhuo @ 2024-07-04 11:38 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, eperezma, parav, feliu, hengqi,
Jiri Pirko
On Wed, 3 Jul 2024 09:37:10 -0400, "Michael S. Tsirkin" <mst@redhat.com> wrote:
> On Wed, Jul 03, 2024 at 03:24:51PM +0200, Jiri Pirko wrote:
> > Wed, Jul 03, 2024 at 02:50:36PM CEST, mst@redhat.com wrote:
> > >On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
> > >> From: Jiri Pirko <jiri@nvidia.com>
> > >>
> > >> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
> > >> names, callbacks and ctx (in case of the second one) as separate args.
> > >> That became inconvenient as the ctx addition showed.
> > >>
> > >> For virtio_net control queue, an indication of queue flavour (slow path)
> > >> is going to be needed to be passed to PCI transport in order to
> > >> assign vectors properly, another array added to virtio_find_vqs_ctx()
> > >> arg list would not be nice and convenient.
> > >>
> > >> Instead, introduce a structure to carry vq callback, name and ctx. Pass
> > >> array of these structures to virtio_find_vqs() and all the way down to
> > >> transport find_vqs() op implementation.
> > >>
> > >> That allows to easily extend what needs to be passed down. Also, it
> > >> makes the code a bit more cleaner. We get rid of separate
> > >> virtio_find_vqs_ctx() helper.
> > >>
> > >> This patchset does the conversion in steps, using temporary _info() op
> > >> and helper. Note they are renamed back.
> > >
> > >Thanks a lot Jiri, looks very good.
> > >Some minor comments.
> >
> > Will fix and send v2 tomorrow. I have my admin queue patchset rebased on
> > top of this and code will be ready for control queue to benefit from
> > vector allocation.
>
>
> Excellent, I hope it makes it in next in time for the next merge window.
Hi, Michael, you know I was working on this.
Is the virtio community already in such a mess?
>
> >
> > >
> > >
> > >> Patch #1 does one forgotten conversion to virtio_find_single_vq().
> > >> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
> > >> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
> > >> introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
> > >> Patches #5 and #6 convert transports to implement find_vqs_info() op
> > >> that accepts array of virtio_queue_info structs.
> > >> Patch #7 converts virtio_find_single_vq() to use the new way as well.
> > >> Patch #8 removes original find_vqs() op.
> > >> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
> > >> of conversion this patches does.
> > >> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
> > >> users to use new virtio_find_vqs_info() helper.
> > >> Patch #18 removes no longer used virtio_find_vqs() and
> > >> virtio_find_vqs_ctx() helpers.
> > >> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
> > >> to virtio_find_vqs().
> > >>
> > >> Jiri Pirko (19):
> > >> caif_virtio: use virtio_find_single_vq() for single virtqueue finding
> > >> virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
> > >> virtio: make virtio_find_single_vq() call virtio_find_vqs()
> > >> virtio: introduce virtio_queue_info struct and find_vqs_info() config
> > >> op
> > >> virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
> > >> virtio: convert find_vqs() op implementations to find_vqs_info()
> > >> virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
> > >> directly
> > >> virtio: remove the original find_vqs() op
> > >> virtio: rename find_vqs_info() op to find_vqs()
> > >> virtio_blk: convert to use virtio_find_vqs_info()
> > >> virtio_console: convert to use virtio_find_vqs_info()
> > >> virtio_crypto: convert to use virtio_find_vqs_info()
> > >> virtio_net: convert to use virtio_find_vqs_info()
> > >> scsi: virtio_scsi: convert to use virtio_find_vqs_info()
> > >> virtiofs: convert to use virtio_find_vqs_info()
> > >> virtio_balloon: convert to use virtio_find_vqs_info()
> > >> virtio: convert the rest virtio_find_vqs() users to
> > >> virtio_find_vqs_info()
> > >> virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
> > >> helpers
> > >> virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
> > >>
> > >> arch/um/drivers/virt-pci.c | 8 ++-
> > >> arch/um/drivers/virtio_uml.c | 12 ++--
> > >> drivers/block/virtio_blk.c | 20 +++----
> > >> drivers/bluetooth/virtio_bt.c | 13 ++--
> > >> drivers/char/virtio_console.c | 43 ++++++-------
> > >> drivers/crypto/virtio/virtio_crypto_core.c | 31 ++++------
> > >> drivers/firmware/arm_scmi/virtio.c | 11 ++--
> > >> drivers/gpio/gpio-virtio.c | 10 ++--
> > >> drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++-
> > >> drivers/iommu/virtio-iommu.c | 11 ++--
> > >> drivers/net/caif/caif_virtio.c | 8 +--
> > >> drivers/net/virtio_net.c | 34 ++++-------
> > >> drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
> > >> drivers/platform/mellanox/mlxbf-tmfifo.c | 10 ++--
> > >> drivers/remoteproc/remoteproc_virtio.c | 12 ++--
> > >> drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++-
> > >> drivers/s390/virtio/virtio_ccw.c | 13 ++--
> > >> drivers/scsi/virtio_scsi.c | 32 ++++------
> > >> drivers/virtio/virtio_balloon.c | 32 ++++------
> > >> drivers/virtio/virtio_input.c | 9 +--
> > >> drivers/virtio/virtio_mmio.c | 12 ++--
> > >> drivers/virtio/virtio_pci_common.c | 49 ++++++++-------
> > >> drivers/virtio/virtio_pci_common.h | 4 +-
> > >> drivers/virtio/virtio_pci_modern.c | 5 +-
> > >> drivers/virtio/virtio_vdpa.c | 13 ++--
> > >> fs/fuse/virtio_fs.c | 22 +++----
> > >> include/linux/virtio_config.h | 60 +++++++++----------
> > >> net/vmw_vsock/virtio_transport.c | 16 ++---
> > >> sound/virtio/virtio_card.c | 23 ++++---
> > >> 29 files changed, 240 insertions(+), 302 deletions(-)
> > >>
> > >> --
> > >> 2.45.2
> > >
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
2024-07-04 11:38 ` Xuan Zhuo
@ 2024-07-04 12:39 ` Michael S. Tsirkin
2024-07-04 12:55 ` Jiri Pirko
0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-04 12:39 UTC (permalink / raw)
To: Xuan Zhuo
Cc: virtualization, jasowang, eperezma, parav, feliu, hengqi,
Jiri Pirko
On Thu, Jul 04, 2024 at 07:38:35PM +0800, Xuan Zhuo wrote:
> On Wed, 3 Jul 2024 09:37:10 -0400, "Michael S. Tsirkin" <mst@redhat.com> wrote:
> > On Wed, Jul 03, 2024 at 03:24:51PM +0200, Jiri Pirko wrote:
> > > Wed, Jul 03, 2024 at 02:50:36PM CEST, mst@redhat.com wrote:
> > > >On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
> > > >> From: Jiri Pirko <jiri@nvidia.com>
> > > >>
> > > >> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
> > > >> names, callbacks and ctx (in case of the second one) as separate args.
> > > >> That became inconvenient as the ctx addition showed.
> > > >>
> > > >> For virtio_net control queue, an indication of queue flavour (slow path)
> > > >> is going to be needed to be passed to PCI transport in order to
> > > >> assign vectors properly, another array added to virtio_find_vqs_ctx()
> > > >> arg list would not be nice and convenient.
> > > >>
> > > >> Instead, introduce a structure to carry vq callback, name and ctx. Pass
> > > >> array of these structures to virtio_find_vqs() and all the way down to
> > > >> transport find_vqs() op implementation.
> > > >>
> > > >> That allows to easily extend what needs to be passed down. Also, it
> > > >> makes the code a bit more cleaner. We get rid of separate
> > > >> virtio_find_vqs_ctx() helper.
> > > >>
> > > >> This patchset does the conversion in steps, using temporary _info() op
> > > >> and helper. Note they are renamed back.
> > > >
> > > >Thanks a lot Jiri, looks very good.
> > > >Some minor comments.
> > >
> > > Will fix and send v2 tomorrow. I have my admin queue patchset rebased on
> > > top of this and code will be ready for control queue to benefit from
> > > vector allocation.
> >
> >
> > Excellent, I hope it makes it in next in time for the next merge window.
>
> Hi, Michael, you know I was working on this.
>
> Is the virtio community already in such a mess?
Sorry you feel that way. Jiri, I think it's fair to add
Suggested-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
to patches 4 and 10-17.
> >
> > >
> > > >
> > > >
> > > >> Patch #1 does one forgotten conversion to virtio_find_single_vq().
> > > >> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
> > > >> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
> > > >> introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
> > > >> Patches #5 and #6 convert transports to implement find_vqs_info() op
> > > >> that accepts array of virtio_queue_info structs.
> > > >> Patch #7 converts virtio_find_single_vq() to use the new way as well.
> > > >> Patch #8 removes original find_vqs() op.
> > > >> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
> > > >> of conversion this patches does.
> > > >> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
> > > >> users to use new virtio_find_vqs_info() helper.
> > > >> Patch #18 removes no longer used virtio_find_vqs() and
> > > >> virtio_find_vqs_ctx() helpers.
> > > >> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
> > > >> to virtio_find_vqs().
> > > >>
> > > >> Jiri Pirko (19):
> > > >> caif_virtio: use virtio_find_single_vq() for single virtqueue finding
> > > >> virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
> > > >> virtio: make virtio_find_single_vq() call virtio_find_vqs()
> > > >> virtio: introduce virtio_queue_info struct and find_vqs_info() config
> > > >> op
> > > >> virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
> > > >> virtio: convert find_vqs() op implementations to find_vqs_info()
> > > >> virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
> > > >> directly
> > > >> virtio: remove the original find_vqs() op
> > > >> virtio: rename find_vqs_info() op to find_vqs()
> > > >> virtio_blk: convert to use virtio_find_vqs_info()
> > > >> virtio_console: convert to use virtio_find_vqs_info()
> > > >> virtio_crypto: convert to use virtio_find_vqs_info()
> > > >> virtio_net: convert to use virtio_find_vqs_info()
> > > >> scsi: virtio_scsi: convert to use virtio_find_vqs_info()
> > > >> virtiofs: convert to use virtio_find_vqs_info()
> > > >> virtio_balloon: convert to use virtio_find_vqs_info()
> > > >> virtio: convert the rest virtio_find_vqs() users to
> > > >> virtio_find_vqs_info()
> > > >> virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
> > > >> helpers
> > > >> virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
> > > >>
> > > >> arch/um/drivers/virt-pci.c | 8 ++-
> > > >> arch/um/drivers/virtio_uml.c | 12 ++--
> > > >> drivers/block/virtio_blk.c | 20 +++----
> > > >> drivers/bluetooth/virtio_bt.c | 13 ++--
> > > >> drivers/char/virtio_console.c | 43 ++++++-------
> > > >> drivers/crypto/virtio/virtio_crypto_core.c | 31 ++++------
> > > >> drivers/firmware/arm_scmi/virtio.c | 11 ++--
> > > >> drivers/gpio/gpio-virtio.c | 10 ++--
> > > >> drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++-
> > > >> drivers/iommu/virtio-iommu.c | 11 ++--
> > > >> drivers/net/caif/caif_virtio.c | 8 +--
> > > >> drivers/net/virtio_net.c | 34 ++++-------
> > > >> drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
> > > >> drivers/platform/mellanox/mlxbf-tmfifo.c | 10 ++--
> > > >> drivers/remoteproc/remoteproc_virtio.c | 12 ++--
> > > >> drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++-
> > > >> drivers/s390/virtio/virtio_ccw.c | 13 ++--
> > > >> drivers/scsi/virtio_scsi.c | 32 ++++------
> > > >> drivers/virtio/virtio_balloon.c | 32 ++++------
> > > >> drivers/virtio/virtio_input.c | 9 +--
> > > >> drivers/virtio/virtio_mmio.c | 12 ++--
> > > >> drivers/virtio/virtio_pci_common.c | 49 ++++++++-------
> > > >> drivers/virtio/virtio_pci_common.h | 4 +-
> > > >> drivers/virtio/virtio_pci_modern.c | 5 +-
> > > >> drivers/virtio/virtio_vdpa.c | 13 ++--
> > > >> fs/fuse/virtio_fs.c | 22 +++----
> > > >> include/linux/virtio_config.h | 60 +++++++++----------
> > > >> net/vmw_vsock/virtio_transport.c | 16 ++---
> > > >> sound/virtio/virtio_card.c | 23 ++++---
> > > >> 29 files changed, 240 insertions(+), 302 deletions(-)
> > > >>
> > > >> --
> > > >> 2.45.2
> > > >
> >
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH virtio 00/19] virtio: consolidate vq info args of find_vqs()
2024-07-04 12:39 ` Michael S. Tsirkin
@ 2024-07-04 12:55 ` Jiri Pirko
0 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 12:55 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Xuan Zhuo, virtualization, jasowang, eperezma, parav, feliu,
hengqi
Thu, Jul 04, 2024 at 02:39:36PM CEST, mst@redhat.com wrote:
>On Thu, Jul 04, 2024 at 07:38:35PM +0800, Xuan Zhuo wrote:
>> On Wed, 3 Jul 2024 09:37:10 -0400, "Michael S. Tsirkin" <mst@redhat.com> wrote:
>> > On Wed, Jul 03, 2024 at 03:24:51PM +0200, Jiri Pirko wrote:
>> > > Wed, Jul 03, 2024 at 02:50:36PM CEST, mst@redhat.com wrote:
>> > > >On Wed, Jul 03, 2024 at 02:38:54PM +0200, Jiri Pirko wrote:
>> > > >> From: Jiri Pirko <jiri@nvidia.com>
>> > > >>
>> > > >> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
>> > > >> names, callbacks and ctx (in case of the second one) as separate args.
>> > > >> That became inconvenient as the ctx addition showed.
>> > > >>
>> > > >> For virtio_net control queue, an indication of queue flavour (slow path)
>> > > >> is going to be needed to be passed to PCI transport in order to
>> > > >> assign vectors properly, another array added to virtio_find_vqs_ctx()
>> > > >> arg list would not be nice and convenient.
>> > > >>
>> > > >> Instead, introduce a structure to carry vq callback, name and ctx. Pass
>> > > >> array of these structures to virtio_find_vqs() and all the way down to
>> > > >> transport find_vqs() op implementation.
>> > > >>
>> > > >> That allows to easily extend what needs to be passed down. Also, it
>> > > >> makes the code a bit more cleaner. We get rid of separate
>> > > >> virtio_find_vqs_ctx() helper.
>> > > >>
>> > > >> This patchset does the conversion in steps, using temporary _info() op
>> > > >> and helper. Note they are renamed back.
>> > > >
>> > > >Thanks a lot Jiri, looks very good.
>> > > >Some minor comments.
>> > >
>> > > Will fix and send v2 tomorrow. I have my admin queue patchset rebased on
>> > > top of this and code will be ready for control queue to benefit from
>> > > vector allocation.
>> >
>> >
>> > Excellent, I hope it makes it in next in time for the next merge window.
>>
>> Hi, Michael, you know I was working on this.
>>
>> Is the virtio community already in such a mess?
>
>Sorry you feel that way. Jiri, I think it's fair to add
>
>Suggested-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
>
>to patches 4 and 10-17.
Sure, no problem.
>
>
>
>> >
>> > >
>> > > >
>> > > >
>> > > >> Patch #1 does one forgotten conversion to virtio_find_single_vq().
>> > > >> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
>> > > >> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
>> > > >> introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
>> > > >> Patches #5 and #6 convert transports to implement find_vqs_info() op
>> > > >> that accepts array of virtio_queue_info structs.
>> > > >> Patch #7 converts virtio_find_single_vq() to use the new way as well.
>> > > >> Patch #8 removes original find_vqs() op.
>> > > >> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
>> > > >> of conversion this patches does.
>> > > >> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
>> > > >> users to use new virtio_find_vqs_info() helper.
>> > > >> Patch #18 removes no longer used virtio_find_vqs() and
>> > > >> virtio_find_vqs_ctx() helpers.
>> > > >> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
>> > > >> to virtio_find_vqs().
>> > > >>
>> > > >> Jiri Pirko (19):
>> > > >> caif_virtio: use virtio_find_single_vq() for single virtqueue finding
>> > > >> virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
>> > > >> virtio: make virtio_find_single_vq() call virtio_find_vqs()
>> > > >> virtio: introduce virtio_queue_info struct and find_vqs_info() config
>> > > >> op
>> > > >> virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
>> > > >> virtio: convert find_vqs() op implementations to find_vqs_info()
>> > > >> virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
>> > > >> directly
>> > > >> virtio: remove the original find_vqs() op
>> > > >> virtio: rename find_vqs_info() op to find_vqs()
>> > > >> virtio_blk: convert to use virtio_find_vqs_info()
>> > > >> virtio_console: convert to use virtio_find_vqs_info()
>> > > >> virtio_crypto: convert to use virtio_find_vqs_info()
>> > > >> virtio_net: convert to use virtio_find_vqs_info()
>> > > >> scsi: virtio_scsi: convert to use virtio_find_vqs_info()
>> > > >> virtiofs: convert to use virtio_find_vqs_info()
>> > > >> virtio_balloon: convert to use virtio_find_vqs_info()
>> > > >> virtio: convert the rest virtio_find_vqs() users to
>> > > >> virtio_find_vqs_info()
>> > > >> virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
>> > > >> helpers
>> > > >> virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
>> > > >>
>> > > >> arch/um/drivers/virt-pci.c | 8 ++-
>> > > >> arch/um/drivers/virtio_uml.c | 12 ++--
>> > > >> drivers/block/virtio_blk.c | 20 +++----
>> > > >> drivers/bluetooth/virtio_bt.c | 13 ++--
>> > > >> drivers/char/virtio_console.c | 43 ++++++-------
>> > > >> drivers/crypto/virtio/virtio_crypto_core.c | 31 ++++------
>> > > >> drivers/firmware/arm_scmi/virtio.c | 11 ++--
>> > > >> drivers/gpio/gpio-virtio.c | 10 ++--
>> > > >> drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++-
>> > > >> drivers/iommu/virtio-iommu.c | 11 ++--
>> > > >> drivers/net/caif/caif_virtio.c | 8 +--
>> > > >> drivers/net/virtio_net.c | 34 ++++-------
>> > > >> drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
>> > > >> drivers/platform/mellanox/mlxbf-tmfifo.c | 10 ++--
>> > > >> drivers/remoteproc/remoteproc_virtio.c | 12 ++--
>> > > >> drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++-
>> > > >> drivers/s390/virtio/virtio_ccw.c | 13 ++--
>> > > >> drivers/scsi/virtio_scsi.c | 32 ++++------
>> > > >> drivers/virtio/virtio_balloon.c | 32 ++++------
>> > > >> drivers/virtio/virtio_input.c | 9 +--
>> > > >> drivers/virtio/virtio_mmio.c | 12 ++--
>> > > >> drivers/virtio/virtio_pci_common.c | 49 ++++++++-------
>> > > >> drivers/virtio/virtio_pci_common.h | 4 +-
>> > > >> drivers/virtio/virtio_pci_modern.c | 5 +-
>> > > >> drivers/virtio/virtio_vdpa.c | 13 ++--
>> > > >> fs/fuse/virtio_fs.c | 22 +++----
>> > > >> include/linux/virtio_config.h | 60 +++++++++----------
>> > > >> net/vmw_vsock/virtio_transport.c | 16 ++---
>> > > >> sound/virtio/virtio_card.c | 23 ++++---
>> > > >> 29 files changed, 240 insertions(+), 302 deletions(-)
>> > > >>
>> > > >> --
>> > > >> 2.45.2
>> > > >
>> >
>
^ permalink raw reply [flat|nested] 30+ messages in thread