* [PATCH virtio v2 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx() Jiri Pirko
` (18 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Since caif uses only one queue, convert to virtio_find_single_vq()
helper which is made for this purpose.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
drivers/net/caif/caif_virtio.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/caif/caif_virtio.c b/drivers/net/caif/caif_virtio.c
index 99d984851fef..7fea00c7ca8a 100644
--- a/drivers/net/caif/caif_virtio.c
+++ b/drivers/net/caif/caif_virtio.c
@@ -646,9 +646,7 @@ static inline void debugfs_init(struct cfv_info *cfv)
/* Setup CAIF for the a virtio device */
static int cfv_probe(struct virtio_device *vdev)
{
- vq_callback_t *vq_cbs = cfv_release_cb;
vrh_callback_t *vrh_cbs = cfv_recv;
- const char *names = "output";
const char *cfv_netdev_name = "cfvrt";
struct net_device *netdev;
struct cfv_info *cfv;
@@ -675,9 +673,11 @@ static int cfv_probe(struct virtio_device *vdev)
goto err;
/* Get the TX virtio ring. This is a "guest side vring". */
- err = virtio_find_vqs(vdev, 1, &cfv->vq_tx, &vq_cbs, &names, NULL);
- if (err)
+ cfv->vq_tx = virtio_find_single_vq(vdev, cfv_release_cb, "output");
+ if (IS_ERR(cfv->vq_tx)) {
+ err = PTR_ERR(cfv->vq_tx);
goto err;
+ }
/* Get the CAIF configuration from virtio config space, if available */
if (vdev->config->get) {
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs() Jiri Pirko
` (17 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
In order to prepare for conversion of virtio_find_vqs*() arguments, make
virtio_find_vqs() to call virtio_find_vqs_ctx() instead of op directly.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
include/linux/virtio_config.h | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index da9b271b54db..d19eaf6bafbf 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -225,22 +225,23 @@ struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
}
static inline
-int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
+int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[],
+ const char * const names[], const bool *ctx,
struct irq_affinity *desc)
{
- return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, NULL, desc);
+ return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
+ desc);
}
static inline
-int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
+int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
+ const char * const names[],
struct irq_affinity *desc)
{
- return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
- desc);
+ return virtio_find_vqs_ctx(vdev, nvqs, vqs, callbacks,
+ names, NULL, desc);
}
/**
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 01/19] caif_virtio: use virtio_find_single_vq() for single virtqueue finding Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 02/19] virtio: make virtio_find_vqs() call virtio_find_vqs_ctx() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
` (16 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
In order to prepare for conversion of virtio_find_vqs*() arguments, make
virtio_find_single_vq() to call virtio_find_vqs() instead of
op directly.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
include/linux/virtio_config.h | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index d19eaf6bafbf..82a1d798b2f1 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -210,20 +210,6 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
}
-static inline
-struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
- vq_callback_t *c, const char *n)
-{
- vq_callback_t *callbacks[] = { c };
- const char *names[] = { n };
- struct virtqueue *vq;
- int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names, NULL,
- NULL);
- if (err < 0)
- return ERR_PTR(err);
- return vq;
-}
-
static inline
int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[], vq_callback_t *callbacks[],
@@ -244,6 +230,20 @@ int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
names, NULL, desc);
}
+static inline
+struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
+ vq_callback_t *c, const char *n)
+{
+ vq_callback_t *callbacks[] = { c };
+ const char *names[] = { n };
+ struct virtqueue *vq;
+ int err = virtio_find_vqs(vdev, 1, &vq, callbacks, names, NULL);
+
+ if (err < 0)
+ return ERR_PTR(err);
+ return vq;
+}
+
/**
* virtio_synchronize_cbs - synchronize with virtqueue callbacks
* @dev: the virtio device
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (2 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 03/19] virtio: make virtio_find_single_vq() call virtio_find_vqs() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 7:47 ` Michael S. Tsirkin
2024-07-04 6:43 ` [PATCH virtio v2 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info() Jiri Pirko
` (15 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Introduce a structure virtio_queue_info to carry name, callback and ctx
together. In order to allow config implementations to accept config op
with array of virtio_queue_info structures, introduce a new
find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
Note that whole virtio_find_vqs_ctx() is going to be eventually removed
at the and of this patchset.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- fixed comments for struct virtqueue_info
- s/virtio_queue_info/virtqueue_info/
---
include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
1 file changed, 48 insertions(+), 3 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 82a1d798b2f1..9b975c2830f6 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -18,6 +18,16 @@ struct virtio_shm_region {
typedef void vq_callback_t(struct virtqueue *);
+struct virtqueue_info {
+ const char *name; /* Mainly for debugging, may be NULL for a virtqueue
+ * unused by driver.
+ */
+ vq_callback_t *callback; /* May be NULL for vq that does
+ * not need a callback.
+ */
+ bool ctx;
+};
+
/**
* struct virtio_config_ops - operations for configuring a virtio device
* Note: Do not assume that a transport implements all of the operations
@@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
* names: array of virtqueue names (mainly for debugging)
* include a NULL entry for vqs unused by driver
* Returns 0 on success or error status
+ * @find_vqs_info: find virtqueues and instantiate them.
+ * vdev: the virtio_device
+ * nvqs: the number of virtqueues to find
+ * vqs: on success, includes new virtqueues
+ * vqs_info: array of virtqueue info structures
+ * Returns 0 on success or error status
* @del_vqs: free virtqueues found by find_vqs().
* @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
* The function guarantees that all memory operations on the
@@ -109,6 +125,10 @@ struct virtio_config_ops {
struct virtqueue *vqs[], vq_callback_t *callbacks[],
const char * const names[], const bool *ctx,
struct irq_affinity *desc);
+ int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
+ struct virtqueue *vqs[],
+ struct virtqueue_info vqs_info[],
+ struct irq_affinity *desc);
void (*del_vqs)(struct virtio_device *);
void (*synchronize_cbs)(struct virtio_device *);
u64 (*get_features)(struct virtio_device *vdev);
@@ -117,7 +137,7 @@ struct virtio_config_ops {
int (*set_vq_affinity)(struct virtqueue *vq,
const struct cpumask *cpu_mask);
const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
- int index);
+ int index);
bool (*get_shm_region)(struct virtio_device *vdev,
struct virtio_shm_region *region, u8 id);
int (*disable_vq_and_reset)(struct virtqueue *vq);
@@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
}
+static inline
+int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
+ struct virtqueue *vqs[],
+ struct virtqueue_info vqs_info[],
+ struct irq_affinity *desc)
+{
+ return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
+}
+
static inline
int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[], vq_callback_t *callbacks[],
const char * const names[], const bool *ctx,
struct irq_affinity *desc)
{
- return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
- desc);
+ struct virtqueue_info *vqs_info;
+ int err, i;
+
+ if (!vdev->config->find_vqs_info)
+ return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
+ names, ctx, desc);
+
+ vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
+ if (!vqs_info)
+ return -ENOMEM;
+ for (i = 0; i < nvqs; i++) {
+ vqs_info[i].name = names[i];
+ vqs_info[i].callback = callbacks[i];
+ vqs_info[i].ctx = ctx ? ctx[i] : false;
+ }
+ err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
+ kfree(vqs_info);
+ return err;
}
static inline
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 6:43 ` [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
@ 2024-07-04 7:47 ` Michael S. Tsirkin
2024-07-04 9:42 ` Jiri Pirko
2024-07-04 11:06 ` Jiri Pirko
0 siblings, 2 replies; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-04 7:47 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
On Thu, Jul 04, 2024 at 08:43:35AM +0200, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@nvidia.com>
>
> Introduce a structure virtio_queue_info to carry name, callback and ctx
> together. In order to allow config implementations to accept config op
> with array of virtio_queue_info structures, introduce a new
> find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
> Note that whole virtio_find_vqs_ctx() is going to be eventually removed
> at the and of this patchset.
>
> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
> ---
> v1->v2:
> - fixed comments for struct virtqueue_info
> - s/virtio_queue_info/virtqueue_info/
> ---
> include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
> 1 file changed, 48 insertions(+), 3 deletions(-)
>
> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
> index 82a1d798b2f1..9b975c2830f6 100644
> --- a/include/linux/virtio_config.h
> +++ b/include/linux/virtio_config.h
> @@ -18,6 +18,16 @@ struct virtio_shm_region {
>
> typedef void vq_callback_t(struct virtqueue *);
>
> +struct virtqueue_info {
> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
> + * unused by driver.
> + */
> + vq_callback_t *callback; /* May be NULL for vq that does
> + * not need a callback.
> + */
> + bool ctx;
/*
* Always
* like this
* outside of netdev code
* and it comes before the code being documented
*/
/* Never
* like this
*/
Also "may be null" is a bit confusing - it has to be null
for such a vq.
Thus:
/*
* name: mainly for debugging, NULL for a virtqueue
* unused by the driver.
*/
const char *name;
and similarly for the callback.
> +};
> +
> /**
> * struct virtio_config_ops - operations for configuring a virtio device
> * Note: Do not assume that a transport implements all of the operations
> @@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
> * names: array of virtqueue names (mainly for debugging)
> * include a NULL entry for vqs unused by driver
> * Returns 0 on success or error status
> + * @find_vqs_info: find virtqueues and instantiate them.
> + * vdev: the virtio_device
> + * nvqs: the number of virtqueues to find
> + * vqs: on success, includes new virtqueues
> + * vqs_info: array of virtqueue info structures
> + * Returns 0 on success or error status
> * @del_vqs: free virtqueues found by find_vqs().
> * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
> * The function guarantees that all memory operations on the
> @@ -109,6 +125,10 @@ struct virtio_config_ops {
> struct virtqueue *vqs[], vq_callback_t *callbacks[],
> const char * const names[], const bool *ctx,
> struct irq_affinity *desc);
> + int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
> + struct virtqueue *vqs[],
> + struct virtqueue_info vqs_info[],
> + struct irq_affinity *desc);
> void (*del_vqs)(struct virtio_device *);
> void (*synchronize_cbs)(struct virtio_device *);
> u64 (*get_features)(struct virtio_device *vdev);
> @@ -117,7 +137,7 @@ struct virtio_config_ops {
> int (*set_vq_affinity)(struct virtqueue *vq,
> const struct cpumask *cpu_mask);
> const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
> - int index);
> + int index);
> bool (*get_shm_region)(struct virtio_device *vdev,
> struct virtio_shm_region *region, u8 id);
> int (*disable_vq_and_reset)(struct virtqueue *vq);
> @@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
> return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
> }
>
> +static inline
> +int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
> + struct virtqueue *vqs[],
> + struct virtqueue_info vqs_info[],
> + struct irq_affinity *desc)
> +{
> + return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
> +}
> +
> static inline
> int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
> struct virtqueue *vqs[], vq_callback_t *callbacks[],
> const char * const names[], const bool *ctx,
> struct irq_affinity *desc)
> {
> - return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
> - desc);
> + struct virtqueue_info *vqs_info;
> + int err, i;
> +
> + if (!vdev->config->find_vqs_info)
> + return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
> + names, ctx, desc);
> +
> + vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
> + if (!vqs_info)
> + return -ENOMEM;
> + for (i = 0; i < nvqs; i++) {
> + vqs_info[i].name = names[i];
> + vqs_info[i].callback = callbacks[i];
> + vqs_info[i].ctx = ctx ? ctx[i] : false;
> + }
> + err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
> + kfree(vqs_info);
> + return err;
> }
>
> static inline
> --
> 2.45.2
^ permalink raw reply [flat|nested] 30+ messages in thread* Re: [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 7:47 ` Michael S. Tsirkin
@ 2024-07-04 9:42 ` Jiri Pirko
2024-07-04 11:06 ` Jiri Pirko
1 sibling, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 9:42 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Thu, Jul 04, 2024 at 09:47:09AM CEST, mst@redhat.com wrote:
>On Thu, Jul 04, 2024 at 08:43:35AM +0200, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@nvidia.com>
>>
>> Introduce a structure virtio_queue_info to carry name, callback and ctx
>> together. In order to allow config implementations to accept config op
>> with array of virtio_queue_info structures, introduce a new
>> find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
>> Note that whole virtio_find_vqs_ctx() is going to be eventually removed
>> at the and of this patchset.
>>
>> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
>> ---
>> v1->v2:
>> - fixed comments for struct virtqueue_info
>> - s/virtio_queue_info/virtqueue_info/
>> ---
>> include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
>> 1 file changed, 48 insertions(+), 3 deletions(-)
>>
>> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
>> index 82a1d798b2f1..9b975c2830f6 100644
>> --- a/include/linux/virtio_config.h
>> +++ b/include/linux/virtio_config.h
>> @@ -18,6 +18,16 @@ struct virtio_shm_region {
>>
>> typedef void vq_callback_t(struct virtqueue *);
>>
>> +struct virtqueue_info {
>> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
>> + * unused by driver.
>> + */
>> + vq_callback_t *callback; /* May be NULL for vq that does
>> + * not need a callback.
>> + */
>> + bool ctx;
>
>
> /*
> * Always
> * like this
> * outside of netdev code
> * and it comes before the code being documented
> */
Ah, yeah.
I wonder howcome checkpatch does not warn.
>
> /* Never
> * like this
> */
>
>
>Also "may be null" is a bit confusing - it has to be null
>for such a vq.
>
>Thus:
>
> /*
> * name: mainly for debugging, NULL for a virtqueue
> * unused by the driver.
> */
Okay.
> const char *name;
>
>and similarly for the callback.
Yes.
Will send v3 later today if there are no more comments.
Thanks!
>
>
>
>> +};
>> +
>> /**
>> * struct virtio_config_ops - operations for configuring a virtio device
>> * Note: Do not assume that a transport implements all of the operations
>> @@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
>> * names: array of virtqueue names (mainly for debugging)
>> * include a NULL entry for vqs unused by driver
>> * Returns 0 on success or error status
>> + * @find_vqs_info: find virtqueues and instantiate them.
>> + * vdev: the virtio_device
>> + * nvqs: the number of virtqueues to find
>> + * vqs: on success, includes new virtqueues
>> + * vqs_info: array of virtqueue info structures
>> + * Returns 0 on success or error status
>> * @del_vqs: free virtqueues found by find_vqs().
>> * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
>> * The function guarantees that all memory operations on the
>> @@ -109,6 +125,10 @@ struct virtio_config_ops {
>> struct virtqueue *vqs[], vq_callback_t *callbacks[],
>> const char * const names[], const bool *ctx,
>> struct irq_affinity *desc);
>> + int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
>> + struct virtqueue *vqs[],
>> + struct virtqueue_info vqs_info[],
>> + struct irq_affinity *desc);
>> void (*del_vqs)(struct virtio_device *);
>> void (*synchronize_cbs)(struct virtio_device *);
>> u64 (*get_features)(struct virtio_device *vdev);
>> @@ -117,7 +137,7 @@ struct virtio_config_ops {
>> int (*set_vq_affinity)(struct virtqueue *vq,
>> const struct cpumask *cpu_mask);
>> const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
>> - int index);
>> + int index);
>> bool (*get_shm_region)(struct virtio_device *vdev,
>> struct virtio_shm_region *region, u8 id);
>> int (*disable_vq_and_reset)(struct virtqueue *vq);
>> @@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
>> return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
>> }
>>
>> +static inline
>> +int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
>> + struct virtqueue *vqs[],
>> + struct virtqueue_info vqs_info[],
>> + struct irq_affinity *desc)
>> +{
>> + return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
>> +}
>> +
>> static inline
>> int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
>> struct virtqueue *vqs[], vq_callback_t *callbacks[],
>> const char * const names[], const bool *ctx,
>> struct irq_affinity *desc)
>> {
>> - return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
>> - desc);
>> + struct virtqueue_info *vqs_info;
>> + int err, i;
>> +
>> + if (!vdev->config->find_vqs_info)
>> + return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
>> + names, ctx, desc);
>> +
>> + vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
>> + if (!vqs_info)
>> + return -ENOMEM;
>> + for (i = 0; i < nvqs; i++) {
>> + vqs_info[i].name = names[i];
>> + vqs_info[i].callback = callbacks[i];
>> + vqs_info[i].ctx = ctx ? ctx[i] : false;
>> + }
>> + err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
>> + kfree(vqs_info);
>> + return err;
>> }
>>
>> static inline
>> --
>> 2.45.2
>
^ permalink raw reply [flat|nested] 30+ messages in thread* Re: [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 7:47 ` Michael S. Tsirkin
2024-07-04 9:42 ` Jiri Pirko
@ 2024-07-04 11:06 ` Jiri Pirko
2024-07-04 11:28 ` Michael S. Tsirkin
1 sibling, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 11:06 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Thu, Jul 04, 2024 at 09:47:09AM CEST, mst@redhat.com wrote:
>On Thu, Jul 04, 2024 at 08:43:35AM +0200, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@nvidia.com>
>>
>> Introduce a structure virtio_queue_info to carry name, callback and ctx
>> together. In order to allow config implementations to accept config op
>> with array of virtio_queue_info structures, introduce a new
>> find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
>> Note that whole virtio_find_vqs_ctx() is going to be eventually removed
>> at the and of this patchset.
>>
>> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
>> ---
>> v1->v2:
>> - fixed comments for struct virtqueue_info
>> - s/virtio_queue_info/virtqueue_info/
>> ---
>> include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
>> 1 file changed, 48 insertions(+), 3 deletions(-)
>>
>> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
>> index 82a1d798b2f1..9b975c2830f6 100644
>> --- a/include/linux/virtio_config.h
>> +++ b/include/linux/virtio_config.h
>> @@ -18,6 +18,16 @@ struct virtio_shm_region {
>>
>> typedef void vq_callback_t(struct virtqueue *);
>>
>> +struct virtqueue_info {
>> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
>> + * unused by driver.
>> + */
>> + vq_callback_t *callback; /* May be NULL for vq that does
>> + * not need a callback.
>> + */
>> + bool ctx;
>
>
> /*
> * Always
> * like this
> * outside of netdev code
> * and it comes before the code being documented
> */
>
> /* Never
> * like this
> */
How about to properly document the struct instead like this:
/**
* struct virtqueue_info - info for a virtqueue passed to find_vqs()
* @name: mainly for debugging, NULL for a virtqueue
* unused by the driver
* @callback: NULL for a virtqueue that does not need a callback
* @ctx: true to allow to maintain extra context per virtqueue
*/
struct virtqueue_info {
const char *name;
vq_callback_t *callback;
bool ctx;
};
>
>
>Also "may be null" is a bit confusing - it has to be null
>for such a vq.
>
>Thus:
>
> /*
> * name: mainly for debugging, NULL for a virtqueue
> * unused by the driver.
> */
> const char *name;
>
>and similarly for the callback.
>
>
>
>> +};
>> +
>> /**
>> * struct virtio_config_ops - operations for configuring a virtio device
>> * Note: Do not assume that a transport implements all of the operations
>> @@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
>> * names: array of virtqueue names (mainly for debugging)
>> * include a NULL entry for vqs unused by driver
>> * Returns 0 on success or error status
>> + * @find_vqs_info: find virtqueues and instantiate them.
>> + * vdev: the virtio_device
>> + * nvqs: the number of virtqueues to find
>> + * vqs: on success, includes new virtqueues
>> + * vqs_info: array of virtqueue info structures
>> + * Returns 0 on success or error status
>> * @del_vqs: free virtqueues found by find_vqs().
>> * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
>> * The function guarantees that all memory operations on the
>> @@ -109,6 +125,10 @@ struct virtio_config_ops {
>> struct virtqueue *vqs[], vq_callback_t *callbacks[],
>> const char * const names[], const bool *ctx,
>> struct irq_affinity *desc);
>> + int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
>> + struct virtqueue *vqs[],
>> + struct virtqueue_info vqs_info[],
>> + struct irq_affinity *desc);
>> void (*del_vqs)(struct virtio_device *);
>> void (*synchronize_cbs)(struct virtio_device *);
>> u64 (*get_features)(struct virtio_device *vdev);
>> @@ -117,7 +137,7 @@ struct virtio_config_ops {
>> int (*set_vq_affinity)(struct virtqueue *vq,
>> const struct cpumask *cpu_mask);
>> const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
>> - int index);
>> + int index);
>> bool (*get_shm_region)(struct virtio_device *vdev,
>> struct virtio_shm_region *region, u8 id);
>> int (*disable_vq_and_reset)(struct virtqueue *vq);
>> @@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
>> return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
>> }
>>
>> +static inline
>> +int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
>> + struct virtqueue *vqs[],
>> + struct virtqueue_info vqs_info[],
>> + struct irq_affinity *desc)
>> +{
>> + return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
>> +}
>> +
>> static inline
>> int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
>> struct virtqueue *vqs[], vq_callback_t *callbacks[],
>> const char * const names[], const bool *ctx,
>> struct irq_affinity *desc)
>> {
>> - return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
>> - desc);
>> + struct virtqueue_info *vqs_info;
>> + int err, i;
>> +
>> + if (!vdev->config->find_vqs_info)
>> + return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
>> + names, ctx, desc);
>> +
>> + vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
>> + if (!vqs_info)
>> + return -ENOMEM;
>> + for (i = 0; i < nvqs; i++) {
>> + vqs_info[i].name = names[i];
>> + vqs_info[i].callback = callbacks[i];
>> + vqs_info[i].ctx = ctx ? ctx[i] : false;
>> + }
>> + err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
>> + kfree(vqs_info);
>> + return err;
>> }
>>
>> static inline
>> --
>> 2.45.2
>
^ permalink raw reply [flat|nested] 30+ messages in thread* Re: [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 11:06 ` Jiri Pirko
@ 2024-07-04 11:28 ` Michael S. Tsirkin
2024-07-04 13:00 ` Jiri Pirko
0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-04 11:28 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
On Thu, Jul 04, 2024 at 01:06:12PM +0200, Jiri Pirko wrote:
> Thu, Jul 04, 2024 at 09:47:09AM CEST, mst@redhat.com wrote:
> >On Thu, Jul 04, 2024 at 08:43:35AM +0200, Jiri Pirko wrote:
> >> From: Jiri Pirko <jiri@nvidia.com>
> >>
> >> Introduce a structure virtio_queue_info to carry name, callback and ctx
> >> together. In order to allow config implementations to accept config op
> >> with array of virtio_queue_info structures, introduce a new
> >> find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
> >> Note that whole virtio_find_vqs_ctx() is going to be eventually removed
> >> at the and of this patchset.
> >>
> >> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
> >> ---
> >> v1->v2:
> >> - fixed comments for struct virtqueue_info
> >> - s/virtio_queue_info/virtqueue_info/
> >> ---
> >> include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
> >> 1 file changed, 48 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
> >> index 82a1d798b2f1..9b975c2830f6 100644
> >> --- a/include/linux/virtio_config.h
> >> +++ b/include/linux/virtio_config.h
> >> @@ -18,6 +18,16 @@ struct virtio_shm_region {
> >>
> >> typedef void vq_callback_t(struct virtqueue *);
> >>
> >> +struct virtqueue_info {
> >> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
> >> + * unused by driver.
> >> + */
> >> + vq_callback_t *callback; /* May be NULL for vq that does
> >> + * not need a callback.
> >> + */
> >> + bool ctx;
> >
> >
> > /*
> > * Always
> > * like this
> > * outside of netdev code
> > * and it comes before the code being documented
> > */
> >
> > /* Never
> > * like this
> > */
>
>
> How about to properly document the struct instead like this:
> /**
> * struct virtqueue_info - info for a virtqueue passed to find_vqs()
> * @name: mainly for debugging, NULL for a virtqueue
> * unused by the driver
> * @callback: NULL for a virtqueue that does not need a callback
> * @ctx: true to allow to maintain extra context per virtqueue
> */
> struct virtqueue_info {
> const char *name;
> vq_callback_t *callback;
> bool ctx;
> };
Sure. And actually include the explanation what the fields are then?
@name: virtqueue description
@callback: a callback to invoke on a used buffer notification
>
>
> >
> >
> >Also "may be null" is a bit confusing - it has to be null
> >for such a vq.
> >
> >Thus:
> >
> > /*
> > * name: mainly for debugging, NULL for a virtqueue
> > * unused by the driver.
> > */
> > const char *name;
> >
> >and similarly for the callback.
> >
> >
> >
> >> +};
> >> +
> >> /**
> >> * struct virtio_config_ops - operations for configuring a virtio device
> >> * Note: Do not assume that a transport implements all of the operations
> >> @@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
> >> * names: array of virtqueue names (mainly for debugging)
> >> * include a NULL entry for vqs unused by driver
> >> * Returns 0 on success or error status
> >> + * @find_vqs_info: find virtqueues and instantiate them.
> >> + * vdev: the virtio_device
> >> + * nvqs: the number of virtqueues to find
> >> + * vqs: on success, includes new virtqueues
> >> + * vqs_info: array of virtqueue info structures
> >> + * Returns 0 on success or error status
> >> * @del_vqs: free virtqueues found by find_vqs().
> >> * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
> >> * The function guarantees that all memory operations on the
> >> @@ -109,6 +125,10 @@ struct virtio_config_ops {
> >> struct virtqueue *vqs[], vq_callback_t *callbacks[],
> >> const char * const names[], const bool *ctx,
> >> struct irq_affinity *desc);
> >> + int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
> >> + struct virtqueue *vqs[],
> >> + struct virtqueue_info vqs_info[],
> >> + struct irq_affinity *desc);
> >> void (*del_vqs)(struct virtio_device *);
> >> void (*synchronize_cbs)(struct virtio_device *);
> >> u64 (*get_features)(struct virtio_device *vdev);
> >> @@ -117,7 +137,7 @@ struct virtio_config_ops {
> >> int (*set_vq_affinity)(struct virtqueue *vq,
> >> const struct cpumask *cpu_mask);
> >> const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
> >> - int index);
> >> + int index);
> >> bool (*get_shm_region)(struct virtio_device *vdev,
> >> struct virtio_shm_region *region, u8 id);
> >> int (*disable_vq_and_reset)(struct virtqueue *vq);
> >> @@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
> >> return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
> >> }
> >>
> >> +static inline
> >> +int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
> >> + struct virtqueue *vqs[],
> >> + struct virtqueue_info vqs_info[],
> >> + struct irq_affinity *desc)
> >> +{
> >> + return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
> >> +}
> >> +
> >> static inline
> >> int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
> >> struct virtqueue *vqs[], vq_callback_t *callbacks[],
> >> const char * const names[], const bool *ctx,
> >> struct irq_affinity *desc)
> >> {
> >> - return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
> >> - desc);
> >> + struct virtqueue_info *vqs_info;
> >> + int err, i;
> >> +
> >> + if (!vdev->config->find_vqs_info)
> >> + return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
> >> + names, ctx, desc);
> >> +
> >> + vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
> >> + if (!vqs_info)
> >> + return -ENOMEM;
> >> + for (i = 0; i < nvqs; i++) {
> >> + vqs_info[i].name = names[i];
> >> + vqs_info[i].callback = callbacks[i];
> >> + vqs_info[i].ctx = ctx ? ctx[i] : false;
> >> + }
> >> + err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
> >> + kfree(vqs_info);
> >> + return err;
> >> }
> >>
> >> static inline
> >> --
> >> 2.45.2
> >
^ permalink raw reply [flat|nested] 30+ messages in thread* Re: [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 11:28 ` Michael S. Tsirkin
@ 2024-07-04 13:00 ` Jiri Pirko
2024-07-04 14:17 ` Michael S. Tsirkin
0 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 13:00 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Thu, Jul 04, 2024 at 01:28:03PM CEST, mst@redhat.com wrote:
>On Thu, Jul 04, 2024 at 01:06:12PM +0200, Jiri Pirko wrote:
>> Thu, Jul 04, 2024 at 09:47:09AM CEST, mst@redhat.com wrote:
>> >On Thu, Jul 04, 2024 at 08:43:35AM +0200, Jiri Pirko wrote:
>> >> From: Jiri Pirko <jiri@nvidia.com>
>> >>
>> >> Introduce a structure virtio_queue_info to carry name, callback and ctx
>> >> together. In order to allow config implementations to accept config op
>> >> with array of virtio_queue_info structures, introduce a new
>> >> find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
>> >> Note that whole virtio_find_vqs_ctx() is going to be eventually removed
>> >> at the and of this patchset.
>> >>
>> >> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
>> >> ---
>> >> v1->v2:
>> >> - fixed comments for struct virtqueue_info
>> >> - s/virtio_queue_info/virtqueue_info/
>> >> ---
>> >> include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
>> >> 1 file changed, 48 insertions(+), 3 deletions(-)
>> >>
>> >> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
>> >> index 82a1d798b2f1..9b975c2830f6 100644
>> >> --- a/include/linux/virtio_config.h
>> >> +++ b/include/linux/virtio_config.h
>> >> @@ -18,6 +18,16 @@ struct virtio_shm_region {
>> >>
>> >> typedef void vq_callback_t(struct virtqueue *);
>> >>
>> >> +struct virtqueue_info {
>> >> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
>> >> + * unused by driver.
>> >> + */
>> >> + vq_callback_t *callback; /* May be NULL for vq that does
>> >> + * not need a callback.
>> >> + */
>> >> + bool ctx;
>> >
>> >
>> > /*
>> > * Always
>> > * like this
>> > * outside of netdev code
>> > * and it comes before the code being documented
>> > */
>> >
>> > /* Never
>> > * like this
>> > */
>>
>>
>> How about to properly document the struct instead like this:
>> /**
>> * struct virtqueue_info - info for a virtqueue passed to find_vqs()
>> * @name: mainly for debugging, NULL for a virtqueue
>> * unused by the driver
>> * @callback: NULL for a virtqueue that does not need a callback
>> * @ctx: true to allow to maintain extra context per virtqueue
>> */
>> struct virtqueue_info {
>> const char *name;
>> vq_callback_t *callback;
>> bool ctx;
>> };
>
>Sure. And actually include the explanation what the fields are then?
>@name: virtqueue description
>@callback: a callback to invoke on a used buffer notification
Okay, how about:
/**
* struct virtqueue_info - Info for a virtqueue passed to find_vqs().
* @name: virtqueue description. Used mainly for debugging, NULL for
* a virtqueue unused by the driver.
* @callback: A callback to invoke on a used buffer notification.
* NULL for a virtqueue that does not need a callback.
* @ctx: A flag to indicate to maintain an extra context per virtqueue.
*/
struct virtqueue_info {
const char *name;
vq_callback_t *callback;
bool ctx;
};
?
>
>
>>
>>
>> >
>> >
>> >Also "may be null" is a bit confusing - it has to be null
>> >for such a vq.
>> >
>> >Thus:
>> >
>> > /*
>> > * name: mainly for debugging, NULL for a virtqueue
>> > * unused by the driver.
>> > */
>> > const char *name;
>> >
>> >and similarly for the callback.
>> >
>> >
>> >
>> >> +};
>> >> +
>> >> /**
>> >> * struct virtio_config_ops - operations for configuring a virtio device
>> >> * Note: Do not assume that a transport implements all of the operations
>> >> @@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
>> >> * names: array of virtqueue names (mainly for debugging)
>> >> * include a NULL entry for vqs unused by driver
>> >> * Returns 0 on success or error status
>> >> + * @find_vqs_info: find virtqueues and instantiate them.
>> >> + * vdev: the virtio_device
>> >> + * nvqs: the number of virtqueues to find
>> >> + * vqs: on success, includes new virtqueues
>> >> + * vqs_info: array of virtqueue info structures
>> >> + * Returns 0 on success or error status
>> >> * @del_vqs: free virtqueues found by find_vqs().
>> >> * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
>> >> * The function guarantees that all memory operations on the
>> >> @@ -109,6 +125,10 @@ struct virtio_config_ops {
>> >> struct virtqueue *vqs[], vq_callback_t *callbacks[],
>> >> const char * const names[], const bool *ctx,
>> >> struct irq_affinity *desc);
>> >> + int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
>> >> + struct virtqueue *vqs[],
>> >> + struct virtqueue_info vqs_info[],
>> >> + struct irq_affinity *desc);
>> >> void (*del_vqs)(struct virtio_device *);
>> >> void (*synchronize_cbs)(struct virtio_device *);
>> >> u64 (*get_features)(struct virtio_device *vdev);
>> >> @@ -117,7 +137,7 @@ struct virtio_config_ops {
>> >> int (*set_vq_affinity)(struct virtqueue *vq,
>> >> const struct cpumask *cpu_mask);
>> >> const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
>> >> - int index);
>> >> + int index);
>> >> bool (*get_shm_region)(struct virtio_device *vdev,
>> >> struct virtio_shm_region *region, u8 id);
>> >> int (*disable_vq_and_reset)(struct virtqueue *vq);
>> >> @@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
>> >> return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
>> >> }
>> >>
>> >> +static inline
>> >> +int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
>> >> + struct virtqueue *vqs[],
>> >> + struct virtqueue_info vqs_info[],
>> >> + struct irq_affinity *desc)
>> >> +{
>> >> + return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
>> >> +}
>> >> +
>> >> static inline
>> >> int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
>> >> struct virtqueue *vqs[], vq_callback_t *callbacks[],
>> >> const char * const names[], const bool *ctx,
>> >> struct irq_affinity *desc)
>> >> {
>> >> - return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
>> >> - desc);
>> >> + struct virtqueue_info *vqs_info;
>> >> + int err, i;
>> >> +
>> >> + if (!vdev->config->find_vqs_info)
>> >> + return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
>> >> + names, ctx, desc);
>> >> +
>> >> + vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
>> >> + if (!vqs_info)
>> >> + return -ENOMEM;
>> >> + for (i = 0; i < nvqs; i++) {
>> >> + vqs_info[i].name = names[i];
>> >> + vqs_info[i].callback = callbacks[i];
>> >> + vqs_info[i].ctx = ctx ? ctx[i] : false;
>> >> + }
>> >> + err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
>> >> + kfree(vqs_info);
>> >> + return err;
>> >> }
>> >>
>> >> static inline
>> >> --
>> >> 2.45.2
>> >
>
^ permalink raw reply [flat|nested] 30+ messages in thread* Re: [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op
2024-07-04 13:00 ` Jiri Pirko
@ 2024-07-04 14:17 ` Michael S. Tsirkin
0 siblings, 0 replies; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-04 14:17 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
On Thu, Jul 04, 2024 at 03:00:01PM +0200, Jiri Pirko wrote:
> Thu, Jul 04, 2024 at 01:28:03PM CEST, mst@redhat.com wrote:
> >On Thu, Jul 04, 2024 at 01:06:12PM +0200, Jiri Pirko wrote:
> >> Thu, Jul 04, 2024 at 09:47:09AM CEST, mst@redhat.com wrote:
> >> >On Thu, Jul 04, 2024 at 08:43:35AM +0200, Jiri Pirko wrote:
> >> >> From: Jiri Pirko <jiri@nvidia.com>
> >> >>
> >> >> Introduce a structure virtio_queue_info to carry name, callback and ctx
> >> >> together. In order to allow config implementations to accept config op
> >> >> with array of virtio_queue_info structures, introduce a new
> >> >> find_vqs_info() op. Do the needed conversion in virtio_find_vqs_ctx().
> >> >> Note that whole virtio_find_vqs_ctx() is going to be eventually removed
> >> >> at the and of this patchset.
> >> >>
> >> >> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
> >> >> ---
> >> >> v1->v2:
> >> >> - fixed comments for struct virtqueue_info
> >> >> - s/virtio_queue_info/virtqueue_info/
> >> >> ---
> >> >> include/linux/virtio_config.h | 51 ++++++++++++++++++++++++++++++++---
> >> >> 1 file changed, 48 insertions(+), 3 deletions(-)
> >> >>
> >> >> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
> >> >> index 82a1d798b2f1..9b975c2830f6 100644
> >> >> --- a/include/linux/virtio_config.h
> >> >> +++ b/include/linux/virtio_config.h
> >> >> @@ -18,6 +18,16 @@ struct virtio_shm_region {
> >> >>
> >> >> typedef void vq_callback_t(struct virtqueue *);
> >> >>
> >> >> +struct virtqueue_info {
> >> >> + const char *name; /* Mainly for debugging, may be NULL for a virtqueue
> >> >> + * unused by driver.
> >> >> + */
> >> >> + vq_callback_t *callback; /* May be NULL for vq that does
> >> >> + * not need a callback.
> >> >> + */
> >> >> + bool ctx;
> >> >
> >> >
> >> > /*
> >> > * Always
> >> > * like this
> >> > * outside of netdev code
> >> > * and it comes before the code being documented
> >> > */
> >> >
> >> > /* Never
> >> > * like this
> >> > */
> >>
> >>
> >> How about to properly document the struct instead like this:
> >> /**
> >> * struct virtqueue_info - info for a virtqueue passed to find_vqs()
> >> * @name: mainly for debugging, NULL for a virtqueue
> >> * unused by the driver
> >> * @callback: NULL for a virtqueue that does not need a callback
> >> * @ctx: true to allow to maintain extra context per virtqueue
> >> */
> >> struct virtqueue_info {
> >> const char *name;
> >> vq_callback_t *callback;
> >> bool ctx;
> >> };
> >
> >Sure. And actually include the explanation what the fields are then?
> >@name: virtqueue description
> >@callback: a callback to invoke on a used buffer notification
>
> Okay, how about:
>
> /**
> * struct virtqueue_info - Info for a virtqueue passed to find_vqs().
> * @name: virtqueue description. Used mainly for debugging, NULL for
> * a virtqueue unused by the driver.
> * @callback: A callback to invoke on a used buffer notification.
> * NULL for a virtqueue that does not need a callback.
> * @ctx: A flag to indicate to maintain an extra context per virtqueue.
> */
> struct virtqueue_info {
> const char *name;
> vq_callback_t *callback;
> bool ctx;
> };
>
>
> ?
Looks good to me.
>
>
> >
> >
> >>
> >>
> >> >
> >> >
> >> >Also "may be null" is a bit confusing - it has to be null
> >> >for such a vq.
> >> >
> >> >Thus:
> >> >
> >> > /*
> >> > * name: mainly for debugging, NULL for a virtqueue
> >> > * unused by the driver.
> >> > */
> >> > const char *name;
> >> >
> >> >and similarly for the callback.
> >> >
> >> >
> >> >
> >> >> +};
> >> >> +
> >> >> /**
> >> >> * struct virtio_config_ops - operations for configuring a virtio device
> >> >> * Note: Do not assume that a transport implements all of the operations
> >> >> @@ -58,6 +68,12 @@ typedef void vq_callback_t(struct virtqueue *);
> >> >> * names: array of virtqueue names (mainly for debugging)
> >> >> * include a NULL entry for vqs unused by driver
> >> >> * Returns 0 on success or error status
> >> >> + * @find_vqs_info: find virtqueues and instantiate them.
> >> >> + * vdev: the virtio_device
> >> >> + * nvqs: the number of virtqueues to find
> >> >> + * vqs: on success, includes new virtqueues
> >> >> + * vqs_info: array of virtqueue info structures
> >> >> + * Returns 0 on success or error status
> >> >> * @del_vqs: free virtqueues found by find_vqs().
> >> >> * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
> >> >> * The function guarantees that all memory operations on the
> >> >> @@ -109,6 +125,10 @@ struct virtio_config_ops {
> >> >> struct virtqueue *vqs[], vq_callback_t *callbacks[],
> >> >> const char * const names[], const bool *ctx,
> >> >> struct irq_affinity *desc);
> >> >> + int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
> >> >> + struct virtqueue *vqs[],
> >> >> + struct virtqueue_info vqs_info[],
> >> >> + struct irq_affinity *desc);
> >> >> void (*del_vqs)(struct virtio_device *);
> >> >> void (*synchronize_cbs)(struct virtio_device *);
> >> >> u64 (*get_features)(struct virtio_device *vdev);
> >> >> @@ -117,7 +137,7 @@ struct virtio_config_ops {
> >> >> int (*set_vq_affinity)(struct virtqueue *vq,
> >> >> const struct cpumask *cpu_mask);
> >> >> const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
> >> >> - int index);
> >> >> + int index);
> >> >> bool (*get_shm_region)(struct virtio_device *vdev,
> >> >> struct virtio_shm_region *region, u8 id);
> >> >> int (*disable_vq_and_reset)(struct virtqueue *vq);
> >> >> @@ -210,14 +230,39 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
> >> >> return !virtio_has_feature(vdev, VIRTIO_F_ACCESS_PLATFORM);
> >> >> }
> >> >>
> >> >> +static inline
> >> >> +int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
> >> >> + struct virtqueue *vqs[],
> >> >> + struct virtqueue_info vqs_info[],
> >> >> + struct irq_affinity *desc)
> >> >> +{
> >> >> + return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
> >> >> +}
> >> >> +
> >> >> static inline
> >> >> int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
> >> >> struct virtqueue *vqs[], vq_callback_t *callbacks[],
> >> >> const char * const names[], const bool *ctx,
> >> >> struct irq_affinity *desc)
> >> >> {
> >> >> - return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
> >> >> - desc);
> >> >> + struct virtqueue_info *vqs_info;
> >> >> + int err, i;
> >> >> +
> >> >> + if (!vdev->config->find_vqs_info)
> >> >> + return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
> >> >> + names, ctx, desc);
> >> >> +
> >> >> + vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
> >> >> + if (!vqs_info)
> >> >> + return -ENOMEM;
> >> >> + for (i = 0; i < nvqs; i++) {
> >> >> + vqs_info[i].name = names[i];
> >> >> + vqs_info[i].callback = callbacks[i];
> >> >> + vqs_info[i].ctx = ctx ? ctx[i] : false;
> >> >> + }
> >> >> + err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
> >> >> + kfree(vqs_info);
> >> >> + return err;
> >> >> }
> >> >>
> >> >> static inline
> >> >> --
> >> >> 2.45.2
> >> >
> >
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH virtio v2 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (3 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 04/19] virtio: introduce virtio_queue_info struct and find_vqs_info() config op Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
` (14 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Convert existing vp_find_vqs() and vp_modern_find_vqs() implementations
to find_vqs_info() config op.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
drivers/virtio/virtio_pci_common.c | 48 ++++++++++++++++--------------
drivers/virtio/virtio_pci_common.h | 3 +-
drivers/virtio/virtio_pci_legacy.c | 2 +-
drivers/virtio/virtio_pci_modern.c | 9 +++---
4 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
index f6b0b00e4599..3a1b74fb4da4 100644
--- a/drivers/virtio/virtio_pci_common.c
+++ b/drivers/virtio/virtio_pci_common.c
@@ -285,12 +285,13 @@ void vp_del_vqs(struct virtio_device *vdev)
}
static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], bool per_vq_vectors,
- const bool *ctx,
- struct irq_affinity *desc)
+ struct virtqueue *vqs[],
+ struct virtqueue_info vqs_info[],
+ bool per_vq_vectors,
+ struct irq_affinity *desc)
{
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+ struct virtqueue_info *vqi;
u16 msix_vec;
int i, err, nvectors, allocated_vectors, queue_idx = 0;
@@ -301,9 +302,11 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
if (per_vq_vectors) {
/* Best option: one for change interrupt, one per vq. */
nvectors = 1;
- for (i = 0; i < nvqs; ++i)
- if (names[i] && callbacks[i])
+ for (i = 0; i < nvqs; ++i) {
+ vqi = &vqs_info[i];
+ if (vqi->name && vqi->callback)
++nvectors;
+ }
} else {
/* Second best: one for change, shared for all vqs. */
nvectors = 2;
@@ -317,20 +320,20 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
vp_dev->per_vq_vectors = per_vq_vectors;
allocated_vectors = vp_dev->msix_used_vectors;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- if (!callbacks[i])
+ if (!vqi->callback)
msix_vec = VIRTIO_MSI_NO_VECTOR;
else if (vp_dev->per_vq_vectors)
msix_vec = allocated_vectors++;
else
msix_vec = VP_MSIX_VQ_VECTOR;
- vqs[i] = vp_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
- ctx ? ctx[i] : false,
- msix_vec);
+ vqs[i] = vp_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx, msix_vec);
if (IS_ERR(vqs[i])) {
err = PTR_ERR(vqs[i]);
goto error_find;
@@ -343,7 +346,7 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
snprintf(vp_dev->msix_names[msix_vec],
sizeof *vp_dev->msix_names,
"%s-%s",
- dev_name(&vp_dev->vdev.dev), names[i]);
+ dev_name(&vp_dev->vdev.dev), vqi->name);
err = request_irq(pci_irq_vector(vp_dev->pci_dev, msix_vec),
vring_interrupt, 0,
vp_dev->msix_names[msix_vec],
@@ -361,10 +364,11 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs,
}
static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx)
+ struct virtqueue *vqs[],
+ struct virtqueue_info vqs_info[])
{
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+ struct virtqueue_info *vqi;
int i, err, queue_idx = 0;
vp_dev->vqs = kcalloc(nvqs, sizeof(*vp_dev->vqs), GFP_KERNEL);
@@ -379,12 +383,13 @@ static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
vp_dev->intx_enabled = 1;
vp_dev->per_vq_vectors = false;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = vp_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
- ctx ? ctx[i] : false,
+ vqs[i] = vp_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx,
VIRTIO_MSI_NO_VECTOR);
if (IS_ERR(vqs[i])) {
err = PTR_ERR(vqs[i]);
@@ -400,25 +405,24 @@ static int vp_find_vqs_intx(struct virtio_device *vdev, unsigned int nvqs,
/* the config->find_vqs() implementation */
int vp_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
+ struct virtqueue *vqs[], struct virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
int err;
/* Try MSI-X with one vector per queue. */
- err = vp_find_vqs_msix(vdev, nvqs, vqs, callbacks, names, true, ctx, desc);
+ err = vp_find_vqs_msix(vdev, nvqs, vqs, vqs_info, true, desc);
if (!err)
return 0;
/* Fallback: MSI-X with one vector for config, one shared for queues. */
- err = vp_find_vqs_msix(vdev, nvqs, vqs, callbacks, names, false, ctx, desc);
+ err = vp_find_vqs_msix(vdev, nvqs, vqs, vqs_info, false, desc);
if (!err)
return 0;
/* Is there an interrupt? If not give up. */
if (!(to_vp_device(vdev)->pci_dev->irq))
return err;
/* Finally fall back to regular interrupts. */
- return vp_find_vqs_intx(vdev, nvqs, vqs, callbacks, names, ctx);
+ return vp_find_vqs_intx(vdev, nvqs, vqs, vqs_info);
}
const char *vp_bus_name(struct virtio_device *vdev)
diff --git a/drivers/virtio/virtio_pci_common.h b/drivers/virtio/virtio_pci_common.h
index 7fef52bee455..3c4bb2d6163a 100644
--- a/drivers/virtio/virtio_pci_common.h
+++ b/drivers/virtio/virtio_pci_common.h
@@ -127,8 +127,7 @@ bool vp_notify(struct virtqueue *vq);
void vp_del_vqs(struct virtio_device *vdev);
/* the config->find_vqs() implementation */
int vp_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
+ struct virtqueue *vqs[], struct virtqueue_info vqs_info[],
struct irq_affinity *desc);
const char *vp_bus_name(struct virtio_device *vdev);
diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
index d9cbb02b35a1..a9786e38d763 100644
--- a/drivers/virtio/virtio_pci_legacy.c
+++ b/drivers/virtio/virtio_pci_legacy.c
@@ -192,7 +192,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs = vp_find_vqs,
+ .find_vqs_info = vp_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index f62b530aa3b5..adba4a29fdf4 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -595,13 +595,12 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
static int vp_modern_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
+ struct virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
struct virtqueue *vq;
- int rc = vp_find_vqs(vdev, nvqs, vqs, callbacks, names, ctx, desc);
+ int rc = vp_find_vqs(vdev, nvqs, vqs, vqs_info, desc);
if (rc)
return rc;
@@ -782,7 +781,7 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs = vp_modern_find_vqs,
+ .find_vqs_info = vp_modern_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
@@ -804,7 +803,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs = vp_modern_find_vqs,
+ .find_vqs_info = vp_modern_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 06/19] virtio: convert find_vqs() op implementations to find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (4 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 05/19] virtio_pci: convert vp_*find_vqs() ops to find_vqs_info() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-05 7:43 ` Michael S. Tsirkin
2024-07-04 6:43 ` [PATCH virtio v2 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly Jiri Pirko
` (13 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Convert existing find_vqs() transport implementations
to use find_vqs_info() config op.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
arch/um/drivers/virtio_uml.c | 14 ++++++++------
drivers/platform/mellanox/mlxbf-tmfifo.c | 12 ++++++------
drivers/remoteproc/remoteproc_virtio.c | 14 +++++++-------
drivers/s390/virtio/virtio_ccw.c | 15 +++++++--------
drivers/virtio/virtio_mmio.c | 14 +++++++-------
drivers/virtio/virtio_vdpa.c | 15 +++++++--------
6 files changed, 42 insertions(+), 42 deletions(-)
diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
index 77faa2cf3a13..c32a51017f9f 100644
--- a/arch/um/drivers/virtio_uml.c
+++ b/arch/um/drivers/virtio_uml.c
@@ -1014,11 +1014,12 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
}
static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
+ struct virtqueue *vqs[],
+ struct virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
+ struct virtqueue_info *vqi;
int i, queue_idx = 0, rc;
struct virtqueue *vq;
@@ -1031,13 +1032,14 @@ static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
return rc;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = vu_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
- ctx ? ctx[i] : false);
+ vqs[i] = vu_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx);
if (IS_ERR(vqs[i])) {
rc = PTR_ERR(vqs[i]);
goto error_setup;
@@ -1097,7 +1099,7 @@ static const struct virtio_config_ops virtio_uml_config_ops = {
.get_status = vu_get_status,
.set_status = vu_set_status,
.reset = vu_reset,
- .find_vqs = vu_find_vqs,
+ .find_vqs_info = vu_find_vqs,
.del_vqs = vu_del_vqs,
.get_features = vu_get_features,
.finalize_features = vu_finalize_features,
diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
index b8d1e32e97eb..1497a5a0a68f 100644
--- a/drivers/platform/mellanox/mlxbf-tmfifo.c
+++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
@@ -1058,13 +1058,12 @@ static void mlxbf_tmfifo_virtio_del_vqs(struct virtio_device *vdev)
static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
unsigned int nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[],
- const bool *ctx,
+ struct virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
struct mlxbf_tmfifo_vdev *tm_vdev = mlxbf_vdev_to_tmfifo(vdev);
struct mlxbf_tmfifo_vring *vring;
+ struct virtqueue_info *vqi;
struct virtqueue *vq;
int i, ret, size;
@@ -1072,7 +1071,8 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
return -EINVAL;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
ret = -EINVAL;
goto error;
}
@@ -1084,7 +1084,7 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
vq = vring_new_virtqueue(i, vring->num, vring->align, vdev,
false, false, vring->va,
mlxbf_tmfifo_virtio_notify,
- callbacks[i], names[i]);
+ vqi->callback, vqi->name);
if (!vq) {
dev_err(&vdev->dev, "vring_new_virtqueue failed\n");
ret = -ENOMEM;
@@ -1175,7 +1175,7 @@ static void tmfifo_virtio_dev_release(struct device *device)
static const struct virtio_config_ops mlxbf_tmfifo_virtio_config_ops = {
.get_features = mlxbf_tmfifo_virtio_get_features,
.finalize_features = mlxbf_tmfifo_virtio_finalize_features,
- .find_vqs = mlxbf_tmfifo_virtio_find_vqs,
+ .find_vqs_info = mlxbf_tmfifo_virtio_find_vqs,
.del_vqs = mlxbf_tmfifo_virtio_del_vqs,
.reset = mlxbf_tmfifo_virtio_reset,
.set_status = mlxbf_tmfifo_virtio_set_status,
diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
index 25b66b113b69..a82a7c13bdc5 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -182,21 +182,21 @@ static void rproc_virtio_del_vqs(struct virtio_device *vdev)
static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[],
- const bool * ctx,
+ struct virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
+ struct virtqueue_info *vqi;
int i, ret, queue_idx = 0;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = rp_find_vq(vdev, queue_idx++, callbacks[i], names[i],
- ctx ? ctx[i] : false);
+ vqs[i] = rp_find_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx);
if (IS_ERR(vqs[i])) {
ret = PTR_ERR(vqs[i]);
goto error;
@@ -327,7 +327,7 @@ static void rproc_virtio_set(struct virtio_device *vdev, unsigned int offset,
static const struct virtio_config_ops rproc_virtio_config_ops = {
.get_features = rproc_virtio_get_features,
.finalize_features = rproc_virtio_finalize_features,
- .find_vqs = rproc_virtio_find_vqs,
+ .find_vqs_info = rproc_virtio_find_vqs,
.del_vqs = rproc_virtio_del_vqs,
.reset = rproc_virtio_reset,
.set_status = rproc_virtio_set_status,
diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
index d6491fc84e8c..1f1fa70cf09d 100644
--- a/drivers/s390/virtio/virtio_ccw.c
+++ b/drivers/s390/virtio/virtio_ccw.c
@@ -689,12 +689,11 @@ static int virtio_ccw_register_adapter_ind(struct virtio_ccw_device *vcdev,
static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[],
- const bool *ctx,
+ struct virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_ccw_device *vcdev = to_vc_device(vdev);
+ struct virtqueue_info *vqi;
dma64_t *indicatorp = NULL;
int ret, i, queue_idx = 0;
struct ccw1 *ccw;
@@ -705,14 +704,14 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
return -ENOMEM;
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vq_info->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, callbacks[i],
- names[i], ctx ? ctx[i] : false,
- ccw);
+ vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx, ccw);
if (IS_ERR(vqs[i])) {
ret = PTR_ERR(vqs[i]);
vqs[i] = NULL;
@@ -1079,7 +1078,7 @@ static const struct virtio_config_ops virtio_ccw_config_ops = {
.get_status = virtio_ccw_get_status,
.set_status = virtio_ccw_set_status,
.reset = virtio_ccw_reset,
- .find_vqs = virtio_ccw_find_vqs,
+ .find_vqs_info = virtio_ccw_find_vqs,
.del_vqs = virtio_ccw_del_vqs,
.bus_name = virtio_ccw_bus_name,
.synchronize_cbs = virtio_ccw_synchronize_cbs,
diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
index 173596589c71..533aca85b745 100644
--- a/drivers/virtio/virtio_mmio.c
+++ b/drivers/virtio/virtio_mmio.c
@@ -489,13 +489,12 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[],
- const bool *ctx,
+ struct virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
int irq = platform_get_irq(vm_dev->pdev, 0);
+ struct virtqueue_info *vqi;
int i, err, queue_idx = 0;
if (irq < 0)
@@ -510,13 +509,14 @@ static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
enable_irq_wake(irq);
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = vm_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
- ctx ? ctx[i] : false);
+ vqs[i] = vm_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx);
if (IS_ERR(vqs[i])) {
vm_del_vqs(vdev);
return PTR_ERR(vqs[i]);
@@ -570,7 +570,7 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
.get_status = vm_get_status,
.set_status = vm_set_status,
.reset = vm_reset,
- .find_vqs = vm_find_vqs,
+ .find_vqs_info = vm_find_vqs,
.del_vqs = vm_del_vqs,
.get_features = vm_get_features,
.finalize_features = vm_finalize_features,
diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
index e803db0da307..dcf0c2b19a44 100644
--- a/drivers/virtio/virtio_vdpa.c
+++ b/drivers/virtio/virtio_vdpa.c
@@ -358,15 +358,14 @@ create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd)
static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue *vqs[],
- vq_callback_t *callbacks[],
- const char * const names[],
- const bool *ctx,
+ struct virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
struct virtio_vdpa_device *vd_dev = to_virtio_vdpa_device(vdev);
struct vdpa_device *vdpa = vd_get_vdpa(vdev);
const struct vdpa_config_ops *ops = vdpa->config;
struct irq_affinity default_affd = { 0 };
+ struct virtqueue_info *vqi;
struct cpumask *masks;
struct vdpa_callback cb;
bool has_affinity = desc && ops->set_vq_affinity;
@@ -379,14 +378,14 @@ static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
}
for (i = 0; i < nvqs; ++i) {
- if (!names[i]) {
+ vqi = &vqs_info[i];
+ if (!vqi->name) {
vqs[i] = NULL;
continue;
}
- vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++,
- callbacks[i], names[i], ctx ?
- ctx[i] : false);
+ vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++, vqi->callback,
+ vqi->name, vqi->ctx);
if (IS_ERR(vqs[i])) {
err = PTR_ERR(vqs[i]);
goto err_setup_vq;
@@ -470,7 +469,7 @@ static const struct virtio_config_ops virtio_vdpa_config_ops = {
.get_status = virtio_vdpa_get_status,
.set_status = virtio_vdpa_set_status,
.reset = virtio_vdpa_reset,
- .find_vqs = virtio_vdpa_find_vqs,
+ .find_vqs_info = virtio_vdpa_find_vqs,
.del_vqs = virtio_vdpa_del_vqs,
.get_features = virtio_vdpa_get_features,
.finalize_features = virtio_vdpa_finalize_features,
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH virtio v2 06/19] virtio: convert find_vqs() op implementations to find_vqs_info()
2024-07-04 6:43 ` [PATCH virtio v2 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
@ 2024-07-05 7:43 ` Michael S. Tsirkin
2024-07-08 7:26 ` Jiri Pirko
0 siblings, 1 reply; 30+ messages in thread
From: Michael S. Tsirkin @ 2024-07-05 7:43 UTC (permalink / raw)
To: Jiri Pirko
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
This is the riskiest patch.
Jiri, I'd ask you to cross-build it before posting,
wasn't done here.
On Thu, Jul 04, 2024 at 08:43:37AM +0200, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@nvidia.com>
>
> Convert existing find_vqs() transport implementations
> to use find_vqs_info() config op.
>
> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
> ---
> v1->v2:
> - s/virtio_queue_info/virtqueue_info/
> ---
> arch/um/drivers/virtio_uml.c | 14 ++++++++------
> drivers/platform/mellanox/mlxbf-tmfifo.c | 12 ++++++------
> drivers/remoteproc/remoteproc_virtio.c | 14 +++++++-------
> drivers/s390/virtio/virtio_ccw.c | 15 +++++++--------
> drivers/virtio/virtio_mmio.c | 14 +++++++-------
> drivers/virtio/virtio_vdpa.c | 15 +++++++--------
> 6 files changed, 42 insertions(+), 42 deletions(-)
>
> diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
> index 77faa2cf3a13..c32a51017f9f 100644
> --- a/arch/um/drivers/virtio_uml.c
> +++ b/arch/um/drivers/virtio_uml.c
> @@ -1014,11 +1014,12 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
> }
>
> static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
> - struct virtqueue *vqs[], vq_callback_t *callbacks[],
> - const char * const names[], const bool *ctx,
> + struct virtqueue *vqs[],
> + struct virtqueue_info vqs_info[],
> struct irq_affinity *desc)
> {
> struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
> + struct virtqueue_info *vqi;
> int i, queue_idx = 0, rc;
> struct virtqueue *vq;
>
> @@ -1031,13 +1032,14 @@ static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
> return rc;
>
> for (i = 0; i < nvqs; ++i) {
> - if (!names[i]) {
> + vqi = &vqs_info[i];
vqi better declared here, it's unused outside the loop.
same elsewhere.
> + if (!vqi->name) {
> vqs[i] = NULL;
> continue;
> }
>
> - vqs[i] = vu_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
> - ctx ? ctx[i] : false);
> + vqs[i] = vu_setup_vq(vdev, queue_idx++, vqi->callback,
> + vqi->name, vqi->ctx);
> if (IS_ERR(vqs[i])) {
> rc = PTR_ERR(vqs[i]);
> goto error_setup;
> @@ -1097,7 +1099,7 @@ static const struct virtio_config_ops virtio_uml_config_ops = {
> .get_status = vu_get_status,
> .set_status = vu_set_status,
> .reset = vu_reset,
> - .find_vqs = vu_find_vqs,
> + .find_vqs_info = vu_find_vqs,
> .del_vqs = vu_del_vqs,
> .get_features = vu_get_features,
> .finalize_features = vu_finalize_features,
> diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
> index b8d1e32e97eb..1497a5a0a68f 100644
> --- a/drivers/platform/mellanox/mlxbf-tmfifo.c
> +++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
> @@ -1058,13 +1058,12 @@ static void mlxbf_tmfifo_virtio_del_vqs(struct virtio_device *vdev)
> static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
> unsigned int nvqs,
> struct virtqueue *vqs[],
> - vq_callback_t *callbacks[],
> - const char * const names[],
> - const bool *ctx,
> + struct virtqueue_info vqs_info[],
> struct irq_affinity *desc)
> {
> struct mlxbf_tmfifo_vdev *tm_vdev = mlxbf_vdev_to_tmfifo(vdev);
> struct mlxbf_tmfifo_vring *vring;
> + struct virtqueue_info *vqi;
> struct virtqueue *vq;
> int i, ret, size;
>
> @@ -1072,7 +1071,8 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
> return -EINVAL;
>
> for (i = 0; i < nvqs; ++i) {
> - if (!names[i]) {
> + vqi = &vqs_info[i];
> + if (!vqi->name) {
> ret = -EINVAL;
> goto error;
> }
> @@ -1084,7 +1084,7 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
> vq = vring_new_virtqueue(i, vring->num, vring->align, vdev,
> false, false, vring->va,
> mlxbf_tmfifo_virtio_notify,
> - callbacks[i], names[i]);
> + vqi->callback, vqi->name);
> if (!vq) {
> dev_err(&vdev->dev, "vring_new_virtqueue failed\n");
> ret = -ENOMEM;
> @@ -1175,7 +1175,7 @@ static void tmfifo_virtio_dev_release(struct device *device)
> static const struct virtio_config_ops mlxbf_tmfifo_virtio_config_ops = {
> .get_features = mlxbf_tmfifo_virtio_get_features,
> .finalize_features = mlxbf_tmfifo_virtio_finalize_features,
> - .find_vqs = mlxbf_tmfifo_virtio_find_vqs,
> + .find_vqs_info = mlxbf_tmfifo_virtio_find_vqs,
> .del_vqs = mlxbf_tmfifo_virtio_del_vqs,
> .reset = mlxbf_tmfifo_virtio_reset,
> .set_status = mlxbf_tmfifo_virtio_set_status,
> diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
> index 25b66b113b69..a82a7c13bdc5 100644
> --- a/drivers/remoteproc/remoteproc_virtio.c
> +++ b/drivers/remoteproc/remoteproc_virtio.c
> @@ -182,21 +182,21 @@ static void rproc_virtio_del_vqs(struct virtio_device *vdev)
>
> static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
> struct virtqueue *vqs[],
> - vq_callback_t *callbacks[],
> - const char * const names[],
> - const bool * ctx,
> + struct virtqueue_info vqs_info[],
> struct irq_affinity *desc)
> {
> + struct virtqueue_info *vqi;
> int i, ret, queue_idx = 0;
>
> for (i = 0; i < nvqs; ++i) {
> - if (!names[i]) {
> + vqi = &vqs_info[i];
> + if (!vqi->name) {
> vqs[i] = NULL;
> continue;
> }
>
> - vqs[i] = rp_find_vq(vdev, queue_idx++, callbacks[i], names[i],
> - ctx ? ctx[i] : false);
> + vqs[i] = rp_find_vq(vdev, queue_idx++, vqi->callback,
> + vqi->name, vqi->ctx);
> if (IS_ERR(vqs[i])) {
> ret = PTR_ERR(vqs[i]);
> goto error;
> @@ -327,7 +327,7 @@ static void rproc_virtio_set(struct virtio_device *vdev, unsigned int offset,
> static const struct virtio_config_ops rproc_virtio_config_ops = {
> .get_features = rproc_virtio_get_features,
> .finalize_features = rproc_virtio_finalize_features,
> - .find_vqs = rproc_virtio_find_vqs,
> + .find_vqs_info = rproc_virtio_find_vqs,
> .del_vqs = rproc_virtio_del_vqs,
> .reset = rproc_virtio_reset,
> .set_status = rproc_virtio_set_status,
> diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
> index d6491fc84e8c..1f1fa70cf09d 100644
> --- a/drivers/s390/virtio/virtio_ccw.c
> +++ b/drivers/s390/virtio/virtio_ccw.c
> @@ -689,12 +689,11 @@ static int virtio_ccw_register_adapter_ind(struct virtio_ccw_device *vcdev,
>
> static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
> struct virtqueue *vqs[],
> - vq_callback_t *callbacks[],
> - const char * const names[],
> - const bool *ctx,
> + struct virtqueue_info vqs_info[],
> struct irq_affinity *desc)
> {
> struct virtio_ccw_device *vcdev = to_vc_device(vdev);
> + struct virtqueue_info *vqi;
> dma64_t *indicatorp = NULL;
> int ret, i, queue_idx = 0;
> struct ccw1 *ccw;
> @@ -705,14 +704,14 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
> return -ENOMEM;
>
> for (i = 0; i < nvqs; ++i) {
> - if (!names[i]) {
> + vqi = &vqs_info[i];
> + if (!vq_info->name) {
typo. we got lucky you didn't write vqs_info otherwise
it would build but not work correctly.
> vqs[i] = NULL;
> continue;
> }
>
> - vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, callbacks[i],
> - names[i], ctx ? ctx[i] : false,
> - ccw);
> + vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, vqi->callback,
> + vqi->name, vqi->ctx, ccw);
> if (IS_ERR(vqs[i])) {
> ret = PTR_ERR(vqs[i]);
> vqs[i] = NULL;
> @@ -1079,7 +1078,7 @@ static const struct virtio_config_ops virtio_ccw_config_ops = {
> .get_status = virtio_ccw_get_status,
> .set_status = virtio_ccw_set_status,
> .reset = virtio_ccw_reset,
> - .find_vqs = virtio_ccw_find_vqs,
> + .find_vqs_info = virtio_ccw_find_vqs,
> .del_vqs = virtio_ccw_del_vqs,
> .bus_name = virtio_ccw_bus_name,
> .synchronize_cbs = virtio_ccw_synchronize_cbs,
> diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
> index 173596589c71..533aca85b745 100644
> --- a/drivers/virtio/virtio_mmio.c
> +++ b/drivers/virtio/virtio_mmio.c
> @@ -489,13 +489,12 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
>
> static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
> struct virtqueue *vqs[],
> - vq_callback_t *callbacks[],
> - const char * const names[],
> - const bool *ctx,
> + struct virtqueue_info vqs_info[],
> struct irq_affinity *desc)
> {
> struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
> int irq = platform_get_irq(vm_dev->pdev, 0);
> + struct virtqueue_info *vqi;
> int i, err, queue_idx = 0;
>
> if (irq < 0)
> @@ -510,13 +509,14 @@ static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
> enable_irq_wake(irq);
>
> for (i = 0; i < nvqs; ++i) {
> - if (!names[i]) {
> + vqi = &vqs_info[i];
> + if (!vqi->name) {
> vqs[i] = NULL;
> continue;
> }
>
> - vqs[i] = vm_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
> - ctx ? ctx[i] : false);
> + vqs[i] = vm_setup_vq(vdev, queue_idx++, vqi->callback,
> + vqi->name, vqi->ctx);
> if (IS_ERR(vqs[i])) {
> vm_del_vqs(vdev);
> return PTR_ERR(vqs[i]);
> @@ -570,7 +570,7 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
> .get_status = vm_get_status,
> .set_status = vm_set_status,
> .reset = vm_reset,
> - .find_vqs = vm_find_vqs,
> + .find_vqs_info = vm_find_vqs,
> .del_vqs = vm_del_vqs,
> .get_features = vm_get_features,
> .finalize_features = vm_finalize_features,
> diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
> index e803db0da307..dcf0c2b19a44 100644
> --- a/drivers/virtio/virtio_vdpa.c
> +++ b/drivers/virtio/virtio_vdpa.c
> @@ -358,15 +358,14 @@ create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd)
>
> static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
> struct virtqueue *vqs[],
> - vq_callback_t *callbacks[],
> - const char * const names[],
> - const bool *ctx,
> + struct virtqueue_info vqs_info[],
> struct irq_affinity *desc)
> {
> struct virtio_vdpa_device *vd_dev = to_virtio_vdpa_device(vdev);
> struct vdpa_device *vdpa = vd_get_vdpa(vdev);
> const struct vdpa_config_ops *ops = vdpa->config;
> struct irq_affinity default_affd = { 0 };
> + struct virtqueue_info *vqi;
> struct cpumask *masks;
> struct vdpa_callback cb;
> bool has_affinity = desc && ops->set_vq_affinity;
> @@ -379,14 +378,14 @@ static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
> }
>
> for (i = 0; i < nvqs; ++i) {
> - if (!names[i]) {
> + vqi = &vqs_info[i];
> + if (!vqi->name) {
> vqs[i] = NULL;
> continue;
> }
>
> - vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++,
> - callbacks[i], names[i], ctx ?
> - ctx[i] : false);
> + vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++, vqi->callback,
> + vqi->name, vqi->ctx);
> if (IS_ERR(vqs[i])) {
> err = PTR_ERR(vqs[i]);
> goto err_setup_vq;
> @@ -470,7 +469,7 @@ static const struct virtio_config_ops virtio_vdpa_config_ops = {
> .get_status = virtio_vdpa_get_status,
> .set_status = virtio_vdpa_set_status,
> .reset = virtio_vdpa_reset,
> - .find_vqs = virtio_vdpa_find_vqs,
> + .find_vqs_info = virtio_vdpa_find_vqs,
> .del_vqs = virtio_vdpa_del_vqs,
> .get_features = virtio_vdpa_get_features,
> .finalize_features = virtio_vdpa_finalize_features,
> --
> 2.45.2
^ permalink raw reply [flat|nested] 30+ messages in thread* Re: [PATCH virtio v2 06/19] virtio: convert find_vqs() op implementations to find_vqs_info()
2024-07-05 7:43 ` Michael S. Tsirkin
@ 2024-07-08 7:26 ` Jiri Pirko
0 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-08 7:26 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: virtualization, jasowang, xuanzhuo, eperezma, parav, feliu,
hengqi
Fri, Jul 05, 2024 at 09:43:41AM CEST, mst@redhat.com wrote:
>This is the riskiest patch.
>Jiri, I'd ask you to cross-build it before posting,
>wasn't done here.
I relied on buildbot to do that. I didn't receive any issues from him.
Will try to build manually.
>
>On Thu, Jul 04, 2024 at 08:43:37AM +0200, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@nvidia.com>
>>
>> Convert existing find_vqs() transport implementations
>> to use find_vqs_info() config op.
>>
>> Signed-off-by: Jiri Pirko <jiri@nvidia.com>
>> ---
>> v1->v2:
>> - s/virtio_queue_info/virtqueue_info/
>> ---
>> arch/um/drivers/virtio_uml.c | 14 ++++++++------
>> drivers/platform/mellanox/mlxbf-tmfifo.c | 12 ++++++------
>> drivers/remoteproc/remoteproc_virtio.c | 14 +++++++-------
>> drivers/s390/virtio/virtio_ccw.c | 15 +++++++--------
>> drivers/virtio/virtio_mmio.c | 14 +++++++-------
>> drivers/virtio/virtio_vdpa.c | 15 +++++++--------
>> 6 files changed, 42 insertions(+), 42 deletions(-)
>>
>> diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
>> index 77faa2cf3a13..c32a51017f9f 100644
>> --- a/arch/um/drivers/virtio_uml.c
>> +++ b/arch/um/drivers/virtio_uml.c
>> @@ -1014,11 +1014,12 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
>> }
>>
>> static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
>> - struct virtqueue *vqs[], vq_callback_t *callbacks[],
>> - const char * const names[], const bool *ctx,
>> + struct virtqueue *vqs[],
>> + struct virtqueue_info vqs_info[],
>> struct irq_affinity *desc)
>> {
>> struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
>> + struct virtqueue_info *vqi;
>> int i, queue_idx = 0, rc;
>> struct virtqueue *vq;
>>
>> @@ -1031,13 +1032,14 @@ static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
>> return rc;
>>
>> for (i = 0; i < nvqs; ++i) {
>> - if (!names[i]) {
>> + vqi = &vqs_info[i];
>
>vqi better declared here, it's unused outside the loop.
>same elsewhere.
Why not.
>
>> + if (!vqi->name) {
>> vqs[i] = NULL;
>> continue;
>> }
>>
>> - vqs[i] = vu_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
>> - ctx ? ctx[i] : false);
>> + vqs[i] = vu_setup_vq(vdev, queue_idx++, vqi->callback,
>> + vqi->name, vqi->ctx);
>> if (IS_ERR(vqs[i])) {
>> rc = PTR_ERR(vqs[i]);
>> goto error_setup;
>> @@ -1097,7 +1099,7 @@ static const struct virtio_config_ops virtio_uml_config_ops = {
>> .get_status = vu_get_status,
>> .set_status = vu_set_status,
>> .reset = vu_reset,
>> - .find_vqs = vu_find_vqs,
>> + .find_vqs_info = vu_find_vqs,
>> .del_vqs = vu_del_vqs,
>> .get_features = vu_get_features,
>> .finalize_features = vu_finalize_features,
>> diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
>> index b8d1e32e97eb..1497a5a0a68f 100644
>> --- a/drivers/platform/mellanox/mlxbf-tmfifo.c
>> +++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
>> @@ -1058,13 +1058,12 @@ static void mlxbf_tmfifo_virtio_del_vqs(struct virtio_device *vdev)
>> static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
>> unsigned int nvqs,
>> struct virtqueue *vqs[],
>> - vq_callback_t *callbacks[],
>> - const char * const names[],
>> - const bool *ctx,
>> + struct virtqueue_info vqs_info[],
>> struct irq_affinity *desc)
>> {
>> struct mlxbf_tmfifo_vdev *tm_vdev = mlxbf_vdev_to_tmfifo(vdev);
>> struct mlxbf_tmfifo_vring *vring;
>> + struct virtqueue_info *vqi;
>> struct virtqueue *vq;
>> int i, ret, size;
>>
>> @@ -1072,7 +1071,8 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
>> return -EINVAL;
>>
>> for (i = 0; i < nvqs; ++i) {
>> - if (!names[i]) {
>> + vqi = &vqs_info[i];
>> + if (!vqi->name) {
>> ret = -EINVAL;
>> goto error;
>> }
>> @@ -1084,7 +1084,7 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
>> vq = vring_new_virtqueue(i, vring->num, vring->align, vdev,
>> false, false, vring->va,
>> mlxbf_tmfifo_virtio_notify,
>> - callbacks[i], names[i]);
>> + vqi->callback, vqi->name);
>> if (!vq) {
>> dev_err(&vdev->dev, "vring_new_virtqueue failed\n");
>> ret = -ENOMEM;
>> @@ -1175,7 +1175,7 @@ static void tmfifo_virtio_dev_release(struct device *device)
>> static const struct virtio_config_ops mlxbf_tmfifo_virtio_config_ops = {
>> .get_features = mlxbf_tmfifo_virtio_get_features,
>> .finalize_features = mlxbf_tmfifo_virtio_finalize_features,
>> - .find_vqs = mlxbf_tmfifo_virtio_find_vqs,
>> + .find_vqs_info = mlxbf_tmfifo_virtio_find_vqs,
>> .del_vqs = mlxbf_tmfifo_virtio_del_vqs,
>> .reset = mlxbf_tmfifo_virtio_reset,
>> .set_status = mlxbf_tmfifo_virtio_set_status,
>> diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
>> index 25b66b113b69..a82a7c13bdc5 100644
>> --- a/drivers/remoteproc/remoteproc_virtio.c
>> +++ b/drivers/remoteproc/remoteproc_virtio.c
>> @@ -182,21 +182,21 @@ static void rproc_virtio_del_vqs(struct virtio_device *vdev)
>>
>> static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
>> struct virtqueue *vqs[],
>> - vq_callback_t *callbacks[],
>> - const char * const names[],
>> - const bool * ctx,
>> + struct virtqueue_info vqs_info[],
>> struct irq_affinity *desc)
>> {
>> + struct virtqueue_info *vqi;
>> int i, ret, queue_idx = 0;
>>
>> for (i = 0; i < nvqs; ++i) {
>> - if (!names[i]) {
>> + vqi = &vqs_info[i];
>> + if (!vqi->name) {
>> vqs[i] = NULL;
>> continue;
>> }
>>
>> - vqs[i] = rp_find_vq(vdev, queue_idx++, callbacks[i], names[i],
>> - ctx ? ctx[i] : false);
>> + vqs[i] = rp_find_vq(vdev, queue_idx++, vqi->callback,
>> + vqi->name, vqi->ctx);
>> if (IS_ERR(vqs[i])) {
>> ret = PTR_ERR(vqs[i]);
>> goto error;
>> @@ -327,7 +327,7 @@ static void rproc_virtio_set(struct virtio_device *vdev, unsigned int offset,
>> static const struct virtio_config_ops rproc_virtio_config_ops = {
>> .get_features = rproc_virtio_get_features,
>> .finalize_features = rproc_virtio_finalize_features,
>> - .find_vqs = rproc_virtio_find_vqs,
>> + .find_vqs_info = rproc_virtio_find_vqs,
>> .del_vqs = rproc_virtio_del_vqs,
>> .reset = rproc_virtio_reset,
>> .set_status = rproc_virtio_set_status,
>> diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
>> index d6491fc84e8c..1f1fa70cf09d 100644
>> --- a/drivers/s390/virtio/virtio_ccw.c
>> +++ b/drivers/s390/virtio/virtio_ccw.c
>> @@ -689,12 +689,11 @@ static int virtio_ccw_register_adapter_ind(struct virtio_ccw_device *vcdev,
>>
>> static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
>> struct virtqueue *vqs[],
>> - vq_callback_t *callbacks[],
>> - const char * const names[],
>> - const bool *ctx,
>> + struct virtqueue_info vqs_info[],
>> struct irq_affinity *desc)
>> {
>> struct virtio_ccw_device *vcdev = to_vc_device(vdev);
>> + struct virtqueue_info *vqi;
>> dma64_t *indicatorp = NULL;
>> int ret, i, queue_idx = 0;
>> struct ccw1 *ccw;
>> @@ -705,14 +704,14 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
>> return -ENOMEM;
>>
>> for (i = 0; i < nvqs; ++i) {
>> - if (!names[i]) {
>> + vqi = &vqs_info[i];
>> + if (!vq_info->name) {
>
>typo. we got lucky you didn't write vqs_info otherwise
>it would build but not work correctly.
Will fix.
>
>
>> vqs[i] = NULL;
>> continue;
>> }
>>
>> - vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, callbacks[i],
>> - names[i], ctx ? ctx[i] : false,
>> - ccw);
>> + vqs[i] = virtio_ccw_setup_vq(vdev, queue_idx++, vqi->callback,
>> + vqi->name, vqi->ctx, ccw);
>> if (IS_ERR(vqs[i])) {
>> ret = PTR_ERR(vqs[i]);
>> vqs[i] = NULL;
>> @@ -1079,7 +1078,7 @@ static const struct virtio_config_ops virtio_ccw_config_ops = {
>> .get_status = virtio_ccw_get_status,
>> .set_status = virtio_ccw_set_status,
>> .reset = virtio_ccw_reset,
>> - .find_vqs = virtio_ccw_find_vqs,
>> + .find_vqs_info = virtio_ccw_find_vqs,
>> .del_vqs = virtio_ccw_del_vqs,
>> .bus_name = virtio_ccw_bus_name,
>> .synchronize_cbs = virtio_ccw_synchronize_cbs,
>> diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
>> index 173596589c71..533aca85b745 100644
>> --- a/drivers/virtio/virtio_mmio.c
>> +++ b/drivers/virtio/virtio_mmio.c
>> @@ -489,13 +489,12 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
>>
>> static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
>> struct virtqueue *vqs[],
>> - vq_callback_t *callbacks[],
>> - const char * const names[],
>> - const bool *ctx,
>> + struct virtqueue_info vqs_info[],
>> struct irq_affinity *desc)
>> {
>> struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
>> int irq = platform_get_irq(vm_dev->pdev, 0);
>> + struct virtqueue_info *vqi;
>> int i, err, queue_idx = 0;
>>
>> if (irq < 0)
>> @@ -510,13 +509,14 @@ static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
>> enable_irq_wake(irq);
>>
>> for (i = 0; i < nvqs; ++i) {
>> - if (!names[i]) {
>> + vqi = &vqs_info[i];
>> + if (!vqi->name) {
>> vqs[i] = NULL;
>> continue;
>> }
>>
>> - vqs[i] = vm_setup_vq(vdev, queue_idx++, callbacks[i], names[i],
>> - ctx ? ctx[i] : false);
>> + vqs[i] = vm_setup_vq(vdev, queue_idx++, vqi->callback,
>> + vqi->name, vqi->ctx);
>> if (IS_ERR(vqs[i])) {
>> vm_del_vqs(vdev);
>> return PTR_ERR(vqs[i]);
>> @@ -570,7 +570,7 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
>> .get_status = vm_get_status,
>> .set_status = vm_set_status,
>> .reset = vm_reset,
>> - .find_vqs = vm_find_vqs,
>> + .find_vqs_info = vm_find_vqs,
>> .del_vqs = vm_del_vqs,
>> .get_features = vm_get_features,
>> .finalize_features = vm_finalize_features,
>> diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
>> index e803db0da307..dcf0c2b19a44 100644
>> --- a/drivers/virtio/virtio_vdpa.c
>> +++ b/drivers/virtio/virtio_vdpa.c
>> @@ -358,15 +358,14 @@ create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd)
>>
>> static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
>> struct virtqueue *vqs[],
>> - vq_callback_t *callbacks[],
>> - const char * const names[],
>> - const bool *ctx,
>> + struct virtqueue_info vqs_info[],
>> struct irq_affinity *desc)
>> {
>> struct virtio_vdpa_device *vd_dev = to_virtio_vdpa_device(vdev);
>> struct vdpa_device *vdpa = vd_get_vdpa(vdev);
>> const struct vdpa_config_ops *ops = vdpa->config;
>> struct irq_affinity default_affd = { 0 };
>> + struct virtqueue_info *vqi;
>> struct cpumask *masks;
>> struct vdpa_callback cb;
>> bool has_affinity = desc && ops->set_vq_affinity;
>> @@ -379,14 +378,14 @@ static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
>> }
>>
>> for (i = 0; i < nvqs; ++i) {
>> - if (!names[i]) {
>> + vqi = &vqs_info[i];
>> + if (!vqi->name) {
>> vqs[i] = NULL;
>> continue;
>> }
>>
>> - vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++,
>> - callbacks[i], names[i], ctx ?
>> - ctx[i] : false);
>> + vqs[i] = virtio_vdpa_setup_vq(vdev, queue_idx++, vqi->callback,
>> + vqi->name, vqi->ctx);
>> if (IS_ERR(vqs[i])) {
>> err = PTR_ERR(vqs[i]);
>> goto err_setup_vq;
>> @@ -470,7 +469,7 @@ static const struct virtio_config_ops virtio_vdpa_config_ops = {
>> .get_status = virtio_vdpa_get_status,
>> .set_status = virtio_vdpa_set_status,
>> .reset = virtio_vdpa_reset,
>> - .find_vqs = virtio_vdpa_find_vqs,
>> + .find_vqs_info = virtio_vdpa_find_vqs,
>> .del_vqs = virtio_vdpa_del_vqs,
>> .get_features = virtio_vdpa_get_features,
>> .finalize_features = virtio_vdpa_finalize_features,
>> --
>> 2.45.2
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH virtio v2 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (5 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 06/19] virtio: convert find_vqs() op implementations " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 08/19] virtio: remove the original find_vqs() op Jiri Pirko
` (12 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Since there are no more implementations of find_vqs() op, call
virtio_find_vqs_info() from virtio_find_single_vq() directly.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
include/linux/virtio_config.h | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 9b975c2830f6..eabbc28cdd0f 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -279,10 +279,11 @@ static inline
struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
vq_callback_t *c, const char *n)
{
- vq_callback_t *callbacks[] = { c };
- const char *names[] = { n };
+ struct virtqueue_info vqs_info[] = {
+ { n, c },
+ };
struct virtqueue *vq;
- int err = virtio_find_vqs(vdev, 1, &vq, callbacks, names, NULL);
+ int err = virtio_find_vqs_info(vdev, 1, &vq, vqs_info, NULL);
if (err < 0)
return ERR_PTR(err);
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 08/19] virtio: remove the original find_vqs() op
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (6 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 07/19] virtio: call virtio_find_vqs_info() from virtio_find_single_vq() directly Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 09/19] virtio: rename find_vqs_info() op to find_vqs() Jiri Pirko
` (11 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
As it is no longer used, remove it.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
include/linux/virtio_config.h | 17 -----------------
1 file changed, 17 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index eabbc28cdd0f..ad6ac5cf4bd7 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -59,15 +59,6 @@ struct virtqueue_info {
* After this, status and feature negotiation must be done again
* Device must not be reset from its vq/config callbacks, or in
* parallel with being added/removed.
- * @find_vqs: find virtqueues and instantiate them.
- * vdev: the virtio_device
- * nvqs: the number of virtqueues to find
- * vqs: on success, includes new virtqueues
- * callbacks: array of callbacks, for each virtqueue
- * include a NULL entry for vqs that do not need a callback
- * names: array of virtqueue names (mainly for debugging)
- * include a NULL entry for vqs unused by driver
- * Returns 0 on success or error status
* @find_vqs_info: find virtqueues and instantiate them.
* vdev: the virtio_device
* nvqs: the number of virtqueues to find
@@ -121,10 +112,6 @@ struct virtio_config_ops {
u8 (*get_status)(struct virtio_device *vdev);
void (*set_status)(struct virtio_device *vdev, u8 status);
void (*reset)(struct virtio_device *vdev);
- int (*find_vqs)(struct virtio_device *, unsigned nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
- struct irq_affinity *desc);
int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue *vqs[],
struct virtqueue_info vqs_info[],
@@ -248,10 +235,6 @@ int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
struct virtqueue_info *vqs_info;
int err, i;
- if (!vdev->config->find_vqs_info)
- return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks,
- names, ctx, desc);
-
vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
if (!vqs_info)
return -ENOMEM;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 09/19] virtio: rename find_vqs_info() op to find_vqs()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (7 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 08/19] virtio: remove the original find_vqs() op Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 10/19] virtio_blk: convert to use virtio_find_vqs_info() Jiri Pirko
` (10 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Since the original find_vqs() is no longer present, rename
find_vqs_info() back to find_vqs().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
arch/um/drivers/virtio_uml.c | 2 +-
drivers/platform/mellanox/mlxbf-tmfifo.c | 2 +-
drivers/remoteproc/remoteproc_virtio.c | 2 +-
drivers/s390/virtio/virtio_ccw.c | 2 +-
drivers/virtio/virtio_mmio.c | 2 +-
drivers/virtio/virtio_pci_legacy.c | 2 +-
drivers/virtio/virtio_pci_modern.c | 4 ++--
drivers/virtio/virtio_vdpa.c | 2 +-
include/linux/virtio_config.h | 12 ++++++------
9 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
index c32a51017f9f..35cc31928bb0 100644
--- a/arch/um/drivers/virtio_uml.c
+++ b/arch/um/drivers/virtio_uml.c
@@ -1099,7 +1099,7 @@ static const struct virtio_config_ops virtio_uml_config_ops = {
.get_status = vu_get_status,
.set_status = vu_set_status,
.reset = vu_reset,
- .find_vqs_info = vu_find_vqs,
+ .find_vqs = vu_find_vqs,
.del_vqs = vu_del_vqs,
.get_features = vu_get_features,
.finalize_features = vu_finalize_features,
diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
index 1497a5a0a68f..05a68b36ff50 100644
--- a/drivers/platform/mellanox/mlxbf-tmfifo.c
+++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
@@ -1175,7 +1175,7 @@ static void tmfifo_virtio_dev_release(struct device *device)
static const struct virtio_config_ops mlxbf_tmfifo_virtio_config_ops = {
.get_features = mlxbf_tmfifo_virtio_get_features,
.finalize_features = mlxbf_tmfifo_virtio_finalize_features,
- .find_vqs_info = mlxbf_tmfifo_virtio_find_vqs,
+ .find_vqs = mlxbf_tmfifo_virtio_find_vqs,
.del_vqs = mlxbf_tmfifo_virtio_del_vqs,
.reset = mlxbf_tmfifo_virtio_reset,
.set_status = mlxbf_tmfifo_virtio_set_status,
diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
index a82a7c13bdc5..346888ca1732 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -327,7 +327,7 @@ static void rproc_virtio_set(struct virtio_device *vdev, unsigned int offset,
static const struct virtio_config_ops rproc_virtio_config_ops = {
.get_features = rproc_virtio_get_features,
.finalize_features = rproc_virtio_finalize_features,
- .find_vqs_info = rproc_virtio_find_vqs,
+ .find_vqs = rproc_virtio_find_vqs,
.del_vqs = rproc_virtio_del_vqs,
.reset = rproc_virtio_reset,
.set_status = rproc_virtio_set_status,
diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
index 1f1fa70cf09d..ec0ecdce4808 100644
--- a/drivers/s390/virtio/virtio_ccw.c
+++ b/drivers/s390/virtio/virtio_ccw.c
@@ -1078,7 +1078,7 @@ static const struct virtio_config_ops virtio_ccw_config_ops = {
.get_status = virtio_ccw_get_status,
.set_status = virtio_ccw_set_status,
.reset = virtio_ccw_reset,
- .find_vqs_info = virtio_ccw_find_vqs,
+ .find_vqs = virtio_ccw_find_vqs,
.del_vqs = virtio_ccw_del_vqs,
.bus_name = virtio_ccw_bus_name,
.synchronize_cbs = virtio_ccw_synchronize_cbs,
diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
index 533aca85b745..54abd3722296 100644
--- a/drivers/virtio/virtio_mmio.c
+++ b/drivers/virtio/virtio_mmio.c
@@ -570,7 +570,7 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
.get_status = vm_get_status,
.set_status = vm_set_status,
.reset = vm_reset,
- .find_vqs_info = vm_find_vqs,
+ .find_vqs = vm_find_vqs,
.del_vqs = vm_del_vqs,
.get_features = vm_get_features,
.finalize_features = vm_finalize_features,
diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
index a9786e38d763..d9cbb02b35a1 100644
--- a/drivers/virtio/virtio_pci_legacy.c
+++ b/drivers/virtio/virtio_pci_legacy.c
@@ -192,7 +192,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs_info = vp_find_vqs,
+ .find_vqs = vp_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index adba4a29fdf4..3b5b9499a53a 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -781,7 +781,7 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs_info = vp_modern_find_vqs,
+ .find_vqs = vp_modern_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
@@ -803,7 +803,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
.get_status = vp_get_status,
.set_status = vp_set_status,
.reset = vp_reset,
- .find_vqs_info = vp_modern_find_vqs,
+ .find_vqs = vp_modern_find_vqs,
.del_vqs = vp_del_vqs,
.synchronize_cbs = vp_synchronize_vectors,
.get_features = vp_get_features,
diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
index dcf0c2b19a44..138bcc56d156 100644
--- a/drivers/virtio/virtio_vdpa.c
+++ b/drivers/virtio/virtio_vdpa.c
@@ -469,7 +469,7 @@ static const struct virtio_config_ops virtio_vdpa_config_ops = {
.get_status = virtio_vdpa_get_status,
.set_status = virtio_vdpa_set_status,
.reset = virtio_vdpa_reset,
- .find_vqs_info = virtio_vdpa_find_vqs,
+ .find_vqs = virtio_vdpa_find_vqs,
.del_vqs = virtio_vdpa_del_vqs,
.get_features = virtio_vdpa_get_features,
.finalize_features = virtio_vdpa_finalize_features,
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index ad6ac5cf4bd7..d325af057d1a 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -59,7 +59,7 @@ struct virtqueue_info {
* After this, status and feature negotiation must be done again
* Device must not be reset from its vq/config callbacks, or in
* parallel with being added/removed.
- * @find_vqs_info: find virtqueues and instantiate them.
+ * @find_vqs: find virtqueues and instantiate them.
* vdev: the virtio_device
* nvqs: the number of virtqueues to find
* vqs: on success, includes new virtqueues
@@ -112,10 +112,10 @@ struct virtio_config_ops {
u8 (*get_status)(struct virtio_device *vdev);
void (*set_status)(struct virtio_device *vdev, u8 status);
void (*reset)(struct virtio_device *vdev);
- int (*find_vqs_info)(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[],
- struct virtqueue_info vqs_info[],
- struct irq_affinity *desc);
+ int (*find_vqs)(struct virtio_device *vdev, unsigned int nvqs,
+ struct virtqueue *vqs[],
+ struct virtqueue_info vqs_info[],
+ struct irq_affinity *desc);
void (*del_vqs)(struct virtio_device *);
void (*synchronize_cbs)(struct virtio_device *);
u64 (*get_features)(struct virtio_device *vdev);
@@ -223,7 +223,7 @@ int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
struct virtqueue_info vqs_info[],
struct irq_affinity *desc)
{
- return vdev->config->find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
+ return vdev->config->find_vqs(vdev, nvqs, vqs, vqs_info, desc);
}
static inline
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 10/19] virtio_blk: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (8 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 09/19] virtio: rename find_vqs_info() op to find_vqs() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 11/19] virtio_console: " Jiri Pirko
` (9 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
drivers/block/virtio_blk.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 2351f411fa46..ca3446503e82 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -964,8 +964,7 @@ static int init_vq(struct virtio_blk *vblk)
{
int err;
unsigned short i;
- vq_callback_t **callbacks;
- const char **names;
+ struct virtqueue_info *vqs_info;
struct virtqueue **vqs;
unsigned short num_vqs;
unsigned short num_poll_vqs;
@@ -1002,28 +1001,26 @@ static int init_vq(struct virtio_blk *vblk)
if (!vblk->vqs)
return -ENOMEM;
- names = kmalloc_array(num_vqs, sizeof(*names), GFP_KERNEL);
- callbacks = kmalloc_array(num_vqs, sizeof(*callbacks), GFP_KERNEL);
+ vqs_info = kcalloc(num_vqs, sizeof(*vqs_info), GFP_KERNEL);
vqs = kmalloc_array(num_vqs, sizeof(*vqs), GFP_KERNEL);
- if (!names || !callbacks || !vqs) {
+ if (!vqs_info || !vqs) {
err = -ENOMEM;
goto out;
}
for (i = 0; i < num_vqs - num_poll_vqs; i++) {
- callbacks[i] = virtblk_done;
+ vqs_info[i].callback = virtblk_done;
snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req.%u", i);
- names[i] = vblk->vqs[i].name;
+ vqs_info[i].name = vblk->vqs[i].name;
}
for (; i < num_vqs; i++) {
- callbacks[i] = NULL;
snprintf(vblk->vqs[i].name, VQ_NAME_LEN, "req_poll.%u", i);
- names[i] = vblk->vqs[i].name;
+ vqs_info[i].name = vblk->vqs[i].name;
}
/* Discover virtqueues and write information to configuration. */
- err = virtio_find_vqs(vdev, num_vqs, vqs, callbacks, names, &desc);
+ err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
if (err)
goto out;
@@ -1035,8 +1032,7 @@ static int init_vq(struct virtio_blk *vblk)
out:
kfree(vqs);
- kfree(callbacks);
- kfree(names);
+ kfree(vqs_info);
if (err)
kfree(vblk->vqs);
return err;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 11/19] virtio_console: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (9 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 10/19] virtio_blk: convert to use virtio_find_vqs_info() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 12/19] virtio_crypto: " Jiri Pirko
` (8 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
drivers/char/virtio_console.c | 44 ++++++++++++++---------------------
1 file changed, 18 insertions(+), 26 deletions(-)
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index d9ee2dbc7eab..903d83a1ffe8 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1804,8 +1804,7 @@ static void config_work_handler(struct work_struct *work)
static int init_vqs(struct ports_device *portdev)
{
- vq_callback_t **io_callbacks;
- char **io_names;
+ struct virtqueue_info *vqs_info;
struct virtqueue **vqs;
u32 i, j, nr_ports, nr_queues;
int err;
@@ -1814,15 +1813,12 @@ static int init_vqs(struct ports_device *portdev)
nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;
vqs = kmalloc_array(nr_queues, sizeof(struct virtqueue *), GFP_KERNEL);
- io_callbacks = kmalloc_array(nr_queues, sizeof(vq_callback_t *),
- GFP_KERNEL);
- io_names = kmalloc_array(nr_queues, sizeof(char *), GFP_KERNEL);
+ vqs_info = kcalloc(nr_queues, sizeof(*vqs_info), GFP_KERNEL);
portdev->in_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
GFP_KERNEL);
portdev->out_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
GFP_KERNEL);
- if (!vqs || !io_callbacks || !io_names || !portdev->in_vqs ||
- !portdev->out_vqs) {
+ if (!vqs || !vqs_info || !portdev->in_vqs || !portdev->out_vqs) {
err = -ENOMEM;
goto free;
}
@@ -1833,30 +1829,28 @@ static int init_vqs(struct ports_device *portdev)
* 0 before others.
*/
j = 0;
- io_callbacks[j] = in_intr;
- io_callbacks[j + 1] = out_intr;
- io_names[j] = "input";
- io_names[j + 1] = "output";
+ vqs_info[j].callback = in_intr;
+ vqs_info[j + 1].callback = out_intr;
+ vqs_info[j].name = "input";
+ vqs_info[j + 1].name = "output";
j += 2;
if (use_multiport(portdev)) {
- io_callbacks[j] = control_intr;
- io_callbacks[j + 1] = NULL;
- io_names[j] = "control-i";
- io_names[j + 1] = "control-o";
+ vqs_info[j].callback = control_intr;
+ vqs_info[j].name = "control-i";
+ vqs_info[j + 1].name = "control-o";
for (i = 1; i < nr_ports; i++) {
j += 2;
- io_callbacks[j] = in_intr;
- io_callbacks[j + 1] = out_intr;
- io_names[j] = "input";
- io_names[j + 1] = "output";
+ vqs_info[j].callback = in_intr;
+ vqs_info[j + 1].callback = out_intr;
+ vqs_info[j].name = "input";
+ vqs_info[j + 1].name = "output";
}
}
/* Find the queues. */
- err = virtio_find_vqs(portdev->vdev, nr_queues, vqs,
- io_callbacks,
- (const char **)io_names, NULL);
+ err = virtio_find_vqs_info(portdev->vdev, nr_queues, vqs,
+ vqs_info, NULL);
if (err)
goto free;
@@ -1874,8 +1868,7 @@ static int init_vqs(struct ports_device *portdev)
portdev->out_vqs[i] = vqs[j + 1];
}
}
- kfree(io_names);
- kfree(io_callbacks);
+ kfree(vqs_info);
kfree(vqs);
return 0;
@@ -1883,8 +1876,7 @@ static int init_vqs(struct ports_device *portdev)
free:
kfree(portdev->out_vqs);
kfree(portdev->in_vqs);
- kfree(io_names);
- kfree(io_callbacks);
+ kfree(vqs_info);
kfree(vqs);
return err;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 12/19] virtio_crypto: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (10 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 11/19] virtio_console: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 13/19] virtio_net: " Jiri Pirko
` (7 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
drivers/crypto/virtio/virtio_crypto_core.c | 31 +++++++++-------------
1 file changed, 12 insertions(+), 19 deletions(-)
diff --git a/drivers/crypto/virtio/virtio_crypto_core.c b/drivers/crypto/virtio/virtio_crypto_core.c
index 30cd040aa03b..b8119d1f9931 100644
--- a/drivers/crypto/virtio/virtio_crypto_core.c
+++ b/drivers/crypto/virtio/virtio_crypto_core.c
@@ -96,11 +96,10 @@ static void virtcrypto_dataq_callback(struct virtqueue *vq)
static int virtcrypto_find_vqs(struct virtio_crypto *vi)
{
- vq_callback_t **callbacks;
+ struct virtqueue_info *vqs_info;
struct virtqueue **vqs;
int ret = -ENOMEM;
int i, total_vqs;
- const char **names;
struct device *dev = &vi->vdev->dev;
/*
@@ -114,26 +113,23 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
vqs = kcalloc(total_vqs, sizeof(*vqs), GFP_KERNEL);
if (!vqs)
goto err_vq;
- callbacks = kcalloc(total_vqs, sizeof(*callbacks), GFP_KERNEL);
- if (!callbacks)
- goto err_callback;
- names = kcalloc(total_vqs, sizeof(*names), GFP_KERNEL);
- if (!names)
- goto err_names;
+ vqs_info = kcalloc(total_vqs, sizeof(*vqs_info), GFP_KERNEL);
+ if (!vqs_info)
+ goto err_vqs_info;
/* Parameters for control virtqueue */
- callbacks[total_vqs - 1] = virtcrypto_ctrlq_callback;
- names[total_vqs - 1] = "controlq";
+ vqs_info[total_vqs - 1].callback = virtcrypto_ctrlq_callback;
+ vqs_info[total_vqs - 1].name = "controlq";
/* Allocate/initialize parameters for data virtqueues */
for (i = 0; i < vi->max_data_queues; i++) {
- callbacks[i] = virtcrypto_dataq_callback;
+ vqs_info[i].callback = virtcrypto_dataq_callback;
snprintf(vi->data_vq[i].name, sizeof(vi->data_vq[i].name),
"dataq.%d", i);
- names[i] = vi->data_vq[i].name;
+ vqs_info[i].name = vi->data_vq[i].name;
}
- ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, callbacks, names, NULL);
+ ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
if (ret)
goto err_find;
@@ -153,18 +149,15 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
(unsigned long)&vi->data_vq[i]);
}
- kfree(names);
- kfree(callbacks);
+ kfree(vqs_info);
kfree(vqs);
return 0;
err_engine:
err_find:
- kfree(names);
-err_names:
- kfree(callbacks);
-err_callback:
+ kfree(vqs_info);
+err_vqs_info:
kfree(vqs);
err_vq:
return ret;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 13/19] virtio_net: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (11 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 12/19] virtio_crypto: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 14/19] scsi: virtio_scsi: " Jiri Pirko
` (6 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs_ctx(), allocate one of virtual_queue_info structs
and pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
drivers/net/virtio_net.c | 34 +++++++++++++---------------------
1 file changed, 13 insertions(+), 21 deletions(-)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 18165faafa92..686ecd819fec 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -5297,9 +5297,8 @@ static unsigned int mergeable_min_buf_len(struct virtnet_info *vi, struct virtqu
static int virtnet_find_vqs(struct virtnet_info *vi)
{
- vq_callback_t **callbacks;
+ struct virtqueue_info *vqs_info;
struct virtqueue **vqs;
- const char **names;
int ret = -ENOMEM;
int total_vqs;
bool *ctx;
@@ -5316,12 +5315,9 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
vqs = kcalloc(total_vqs, sizeof(*vqs), GFP_KERNEL);
if (!vqs)
goto err_vq;
- callbacks = kmalloc_array(total_vqs, sizeof(*callbacks), GFP_KERNEL);
- if (!callbacks)
- goto err_callback;
- names = kmalloc_array(total_vqs, sizeof(*names), GFP_KERNEL);
- if (!names)
- goto err_names;
+ vqs_info = kcalloc(total_vqs, sizeof(*vqs_info), GFP_KERNEL);
+ if (!vqs_info)
+ goto err_vqs_info;
if (!vi->big_packets || vi->mergeable_rx_bufs) {
ctx = kcalloc(total_vqs, sizeof(*ctx), GFP_KERNEL);
if (!ctx)
@@ -5332,24 +5328,22 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
/* Parameters for control virtqueue, if any */
if (vi->has_cvq) {
- callbacks[total_vqs - 1] = NULL;
- names[total_vqs - 1] = "control";
+ vqs_info[total_vqs - 1].name = "control";
}
/* Allocate/initialize parameters for send/receive virtqueues */
for (i = 0; i < vi->max_queue_pairs; i++) {
- callbacks[rxq2vq(i)] = skb_recv_done;
- callbacks[txq2vq(i)] = skb_xmit_done;
+ vqs_info[rxq2vq(i)].callback = skb_recv_done;
+ vqs_info[txq2vq(i)].callback = skb_xmit_done;
sprintf(vi->rq[i].name, "input.%u", i);
sprintf(vi->sq[i].name, "output.%u", i);
- names[rxq2vq(i)] = vi->rq[i].name;
- names[txq2vq(i)] = vi->sq[i].name;
+ vqs_info[rxq2vq(i)].name = vi->rq[i].name;
+ vqs_info[txq2vq(i)].name = vi->sq[i].name;
if (ctx)
- ctx[rxq2vq(i)] = true;
+ vqs_info[rxq2vq(i)].ctx = true;
}
- ret = virtio_find_vqs_ctx(vi->vdev, total_vqs, vqs, callbacks,
- names, ctx, NULL);
+ ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
if (ret)
goto err_find;
@@ -5371,10 +5365,8 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
err_find:
kfree(ctx);
err_ctx:
- kfree(names);
-err_names:
- kfree(callbacks);
-err_callback:
+ kfree(vqs_info);
+err_vqs_info:
kfree(vqs);
err_vq:
return ret;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 14/19] scsi: virtio_scsi: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (12 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 13/19] virtio_net: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 15/19] virtiofs: " Jiri Pirko
` (5 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
drivers/scsi/virtio_scsi.c | 32 +++++++++++++-------------------
1 file changed, 13 insertions(+), 19 deletions(-)
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 89ca26945721..bf9346a66df2 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -841,19 +841,16 @@ static int virtscsi_init(struct virtio_device *vdev,
int err;
u32 i;
u32 num_vqs, num_poll_vqs, num_req_vqs;
- vq_callback_t **callbacks;
- const char **names;
+ struct virtqueue_info *vqs_info;
struct virtqueue **vqs;
struct irq_affinity desc = { .pre_vectors = 2 };
num_req_vqs = vscsi->num_queues;
num_vqs = num_req_vqs + VIRTIO_SCSI_VQ_BASE;
vqs = kmalloc_array(num_vqs, sizeof(struct virtqueue *), GFP_KERNEL);
- callbacks = kmalloc_array(num_vqs, sizeof(vq_callback_t *),
- GFP_KERNEL);
- names = kmalloc_array(num_vqs, sizeof(char *), GFP_KERNEL);
+ vqs_info = kcalloc(num_vqs, sizeof(*vqs_info), GFP_KERNEL);
- if (!callbacks || !vqs || !names) {
+ if (!vqs || !vqs_info) {
err = -ENOMEM;
goto out;
}
@@ -869,22 +866,20 @@ static int virtscsi_init(struct virtio_device *vdev,
vscsi->io_queues[HCTX_TYPE_READ],
vscsi->io_queues[HCTX_TYPE_POLL]);
- callbacks[0] = virtscsi_ctrl_done;
- callbacks[1] = virtscsi_event_done;
- names[0] = "control";
- names[1] = "event";
+ vqs_info[0].callback = virtscsi_ctrl_done;
+ vqs_info[0].name = "control";
+ vqs_info[1].callback = virtscsi_event_done;
+ vqs_info[1].name = "event";
for (i = VIRTIO_SCSI_VQ_BASE; i < num_vqs - num_poll_vqs; i++) {
- callbacks[i] = virtscsi_req_done;
- names[i] = "request";
+ vqs_info[i].callback = virtscsi_req_done;
+ vqs_info[i].name = "request";
}
- for (; i < num_vqs; i++) {
- callbacks[i] = NULL;
- names[i] = "request_poll";
- }
+ for (; i < num_vqs; i++)
+ vqs_info[i].name = "request_poll";
/* Discover virtqueues and write information to configuration. */
- err = virtio_find_vqs(vdev, num_vqs, vqs, callbacks, names, &desc);
+ err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
if (err)
goto out;
@@ -900,8 +895,7 @@ static int virtscsi_init(struct virtio_device *vdev,
err = 0;
out:
- kfree(names);
- kfree(callbacks);
+ kfree(vqs_info);
kfree(vqs);
if (err)
virtscsi_remove_vqs(vdev);
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 15/19] virtiofs: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (13 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 14/19] scsi: virtio_scsi: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 16/19] virtio_balloon: " Jiri Pirko
` (4 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
- rebased on top of recent code changes
---
fs/fuse/virtio_fs.c | 22 +++++++++-------------
1 file changed, 9 insertions(+), 13 deletions(-)
diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
index 728f14e077bd..a335b421f196 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -789,14 +789,13 @@ static void virtio_fs_init_vq(struct virtio_fs_vq *fsvq, char *name,
static int virtio_fs_setup_vqs(struct virtio_device *vdev,
struct virtio_fs *fs)
{
+ struct virtqueue_info *vqs_info;
struct virtqueue **vqs;
- vq_callback_t **callbacks;
/* Specify pre_vectors to ensure that the queues before the
* request queues (e.g. hiprio) don't claim any of the CPUs in
* the multi-queue mapping and interrupt affinities
*/
struct irq_affinity desc = { .pre_vectors = VQ_REQUEST };
- const char **names;
unsigned int i;
int ret = 0;
@@ -814,20 +813,18 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
return -ENOMEM;
vqs = kmalloc_array(fs->nvqs, sizeof(vqs[VQ_HIPRIO]), GFP_KERNEL);
- callbacks = kmalloc_array(fs->nvqs, sizeof(callbacks[VQ_HIPRIO]),
- GFP_KERNEL);
- names = kmalloc_array(fs->nvqs, sizeof(names[VQ_HIPRIO]), GFP_KERNEL);
fs->mq_map = kcalloc_node(nr_cpu_ids, sizeof(*fs->mq_map), GFP_KERNEL,
dev_to_node(&vdev->dev));
- if (!vqs || !callbacks || !names || !fs->mq_map) {
+ vqs_info = kcalloc(fs->nvqs, sizeof(*vqs_info), GFP_KERNEL);
+ if (!vqs || !vqs_info || !fs->mq_map) {
ret = -ENOMEM;
goto out;
}
/* Initialize the hiprio/forget request virtqueue */
- callbacks[VQ_HIPRIO] = virtio_fs_vq_done;
+ vqs_info[VQ_HIPRIO].callback = virtio_fs_vq_done;
virtio_fs_init_vq(&fs->vqs[VQ_HIPRIO], "hiprio", VQ_HIPRIO);
- names[VQ_HIPRIO] = fs->vqs[VQ_HIPRIO].name;
+ vqs_info[VQ_HIPRIO].name = fs->vqs[VQ_HIPRIO].name;
/* Initialize the requests virtqueues */
for (i = VQ_REQUEST; i < fs->nvqs; i++) {
@@ -835,11 +832,11 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
snprintf(vq_name, VQ_NAME_LEN, "requests.%u", i - VQ_REQUEST);
virtio_fs_init_vq(&fs->vqs[i], vq_name, VQ_REQUEST);
- callbacks[i] = virtio_fs_vq_done;
- names[i] = fs->vqs[i].name;
+ vqs_info[i].callback = virtio_fs_vq_done;
+ vqs_info[i].name = fs->vqs[i].name;
}
- ret = virtio_find_vqs(vdev, fs->nvqs, vqs, callbacks, names, &desc);
+ ret = virtio_find_vqs_info(vdev, fs->nvqs, vqs, vqs_info, &desc);
if (ret < 0)
goto out;
@@ -848,8 +845,7 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
virtio_fs_start_all_queues(fs);
out:
- kfree(names);
- kfree(callbacks);
+ kfree(vqs_info);
kfree(vqs);
if (ret) {
kfree(fs->vqs);
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 16/19] virtio_balloon: convert to use virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (14 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 15/19] virtiofs: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
` (3 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), have one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- s/virtio_queue_info/virtqueue_info/
---
drivers/virtio/virtio_balloon.c | 34 +++++++++++++--------------------
1 file changed, 13 insertions(+), 21 deletions(-)
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index 9a61febbd2f7..cfa710abf441 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -560,9 +560,8 @@ static void update_balloon_size_func(struct work_struct *work)
static int init_vqs(struct virtio_balloon *vb)
{
+ struct virtqueue_info vqs_info[VIRTIO_BALLOON_VQ_MAX] = {};
struct virtqueue *vqs[VIRTIO_BALLOON_VQ_MAX];
- vq_callback_t *callbacks[VIRTIO_BALLOON_VQ_MAX];
- const char *names[VIRTIO_BALLOON_VQ_MAX];
int err;
/*
@@ -570,33 +569,26 @@ static int init_vqs(struct virtio_balloon *vb)
* will be NULL if the related feature is not enabled, which will
* cause no allocation for the corresponding virtqueue in find_vqs.
*/
- callbacks[VIRTIO_BALLOON_VQ_INFLATE] = balloon_ack;
- names[VIRTIO_BALLOON_VQ_INFLATE] = "inflate";
- callbacks[VIRTIO_BALLOON_VQ_DEFLATE] = balloon_ack;
- names[VIRTIO_BALLOON_VQ_DEFLATE] = "deflate";
- callbacks[VIRTIO_BALLOON_VQ_STATS] = NULL;
- names[VIRTIO_BALLOON_VQ_STATS] = NULL;
- callbacks[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
- names[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
- names[VIRTIO_BALLOON_VQ_REPORTING] = NULL;
+ vqs_info[VIRTIO_BALLOON_VQ_INFLATE].callback = balloon_ack;
+ vqs_info[VIRTIO_BALLOON_VQ_INFLATE].name = "inflate";
+ vqs_info[VIRTIO_BALLOON_VQ_DEFLATE].callback = balloon_ack;
+ vqs_info[VIRTIO_BALLOON_VQ_DEFLATE].name = "deflate";
if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ)) {
- names[VIRTIO_BALLOON_VQ_STATS] = "stats";
- callbacks[VIRTIO_BALLOON_VQ_STATS] = stats_request;
+ vqs_info[VIRTIO_BALLOON_VQ_STATS].name = "stats";
+ vqs_info[VIRTIO_BALLOON_VQ_STATS].callback = stats_request;
}
- if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) {
- names[VIRTIO_BALLOON_VQ_FREE_PAGE] = "free_page_vq";
- callbacks[VIRTIO_BALLOON_VQ_FREE_PAGE] = NULL;
- }
+ if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT))
+ vqs_info[VIRTIO_BALLOON_VQ_FREE_PAGE].name = "free_page_vq";
if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_REPORTING)) {
- names[VIRTIO_BALLOON_VQ_REPORTING] = "reporting_vq";
- callbacks[VIRTIO_BALLOON_VQ_REPORTING] = balloon_ack;
+ vqs_info[VIRTIO_BALLOON_VQ_REPORTING].name = "reporting_vq";
+ vqs_info[VIRTIO_BALLOON_VQ_REPORTING].callback = balloon_ack;
}
- err = virtio_find_vqs(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
- callbacks, names, NULL);
+ err = virtio_find_vqs_info(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
+ vqs_info, NULL);
if (err)
return err;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (15 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 16/19] virtio_balloon: " Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers Jiri Pirko
` (2 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), have one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- added forgotten VIRTIO_SND_VQ_MAX for array size in virtio_card.c
- s/virtio_queue_info/virtqueue_info/
---
arch/um/drivers/virt-pci.c | 8 ++++---
drivers/bluetooth/virtio_bt.c | 14 ++++-------
drivers/firmware/arm_scmi/virtio.c | 11 ++++-----
drivers/gpio/gpio-virtio.c | 10 ++++----
drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++++----
drivers/iommu/virtio-iommu.c | 11 ++++-----
drivers/net/wireless/virtual/mac80211_hwsim.c | 14 ++++-------
drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++++---
drivers/virtio/virtio_input.c | 9 ++++----
net/vmw_vsock/virtio_transport.c | 17 +++++---------
sound/virtio/virtio_card.c | 23 ++++++++-----------
11 files changed, 59 insertions(+), 75 deletions(-)
diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
index 7cb503469bbd..3a668241c0aa 100644
--- a/arch/um/drivers/virt-pci.c
+++ b/arch/um/drivers/virt-pci.c
@@ -567,12 +567,14 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
static int um_pci_init_vqs(struct um_pci_device *dev)
{
+ struct virtqueue_info vqs_info[] = {
+ { "cmd", um_pci_cmd_vq_cb },
+ { "irq", um_pci_irq_vq_cb },
+ };
struct virtqueue *vqs[2];
- static const char *const names[2] = { "cmd", "irq" };
- vq_callback_t *cbs[2] = { um_pci_cmd_vq_cb, um_pci_irq_vq_cb };
int err, i;
- err = virtio_find_vqs(dev->vdev, 2, vqs, cbs, names, NULL);
+ err = virtio_find_vqs_info(dev->vdev, 2, vqs, vqs_info, NULL);
if (err)
return err;
diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c
index 40bd83825c29..79574855ed54 100644
--- a/drivers/bluetooth/virtio_bt.c
+++ b/drivers/bluetooth/virtio_bt.c
@@ -254,13 +254,9 @@ static void virtbt_rx_done(struct virtqueue *vq)
static int virtbt_probe(struct virtio_device *vdev)
{
- vq_callback_t *callbacks[VIRTBT_NUM_VQS] = {
- [VIRTBT_VQ_TX] = virtbt_tx_done,
- [VIRTBT_VQ_RX] = virtbt_rx_done,
- };
- const char *names[VIRTBT_NUM_VQS] = {
- [VIRTBT_VQ_TX] = "tx",
- [VIRTBT_VQ_RX] = "rx",
+ struct virtqueue_info vqs_info[VIRTBT_NUM_VQS] = {
+ [VIRTBT_VQ_TX] = { "tx", virtbt_tx_done },
+ [VIRTBT_VQ_RX] = { "rx", virtbt_rx_done },
};
struct virtio_bluetooth *vbt;
struct hci_dev *hdev;
@@ -288,8 +284,8 @@ static int virtbt_probe(struct virtio_device *vdev)
INIT_WORK(&vbt->rx, virtbt_rx_work);
- err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, callbacks,
- names, NULL);
+ err = virtio_find_vqs_info(vdev, VIRTBT_NUM_VQS, vbt->vqs,
+ vqs_info, NULL);
if (err)
return err;
diff --git a/drivers/firmware/arm_scmi/virtio.c b/drivers/firmware/arm_scmi/virtio.c
index 4892058445ce..d7cdefb6bd54 100644
--- a/drivers/firmware/arm_scmi/virtio.c
+++ b/drivers/firmware/arm_scmi/virtio.c
@@ -354,11 +354,9 @@ static void scmi_vio_deferred_tx_worker(struct work_struct *work)
scmi_vio_channel_release(vioch);
}
-static const char *const scmi_vio_vqueue_names[] = { "tx", "rx" };
-
-static vq_callback_t *scmi_vio_complete_callbacks[] = {
- scmi_vio_complete_cb,
- scmi_vio_complete_cb
+static struct virtqueue_info scmi_vio_vqs_info[] = {
+ { "tx", scmi_vio_complete_cb },
+ { "rx", scmi_vio_complete_cb },
};
static unsigned int virtio_get_max_msg(struct scmi_chan_info *base_cinfo)
@@ -831,8 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
if (have_vq_rx)
channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
- ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_complete_callbacks,
- scmi_vio_vqueue_names, NULL);
+ ret = virtio_find_vqs_info(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
if (ret) {
dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
return ret;
diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c
index 9fae8e396c58..d11464420797 100644
--- a/drivers/gpio/gpio-virtio.c
+++ b/drivers/gpio/gpio-virtio.c
@@ -457,15 +457,15 @@ static void virtio_gpio_free_vqs(struct virtio_device *vdev)
static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
struct virtio_device *vdev)
{
- const char * const names[] = { "requestq", "eventq" };
- vq_callback_t *cbs[] = {
- virtio_gpio_request_vq,
- virtio_gpio_event_vq,
+ struct virtqueue_info vqs_info[] = {
+ { "requestq", virtio_gpio_request_vq },
+ { "eventq", virtio_gpio_event_vq },
};
struct virtqueue *vqs[2] = { NULL, NULL };
int ret;
- ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs, cbs, names, NULL);
+ ret = virtio_find_vqs_info(vdev, vgpio->irq_lines ? 2 : 1, vqs,
+ vqs_info, NULL);
if (ret) {
dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
return ret;
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 5a3b5aaed1f3..1590fc180c66 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -116,11 +116,10 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev,
int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
{
- static vq_callback_t *callbacks[] = {
- virtio_gpu_ctrl_ack, virtio_gpu_cursor_ack
+ struct virtqueue_info vqs_info[] = {
+ { "control", virtio_gpu_ctrl_ack },
+ { "cursor", virtio_gpu_cursor_ack },
};
- static const char * const names[] = { "control", "cursor" };
-
struct virtio_gpu_device *vgdev;
/* this will expand later */
struct virtqueue *vqs[2];
@@ -207,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
DRM_INFO("features: %ccontext_init\n",
vgdev->has_context_init ? '+' : '-');
- ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
+ ret = virtio_find_vqs_info(vgdev->vdev, 2, vqs, vqs_info, NULL);
if (ret) {
DRM_ERROR("failed to find virt queues\n");
goto err_vqs;
diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
index 36d680826b57..d3c7877a3806 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -1084,14 +1084,13 @@ static struct iommu_ops viommu_ops = {
static int viommu_init_vqs(struct viommu_dev *viommu)
{
struct virtio_device *vdev = dev_to_virtio(viommu->dev);
- const char *names[] = { "request", "event" };
- vq_callback_t *callbacks[] = {
- NULL, /* No async requests */
- viommu_event_handler,
+ struct virtqueue_info vqs_info[] = {
+ { "request" },
+ { "event", viommu_event_handler },
};
- return virtio_find_vqs(vdev, VIOMMU_NR_VQS, viommu->vqs, callbacks,
- names, NULL);
+ return virtio_find_vqs_info(vdev, VIOMMU_NR_VQS, viommu->vqs,
+ vqs_info, NULL);
}
static int viommu_fill_evtq(struct viommu_dev *viommu)
diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
index c5d896994e70..7bda786631ba 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -6574,17 +6574,13 @@ static void hwsim_virtio_rx_done(struct virtqueue *vq)
static int init_vqs(struct virtio_device *vdev)
{
- vq_callback_t *callbacks[HWSIM_NUM_VQS] = {
- [HWSIM_VQ_TX] = hwsim_virtio_tx_done,
- [HWSIM_VQ_RX] = hwsim_virtio_rx_done,
- };
- const char *names[HWSIM_NUM_VQS] = {
- [HWSIM_VQ_TX] = "tx",
- [HWSIM_VQ_RX] = "rx",
+ struct virtqueue_info vqs_info[HWSIM_NUM_VQS] = {
+ [HWSIM_VQ_TX] = { "tx", hwsim_virtio_tx_done },
+ [HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
};
- return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
- hwsim_vqs, callbacks, names, NULL);
+ return virtio_find_vqs_info(vdev, HWSIM_NUM_VQS,
+ hwsim_vqs, vqs_info, NULL);
}
static int fill_vq(struct virtqueue *vq)
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index e9e8c1f7829f..fb466ef20f07 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -868,8 +868,10 @@ static void rpmsg_virtio_del_ctrl_dev(struct rpmsg_device *rpdev_ctrl)
static int rpmsg_probe(struct virtio_device *vdev)
{
- vq_callback_t *vq_cbs[] = { rpmsg_recv_done, rpmsg_xmit_done };
- static const char * const names[] = { "input", "output" };
+ struct virtqueue_info vqs_info[] = {
+ { "input", rpmsg_recv_done },
+ { "output", rpmsg_xmit_done },
+ };
struct virtqueue *vqs[2];
struct virtproc_info *vrp;
struct virtio_rpmsg_channel *vch = NULL;
@@ -891,7 +893,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
init_waitqueue_head(&vrp->sendq);
/* We expect two virtqueues, rx and tx (and in this order) */
- err = virtio_find_vqs(vdev, 2, vqs, vq_cbs, names, NULL);
+ err = virtio_find_vqs_info(vdev, 2, vqs, vqs_info, NULL);
if (err)
goto free_vrp;
diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
index 1a730d6c0b55..6f803dc3d0f9 100644
--- a/drivers/virtio/virtio_input.c
+++ b/drivers/virtio/virtio_input.c
@@ -185,13 +185,14 @@ static void virtinput_cfg_abs(struct virtio_input *vi, int abs)
static int virtinput_init_vqs(struct virtio_input *vi)
{
+ struct virtqueue_info vqs_info[] = {
+ { "events", virtinput_recv_events },
+ { "status", virtinput_recv_status },
+ };
struct virtqueue *vqs[2];
- vq_callback_t *cbs[] = { virtinput_recv_events,
- virtinput_recv_status };
- static const char * const names[] = { "events", "status" };
int err;
- err = virtio_find_vqs(vi->vdev, 2, vqs, cbs, names, NULL);
+ err = virtio_find_vqs_info(vi->vdev, 2, vqs, vqs_info, NULL);
if (err)
return err;
vi->evt = vqs[0];
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index 43d405298857..3033680fcc98 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -617,20 +617,15 @@ static void virtio_transport_rx_work(struct work_struct *work)
static int virtio_vsock_vqs_init(struct virtio_vsock *vsock)
{
struct virtio_device *vdev = vsock->vdev;
- static const char * const names[] = {
- "rx",
- "tx",
- "event",
- };
- vq_callback_t *callbacks[] = {
- virtio_vsock_rx_done,
- virtio_vsock_tx_done,
- virtio_vsock_event_done,
+ struct virtqueue_info vqs_info[] = {
+ { "rx", virtio_vsock_rx_done },
+ { "tx", virtio_vsock_tx_done },
+ { "event", virtio_vsock_event_done },
};
int ret;
- ret = virtio_find_vqs(vdev, VSOCK_VQ_MAX, vsock->vqs, callbacks, names,
- NULL);
+ ret = virtio_find_vqs_info(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info,
+ NULL);
if (ret < 0)
return ret;
diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c
index 7805daea0102..109a0008b69e 100644
--- a/sound/virtio/virtio_card.c
+++ b/sound/virtio/virtio_card.c
@@ -110,25 +110,22 @@ static void virtsnd_event_notify_cb(struct virtqueue *vqueue)
static int virtsnd_find_vqs(struct virtio_snd *snd)
{
struct virtio_device *vdev = snd->vdev;
- static vq_callback_t *callbacks[VIRTIO_SND_VQ_MAX] = {
- [VIRTIO_SND_VQ_CONTROL] = virtsnd_ctl_notify_cb,
- [VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb,
- [VIRTIO_SND_VQ_TX] = virtsnd_pcm_tx_notify_cb,
- [VIRTIO_SND_VQ_RX] = virtsnd_pcm_rx_notify_cb
- };
- static const char *names[VIRTIO_SND_VQ_MAX] = {
- [VIRTIO_SND_VQ_CONTROL] = "virtsnd-ctl",
- [VIRTIO_SND_VQ_EVENT] = "virtsnd-event",
- [VIRTIO_SND_VQ_TX] = "virtsnd-tx",
- [VIRTIO_SND_VQ_RX] = "virtsnd-rx"
+ struct virtqueue_info vqs_info[VIRTIO_SND_VQ_MAX] = {
+ [VIRTIO_SND_VQ_CONTROL] = { "virtsnd-ctl",
+ virtsnd_ctl_notify_cb },
+ [VIRTIO_SND_VQ_EVENT] = { "virtsnd-event",
+ virtsnd_event_notify_cb },
+ [VIRTIO_SND_VQ_TX] = { "virtsnd-tx",
+ virtsnd_pcm_tx_notify_cb },
+ [VIRTIO_SND_VQ_RX] = { "virtsnd-rx",
+ virtsnd_pcm_rx_notify_cb },
};
struct virtqueue *vqs[VIRTIO_SND_VQ_MAX] = { 0 };
unsigned int i;
unsigned int n;
int rc;
- rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, callbacks, names,
- NULL);
+ rc = virtio_find_vqs_info(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
if (rc) {
dev_err(&vdev->dev, "failed to initialize virtqueues\n");
return rc;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (16 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 17/19] virtio: convert the rest virtio_find_vqs() users to virtio_find_vqs_info() Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 6:43 ` [PATCH virtio v2 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs() Jiri Pirko
2024-07-04 11:33 ` [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Xuan Zhuo
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
All callers of virtio_find_vqs() and virtio_find_vqs_ctx() were
converted to use virtio_find_vqs_info(). Remove no longer used helpers.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
include/linux/virtio_config.h | 32 --------------------------------
1 file changed, 32 deletions(-)
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index d325af057d1a..939c8dc909a5 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -226,38 +226,6 @@ int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
return vdev->config->find_vqs(vdev, nvqs, vqs, vqs_info, desc);
}
-static inline
-int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[], const bool *ctx,
- struct irq_affinity *desc)
-{
- struct virtqueue_info *vqs_info;
- int err, i;
-
- vqs_info = kmalloc_array(nvqs, sizeof(*vqs_info), GFP_KERNEL);
- if (!vqs_info)
- return -ENOMEM;
- for (i = 0; i < nvqs; i++) {
- vqs_info[i].name = names[i];
- vqs_info[i].callback = callbacks[i];
- vqs_info[i].ctx = ctx ? ctx[i] : false;
- }
- err = virtio_find_vqs_info(vdev, nvqs, vqs, vqs_info, desc);
- kfree(vqs_info);
- return err;
-}
-
-static inline
-int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
- struct virtqueue *vqs[], vq_callback_t *callbacks[],
- const char * const names[],
- struct irq_affinity *desc)
-{
- return virtio_find_vqs_ctx(vdev, nvqs, vqs, callbacks,
- names, NULL, desc);
-}
-
static inline
struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
vq_callback_t *c, const char *n)
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* [PATCH virtio v2 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (17 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 18/19] virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx() helpers Jiri Pirko
@ 2024-07-04 6:43 ` Jiri Pirko
2024-07-04 11:33 ` [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Xuan Zhuo
19 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 6:43 UTC (permalink / raw)
To: virtualization; +Cc: mst, jasowang, xuanzhuo, eperezma, parav, feliu, hengqi
From: Jiri Pirko <jiri@nvidia.com>
Since the original virtio_find_vqs() is no longer present, rename
virtio_find_vqs_info() back to virtio_find_vqs().
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
- rebased on top of virtqueue_info struct name change
---
arch/um/drivers/virt-pci.c | 2 +-
drivers/block/virtio_blk.c | 2 +-
drivers/bluetooth/virtio_bt.c | 3 +--
drivers/char/virtio_console.c | 3 +--
drivers/crypto/virtio/virtio_crypto_core.c | 2 +-
drivers/firmware/arm_scmi/virtio.c | 2 +-
drivers/gpio/gpio-virtio.c | 4 ++--
drivers/gpu/drm/virtio/virtgpu_kms.c | 2 +-
drivers/iommu/virtio-iommu.c | 4 ++--
drivers/net/virtio_net.c | 2 +-
drivers/net/wireless/virtual/mac80211_hwsim.c | 4 ++--
drivers/rpmsg/virtio_rpmsg_bus.c | 2 +-
drivers/scsi/virtio_scsi.c | 2 +-
drivers/virtio/virtio_balloon.c | 4 ++--
drivers/virtio/virtio_input.c | 2 +-
fs/fuse/virtio_fs.c | 2 +-
include/linux/virtio_config.h | 10 +++++-----
net/vmw_vsock/virtio_transport.c | 3 +--
sound/virtio/virtio_card.c | 2 +-
19 files changed, 27 insertions(+), 30 deletions(-)
diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c
index 3a668241c0aa..b16a75c94b8b 100644
--- a/arch/um/drivers/virt-pci.c
+++ b/arch/um/drivers/virt-pci.c
@@ -574,7 +574,7 @@ static int um_pci_init_vqs(struct um_pci_device *dev)
struct virtqueue *vqs[2];
int err, i;
- err = virtio_find_vqs_info(dev->vdev, 2, vqs, vqs_info, NULL);
+ err = virtio_find_vqs(dev->vdev, 2, vqs, vqs_info, NULL);
if (err)
return err;
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index ca3446503e82..112a9e629ab5 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -1020,7 +1020,7 @@ static int init_vq(struct virtio_blk *vblk)
}
/* Discover virtqueues and write information to configuration. */
- err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
+ err = virtio_find_vqs(vdev, num_vqs, vqs, vqs_info, &desc);
if (err)
goto out;
diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c
index 79574855ed54..756f292df9e8 100644
--- a/drivers/bluetooth/virtio_bt.c
+++ b/drivers/bluetooth/virtio_bt.c
@@ -284,8 +284,7 @@ static int virtbt_probe(struct virtio_device *vdev)
INIT_WORK(&vbt->rx, virtbt_rx_work);
- err = virtio_find_vqs_info(vdev, VIRTBT_NUM_VQS, vbt->vqs,
- vqs_info, NULL);
+ err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, vqs_info, NULL);
if (err)
return err;
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 903d83a1ffe8..de7d720d99fa 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1849,8 +1849,7 @@ static int init_vqs(struct ports_device *portdev)
}
}
/* Find the queues. */
- err = virtio_find_vqs_info(portdev->vdev, nr_queues, vqs,
- vqs_info, NULL);
+ err = virtio_find_vqs(portdev->vdev, nr_queues, vqs, vqs_info, NULL);
if (err)
goto free;
diff --git a/drivers/crypto/virtio/virtio_crypto_core.c b/drivers/crypto/virtio/virtio_crypto_core.c
index b8119d1f9931..d0278eb568b9 100644
--- a/drivers/crypto/virtio/virtio_crypto_core.c
+++ b/drivers/crypto/virtio/virtio_crypto_core.c
@@ -129,7 +129,7 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
vqs_info[i].name = vi->data_vq[i].name;
}
- ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
+ ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, vqs_info, NULL);
if (ret)
goto err_find;
diff --git a/drivers/firmware/arm_scmi/virtio.c b/drivers/firmware/arm_scmi/virtio.c
index d7cdefb6bd54..dd3459bdb9cb 100644
--- a/drivers/firmware/arm_scmi/virtio.c
+++ b/drivers/firmware/arm_scmi/virtio.c
@@ -829,7 +829,7 @@ static int scmi_vio_probe(struct virtio_device *vdev)
if (have_vq_rx)
channels[VIRTIO_SCMI_VQ_RX].is_rx = true;
- ret = virtio_find_vqs_info(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
+ ret = virtio_find_vqs(vdev, vq_cnt, vqs, scmi_vio_vqs_info, NULL);
if (ret) {
dev_err(dev, "Failed to get %d virtqueue(s)\n", vq_cnt);
return ret;
diff --git a/drivers/gpio/gpio-virtio.c b/drivers/gpio/gpio-virtio.c
index d11464420797..93544ff62513 100644
--- a/drivers/gpio/gpio-virtio.c
+++ b/drivers/gpio/gpio-virtio.c
@@ -464,8 +464,8 @@ static int virtio_gpio_alloc_vqs(struct virtio_gpio *vgpio,
struct virtqueue *vqs[2] = { NULL, NULL };
int ret;
- ret = virtio_find_vqs_info(vdev, vgpio->irq_lines ? 2 : 1, vqs,
- vqs_info, NULL);
+ ret = virtio_find_vqs(vdev, vgpio->irq_lines ? 2 : 1, vqs,
+ vqs_info, NULL);
if (ret) {
dev_err(&vdev->dev, "failed to find vqs: %d\n", ret);
return ret;
diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 1590fc180c66..7dfb2006c561 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -206,7 +206,7 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev)
DRM_INFO("features: %ccontext_init\n",
vgdev->has_context_init ? '+' : '-');
- ret = virtio_find_vqs_info(vgdev->vdev, 2, vqs, vqs_info, NULL);
+ ret = virtio_find_vqs(vgdev->vdev, 2, vqs, vqs_info, NULL);
if (ret) {
DRM_ERROR("failed to find virt queues\n");
goto err_vqs;
diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
index d3c7877a3806..b85ce6310ddb 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -1089,8 +1089,8 @@ static int viommu_init_vqs(struct viommu_dev *viommu)
{ "event", viommu_event_handler },
};
- return virtio_find_vqs_info(vdev, VIOMMU_NR_VQS, viommu->vqs,
- vqs_info, NULL);
+ return virtio_find_vqs(vdev, VIOMMU_NR_VQS, viommu->vqs,
+ vqs_info, NULL);
}
static int viommu_fill_evtq(struct viommu_dev *viommu)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 686ecd819fec..a42331d89da2 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -5343,7 +5343,7 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
vqs_info[rxq2vq(i)].ctx = true;
}
- ret = virtio_find_vqs_info(vi->vdev, total_vqs, vqs, vqs_info, NULL);
+ ret = virtio_find_vqs(vi->vdev, total_vqs, vqs, vqs_info, NULL);
if (ret)
goto err_find;
diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
index 7bda786631ba..f2e58d246284 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -6579,8 +6579,8 @@ static int init_vqs(struct virtio_device *vdev)
[HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
};
- return virtio_find_vqs_info(vdev, HWSIM_NUM_VQS,
- hwsim_vqs, vqs_info, NULL);
+ return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
+ hwsim_vqs, vqs_info, NULL);
}
static int fill_vq(struct virtqueue *vq)
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index fb466ef20f07..89d7a3b8c48b 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -893,7 +893,7 @@ static int rpmsg_probe(struct virtio_device *vdev)
init_waitqueue_head(&vrp->sendq);
/* We expect two virtqueues, rx and tx (and in this order) */
- err = virtio_find_vqs_info(vdev, 2, vqs, vqs_info, NULL);
+ err = virtio_find_vqs(vdev, 2, vqs, vqs_info, NULL);
if (err)
goto free_vrp;
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index bf9346a66df2..8471f38b730e 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -879,7 +879,7 @@ static int virtscsi_init(struct virtio_device *vdev,
vqs_info[i].name = "request_poll";
/* Discover virtqueues and write information to configuration. */
- err = virtio_find_vqs_info(vdev, num_vqs, vqs, vqs_info, &desc);
+ err = virtio_find_vqs(vdev, num_vqs, vqs, vqs_info, &desc);
if (err)
goto out;
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index cfa710abf441..54469277ca30 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -587,8 +587,8 @@ static int init_vqs(struct virtio_balloon *vb)
vqs_info[VIRTIO_BALLOON_VQ_REPORTING].callback = balloon_ack;
}
- err = virtio_find_vqs_info(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
- vqs_info, NULL);
+ err = virtio_find_vqs(vb->vdev, VIRTIO_BALLOON_VQ_MAX, vqs,
+ vqs_info, NULL);
if (err)
return err;
diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c
index 6f803dc3d0f9..a5d63269f20b 100644
--- a/drivers/virtio/virtio_input.c
+++ b/drivers/virtio/virtio_input.c
@@ -192,7 +192,7 @@ static int virtinput_init_vqs(struct virtio_input *vi)
struct virtqueue *vqs[2];
int err;
- err = virtio_find_vqs_info(vi->vdev, 2, vqs, vqs_info, NULL);
+ err = virtio_find_vqs(vi->vdev, 2, vqs, vqs_info, NULL);
if (err)
return err;
vi->evt = vqs[0];
diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
index a335b421f196..dd5260141615 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -836,7 +836,7 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
vqs_info[i].name = fs->vqs[i].name;
}
- ret = virtio_find_vqs_info(vdev, fs->nvqs, vqs, vqs_info, &desc);
+ ret = virtio_find_vqs(vdev, fs->nvqs, vqs, vqs_info, &desc);
if (ret < 0)
goto out;
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 939c8dc909a5..8efba71615a4 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -218,10 +218,10 @@ static inline bool virtio_has_dma_quirk(const struct virtio_device *vdev)
}
static inline
-int virtio_find_vqs_info(struct virtio_device *vdev, unsigned int nvqs,
- struct virtqueue *vqs[],
- struct virtqueue_info vqs_info[],
- struct irq_affinity *desc)
+int virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
+ struct virtqueue *vqs[],
+ struct virtqueue_info vqs_info[],
+ struct irq_affinity *desc)
{
return vdev->config->find_vqs(vdev, nvqs, vqs, vqs_info, desc);
}
@@ -234,7 +234,7 @@ struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
{ n, c },
};
struct virtqueue *vq;
- int err = virtio_find_vqs_info(vdev, 1, &vq, vqs_info, NULL);
+ int err = virtio_find_vqs(vdev, 1, &vq, vqs_info, NULL);
if (err < 0)
return ERR_PTR(err);
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index 3033680fcc98..64a07acfef12 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -624,8 +624,7 @@ static int virtio_vsock_vqs_init(struct virtio_vsock *vsock)
};
int ret;
- ret = virtio_find_vqs_info(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info,
- NULL);
+ ret = virtio_find_vqs(vdev, VSOCK_VQ_MAX, vsock->vqs, vqs_info, NULL);
if (ret < 0)
return ret;
diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c
index 109a0008b69e..965209e1d872 100644
--- a/sound/virtio/virtio_card.c
+++ b/sound/virtio/virtio_card.c
@@ -125,7 +125,7 @@ static int virtsnd_find_vqs(struct virtio_snd *snd)
unsigned int n;
int rc;
- rc = virtio_find_vqs_info(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
+ rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, vqs_info, NULL);
if (rc) {
dev_err(&vdev->dev, "failed to initialize virtqueues\n");
return rc;
--
2.45.2
^ permalink raw reply related [flat|nested] 30+ messages in thread* Re: [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs()
2024-07-04 6:43 [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Jiri Pirko
` (18 preceding siblings ...)
2024-07-04 6:43 ` [PATCH virtio v2 19/19] virtio: rename virtio_find_vqs_info() to virtio_find_vqs() Jiri Pirko
@ 2024-07-04 11:33 ` Xuan Zhuo
2024-07-04 13:04 ` Jiri Pirko
19 siblings, 1 reply; 30+ messages in thread
From: Xuan Zhuo @ 2024-07-04 11:33 UTC (permalink / raw)
To: Jiri Pirko; +Cc: mst, jasowang, eperezma, parav, feliu, hengqi, virtualization
Do you know this: http://lore.kernel.org/all/20240424091533.86949-1-xuanzhuo@linux.alibaba.com
This seems to do the same thing. That works in process.
Thanks.
On Thu, 4 Jul 2024 08:43:31 +0200, Jiri Pirko <jiri@resnulli.us> wrote:
> From: Jiri Pirko <jiri@nvidia.com>
>
> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
> names, callbacks and ctx (in case of the second one) as separate args.
> That became inconvenient as the ctx addition showed.
>
> For virtio_net control queue, an indication of queue flavour (slow path)
> is going to be needed to be passed to PCI transport in order to
> assign vectors properly, another array added to virtio_find_vqs_ctx()
> arg list would not be nice and convenient.
>
> Instead, introduce a structure to carry vq callback, name and ctx. Pass
> array of these structures to virtio_find_vqs() and all the way down to
> transport find_vqs() op implementation.
>
> That allows to easily extend what needs to be passed down. Also, it
> makes the code a bit more cleaner. We get rid of separate
> virtio_find_vqs_ctx() helper.
>
> This patchset does the conversion in steps, using temporary _info() op
> and helper. Note they are renamed back.
>
> Patch #1 does one forgotten conversion to virtio_find_single_vq().
> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
> introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
> Patches #5 and #6 convert transports to implement find_vqs_info() op
> that accepts array of virtio_queue_info structs.
> Patch #7 converts virtio_find_single_vq() to use the new way as well.
> Patch #8 removes original find_vqs() op.
> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
> of conversion this patches does.
> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
> users to use new virtio_find_vqs_info() helper.
> Patch #18 removes no longer used virtio_find_vqs() and
> virtio_find_vqs_ctx() helpers.
> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
> to virtio_find_vqs().
>
> ---
> v1->v2:
> - added forgotten VIRTIO_SND_VQ_MAX for array size in virtio_card.c
> - s/virtio_queue_info/virtqueue_info/
> - fixed comments for struct virtqueue_info
> - rebased on top of recent code changes (virtio_fs.c)
> - see individual patches changelog for more details
>
> Jiri Pirko (19):
> caif_virtio: use virtio_find_single_vq() for single virtqueue finding
> virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
> virtio: make virtio_find_single_vq() call virtio_find_vqs()
> virtio: introduce virtio_queue_info struct and find_vqs_info() config
> op
> virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
> virtio: convert find_vqs() op implementations to find_vqs_info()
> virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
> directly
> virtio: remove the original find_vqs() op
> virtio: rename find_vqs_info() op to find_vqs()
> virtio_blk: convert to use virtio_find_vqs_info()
> virtio_console: convert to use virtio_find_vqs_info()
> virtio_crypto: convert to use virtio_find_vqs_info()
> virtio_net: convert to use virtio_find_vqs_info()
> scsi: virtio_scsi: convert to use virtio_find_vqs_info()
> virtiofs: convert to use virtio_find_vqs_info()
> virtio_balloon: convert to use virtio_find_vqs_info()
> virtio: convert the rest virtio_find_vqs() users to
> virtio_find_vqs_info()
> virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
> helpers
> virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
>
> arch/um/drivers/virt-pci.c | 8 ++-
> arch/um/drivers/virtio_uml.c | 12 ++--
> drivers/block/virtio_blk.c | 20 +++----
> drivers/bluetooth/virtio_bt.c | 13 ++--
> drivers/char/virtio_console.c | 43 ++++++-------
> drivers/crypto/virtio/virtio_crypto_core.c | 31 ++++------
> drivers/firmware/arm_scmi/virtio.c | 11 ++--
> drivers/gpio/gpio-virtio.c | 10 ++--
> drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++-
> drivers/iommu/virtio-iommu.c | 11 ++--
> drivers/net/caif/caif_virtio.c | 8 +--
> drivers/net/virtio_net.c | 34 ++++-------
> drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
> drivers/platform/mellanox/mlxbf-tmfifo.c | 10 ++--
> drivers/remoteproc/remoteproc_virtio.c | 12 ++--
> drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++-
> drivers/s390/virtio/virtio_ccw.c | 13 ++--
> drivers/scsi/virtio_scsi.c | 32 ++++------
> drivers/virtio/virtio_balloon.c | 32 ++++------
> drivers/virtio/virtio_input.c | 9 +--
> drivers/virtio/virtio_mmio.c | 12 ++--
> drivers/virtio/virtio_pci_common.c | 48 ++++++++-------
> drivers/virtio/virtio_pci_common.h | 3 +-
> drivers/virtio/virtio_pci_modern.c | 5 +-
> drivers/virtio/virtio_vdpa.c | 13 ++--
> fs/fuse/virtio_fs.c | 22 +++----
> include/linux/virtio_config.h | 60 +++++++++----------
> net/vmw_vsock/virtio_transport.c | 16 ++---
> sound/virtio/virtio_card.c | 23 ++++---
> 29 files changed, 238 insertions(+), 302 deletions(-)
>
> --
> 2.45.2
>
^ permalink raw reply [flat|nested] 30+ messages in thread* Re: [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs()
2024-07-04 11:33 ` [PATCH virtio v2 00/19] virtio: consolidate vq info args of find_vqs() Xuan Zhuo
@ 2024-07-04 13:04 ` Jiri Pirko
0 siblings, 0 replies; 30+ messages in thread
From: Jiri Pirko @ 2024-07-04 13:04 UTC (permalink / raw)
To: Xuan Zhuo; +Cc: mst, jasowang, eperezma, parav, feliu, hengqi, virtualization
Thu, Jul 04, 2024 at 01:33:29PM CEST, xuanzhuo@linux.alibaba.com wrote:
>Do you know this: http://lore.kernel.org/all/20240424091533.86949-1-xuanzhuo@linux.alibaba.com
>
>This seems to do the same thing. That works in process.
No clue about this. But your patchset is working thing on a slightly
different level. Still applicable on top of mine, I don't see any
problem.
>
>Thanks.
>
>On Thu, 4 Jul 2024 08:43:31 +0200, Jiri Pirko <jiri@resnulli.us> wrote:
>> From: Jiri Pirko <jiri@nvidia.com>
>>
>> Currently, virtio_find_vqs() and virtio_find_vqs_ctx() accept array of
>> names, callbacks and ctx (in case of the second one) as separate args.
>> That became inconvenient as the ctx addition showed.
>>
>> For virtio_net control queue, an indication of queue flavour (slow path)
>> is going to be needed to be passed to PCI transport in order to
>> assign vectors properly, another array added to virtio_find_vqs_ctx()
>> arg list would not be nice and convenient.
>>
>> Instead, introduce a structure to carry vq callback, name and ctx. Pass
>> array of these structures to virtio_find_vqs() and all the way down to
>> transport find_vqs() op implementation.
>>
>> That allows to easily extend what needs to be passed down. Also, it
>> makes the code a bit more cleaner. We get rid of separate
>> virtio_find_vqs_ctx() helper.
>>
>> This patchset does the conversion in steps, using temporary _info() op
>> and helper. Note they are renamed back.
>>
>> Patch #1 does one forgotten conversion to virtio_find_single_vq().
>> Patches #2 and #3 do preparations for find_vqs_info() op introduction.
>> Patch #4 introduces new op find_vqs_info() to replace find_vqs() it also
>> introduces struct virtio_queue_info and virtio_find_vqs_info() helper.
>> Patches #5 and #6 convert transports to implement find_vqs_info() op
>> that accepts array of virtio_queue_info structs.
>> Patch #7 converts virtio_find_single_vq() to use the new way as well.
>> Patch #8 removes original find_vqs() op.
>> Patch #9 renames find_vqs_info() to find_vqs() and completes first part
>> of conversion this patches does.
>> Patches #10-#17 convert virtio_find_vqs() and virtio_find_vqs_ctx()
>> users to use new virtio_find_vqs_info() helper.
>> Patch #18 removes no longer used virtio_find_vqs() and
>> virtio_find_vqs_ctx() helpers.
>> Patch #19 finalizes the conversion by renaming virtio_find_vqs_info()
>> to virtio_find_vqs().
>>
>> ---
>> v1->v2:
>> - added forgotten VIRTIO_SND_VQ_MAX for array size in virtio_card.c
>> - s/virtio_queue_info/virtqueue_info/
>> - fixed comments for struct virtqueue_info
>> - rebased on top of recent code changes (virtio_fs.c)
>> - see individual patches changelog for more details
>>
>> Jiri Pirko (19):
>> caif_virtio: use virtio_find_single_vq() for single virtqueue finding
>> virtio: make virtio_find_vqs() call virtio_find_vqs_ctx()
>> virtio: make virtio_find_single_vq() call virtio_find_vqs()
>> virtio: introduce virtio_queue_info struct and find_vqs_info() config
>> op
>> virtio_pci: convert vp_*find_vqs() ops to find_vqs_info()
>> virtio: convert find_vqs() op implementations to find_vqs_info()
>> virtio: call virtio_find_vqs_info() from virtio_find_single_vq()
>> directly
>> virtio: remove the original find_vqs() op
>> virtio: rename find_vqs_info() op to find_vqs()
>> virtio_blk: convert to use virtio_find_vqs_info()
>> virtio_console: convert to use virtio_find_vqs_info()
>> virtio_crypto: convert to use virtio_find_vqs_info()
>> virtio_net: convert to use virtio_find_vqs_info()
>> scsi: virtio_scsi: convert to use virtio_find_vqs_info()
>> virtiofs: convert to use virtio_find_vqs_info()
>> virtio_balloon: convert to use virtio_find_vqs_info()
>> virtio: convert the rest virtio_find_vqs() users to
>> virtio_find_vqs_info()
>> virtio: remove unused virtio_find_vqs() and virtio_find_vqs_ctx()
>> helpers
>> virtio: rename virtio_find_vqs_info() to virtio_find_vqs()
>>
>> arch/um/drivers/virt-pci.c | 8 ++-
>> arch/um/drivers/virtio_uml.c | 12 ++--
>> drivers/block/virtio_blk.c | 20 +++----
>> drivers/bluetooth/virtio_bt.c | 13 ++--
>> drivers/char/virtio_console.c | 43 ++++++-------
>> drivers/crypto/virtio/virtio_crypto_core.c | 31 ++++------
>> drivers/firmware/arm_scmi/virtio.c | 11 ++--
>> drivers/gpio/gpio-virtio.c | 10 ++--
>> drivers/gpu/drm/virtio/virtgpu_kms.c | 9 ++-
>> drivers/iommu/virtio-iommu.c | 11 ++--
>> drivers/net/caif/caif_virtio.c | 8 +--
>> drivers/net/virtio_net.c | 34 ++++-------
>> drivers/net/wireless/virtual/mac80211_hwsim.c | 12 ++--
>> drivers/platform/mellanox/mlxbf-tmfifo.c | 10 ++--
>> drivers/remoteproc/remoteproc_virtio.c | 12 ++--
>> drivers/rpmsg/virtio_rpmsg_bus.c | 8 ++-
>> drivers/s390/virtio/virtio_ccw.c | 13 ++--
>> drivers/scsi/virtio_scsi.c | 32 ++++------
>> drivers/virtio/virtio_balloon.c | 32 ++++------
>> drivers/virtio/virtio_input.c | 9 +--
>> drivers/virtio/virtio_mmio.c | 12 ++--
>> drivers/virtio/virtio_pci_common.c | 48 ++++++++-------
>> drivers/virtio/virtio_pci_common.h | 3 +-
>> drivers/virtio/virtio_pci_modern.c | 5 +-
>> drivers/virtio/virtio_vdpa.c | 13 ++--
>> fs/fuse/virtio_fs.c | 22 +++----
>> include/linux/virtio_config.h | 60 +++++++++----------
>> net/vmw_vsock/virtio_transport.c | 16 ++---
>> sound/virtio/virtio_card.c | 23 ++++---
>> 29 files changed, 238 insertions(+), 302 deletions(-)
>>
>> --
>> 2.45.2
>>
^ permalink raw reply [flat|nested] 30+ messages in thread