* [PATCH v2 0/3] virtio_ring: Clean up code for virtio ring and pci
@ 2023-03-15 18:54 Feng Liu via Virtualization
2023-03-15 18:54 ` [PATCH v2 1/3] virtio_ring: Allow non power of 2 sizes for packed virtqueue Feng Liu via Virtualization
` (3 more replies)
0 siblings, 4 replies; 17+ messages in thread
From: Feng Liu via Virtualization @ 2023-03-15 18:54 UTC (permalink / raw)
To: virtualization; +Cc: Michael S . Tsirkin, Jiri Pirko, Bodong Wang, Gavin Li
This patch series performs a clean up of the code in virtio_ring and
virtio_pci, modifying it to conform with the Linux kernel coding style
guidance [1]. The modifications ensure the code easy to read and
understand. This small series does few short cleanups in the code.
Patch-1 Allow non power of 2 sizes for packed virtqueues.
Patch-2 Avoid using inline for small functions.
Patch-3 Use const to annotate read-only pointer params.
[1]
https://www.kernel.org/doc/html/v6.2-rc3/process/coding-style.html#the-inline-disease
All of the patches have been verified based on the kernel code
commit 81ff855485a3 ("Merge tag 'i2c-for-6.3-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux")
Feng Liu (3):
virtio_ring: Allow non power of 2 sizes for packed virtqueue
virtio_ring: Avoid using inline for small functions
virtio_ring: Use const to annotate read-only pointer params
drivers/virtio/virtio_pci_modern.c | 5 ----
drivers/virtio/virtio_ring.c | 48 +++++++++++++++---------------
include/linux/virtio.h | 14 ++++-----
3 files changed, 31 insertions(+), 36 deletions(-)
--
2.34.1
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 1/3] virtio_ring: Allow non power of 2 sizes for packed virtqueue
2023-03-15 18:54 [PATCH v2 0/3] virtio_ring: Clean up code for virtio ring and pci Feng Liu via Virtualization
@ 2023-03-15 18:54 ` Feng Liu via Virtualization
2023-03-17 3:16 ` Jason Wang
2023-03-17 9:16 ` David Edmondson
2023-03-15 18:54 ` [PATCH v2 2/3] virtio_ring: Avoid using inline for small functions Feng Liu via Virtualization
` (2 subsequent siblings)
3 siblings, 2 replies; 17+ messages in thread
From: Feng Liu via Virtualization @ 2023-03-15 18:54 UTC (permalink / raw)
To: virtualization; +Cc: Michael S . Tsirkin, Jiri Pirko, Bodong Wang, Gavin Li
According to the Virtio Specification, the Queue Size parameter of a
virtqueue corresponds to the maximum number of descriptors in that
queue, and it does not have to be a power of 2 for packed virtqueues.
However, the virtio_pci_modern driver enforced a power of 2 check for
virtqueue sizes, which is unnecessary and restrictive for packed
virtuqueue.
Split virtqueue still needs to check the virtqueue size is power_of_2
which has been done in vring_alloc_queue_split of the virtio_ring layer.
To validate this change, we tested various virtqueue sizes for packed
rings, including 128, 256, 512, 100, 200, 500, and 1000, with
CONFIG_PAGE_POISONING enabled, and all tests passed successfully.
Signed-off-by: Feng Liu <feliu@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
v0 -> v1
feedbacks from Jason Wang and Michael S. Tsirkin
- remove power_of_2 check of virtqueue size
v1 -> v2
feedbacks from Parav Pandit and Jiri Pirko
- keep power_of_2 check of split virtqueue in vring_alloc_queue_split of
virtio_ring layer.
---
drivers/virtio/virtio_pci_modern.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index 9e496e288cfa..6e713904d8e8 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -310,11 +310,6 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
if (!num || vp_modern_get_queue_enable(mdev, index))
return ERR_PTR(-ENOENT);
- if (!is_power_of_2(num)) {
- dev_warn(&vp_dev->pci_dev->dev, "bad queue size %u", num);
- return ERR_PTR(-EINVAL);
- }
-
info->msix_vector = msix_vec;
/* create the vring */
--
2.34.1
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 2/3] virtio_ring: Avoid using inline for small functions
2023-03-15 18:54 [PATCH v2 0/3] virtio_ring: Clean up code for virtio ring and pci Feng Liu via Virtualization
2023-03-15 18:54 ` [PATCH v2 1/3] virtio_ring: Allow non power of 2 sizes for packed virtqueue Feng Liu via Virtualization
@ 2023-03-15 18:54 ` Feng Liu via Virtualization
2023-03-17 3:16 ` Jason Wang
2023-03-17 9:16 ` David Edmondson
2023-03-15 18:54 ` [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params Feng Liu via Virtualization
2023-03-31 4:20 ` [PATCH v2 0/3] virtio_ring: Clean up code for virtio ring and pci Xuan Zhuo
3 siblings, 2 replies; 17+ messages in thread
From: Feng Liu via Virtualization @ 2023-03-15 18:54 UTC (permalink / raw)
To: virtualization; +Cc: Michael S . Tsirkin, Jiri Pirko, Bodong Wang, Gavin Li
Remove the inline keyword, according to kernel coding style [1], defining
inline functions is not necessary for samll functions.
It is verified with GCC 12.2.0, the generated code with/without inline
is the same. Additionally tested with kernel pktgen and iperf, and
verified the result, pps of the results are the same in the cases of
with/without inline.
[1]
https://www.kernel.org/doc/html/v6.2-rc3/process/coding-style.html#the-inline-disease
Signed-off-by: Feng Liu <feliu@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
drivers/virtio/virtio_ring.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 41144b5246a8..a26fab91c59f 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -233,8 +233,8 @@ static void vring_free(struct virtqueue *_vq);
#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
-static inline bool virtqueue_use_indirect(struct vring_virtqueue *vq,
- unsigned int total_sg)
+static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
+ unsigned int total_sg)
{
/*
* If the host supports indirect descriptor tables, and we have multiple
@@ -349,7 +349,7 @@ static void vring_free_queue(struct virtio_device *vdev, size_t size,
* making all of the arch DMA ops work on the vring device itself
* is a mess.
*/
-static inline struct device *vring_dma_dev(const struct vring_virtqueue *vq)
+static struct device *vring_dma_dev(const struct vring_virtqueue *vq)
{
return vq->dma_dev;
}
@@ -784,7 +784,7 @@ static void detach_buf_split(struct vring_virtqueue *vq, unsigned int head,
}
}
-static inline bool more_used_split(const struct vring_virtqueue *vq)
+static bool more_used_split(const struct vring_virtqueue *vq)
{
return vq->last_used_idx != virtio16_to_cpu(vq->vq.vdev,
vq->split.vring.used->idx);
@@ -1172,12 +1172,12 @@ static int virtqueue_resize_split(struct virtqueue *_vq, u32 num)
/*
* Packed ring specific functions - *_packed().
*/
-static inline bool packed_used_wrap_counter(u16 last_used_idx)
+static bool packed_used_wrap_counter(u16 last_used_idx)
{
return !!(last_used_idx & (1 << VRING_PACKED_EVENT_F_WRAP_CTR));
}
-static inline u16 packed_last_used(u16 last_used_idx)
+static u16 packed_last_used(u16 last_used_idx)
{
return last_used_idx & ~(-(1 << VRING_PACKED_EVENT_F_WRAP_CTR));
}
@@ -1612,7 +1612,7 @@ static inline bool is_used_desc_packed(const struct vring_virtqueue *vq,
return avail == used && used == used_wrap_counter;
}
-static inline bool more_used_packed(const struct vring_virtqueue *vq)
+static bool more_used_packed(const struct vring_virtqueue *vq)
{
u16 last_used;
u16 last_used_idx;
--
2.34.1
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params
2023-03-15 18:54 [PATCH v2 0/3] virtio_ring: Clean up code for virtio ring and pci Feng Liu via Virtualization
2023-03-15 18:54 ` [PATCH v2 1/3] virtio_ring: Allow non power of 2 sizes for packed virtqueue Feng Liu via Virtualization
2023-03-15 18:54 ` [PATCH v2 2/3] virtio_ring: Avoid using inline for small functions Feng Liu via Virtualization
@ 2023-03-15 18:54 ` Feng Liu via Virtualization
2023-03-17 3:17 ` Jason Wang
2023-03-17 9:20 ` David Edmondson
2023-03-31 4:20 ` [PATCH v2 0/3] virtio_ring: Clean up code for virtio ring and pci Xuan Zhuo
3 siblings, 2 replies; 17+ messages in thread
From: Feng Liu via Virtualization @ 2023-03-15 18:54 UTC (permalink / raw)
To: virtualization; +Cc: Michael S . Tsirkin, Jiri Pirko, Bodong Wang, Gavin Li
Add const to make the read-only pointer parameters clear, similar to
many existing functions.
Use `container_of_const` to implement `to_vvq`, which ensures the
const-ness of read-only parameters and avoids accidental modification
of their members.
Signed-off-by: Feng Liu <feliu@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
v0 -> v1
feedbacks from Michael S. Tsirkin
- use `container_of_const` to implement `to_vvq`
---
drivers/virtio/virtio_ring.c | 36 ++++++++++++++++++------------------
include/linux/virtio.h | 14 +++++++-------
2 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index a26fab91c59f..4c3bb0ddeb9b 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -231,9 +231,9 @@ static void vring_free(struct virtqueue *_vq);
* Helpers.
*/
-#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
+#define to_vvq(_vq) container_of_const(_vq, struct vring_virtqueue, vq)
-static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
+static bool virtqueue_use_indirect(const struct vring_virtqueue *vq,
unsigned int total_sg)
{
/*
@@ -269,7 +269,7 @@ static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
* unconditionally on data path.
*/
-static bool vring_use_dma_api(struct virtio_device *vdev)
+static bool vring_use_dma_api(const struct virtio_device *vdev)
{
if (!virtio_has_dma_quirk(vdev))
return true;
@@ -289,7 +289,7 @@ static bool vring_use_dma_api(struct virtio_device *vdev)
return false;
}
-size_t virtio_max_dma_size(struct virtio_device *vdev)
+size_t virtio_max_dma_size(const struct virtio_device *vdev)
{
size_t max_segment_size = SIZE_MAX;
@@ -423,7 +423,7 @@ static void virtqueue_init(struct vring_virtqueue *vq, u32 num)
*/
static void vring_unmap_one_split_indirect(const struct vring_virtqueue *vq,
- struct vring_desc *desc)
+ const struct vring_desc *desc)
{
u16 flags;
@@ -1183,7 +1183,7 @@ static u16 packed_last_used(u16 last_used_idx)
}
static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
- struct vring_desc_extra *extra)
+ const struct vring_desc_extra *extra)
{
u16 flags;
@@ -1206,7 +1206,7 @@ static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
}
static void vring_unmap_desc_packed(const struct vring_virtqueue *vq,
- struct vring_packed_desc *desc)
+ const struct vring_packed_desc *desc)
{
u16 flags;
@@ -2786,10 +2786,10 @@ EXPORT_SYMBOL_GPL(vring_transport_features);
* Returns the size of the vring. This is mainly used for boasting to
* userspace. Unlike other operations, this need not be serialized.
*/
-unsigned int virtqueue_get_vring_size(struct virtqueue *_vq)
+unsigned int virtqueue_get_vring_size(const struct virtqueue *_vq)
{
- struct vring_virtqueue *vq = to_vvq(_vq);
+ const struct vring_virtqueue *vq = to_vvq(_vq);
return vq->packed_ring ? vq->packed.vring.num : vq->split.vring.num;
}
@@ -2819,9 +2819,9 @@ void __virtqueue_unbreak(struct virtqueue *_vq)
}
EXPORT_SYMBOL_GPL(__virtqueue_unbreak);
-bool virtqueue_is_broken(struct virtqueue *_vq)
+bool virtqueue_is_broken(const struct virtqueue *_vq)
{
- struct vring_virtqueue *vq = to_vvq(_vq);
+ const struct vring_virtqueue *vq = to_vvq(_vq);
return READ_ONCE(vq->broken);
}
@@ -2868,9 +2868,9 @@ void __virtio_unbreak_device(struct virtio_device *dev)
}
EXPORT_SYMBOL_GPL(__virtio_unbreak_device);
-dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
+dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *_vq)
{
- struct vring_virtqueue *vq = to_vvq(_vq);
+ const struct vring_virtqueue *vq = to_vvq(_vq);
BUG_ON(!vq->we_own_ring);
@@ -2881,9 +2881,9 @@ dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
}
EXPORT_SYMBOL_GPL(virtqueue_get_desc_addr);
-dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
+dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *_vq)
{
- struct vring_virtqueue *vq = to_vvq(_vq);
+ const struct vring_virtqueue *vq = to_vvq(_vq);
BUG_ON(!vq->we_own_ring);
@@ -2895,9 +2895,9 @@ dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
}
EXPORT_SYMBOL_GPL(virtqueue_get_avail_addr);
-dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
+dma_addr_t virtqueue_get_used_addr(const struct virtqueue *_vq)
{
- struct vring_virtqueue *vq = to_vvq(_vq);
+ const struct vring_virtqueue *vq = to_vvq(_vq);
BUG_ON(!vq->we_own_ring);
@@ -2910,7 +2910,7 @@ dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
EXPORT_SYMBOL_GPL(virtqueue_get_used_addr);
/* Only available for split ring */
-const struct vring *virtqueue_get_vring(struct virtqueue *vq)
+const struct vring *virtqueue_get_vring(const struct virtqueue *vq)
{
return &to_vvq(vq)->split.vring;
}
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index 2b472514c49b..c4225653f949 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h
@@ -84,14 +84,14 @@ bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
void *virtqueue_detach_unused_buf(struct virtqueue *vq);
-unsigned int virtqueue_get_vring_size(struct virtqueue *vq);
+unsigned int virtqueue_get_vring_size(const struct virtqueue *vq);
-bool virtqueue_is_broken(struct virtqueue *vq);
+bool virtqueue_is_broken(const struct virtqueue *vq);
-const struct vring *virtqueue_get_vring(struct virtqueue *vq);
-dma_addr_t virtqueue_get_desc_addr(struct virtqueue *vq);
-dma_addr_t virtqueue_get_avail_addr(struct virtqueue *vq);
-dma_addr_t virtqueue_get_used_addr(struct virtqueue *vq);
+const struct vring *virtqueue_get_vring(const struct virtqueue *vq);
+dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *vq);
+dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *vq);
+dma_addr_t virtqueue_get_used_addr(const struct virtqueue *vq);
int virtqueue_resize(struct virtqueue *vq, u32 num,
void (*recycle)(struct virtqueue *vq, void *buf));
@@ -147,7 +147,7 @@ int virtio_device_restore(struct virtio_device *dev);
#endif
void virtio_reset_device(struct virtio_device *dev);
-size_t virtio_max_dma_size(struct virtio_device *vdev);
+size_t virtio_max_dma_size(const struct virtio_device *vdev);
#define virtio_device_for_each_vq(vdev, vq) \
list_for_each_entry(vq, &vdev->vqs, list)
--
2.34.1
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/3] virtio_ring: Allow non power of 2 sizes for packed virtqueue
2023-03-15 18:54 ` [PATCH v2 1/3] virtio_ring: Allow non power of 2 sizes for packed virtqueue Feng Liu via Virtualization
@ 2023-03-17 3:16 ` Jason Wang
2023-03-30 18:21 ` Feng Liu via Virtualization
2023-03-17 9:16 ` David Edmondson
1 sibling, 1 reply; 17+ messages in thread
From: Jason Wang @ 2023-03-17 3:16 UTC (permalink / raw)
To: Feng Liu
Cc: Michael S . Tsirkin, virtualization, Jiri Pirko, Bodong Wang, Gavin Li
On Thu, Mar 16, 2023 at 2:55 AM Feng Liu <feliu@nvidia.com> wrote:
>
> According to the Virtio Specification, the Queue Size parameter of a
> virtqueue corresponds to the maximum number of descriptors in that
> queue, and it does not have to be a power of 2 for packed virtqueues.
> However, the virtio_pci_modern driver enforced a power of 2 check for
> virtqueue sizes, which is unnecessary and restrictive for packed
> virtuqueue.
>
> Split virtqueue still needs to check the virtqueue size is power_of_2
> which has been done in vring_alloc_queue_split of the virtio_ring layer.
>
> To validate this change, we tested various virtqueue sizes for packed
> rings, including 128, 256, 512, 100, 200, 500, and 1000, with
> CONFIG_PAGE_POISONING enabled, and all tests passed successfully.
>
> Signed-off-by: Feng Liu <feliu@nvidia.com>
> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Thanks
>
> ---
> v0 -> v1
> feedbacks from Jason Wang and Michael S. Tsirkin
> - remove power_of_2 check of virtqueue size
>
> v1 -> v2
> feedbacks from Parav Pandit and Jiri Pirko
> - keep power_of_2 check of split virtqueue in vring_alloc_queue_split of
> virtio_ring layer.
> ---
> drivers/virtio/virtio_pci_modern.c | 5 -----
> 1 file changed, 5 deletions(-)
>
> diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
> index 9e496e288cfa..6e713904d8e8 100644
> --- a/drivers/virtio/virtio_pci_modern.c
> +++ b/drivers/virtio/virtio_pci_modern.c
> @@ -310,11 +310,6 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
> if (!num || vp_modern_get_queue_enable(mdev, index))
> return ERR_PTR(-ENOENT);
>
> - if (!is_power_of_2(num)) {
> - dev_warn(&vp_dev->pci_dev->dev, "bad queue size %u", num);
> - return ERR_PTR(-EINVAL);
> - }
> -
> info->msix_vector = msix_vec;
>
> /* create the vring */
> --
> 2.34.1
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/3] virtio_ring: Avoid using inline for small functions
2023-03-15 18:54 ` [PATCH v2 2/3] virtio_ring: Avoid using inline for small functions Feng Liu via Virtualization
@ 2023-03-17 3:16 ` Jason Wang
2023-03-30 18:22 ` Feng Liu via Virtualization
2023-03-17 9:16 ` David Edmondson
1 sibling, 1 reply; 17+ messages in thread
From: Jason Wang @ 2023-03-17 3:16 UTC (permalink / raw)
To: Feng Liu
Cc: Michael S . Tsirkin, virtualization, Jiri Pirko, Bodong Wang, Gavin Li
On Thu, Mar 16, 2023 at 2:55 AM Feng Liu <feliu@nvidia.com> wrote:
>
> Remove the inline keyword, according to kernel coding style [1], defining
> inline functions is not necessary for samll functions.
>
> It is verified with GCC 12.2.0, the generated code with/without inline
> is the same. Additionally tested with kernel pktgen and iperf, and
> verified the result, pps of the results are the same in the cases of
> with/without inline.
>
> [1]
> https://www.kernel.org/doc/html/v6.2-rc3/process/coding-style.html#the-inline-disease
>
> Signed-off-by: Feng Liu <feliu@nvidia.com>
> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Thanks
> ---
> drivers/virtio/virtio_ring.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index 41144b5246a8..a26fab91c59f 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -233,8 +233,8 @@ static void vring_free(struct virtqueue *_vq);
>
> #define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
>
> -static inline bool virtqueue_use_indirect(struct vring_virtqueue *vq,
> - unsigned int total_sg)
> +static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
> + unsigned int total_sg)
> {
> /*
> * If the host supports indirect descriptor tables, and we have multiple
> @@ -349,7 +349,7 @@ static void vring_free_queue(struct virtio_device *vdev, size_t size,
> * making all of the arch DMA ops work on the vring device itself
> * is a mess.
> */
> -static inline struct device *vring_dma_dev(const struct vring_virtqueue *vq)
> +static struct device *vring_dma_dev(const struct vring_virtqueue *vq)
> {
> return vq->dma_dev;
> }
> @@ -784,7 +784,7 @@ static void detach_buf_split(struct vring_virtqueue *vq, unsigned int head,
> }
> }
>
> -static inline bool more_used_split(const struct vring_virtqueue *vq)
> +static bool more_used_split(const struct vring_virtqueue *vq)
> {
> return vq->last_used_idx != virtio16_to_cpu(vq->vq.vdev,
> vq->split.vring.used->idx);
> @@ -1172,12 +1172,12 @@ static int virtqueue_resize_split(struct virtqueue *_vq, u32 num)
> /*
> * Packed ring specific functions - *_packed().
> */
> -static inline bool packed_used_wrap_counter(u16 last_used_idx)
> +static bool packed_used_wrap_counter(u16 last_used_idx)
> {
> return !!(last_used_idx & (1 << VRING_PACKED_EVENT_F_WRAP_CTR));
> }
>
> -static inline u16 packed_last_used(u16 last_used_idx)
> +static u16 packed_last_used(u16 last_used_idx)
> {
> return last_used_idx & ~(-(1 << VRING_PACKED_EVENT_F_WRAP_CTR));
> }
> @@ -1612,7 +1612,7 @@ static inline bool is_used_desc_packed(const struct vring_virtqueue *vq,
> return avail == used && used == used_wrap_counter;
> }
>
> -static inline bool more_used_packed(const struct vring_virtqueue *vq)
> +static bool more_used_packed(const struct vring_virtqueue *vq)
> {
> u16 last_used;
> u16 last_used_idx;
> --
> 2.34.1
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params
2023-03-15 18:54 ` [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params Feng Liu via Virtualization
@ 2023-03-17 3:17 ` Jason Wang
2023-03-30 18:22 ` Feng Liu via Virtualization
2023-03-17 9:20 ` David Edmondson
1 sibling, 1 reply; 17+ messages in thread
From: Jason Wang @ 2023-03-17 3:17 UTC (permalink / raw)
To: Feng Liu
Cc: Michael S . Tsirkin, virtualization, Jiri Pirko, Bodong Wang, Gavin Li
On Thu, Mar 16, 2023 at 2:55 AM Feng Liu <feliu@nvidia.com> wrote:
>
> Add const to make the read-only pointer parameters clear, similar to
> many existing functions.
>
> Use `container_of_const` to implement `to_vvq`, which ensures the
> const-ness of read-only parameters and avoids accidental modification
> of their members.
>
> Signed-off-by: Feng Liu <feliu@nvidia.com>
> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Thanks
>
> ---
> v0 -> v1
> feedbacks from Michael S. Tsirkin
> - use `container_of_const` to implement `to_vvq`
> ---
> drivers/virtio/virtio_ring.c | 36 ++++++++++++++++++------------------
> include/linux/virtio.h | 14 +++++++-------
> 2 files changed, 25 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index a26fab91c59f..4c3bb0ddeb9b 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -231,9 +231,9 @@ static void vring_free(struct virtqueue *_vq);
> * Helpers.
> */
>
> -#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
> +#define to_vvq(_vq) container_of_const(_vq, struct vring_virtqueue, vq)
>
> -static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
> +static bool virtqueue_use_indirect(const struct vring_virtqueue *vq,
> unsigned int total_sg)
> {
> /*
> @@ -269,7 +269,7 @@ static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
> * unconditionally on data path.
> */
>
> -static bool vring_use_dma_api(struct virtio_device *vdev)
> +static bool vring_use_dma_api(const struct virtio_device *vdev)
> {
> if (!virtio_has_dma_quirk(vdev))
> return true;
> @@ -289,7 +289,7 @@ static bool vring_use_dma_api(struct virtio_device *vdev)
> return false;
> }
>
> -size_t virtio_max_dma_size(struct virtio_device *vdev)
> +size_t virtio_max_dma_size(const struct virtio_device *vdev)
> {
> size_t max_segment_size = SIZE_MAX;
>
> @@ -423,7 +423,7 @@ static void virtqueue_init(struct vring_virtqueue *vq, u32 num)
> */
>
> static void vring_unmap_one_split_indirect(const struct vring_virtqueue *vq,
> - struct vring_desc *desc)
> + const struct vring_desc *desc)
> {
> u16 flags;
>
> @@ -1183,7 +1183,7 @@ static u16 packed_last_used(u16 last_used_idx)
> }
>
> static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
> - struct vring_desc_extra *extra)
> + const struct vring_desc_extra *extra)
> {
> u16 flags;
>
> @@ -1206,7 +1206,7 @@ static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
> }
>
> static void vring_unmap_desc_packed(const struct vring_virtqueue *vq,
> - struct vring_packed_desc *desc)
> + const struct vring_packed_desc *desc)
> {
> u16 flags;
>
> @@ -2786,10 +2786,10 @@ EXPORT_SYMBOL_GPL(vring_transport_features);
> * Returns the size of the vring. This is mainly used for boasting to
> * userspace. Unlike other operations, this need not be serialized.
> */
> -unsigned int virtqueue_get_vring_size(struct virtqueue *_vq)
> +unsigned int virtqueue_get_vring_size(const struct virtqueue *_vq)
> {
>
> - struct vring_virtqueue *vq = to_vvq(_vq);
> + const struct vring_virtqueue *vq = to_vvq(_vq);
>
> return vq->packed_ring ? vq->packed.vring.num : vq->split.vring.num;
> }
> @@ -2819,9 +2819,9 @@ void __virtqueue_unbreak(struct virtqueue *_vq)
> }
> EXPORT_SYMBOL_GPL(__virtqueue_unbreak);
>
> -bool virtqueue_is_broken(struct virtqueue *_vq)
> +bool virtqueue_is_broken(const struct virtqueue *_vq)
> {
> - struct vring_virtqueue *vq = to_vvq(_vq);
> + const struct vring_virtqueue *vq = to_vvq(_vq);
>
> return READ_ONCE(vq->broken);
> }
> @@ -2868,9 +2868,9 @@ void __virtio_unbreak_device(struct virtio_device *dev)
> }
> EXPORT_SYMBOL_GPL(__virtio_unbreak_device);
>
> -dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
> +dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *_vq)
> {
> - struct vring_virtqueue *vq = to_vvq(_vq);
> + const struct vring_virtqueue *vq = to_vvq(_vq);
>
> BUG_ON(!vq->we_own_ring);
>
> @@ -2881,9 +2881,9 @@ dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
> }
> EXPORT_SYMBOL_GPL(virtqueue_get_desc_addr);
>
> -dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
> +dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *_vq)
> {
> - struct vring_virtqueue *vq = to_vvq(_vq);
> + const struct vring_virtqueue *vq = to_vvq(_vq);
>
> BUG_ON(!vq->we_own_ring);
>
> @@ -2895,9 +2895,9 @@ dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
> }
> EXPORT_SYMBOL_GPL(virtqueue_get_avail_addr);
>
> -dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
> +dma_addr_t virtqueue_get_used_addr(const struct virtqueue *_vq)
> {
> - struct vring_virtqueue *vq = to_vvq(_vq);
> + const struct vring_virtqueue *vq = to_vvq(_vq);
>
> BUG_ON(!vq->we_own_ring);
>
> @@ -2910,7 +2910,7 @@ dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
> EXPORT_SYMBOL_GPL(virtqueue_get_used_addr);
>
> /* Only available for split ring */
> -const struct vring *virtqueue_get_vring(struct virtqueue *vq)
> +const struct vring *virtqueue_get_vring(const struct virtqueue *vq)
> {
> return &to_vvq(vq)->split.vring;
> }
> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> index 2b472514c49b..c4225653f949 100644
> --- a/include/linux/virtio.h
> +++ b/include/linux/virtio.h
> @@ -84,14 +84,14 @@ bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
>
> void *virtqueue_detach_unused_buf(struct virtqueue *vq);
>
> -unsigned int virtqueue_get_vring_size(struct virtqueue *vq);
> +unsigned int virtqueue_get_vring_size(const struct virtqueue *vq);
>
> -bool virtqueue_is_broken(struct virtqueue *vq);
> +bool virtqueue_is_broken(const struct virtqueue *vq);
>
> -const struct vring *virtqueue_get_vring(struct virtqueue *vq);
> -dma_addr_t virtqueue_get_desc_addr(struct virtqueue *vq);
> -dma_addr_t virtqueue_get_avail_addr(struct virtqueue *vq);
> -dma_addr_t virtqueue_get_used_addr(struct virtqueue *vq);
> +const struct vring *virtqueue_get_vring(const struct virtqueue *vq);
> +dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *vq);
> +dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *vq);
> +dma_addr_t virtqueue_get_used_addr(const struct virtqueue *vq);
>
> int virtqueue_resize(struct virtqueue *vq, u32 num,
> void (*recycle)(struct virtqueue *vq, void *buf));
> @@ -147,7 +147,7 @@ int virtio_device_restore(struct virtio_device *dev);
> #endif
> void virtio_reset_device(struct virtio_device *dev);
>
> -size_t virtio_max_dma_size(struct virtio_device *vdev);
> +size_t virtio_max_dma_size(const struct virtio_device *vdev);
>
> #define virtio_device_for_each_vq(vdev, vq) \
> list_for_each_entry(vq, &vdev->vqs, list)
> --
> 2.34.1
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/3] virtio_ring: Allow non power of 2 sizes for packed virtqueue
2023-03-15 18:54 ` [PATCH v2 1/3] virtio_ring: Allow non power of 2 sizes for packed virtqueue Feng Liu via Virtualization
2023-03-17 3:16 ` Jason Wang
@ 2023-03-17 9:16 ` David Edmondson
1 sibling, 0 replies; 17+ messages in thread
From: David Edmondson @ 2023-03-17 9:16 UTC (permalink / raw)
To: Feng Liu, virtualization
Cc: Michael S . Tsirkin, Jiri Pirko, Bodong Wang, Gavin Li
Feng Liu <feliu@nvidia.com> writes:
> According to the Virtio Specification, the Queue Size parameter of a
> virtqueue corresponds to the maximum number of descriptors in that
> queue, and it does not have to be a power of 2 for packed virtqueues.
> However, the virtio_pci_modern driver enforced a power of 2 check for
> virtqueue sizes, which is unnecessary and restrictive for packed
> virtuqueue.
>
> Split virtqueue still needs to check the virtqueue size is power_of_2
> which has been done in vring_alloc_queue_split of the virtio_ring layer.
>
> To validate this change, we tested various virtqueue sizes for packed
> rings, including 128, 256, 512, 100, 200, 500, and 1000, with
> CONFIG_PAGE_POISONING enabled, and all tests passed successfully.
>
> Signed-off-by: Feng Liu <feliu@nvidia.com>
> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
>
Reviewed-by: David Edmondson <david.edmondson@oracle.com>
> ---
> v0 -> v1
> feedbacks from Jason Wang and Michael S. Tsirkin
> - remove power_of_2 check of virtqueue size
>
> v1 -> v2
> feedbacks from Parav Pandit and Jiri Pirko
> - keep power_of_2 check of split virtqueue in vring_alloc_queue_split of
> virtio_ring layer.
> ---
> drivers/virtio/virtio_pci_modern.c | 5 -----
> 1 file changed, 5 deletions(-)
>
> diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
> index 9e496e288cfa..6e713904d8e8 100644
> --- a/drivers/virtio/virtio_pci_modern.c
> +++ b/drivers/virtio/virtio_pci_modern.c
> @@ -310,11 +310,6 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
> if (!num || vp_modern_get_queue_enable(mdev, index))
> return ERR_PTR(-ENOENT);
>
> - if (!is_power_of_2(num)) {
> - dev_warn(&vp_dev->pci_dev->dev, "bad queue size %u", num);
> - return ERR_PTR(-EINVAL);
> - }
> -
> info->msix_vector = msix_vec;
>
> /* create the vring */
> --
> 2.34.1
--
Do not leave the building.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/3] virtio_ring: Avoid using inline for small functions
2023-03-15 18:54 ` [PATCH v2 2/3] virtio_ring: Avoid using inline for small functions Feng Liu via Virtualization
2023-03-17 3:16 ` Jason Wang
@ 2023-03-17 9:16 ` David Edmondson
1 sibling, 0 replies; 17+ messages in thread
From: David Edmondson @ 2023-03-17 9:16 UTC (permalink / raw)
To: Feng Liu, virtualization
Cc: Michael S . Tsirkin, Jiri Pirko, Bodong Wang, Gavin Li
Feng Liu <feliu@nvidia.com> writes:
> Remove the inline keyword, according to kernel coding style [1], defining
> inline functions is not necessary for samll functions.
>
> It is verified with GCC 12.2.0, the generated code with/without inline
> is the same. Additionally tested with kernel pktgen and iperf, and
> verified the result, pps of the results are the same in the cases of
> with/without inline.
>
> [1]
> https://www.kernel.org/doc/html/v6.2-rc3/process/coding-style.html#the-inline-disease
>
> Signed-off-by: Feng Liu <feliu@nvidia.com>
> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: David Edmondson <david.edmondson@oracle.com>
> ---
> drivers/virtio/virtio_ring.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index 41144b5246a8..a26fab91c59f 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -233,8 +233,8 @@ static void vring_free(struct virtqueue *_vq);
>
> #define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
>
> -static inline bool virtqueue_use_indirect(struct vring_virtqueue *vq,
> - unsigned int total_sg)
> +static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
> + unsigned int total_sg)
> {
> /*
> * If the host supports indirect descriptor tables, and we have multiple
> @@ -349,7 +349,7 @@ static void vring_free_queue(struct virtio_device *vdev, size_t size,
> * making all of the arch DMA ops work on the vring device itself
> * is a mess.
> */
> -static inline struct device *vring_dma_dev(const struct vring_virtqueue *vq)
> +static struct device *vring_dma_dev(const struct vring_virtqueue *vq)
> {
> return vq->dma_dev;
> }
> @@ -784,7 +784,7 @@ static void detach_buf_split(struct vring_virtqueue *vq, unsigned int head,
> }
> }
>
> -static inline bool more_used_split(const struct vring_virtqueue *vq)
> +static bool more_used_split(const struct vring_virtqueue *vq)
> {
> return vq->last_used_idx != virtio16_to_cpu(vq->vq.vdev,
> vq->split.vring.used->idx);
> @@ -1172,12 +1172,12 @@ static int virtqueue_resize_split(struct virtqueue *_vq, u32 num)
> /*
> * Packed ring specific functions - *_packed().
> */
> -static inline bool packed_used_wrap_counter(u16 last_used_idx)
> +static bool packed_used_wrap_counter(u16 last_used_idx)
> {
> return !!(last_used_idx & (1 << VRING_PACKED_EVENT_F_WRAP_CTR));
> }
>
> -static inline u16 packed_last_used(u16 last_used_idx)
> +static u16 packed_last_used(u16 last_used_idx)
> {
> return last_used_idx & ~(-(1 << VRING_PACKED_EVENT_F_WRAP_CTR));
> }
> @@ -1612,7 +1612,7 @@ static inline bool is_used_desc_packed(const struct vring_virtqueue *vq,
> return avail == used && used == used_wrap_counter;
> }
>
> -static inline bool more_used_packed(const struct vring_virtqueue *vq)
> +static bool more_used_packed(const struct vring_virtqueue *vq)
> {
> u16 last_used;
> u16 last_used_idx;
> --
> 2.34.1
--
But are you safe Miss Gradenko?
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params
2023-03-15 18:54 ` [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params Feng Liu via Virtualization
2023-03-17 3:17 ` Jason Wang
@ 2023-03-17 9:20 ` David Edmondson
1 sibling, 0 replies; 17+ messages in thread
From: David Edmondson @ 2023-03-17 9:20 UTC (permalink / raw)
To: Feng Liu, virtualization
Cc: Michael S . Tsirkin, Jiri Pirko, Bodong Wang, Gavin Li
Feng Liu <feliu@nvidia.com> writes:
> Add const to make the read-only pointer parameters clear, similar to
> many existing functions.
>
> Use `container_of_const` to implement `to_vvq`, which ensures the
> const-ness of read-only parameters and avoids accidental modification
> of their members.
>
> Signed-off-by: Feng Liu <feliu@nvidia.com>
> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
>
Reviewed-by: David Edmondson <david.edmondson@oracle.com>
> ---
> v0 -> v1
> feedbacks from Michael S. Tsirkin
> - use `container_of_const` to implement `to_vvq`
> ---
> drivers/virtio/virtio_ring.c | 36 ++++++++++++++++++------------------
> include/linux/virtio.h | 14 +++++++-------
> 2 files changed, 25 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index a26fab91c59f..4c3bb0ddeb9b 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -231,9 +231,9 @@ static void vring_free(struct virtqueue *_vq);
> * Helpers.
> */
>
> -#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
> +#define to_vvq(_vq) container_of_const(_vq, struct vring_virtqueue, vq)
>
> -static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
> +static bool virtqueue_use_indirect(const struct vring_virtqueue *vq,
> unsigned int total_sg)
> {
> /*
> @@ -269,7 +269,7 @@ static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
> * unconditionally on data path.
> */
>
> -static bool vring_use_dma_api(struct virtio_device *vdev)
> +static bool vring_use_dma_api(const struct virtio_device *vdev)
> {
> if (!virtio_has_dma_quirk(vdev))
> return true;
> @@ -289,7 +289,7 @@ static bool vring_use_dma_api(struct virtio_device *vdev)
> return false;
> }
>
> -size_t virtio_max_dma_size(struct virtio_device *vdev)
> +size_t virtio_max_dma_size(const struct virtio_device *vdev)
> {
> size_t max_segment_size = SIZE_MAX;
>
> @@ -423,7 +423,7 @@ static void virtqueue_init(struct vring_virtqueue *vq, u32 num)
> */
>
> static void vring_unmap_one_split_indirect(const struct vring_virtqueue *vq,
> - struct vring_desc *desc)
> + const struct vring_desc *desc)
> {
> u16 flags;
>
> @@ -1183,7 +1183,7 @@ static u16 packed_last_used(u16 last_used_idx)
> }
>
> static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
> - struct vring_desc_extra *extra)
> + const struct vring_desc_extra *extra)
> {
> u16 flags;
>
> @@ -1206,7 +1206,7 @@ static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
> }
>
> static void vring_unmap_desc_packed(const struct vring_virtqueue *vq,
> - struct vring_packed_desc *desc)
> + const struct vring_packed_desc *desc)
> {
> u16 flags;
>
> @@ -2786,10 +2786,10 @@ EXPORT_SYMBOL_GPL(vring_transport_features);
> * Returns the size of the vring. This is mainly used for boasting to
> * userspace. Unlike other operations, this need not be serialized.
> */
> -unsigned int virtqueue_get_vring_size(struct virtqueue *_vq)
> +unsigned int virtqueue_get_vring_size(const struct virtqueue *_vq)
> {
>
> - struct vring_virtqueue *vq = to_vvq(_vq);
> + const struct vring_virtqueue *vq = to_vvq(_vq);
>
> return vq->packed_ring ? vq->packed.vring.num : vq->split.vring.num;
> }
> @@ -2819,9 +2819,9 @@ void __virtqueue_unbreak(struct virtqueue *_vq)
> }
> EXPORT_SYMBOL_GPL(__virtqueue_unbreak);
>
> -bool virtqueue_is_broken(struct virtqueue *_vq)
> +bool virtqueue_is_broken(const struct virtqueue *_vq)
> {
> - struct vring_virtqueue *vq = to_vvq(_vq);
> + const struct vring_virtqueue *vq = to_vvq(_vq);
>
> return READ_ONCE(vq->broken);
> }
> @@ -2868,9 +2868,9 @@ void __virtio_unbreak_device(struct virtio_device *dev)
> }
> EXPORT_SYMBOL_GPL(__virtio_unbreak_device);
>
> -dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
> +dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *_vq)
> {
> - struct vring_virtqueue *vq = to_vvq(_vq);
> + const struct vring_virtqueue *vq = to_vvq(_vq);
>
> BUG_ON(!vq->we_own_ring);
>
> @@ -2881,9 +2881,9 @@ dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
> }
> EXPORT_SYMBOL_GPL(virtqueue_get_desc_addr);
>
> -dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
> +dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *_vq)
> {
> - struct vring_virtqueue *vq = to_vvq(_vq);
> + const struct vring_virtqueue *vq = to_vvq(_vq);
>
> BUG_ON(!vq->we_own_ring);
>
> @@ -2895,9 +2895,9 @@ dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
> }
> EXPORT_SYMBOL_GPL(virtqueue_get_avail_addr);
>
> -dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
> +dma_addr_t virtqueue_get_used_addr(const struct virtqueue *_vq)
> {
> - struct vring_virtqueue *vq = to_vvq(_vq);
> + const struct vring_virtqueue *vq = to_vvq(_vq);
>
> BUG_ON(!vq->we_own_ring);
>
> @@ -2910,7 +2910,7 @@ dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
> EXPORT_SYMBOL_GPL(virtqueue_get_used_addr);
>
> /* Only available for split ring */
> -const struct vring *virtqueue_get_vring(struct virtqueue *vq)
> +const struct vring *virtqueue_get_vring(const struct virtqueue *vq)
> {
> return &to_vvq(vq)->split.vring;
> }
> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> index 2b472514c49b..c4225653f949 100644
> --- a/include/linux/virtio.h
> +++ b/include/linux/virtio.h
> @@ -84,14 +84,14 @@ bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
>
> void *virtqueue_detach_unused_buf(struct virtqueue *vq);
>
> -unsigned int virtqueue_get_vring_size(struct virtqueue *vq);
> +unsigned int virtqueue_get_vring_size(const struct virtqueue *vq);
>
> -bool virtqueue_is_broken(struct virtqueue *vq);
> +bool virtqueue_is_broken(const struct virtqueue *vq);
>
> -const struct vring *virtqueue_get_vring(struct virtqueue *vq);
> -dma_addr_t virtqueue_get_desc_addr(struct virtqueue *vq);
> -dma_addr_t virtqueue_get_avail_addr(struct virtqueue *vq);
> -dma_addr_t virtqueue_get_used_addr(struct virtqueue *vq);
> +const struct vring *virtqueue_get_vring(const struct virtqueue *vq);
> +dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *vq);
> +dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *vq);
> +dma_addr_t virtqueue_get_used_addr(const struct virtqueue *vq);
>
> int virtqueue_resize(struct virtqueue *vq, u32 num,
> void (*recycle)(struct virtqueue *vq, void *buf));
> @@ -147,7 +147,7 @@ int virtio_device_restore(struct virtio_device *dev);
> #endif
> void virtio_reset_device(struct virtio_device *dev);
>
> -size_t virtio_max_dma_size(struct virtio_device *vdev);
> +size_t virtio_max_dma_size(const struct virtio_device *vdev);
>
> #define virtio_device_for_each_vq(vdev, vq) \
> list_for_each_entry(vq, &vdev->vqs, list)
> --
> 2.34.1
--
I do believe it's Madame Joy.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/3] virtio_ring: Allow non power of 2 sizes for packed virtqueue
2023-03-17 3:16 ` Jason Wang
@ 2023-03-30 18:21 ` Feng Liu via Virtualization
0 siblings, 0 replies; 17+ messages in thread
From: Feng Liu via Virtualization @ 2023-03-30 18:21 UTC (permalink / raw)
To: Jason Wang, Michael S . Tsirkin
Cc: virtualization, Jiri Pirko, Bodong Wang, Gavin Li
On 2023-03-16 p.m.11:16, Jason Wang wrote:
> External email: Use caution opening links or attachments
>
>
> On Thu, Mar 16, 2023 at 2:55 AM Feng Liu <feliu@nvidia.com> wrote:
>>
>> According to the Virtio Specification, the Queue Size parameter of a
>> virtqueue corresponds to the maximum number of descriptors in that
>> queue, and it does not have to be a power of 2 for packed virtqueues.
>> However, the virtio_pci_modern driver enforced a power of 2 check for
>> virtqueue sizes, which is unnecessary and restrictive for packed
>> virtuqueue.
>>
>> Split virtqueue still needs to check the virtqueue size is power_of_2
>> which has been done in vring_alloc_queue_split of the virtio_ring layer.
>>
>> To validate this change, we tested various virtqueue sizes for packed
>> rings, including 128, 256, 512, 100, 200, 500, and 1000, with
>> CONFIG_PAGE_POISONING enabled, and all tests passed successfully.
>>
>> Signed-off-by: Feng Liu <feliu@nvidia.com>
>> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
>
> Acked-by: Jason Wang <jasowang@redhat.com>
>
> Thanks
>
Hi Michael & Jason
Could you please help to take these reviewed/acked patches forward?
Thanks so much
>>
>> ---
>> v0 -> v1
>> feedbacks from Jason Wang and Michael S. Tsirkin
>> - remove power_of_2 check of virtqueue size
>>
>> v1 -> v2
>> feedbacks from Parav Pandit and Jiri Pirko
>> - keep power_of_2 check of split virtqueue in vring_alloc_queue_split of
>> virtio_ring layer.
>> ---
>> drivers/virtio/virtio_pci_modern.c | 5 -----
>> 1 file changed, 5 deletions(-)
>>
>> diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
>> index 9e496e288cfa..6e713904d8e8 100644
>> --- a/drivers/virtio/virtio_pci_modern.c
>> +++ b/drivers/virtio/virtio_pci_modern.c
>> @@ -310,11 +310,6 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
>> if (!num || vp_modern_get_queue_enable(mdev, index))
>> return ERR_PTR(-ENOENT);
>>
>> - if (!is_power_of_2(num)) {
>> - dev_warn(&vp_dev->pci_dev->dev, "bad queue size %u", num);
>> - return ERR_PTR(-EINVAL);
>> - }
>> -
>> info->msix_vector = msix_vec;
>>
>> /* create the vring */
>> --
>> 2.34.1
>>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/3] virtio_ring: Avoid using inline for small functions
2023-03-17 3:16 ` Jason Wang
@ 2023-03-30 18:22 ` Feng Liu via Virtualization
0 siblings, 0 replies; 17+ messages in thread
From: Feng Liu via Virtualization @ 2023-03-30 18:22 UTC (permalink / raw)
To: Jason Wang, Michael S . Tsirkin
Cc: virtualization, Jiri Pirko, Bodong Wang, Gavin Li
On 2023-03-16 p.m.11:16, Jason Wang wrote:
> External email: Use caution opening links or attachments
>
>
> On Thu, Mar 16, 2023 at 2:55 AM Feng Liu <feliu@nvidia.com> wrote:
>>
>> Remove the inline keyword, according to kernel coding style [1], defining
>> inline functions is not necessary for samll functions.
>>
>> It is verified with GCC 12.2.0, the generated code with/without inline
>> is the same. Additionally tested with kernel pktgen and iperf, and
>> verified the result, pps of the results are the same in the cases of
>> with/without inline.
>>
>> [1]
>> https://www.kernel.org/doc/html/v6.2-rc3/process/coding-style.html#the-inline-disease
>>
>> Signed-off-by: Feng Liu <feliu@nvidia.com>
>> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
>
> Acked-by: Jason Wang <jasowang@redhat.com>
>
> Thanks
>
Hi Michael & Jason
Could you please help to take these reviewed/acked patches forward?
Thanks so much
>> ---
>> drivers/virtio/virtio_ring.c | 14 +++++++-------
>> 1 file changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
>> index 41144b5246a8..a26fab91c59f 100644
>> --- a/drivers/virtio/virtio_ring.c
>> +++ b/drivers/virtio/virtio_ring.c
>> @@ -233,8 +233,8 @@ static void vring_free(struct virtqueue *_vq);
>>
>> #define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
>>
>> -static inline bool virtqueue_use_indirect(struct vring_virtqueue *vq,
>> - unsigned int total_sg)
>> +static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
>> + unsigned int total_sg)
>> {
>> /*
>> * If the host supports indirect descriptor tables, and we have multiple
>> @@ -349,7 +349,7 @@ static void vring_free_queue(struct virtio_device *vdev, size_t size,
>> * making all of the arch DMA ops work on the vring device itself
>> * is a mess.
>> */
>> -static inline struct device *vring_dma_dev(const struct vring_virtqueue *vq)
>> +static struct device *vring_dma_dev(const struct vring_virtqueue *vq)
>> {
>> return vq->dma_dev;
>> }
>> @@ -784,7 +784,7 @@ static void detach_buf_split(struct vring_virtqueue *vq, unsigned int head,
>> }
>> }
>>
>> -static inline bool more_used_split(const struct vring_virtqueue *vq)
>> +static bool more_used_split(const struct vring_virtqueue *vq)
>> {
>> return vq->last_used_idx != virtio16_to_cpu(vq->vq.vdev,
>> vq->split.vring.used->idx);
>> @@ -1172,12 +1172,12 @@ static int virtqueue_resize_split(struct virtqueue *_vq, u32 num)
>> /*
>> * Packed ring specific functions - *_packed().
>> */
>> -static inline bool packed_used_wrap_counter(u16 last_used_idx)
>> +static bool packed_used_wrap_counter(u16 last_used_idx)
>> {
>> return !!(last_used_idx & (1 << VRING_PACKED_EVENT_F_WRAP_CTR));
>> }
>>
>> -static inline u16 packed_last_used(u16 last_used_idx)
>> +static u16 packed_last_used(u16 last_used_idx)
>> {
>> return last_used_idx & ~(-(1 << VRING_PACKED_EVENT_F_WRAP_CTR));
>> }
>> @@ -1612,7 +1612,7 @@ static inline bool is_used_desc_packed(const struct vring_virtqueue *vq,
>> return avail == used && used == used_wrap_counter;
>> }
>>
>> -static inline bool more_used_packed(const struct vring_virtqueue *vq)
>> +static bool more_used_packed(const struct vring_virtqueue *vq)
>> {
>> u16 last_used;
>> u16 last_used_idx;
>> --
>> 2.34.1
>>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params
2023-03-17 3:17 ` Jason Wang
@ 2023-03-30 18:22 ` Feng Liu via Virtualization
2023-03-30 20:27 ` Michael S. Tsirkin
0 siblings, 1 reply; 17+ messages in thread
From: Feng Liu via Virtualization @ 2023-03-30 18:22 UTC (permalink / raw)
To: Jason Wang, Michael S . Tsirkin
Cc: virtualization, Jiri Pirko, Bodong Wang, Gavin Li
On 2023-03-16 p.m.11:17, Jason Wang wrote:
> External email: Use caution opening links or attachments
>
>
> On Thu, Mar 16, 2023 at 2:55 AM Feng Liu <feliu@nvidia.com> wrote:
>>
>> Add const to make the read-only pointer parameters clear, similar to
>> many existing functions.
>>
>> Use `container_of_const` to implement `to_vvq`, which ensures the
>> const-ness of read-only parameters and avoids accidental modification
>> of their members.
>>
>> Signed-off-by: Feng Liu <feliu@nvidia.com>
>> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
>
> Acked-by: Jason Wang <jasowang@redhat.com>
>
> Thanks
>
Hi Michael & Jason
Could you please help to take these reviewed/acked patches forward?
Thanks so much
>>
>> ---
>> v0 -> v1
>> feedbacks from Michael S. Tsirkin
>> - use `container_of_const` to implement `to_vvq`
>> ---
>> drivers/virtio/virtio_ring.c | 36 ++++++++++++++++++------------------
>> include/linux/virtio.h | 14 +++++++-------
>> 2 files changed, 25 insertions(+), 25 deletions(-)
>>
>> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
>> index a26fab91c59f..4c3bb0ddeb9b 100644
>> --- a/drivers/virtio/virtio_ring.c
>> +++ b/drivers/virtio/virtio_ring.c
>> @@ -231,9 +231,9 @@ static void vring_free(struct virtqueue *_vq);
>> * Helpers.
>> */
>>
>> -#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
>> +#define to_vvq(_vq) container_of_const(_vq, struct vring_virtqueue, vq)
>>
>> -static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
>> +static bool virtqueue_use_indirect(const struct vring_virtqueue *vq,
>> unsigned int total_sg)
>> {
>> /*
>> @@ -269,7 +269,7 @@ static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
>> * unconditionally on data path.
>> */
>>
>> -static bool vring_use_dma_api(struct virtio_device *vdev)
>> +static bool vring_use_dma_api(const struct virtio_device *vdev)
>> {
>> if (!virtio_has_dma_quirk(vdev))
>> return true;
>> @@ -289,7 +289,7 @@ static bool vring_use_dma_api(struct virtio_device *vdev)
>> return false;
>> }
>>
>> -size_t virtio_max_dma_size(struct virtio_device *vdev)
>> +size_t virtio_max_dma_size(const struct virtio_device *vdev)
>> {
>> size_t max_segment_size = SIZE_MAX;
>>
>> @@ -423,7 +423,7 @@ static void virtqueue_init(struct vring_virtqueue *vq, u32 num)
>> */
>>
>> static void vring_unmap_one_split_indirect(const struct vring_virtqueue *vq,
>> - struct vring_desc *desc)
>> + const struct vring_desc *desc)
>> {
>> u16 flags;
>>
>> @@ -1183,7 +1183,7 @@ static u16 packed_last_used(u16 last_used_idx)
>> }
>>
>> static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
>> - struct vring_desc_extra *extra)
>> + const struct vring_desc_extra *extra)
>> {
>> u16 flags;
>>
>> @@ -1206,7 +1206,7 @@ static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
>> }
>>
>> static void vring_unmap_desc_packed(const struct vring_virtqueue *vq,
>> - struct vring_packed_desc *desc)
>> + const struct vring_packed_desc *desc)
>> {
>> u16 flags;
>>
>> @@ -2786,10 +2786,10 @@ EXPORT_SYMBOL_GPL(vring_transport_features);
>> * Returns the size of the vring. This is mainly used for boasting to
>> * userspace. Unlike other operations, this need not be serialized.
>> */
>> -unsigned int virtqueue_get_vring_size(struct virtqueue *_vq)
>> +unsigned int virtqueue_get_vring_size(const struct virtqueue *_vq)
>> {
>>
>> - struct vring_virtqueue *vq = to_vvq(_vq);
>> + const struct vring_virtqueue *vq = to_vvq(_vq);
>>
>> return vq->packed_ring ? vq->packed.vring.num : vq->split.vring.num;
>> }
>> @@ -2819,9 +2819,9 @@ void __virtqueue_unbreak(struct virtqueue *_vq)
>> }
>> EXPORT_SYMBOL_GPL(__virtqueue_unbreak);
>>
>> -bool virtqueue_is_broken(struct virtqueue *_vq)
>> +bool virtqueue_is_broken(const struct virtqueue *_vq)
>> {
>> - struct vring_virtqueue *vq = to_vvq(_vq);
>> + const struct vring_virtqueue *vq = to_vvq(_vq);
>>
>> return READ_ONCE(vq->broken);
>> }
>> @@ -2868,9 +2868,9 @@ void __virtio_unbreak_device(struct virtio_device *dev)
>> }
>> EXPORT_SYMBOL_GPL(__virtio_unbreak_device);
>>
>> -dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
>> +dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *_vq)
>> {
>> - struct vring_virtqueue *vq = to_vvq(_vq);
>> + const struct vring_virtqueue *vq = to_vvq(_vq);
>>
>> BUG_ON(!vq->we_own_ring);
>>
>> @@ -2881,9 +2881,9 @@ dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
>> }
>> EXPORT_SYMBOL_GPL(virtqueue_get_desc_addr);
>>
>> -dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
>> +dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *_vq)
>> {
>> - struct vring_virtqueue *vq = to_vvq(_vq);
>> + const struct vring_virtqueue *vq = to_vvq(_vq);
>>
>> BUG_ON(!vq->we_own_ring);
>>
>> @@ -2895,9 +2895,9 @@ dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
>> }
>> EXPORT_SYMBOL_GPL(virtqueue_get_avail_addr);
>>
>> -dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
>> +dma_addr_t virtqueue_get_used_addr(const struct virtqueue *_vq)
>> {
>> - struct vring_virtqueue *vq = to_vvq(_vq);
>> + const struct vring_virtqueue *vq = to_vvq(_vq);
>>
>> BUG_ON(!vq->we_own_ring);
>>
>> @@ -2910,7 +2910,7 @@ dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
>> EXPORT_SYMBOL_GPL(virtqueue_get_used_addr);
>>
>> /* Only available for split ring */
>> -const struct vring *virtqueue_get_vring(struct virtqueue *vq)
>> +const struct vring *virtqueue_get_vring(const struct virtqueue *vq)
>> {
>> return &to_vvq(vq)->split.vring;
>> }
>> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
>> index 2b472514c49b..c4225653f949 100644
>> --- a/include/linux/virtio.h
>> +++ b/include/linux/virtio.h
>> @@ -84,14 +84,14 @@ bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
>>
>> void *virtqueue_detach_unused_buf(struct virtqueue *vq);
>>
>> -unsigned int virtqueue_get_vring_size(struct virtqueue *vq);
>> +unsigned int virtqueue_get_vring_size(const struct virtqueue *vq);
>>
>> -bool virtqueue_is_broken(struct virtqueue *vq);
>> +bool virtqueue_is_broken(const struct virtqueue *vq);
>>
>> -const struct vring *virtqueue_get_vring(struct virtqueue *vq);
>> -dma_addr_t virtqueue_get_desc_addr(struct virtqueue *vq);
>> -dma_addr_t virtqueue_get_avail_addr(struct virtqueue *vq);
>> -dma_addr_t virtqueue_get_used_addr(struct virtqueue *vq);
>> +const struct vring *virtqueue_get_vring(const struct virtqueue *vq);
>> +dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *vq);
>> +dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *vq);
>> +dma_addr_t virtqueue_get_used_addr(const struct virtqueue *vq);
>>
>> int virtqueue_resize(struct virtqueue *vq, u32 num,
>> void (*recycle)(struct virtqueue *vq, void *buf));
>> @@ -147,7 +147,7 @@ int virtio_device_restore(struct virtio_device *dev);
>> #endif
>> void virtio_reset_device(struct virtio_device *dev);
>>
>> -size_t virtio_max_dma_size(struct virtio_device *vdev);
>> +size_t virtio_max_dma_size(const struct virtio_device *vdev);
>>
>> #define virtio_device_for_each_vq(vdev, vq) \
>> list_for_each_entry(vq, &vdev->vqs, list)
>> --
>> 2.34.1
>>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params
2023-03-30 18:22 ` Feng Liu via Virtualization
@ 2023-03-30 20:27 ` Michael S. Tsirkin
2023-03-30 23:46 ` Feng Liu via Virtualization
0 siblings, 1 reply; 17+ messages in thread
From: Michael S. Tsirkin @ 2023-03-30 20:27 UTC (permalink / raw)
To: Feng Liu; +Cc: virtualization, Jiri Pirko, Bodong Wang, Gavin Li
On Thu, Mar 30, 2023 at 02:22:44PM -0400, Feng Liu wrote:
>
>
> On 2023-03-16 p.m.11:17, Jason Wang wrote:
> > External email: Use caution opening links or attachments
> >
> >
> > On Thu, Mar 16, 2023 at 2:55 AM Feng Liu <feliu@nvidia.com> wrote:
> > >
> > > Add const to make the read-only pointer parameters clear, similar to
> > > many existing functions.
> > >
> > > Use `container_of_const` to implement `to_vvq`, which ensures the
> > > const-ness of read-only parameters and avoids accidental modification
> > > of their members.
> > >
> > > Signed-off-by: Feng Liu <feliu@nvidia.com>
> > > Reviewed-by: Jiri Pirko <jiri@nvidia.com>
> >
> > Acked-by: Jason Wang <jasowang@redhat.com>
> >
> > Thanks
> >
> Hi Michael & Jason
> Could you please help to take these reviewed/acked patches forward?
> Thanks so much
this is not going in this linux, only the next.
>
> > >
> > > ---
> > > v0 -> v1
> > > feedbacks from Michael S. Tsirkin
> > > - use `container_of_const` to implement `to_vvq`
> > > ---
> > > drivers/virtio/virtio_ring.c | 36 ++++++++++++++++++------------------
> > > include/linux/virtio.h | 14 +++++++-------
> > > 2 files changed, 25 insertions(+), 25 deletions(-)
> > >
> > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> > > index a26fab91c59f..4c3bb0ddeb9b 100644
> > > --- a/drivers/virtio/virtio_ring.c
> > > +++ b/drivers/virtio/virtio_ring.c
> > > @@ -231,9 +231,9 @@ static void vring_free(struct virtqueue *_vq);
> > > * Helpers.
> > > */
> > >
> > > -#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
> > > +#define to_vvq(_vq) container_of_const(_vq, struct vring_virtqueue, vq)
> > >
> > > -static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
> > > +static bool virtqueue_use_indirect(const struct vring_virtqueue *vq,
> > > unsigned int total_sg)
> > > {
> > > /*
> > > @@ -269,7 +269,7 @@ static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
> > > * unconditionally on data path.
> > > */
> > >
> > > -static bool vring_use_dma_api(struct virtio_device *vdev)
> > > +static bool vring_use_dma_api(const struct virtio_device *vdev)
> > > {
> > > if (!virtio_has_dma_quirk(vdev))
> > > return true;
> > > @@ -289,7 +289,7 @@ static bool vring_use_dma_api(struct virtio_device *vdev)
> > > return false;
> > > }
> > >
> > > -size_t virtio_max_dma_size(struct virtio_device *vdev)
> > > +size_t virtio_max_dma_size(const struct virtio_device *vdev)
> > > {
> > > size_t max_segment_size = SIZE_MAX;
> > >
> > > @@ -423,7 +423,7 @@ static void virtqueue_init(struct vring_virtqueue *vq, u32 num)
> > > */
> > >
> > > static void vring_unmap_one_split_indirect(const struct vring_virtqueue *vq,
> > > - struct vring_desc *desc)
> > > + const struct vring_desc *desc)
> > > {
> > > u16 flags;
> > >
> > > @@ -1183,7 +1183,7 @@ static u16 packed_last_used(u16 last_used_idx)
> > > }
> > >
> > > static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
> > > - struct vring_desc_extra *extra)
> > > + const struct vring_desc_extra *extra)
> > > {
> > > u16 flags;
> > >
> > > @@ -1206,7 +1206,7 @@ static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
> > > }
> > >
> > > static void vring_unmap_desc_packed(const struct vring_virtqueue *vq,
> > > - struct vring_packed_desc *desc)
> > > + const struct vring_packed_desc *desc)
> > > {
> > > u16 flags;
> > >
> > > @@ -2786,10 +2786,10 @@ EXPORT_SYMBOL_GPL(vring_transport_features);
> > > * Returns the size of the vring. This is mainly used for boasting to
> > > * userspace. Unlike other operations, this need not be serialized.
> > > */
> > > -unsigned int virtqueue_get_vring_size(struct virtqueue *_vq)
> > > +unsigned int virtqueue_get_vring_size(const struct virtqueue *_vq)
> > > {
> > >
> > > - struct vring_virtqueue *vq = to_vvq(_vq);
> > > + const struct vring_virtqueue *vq = to_vvq(_vq);
> > >
> > > return vq->packed_ring ? vq->packed.vring.num : vq->split.vring.num;
> > > }
> > > @@ -2819,9 +2819,9 @@ void __virtqueue_unbreak(struct virtqueue *_vq)
> > > }
> > > EXPORT_SYMBOL_GPL(__virtqueue_unbreak);
> > >
> > > -bool virtqueue_is_broken(struct virtqueue *_vq)
> > > +bool virtqueue_is_broken(const struct virtqueue *_vq)
> > > {
> > > - struct vring_virtqueue *vq = to_vvq(_vq);
> > > + const struct vring_virtqueue *vq = to_vvq(_vq);
> > >
> > > return READ_ONCE(vq->broken);
> > > }
> > > @@ -2868,9 +2868,9 @@ void __virtio_unbreak_device(struct virtio_device *dev)
> > > }
> > > EXPORT_SYMBOL_GPL(__virtio_unbreak_device);
> > >
> > > -dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
> > > +dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *_vq)
> > > {
> > > - struct vring_virtqueue *vq = to_vvq(_vq);
> > > + const struct vring_virtqueue *vq = to_vvq(_vq);
> > >
> > > BUG_ON(!vq->we_own_ring);
> > >
> > > @@ -2881,9 +2881,9 @@ dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
> > > }
> > > EXPORT_SYMBOL_GPL(virtqueue_get_desc_addr);
> > >
> > > -dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
> > > +dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *_vq)
> > > {
> > > - struct vring_virtqueue *vq = to_vvq(_vq);
> > > + const struct vring_virtqueue *vq = to_vvq(_vq);
> > >
> > > BUG_ON(!vq->we_own_ring);
> > >
> > > @@ -2895,9 +2895,9 @@ dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
> > > }
> > > EXPORT_SYMBOL_GPL(virtqueue_get_avail_addr);
> > >
> > > -dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
> > > +dma_addr_t virtqueue_get_used_addr(const struct virtqueue *_vq)
> > > {
> > > - struct vring_virtqueue *vq = to_vvq(_vq);
> > > + const struct vring_virtqueue *vq = to_vvq(_vq);
> > >
> > > BUG_ON(!vq->we_own_ring);
> > >
> > > @@ -2910,7 +2910,7 @@ dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
> > > EXPORT_SYMBOL_GPL(virtqueue_get_used_addr);
> > >
> > > /* Only available for split ring */
> > > -const struct vring *virtqueue_get_vring(struct virtqueue *vq)
> > > +const struct vring *virtqueue_get_vring(const struct virtqueue *vq)
> > > {
> > > return &to_vvq(vq)->split.vring;
> > > }
> > > diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> > > index 2b472514c49b..c4225653f949 100644
> > > --- a/include/linux/virtio.h
> > > +++ b/include/linux/virtio.h
> > > @@ -84,14 +84,14 @@ bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
> > >
> > > void *virtqueue_detach_unused_buf(struct virtqueue *vq);
> > >
> > > -unsigned int virtqueue_get_vring_size(struct virtqueue *vq);
> > > +unsigned int virtqueue_get_vring_size(const struct virtqueue *vq);
> > >
> > > -bool virtqueue_is_broken(struct virtqueue *vq);
> > > +bool virtqueue_is_broken(const struct virtqueue *vq);
> > >
> > > -const struct vring *virtqueue_get_vring(struct virtqueue *vq);
> > > -dma_addr_t virtqueue_get_desc_addr(struct virtqueue *vq);
> > > -dma_addr_t virtqueue_get_avail_addr(struct virtqueue *vq);
> > > -dma_addr_t virtqueue_get_used_addr(struct virtqueue *vq);
> > > +const struct vring *virtqueue_get_vring(const struct virtqueue *vq);
> > > +dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *vq);
> > > +dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *vq);
> > > +dma_addr_t virtqueue_get_used_addr(const struct virtqueue *vq);
> > >
> > > int virtqueue_resize(struct virtqueue *vq, u32 num,
> > > void (*recycle)(struct virtqueue *vq, void *buf));
> > > @@ -147,7 +147,7 @@ int virtio_device_restore(struct virtio_device *dev);
> > > #endif
> > > void virtio_reset_device(struct virtio_device *dev);
> > >
> > > -size_t virtio_max_dma_size(struct virtio_device *vdev);
> > > +size_t virtio_max_dma_size(const struct virtio_device *vdev);
> > >
> > > #define virtio_device_for_each_vq(vdev, vq) \
> > > list_for_each_entry(vq, &vdev->vqs, list)
> > > --
> > > 2.34.1
> > >
> >
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params
2023-03-30 20:27 ` Michael S. Tsirkin
@ 2023-03-30 23:46 ` Feng Liu via Virtualization
0 siblings, 0 replies; 17+ messages in thread
From: Feng Liu via Virtualization @ 2023-03-30 23:46 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: virtualization, Jiri Pirko, Bodong Wang, Gavin Li
On 2023-03-30 p.m.4:27, Michael S. Tsirkin wrote:
> External email: Use caution opening links or attachments
>
>
> On Thu, Mar 30, 2023 at 02:22:44PM -0400, Feng Liu wrote:
>>
>>
>> On 2023-03-16 p.m.11:17, Jason Wang wrote:
>>> External email: Use caution opening links or attachments
>>>
>>>
>>> On Thu, Mar 16, 2023 at 2:55 AM Feng Liu <feliu@nvidia.com> wrote:
>>>>
>>>> Add const to make the read-only pointer parameters clear, similar to
>>>> many existing functions.
>>>>
>>>> Use `container_of_const` to implement `to_vvq`, which ensures the
>>>> const-ness of read-only parameters and avoids accidental modification
>>>> of their members.
>>>>
>>>> Signed-off-by: Feng Liu <feliu@nvidia.com>
>>>> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
>>>
>>> Acked-by: Jason Wang <jasowang@redhat.com>
>>>
>>> Thanks
>>>
>> Hi Michael & Jason
>> Could you please help to take these reviewed/acked patches forward?
>> Thanks so much
>
>
> this is not going in this linux, only the next.
>
Hi, Michael
Thanks for the update.
>>
>>>>
>>>> ---
>>>> v0 -> v1
>>>> feedbacks from Michael S. Tsirkin
>>>> - use `container_of_const` to implement `to_vvq`
>>>> ---
>>>> drivers/virtio/virtio_ring.c | 36 ++++++++++++++++++------------------
>>>> include/linux/virtio.h | 14 +++++++-------
>>>> 2 files changed, 25 insertions(+), 25 deletions(-)
>>>>
>>>> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
>>>> index a26fab91c59f..4c3bb0ddeb9b 100644
>>>> --- a/drivers/virtio/virtio_ring.c
>>>> +++ b/drivers/virtio/virtio_ring.c
>>>> @@ -231,9 +231,9 @@ static void vring_free(struct virtqueue *_vq);
>>>> * Helpers.
>>>> */
>>>>
>>>> -#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
>>>> +#define to_vvq(_vq) container_of_const(_vq, struct vring_virtqueue, vq)
>>>>
>>>> -static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
>>>> +static bool virtqueue_use_indirect(const struct vring_virtqueue *vq,
>>>> unsigned int total_sg)
>>>> {
>>>> /*
>>>> @@ -269,7 +269,7 @@ static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
>>>> * unconditionally on data path.
>>>> */
>>>>
>>>> -static bool vring_use_dma_api(struct virtio_device *vdev)
>>>> +static bool vring_use_dma_api(const struct virtio_device *vdev)
>>>> {
>>>> if (!virtio_has_dma_quirk(vdev))
>>>> return true;
>>>> @@ -289,7 +289,7 @@ static bool vring_use_dma_api(struct virtio_device *vdev)
>>>> return false;
>>>> }
>>>>
>>>> -size_t virtio_max_dma_size(struct virtio_device *vdev)
>>>> +size_t virtio_max_dma_size(const struct virtio_device *vdev)
>>>> {
>>>> size_t max_segment_size = SIZE_MAX;
>>>>
>>>> @@ -423,7 +423,7 @@ static void virtqueue_init(struct vring_virtqueue *vq, u32 num)
>>>> */
>>>>
>>>> static void vring_unmap_one_split_indirect(const struct vring_virtqueue *vq,
>>>> - struct vring_desc *desc)
>>>> + const struct vring_desc *desc)
>>>> {
>>>> u16 flags;
>>>>
>>>> @@ -1183,7 +1183,7 @@ static u16 packed_last_used(u16 last_used_idx)
>>>> }
>>>>
>>>> static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
>>>> - struct vring_desc_extra *extra)
>>>> + const struct vring_desc_extra *extra)
>>>> {
>>>> u16 flags;
>>>>
>>>> @@ -1206,7 +1206,7 @@ static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
>>>> }
>>>>
>>>> static void vring_unmap_desc_packed(const struct vring_virtqueue *vq,
>>>> - struct vring_packed_desc *desc)
>>>> + const struct vring_packed_desc *desc)
>>>> {
>>>> u16 flags;
>>>>
>>>> @@ -2786,10 +2786,10 @@ EXPORT_SYMBOL_GPL(vring_transport_features);
>>>> * Returns the size of the vring. This is mainly used for boasting to
>>>> * userspace. Unlike other operations, this need not be serialized.
>>>> */
>>>> -unsigned int virtqueue_get_vring_size(struct virtqueue *_vq)
>>>> +unsigned int virtqueue_get_vring_size(const struct virtqueue *_vq)
>>>> {
>>>>
>>>> - struct vring_virtqueue *vq = to_vvq(_vq);
>>>> + const struct vring_virtqueue *vq = to_vvq(_vq);
>>>>
>>>> return vq->packed_ring ? vq->packed.vring.num : vq->split.vring.num;
>>>> }
>>>> @@ -2819,9 +2819,9 @@ void __virtqueue_unbreak(struct virtqueue *_vq)
>>>> }
>>>> EXPORT_SYMBOL_GPL(__virtqueue_unbreak);
>>>>
>>>> -bool virtqueue_is_broken(struct virtqueue *_vq)
>>>> +bool virtqueue_is_broken(const struct virtqueue *_vq)
>>>> {
>>>> - struct vring_virtqueue *vq = to_vvq(_vq);
>>>> + const struct vring_virtqueue *vq = to_vvq(_vq);
>>>>
>>>> return READ_ONCE(vq->broken);
>>>> }
>>>> @@ -2868,9 +2868,9 @@ void __virtio_unbreak_device(struct virtio_device *dev)
>>>> }
>>>> EXPORT_SYMBOL_GPL(__virtio_unbreak_device);
>>>>
>>>> -dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
>>>> +dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *_vq)
>>>> {
>>>> - struct vring_virtqueue *vq = to_vvq(_vq);
>>>> + const struct vring_virtqueue *vq = to_vvq(_vq);
>>>>
>>>> BUG_ON(!vq->we_own_ring);
>>>>
>>>> @@ -2881,9 +2881,9 @@ dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
>>>> }
>>>> EXPORT_SYMBOL_GPL(virtqueue_get_desc_addr);
>>>>
>>>> -dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
>>>> +dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *_vq)
>>>> {
>>>> - struct vring_virtqueue *vq = to_vvq(_vq);
>>>> + const struct vring_virtqueue *vq = to_vvq(_vq);
>>>>
>>>> BUG_ON(!vq->we_own_ring);
>>>>
>>>> @@ -2895,9 +2895,9 @@ dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
>>>> }
>>>> EXPORT_SYMBOL_GPL(virtqueue_get_avail_addr);
>>>>
>>>> -dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
>>>> +dma_addr_t virtqueue_get_used_addr(const struct virtqueue *_vq)
>>>> {
>>>> - struct vring_virtqueue *vq = to_vvq(_vq);
>>>> + const struct vring_virtqueue *vq = to_vvq(_vq);
>>>>
>>>> BUG_ON(!vq->we_own_ring);
>>>>
>>>> @@ -2910,7 +2910,7 @@ dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
>>>> EXPORT_SYMBOL_GPL(virtqueue_get_used_addr);
>>>>
>>>> /* Only available for split ring */
>>>> -const struct vring *virtqueue_get_vring(struct virtqueue *vq)
>>>> +const struct vring *virtqueue_get_vring(const struct virtqueue *vq)
>>>> {
>>>> return &to_vvq(vq)->split.vring;
>>>> }
>>>> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
>>>> index 2b472514c49b..c4225653f949 100644
>>>> --- a/include/linux/virtio.h
>>>> +++ b/include/linux/virtio.h
>>>> @@ -84,14 +84,14 @@ bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
>>>>
>>>> void *virtqueue_detach_unused_buf(struct virtqueue *vq);
>>>>
>>>> -unsigned int virtqueue_get_vring_size(struct virtqueue *vq);
>>>> +unsigned int virtqueue_get_vring_size(const struct virtqueue *vq);
>>>>
>>>> -bool virtqueue_is_broken(struct virtqueue *vq);
>>>> +bool virtqueue_is_broken(const struct virtqueue *vq);
>>>>
>>>> -const struct vring *virtqueue_get_vring(struct virtqueue *vq);
>>>> -dma_addr_t virtqueue_get_desc_addr(struct virtqueue *vq);
>>>> -dma_addr_t virtqueue_get_avail_addr(struct virtqueue *vq);
>>>> -dma_addr_t virtqueue_get_used_addr(struct virtqueue *vq);
>>>> +const struct vring *virtqueue_get_vring(const struct virtqueue *vq);
>>>> +dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *vq);
>>>> +dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *vq);
>>>> +dma_addr_t virtqueue_get_used_addr(const struct virtqueue *vq);
>>>>
>>>> int virtqueue_resize(struct virtqueue *vq, u32 num,
>>>> void (*recycle)(struct virtqueue *vq, void *buf));
>>>> @@ -147,7 +147,7 @@ int virtio_device_restore(struct virtio_device *dev);
>>>> #endif
>>>> void virtio_reset_device(struct virtio_device *dev);
>>>>
>>>> -size_t virtio_max_dma_size(struct virtio_device *vdev);
>>>> +size_t virtio_max_dma_size(const struct virtio_device *vdev);
>>>>
>>>> #define virtio_device_for_each_vq(vdev, vq) \
>>>> list_for_each_entry(vq, &vdev->vqs, list)
>>>> --
>>>> 2.34.1
>>>>
>>>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 0/3] virtio_ring: Clean up code for virtio ring and pci
2023-03-15 18:54 [PATCH v2 0/3] virtio_ring: Clean up code for virtio ring and pci Feng Liu via Virtualization
` (2 preceding siblings ...)
2023-03-15 18:54 ` [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params Feng Liu via Virtualization
@ 2023-03-31 4:20 ` Xuan Zhuo
3 siblings, 0 replies; 17+ messages in thread
From: Xuan Zhuo @ 2023-03-31 4:20 UTC (permalink / raw)
To: Feng Liu via Virtualization
Cc: Bodong Wang, Jiri Pirko, virtualization, Gavin Li, Michael S . Tsirkin
Series:
Reviewed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Thanks.
On Wed, 15 Mar 2023 20:54:55 +0200, Feng Liu via Virtualization <virtualization@lists.linux-foundation.org> wrote:
> This patch series performs a clean up of the code in virtio_ring and
> virtio_pci, modifying it to conform with the Linux kernel coding style
> guidance [1]. The modifications ensure the code easy to read and
> understand. This small series does few short cleanups in the code.
>
> Patch-1 Allow non power of 2 sizes for packed virtqueues.
> Patch-2 Avoid using inline for small functions.
> Patch-3 Use const to annotate read-only pointer params.
>
> [1]
> https://www.kernel.org/doc/html/v6.2-rc3/process/coding-style.html#the-inline-disease
>
> All of the patches have been verified based on the kernel code
> commit 81ff855485a3 ("Merge tag 'i2c-for-6.3-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux")
>
> Feng Liu (3):
> virtio_ring: Allow non power of 2 sizes for packed virtqueue
> virtio_ring: Avoid using inline for small functions
> virtio_ring: Use const to annotate read-only pointer params
>
> drivers/virtio/virtio_pci_modern.c | 5 ----
> drivers/virtio/virtio_ring.c | 48 +++++++++++++++---------------
> include/linux/virtio.h | 14 ++++-----
> 3 files changed, 31 insertions(+), 36 deletions(-)
>
> --
> 2.34.1
>
> _______________________________________________
> Virtualization mailing list
> Virtualization@lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/virtualization
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params
2023-03-10 5:34 Feng Liu via Virtualization
@ 2023-03-10 5:34 ` Feng Liu via Virtualization
0 siblings, 0 replies; 17+ messages in thread
From: Feng Liu via Virtualization @ 2023-03-10 5:34 UTC (permalink / raw)
To: virtualization; +Cc: Michael S . Tsirkin, Jiri Pirko, Bodong Wang, Gavin Li
Add const to make the read-only pointer parameters clear, similar to
many existing functions.
To implement this change, the commit also introduces the use of
`container_of_const` to implement `to_vvq`, which ensures the const-ness
of read-only parameters and avoids accidental modification of their
members.
Signed-off-by: Feng Liu <feliu@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Gavin Li <gavinl@nvidia.com>
Reviewed-by: Bodong Wang <bodong@nvidia.com>
---
v1 -> v2
feedbacks from Michael S. Tsirkin
- use `container_of_const` to implement `to_vvq`
---
drivers/virtio/virtio_ring.c | 36 ++++++++++++++++++------------------
include/linux/virtio.h | 14 +++++++-------
2 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index a26fab91c59f..4c3bb0ddeb9b 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -231,9 +231,9 @@ static void vring_free(struct virtqueue *_vq);
* Helpers.
*/
-#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
+#define to_vvq(_vq) container_of_const(_vq, struct vring_virtqueue, vq)
-static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
+static bool virtqueue_use_indirect(const struct vring_virtqueue *vq,
unsigned int total_sg)
{
/*
@@ -269,7 +269,7 @@ static bool virtqueue_use_indirect(struct vring_virtqueue *vq,
* unconditionally on data path.
*/
-static bool vring_use_dma_api(struct virtio_device *vdev)
+static bool vring_use_dma_api(const struct virtio_device *vdev)
{
if (!virtio_has_dma_quirk(vdev))
return true;
@@ -289,7 +289,7 @@ static bool vring_use_dma_api(struct virtio_device *vdev)
return false;
}
-size_t virtio_max_dma_size(struct virtio_device *vdev)
+size_t virtio_max_dma_size(const struct virtio_device *vdev)
{
size_t max_segment_size = SIZE_MAX;
@@ -423,7 +423,7 @@ static void virtqueue_init(struct vring_virtqueue *vq, u32 num)
*/
static void vring_unmap_one_split_indirect(const struct vring_virtqueue *vq,
- struct vring_desc *desc)
+ const struct vring_desc *desc)
{
u16 flags;
@@ -1183,7 +1183,7 @@ static u16 packed_last_used(u16 last_used_idx)
}
static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
- struct vring_desc_extra *extra)
+ const struct vring_desc_extra *extra)
{
u16 flags;
@@ -1206,7 +1206,7 @@ static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
}
static void vring_unmap_desc_packed(const struct vring_virtqueue *vq,
- struct vring_packed_desc *desc)
+ const struct vring_packed_desc *desc)
{
u16 flags;
@@ -2786,10 +2786,10 @@ EXPORT_SYMBOL_GPL(vring_transport_features);
* Returns the size of the vring. This is mainly used for boasting to
* userspace. Unlike other operations, this need not be serialized.
*/
-unsigned int virtqueue_get_vring_size(struct virtqueue *_vq)
+unsigned int virtqueue_get_vring_size(const struct virtqueue *_vq)
{
- struct vring_virtqueue *vq = to_vvq(_vq);
+ const struct vring_virtqueue *vq = to_vvq(_vq);
return vq->packed_ring ? vq->packed.vring.num : vq->split.vring.num;
}
@@ -2819,9 +2819,9 @@ void __virtqueue_unbreak(struct virtqueue *_vq)
}
EXPORT_SYMBOL_GPL(__virtqueue_unbreak);
-bool virtqueue_is_broken(struct virtqueue *_vq)
+bool virtqueue_is_broken(const struct virtqueue *_vq)
{
- struct vring_virtqueue *vq = to_vvq(_vq);
+ const struct vring_virtqueue *vq = to_vvq(_vq);
return READ_ONCE(vq->broken);
}
@@ -2868,9 +2868,9 @@ void __virtio_unbreak_device(struct virtio_device *dev)
}
EXPORT_SYMBOL_GPL(__virtio_unbreak_device);
-dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
+dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *_vq)
{
- struct vring_virtqueue *vq = to_vvq(_vq);
+ const struct vring_virtqueue *vq = to_vvq(_vq);
BUG_ON(!vq->we_own_ring);
@@ -2881,9 +2881,9 @@ dma_addr_t virtqueue_get_desc_addr(struct virtqueue *_vq)
}
EXPORT_SYMBOL_GPL(virtqueue_get_desc_addr);
-dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
+dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *_vq)
{
- struct vring_virtqueue *vq = to_vvq(_vq);
+ const struct vring_virtqueue *vq = to_vvq(_vq);
BUG_ON(!vq->we_own_ring);
@@ -2895,9 +2895,9 @@ dma_addr_t virtqueue_get_avail_addr(struct virtqueue *_vq)
}
EXPORT_SYMBOL_GPL(virtqueue_get_avail_addr);
-dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
+dma_addr_t virtqueue_get_used_addr(const struct virtqueue *_vq)
{
- struct vring_virtqueue *vq = to_vvq(_vq);
+ const struct vring_virtqueue *vq = to_vvq(_vq);
BUG_ON(!vq->we_own_ring);
@@ -2910,7 +2910,7 @@ dma_addr_t virtqueue_get_used_addr(struct virtqueue *_vq)
EXPORT_SYMBOL_GPL(virtqueue_get_used_addr);
/* Only available for split ring */
-const struct vring *virtqueue_get_vring(struct virtqueue *vq)
+const struct vring *virtqueue_get_vring(const struct virtqueue *vq)
{
return &to_vvq(vq)->split.vring;
}
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index 2b472514c49b..c4225653f949 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h
@@ -84,14 +84,14 @@ bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
void *virtqueue_detach_unused_buf(struct virtqueue *vq);
-unsigned int virtqueue_get_vring_size(struct virtqueue *vq);
+unsigned int virtqueue_get_vring_size(const struct virtqueue *vq);
-bool virtqueue_is_broken(struct virtqueue *vq);
+bool virtqueue_is_broken(const struct virtqueue *vq);
-const struct vring *virtqueue_get_vring(struct virtqueue *vq);
-dma_addr_t virtqueue_get_desc_addr(struct virtqueue *vq);
-dma_addr_t virtqueue_get_avail_addr(struct virtqueue *vq);
-dma_addr_t virtqueue_get_used_addr(struct virtqueue *vq);
+const struct vring *virtqueue_get_vring(const struct virtqueue *vq);
+dma_addr_t virtqueue_get_desc_addr(const struct virtqueue *vq);
+dma_addr_t virtqueue_get_avail_addr(const struct virtqueue *vq);
+dma_addr_t virtqueue_get_used_addr(const struct virtqueue *vq);
int virtqueue_resize(struct virtqueue *vq, u32 num,
void (*recycle)(struct virtqueue *vq, void *buf));
@@ -147,7 +147,7 @@ int virtio_device_restore(struct virtio_device *dev);
#endif
void virtio_reset_device(struct virtio_device *dev);
-size_t virtio_max_dma_size(struct virtio_device *vdev);
+size_t virtio_max_dma_size(const struct virtio_device *vdev);
#define virtio_device_for_each_vq(vdev, vq) \
list_for_each_entry(vq, &vdev->vqs, list)
--
2.34.1
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
^ permalink raw reply related [flat|nested] 17+ messages in thread
end of thread, other threads:[~2023-03-31 4:21 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-15 18:54 [PATCH v2 0/3] virtio_ring: Clean up code for virtio ring and pci Feng Liu via Virtualization
2023-03-15 18:54 ` [PATCH v2 1/3] virtio_ring: Allow non power of 2 sizes for packed virtqueue Feng Liu via Virtualization
2023-03-17 3:16 ` Jason Wang
2023-03-30 18:21 ` Feng Liu via Virtualization
2023-03-17 9:16 ` David Edmondson
2023-03-15 18:54 ` [PATCH v2 2/3] virtio_ring: Avoid using inline for small functions Feng Liu via Virtualization
2023-03-17 3:16 ` Jason Wang
2023-03-30 18:22 ` Feng Liu via Virtualization
2023-03-17 9:16 ` David Edmondson
2023-03-15 18:54 ` [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params Feng Liu via Virtualization
2023-03-17 3:17 ` Jason Wang
2023-03-30 18:22 ` Feng Liu via Virtualization
2023-03-30 20:27 ` Michael S. Tsirkin
2023-03-30 23:46 ` Feng Liu via Virtualization
2023-03-17 9:20 ` David Edmondson
2023-03-31 4:20 ` [PATCH v2 0/3] virtio_ring: Clean up code for virtio ring and pci Xuan Zhuo
-- strict thread matches above, loose matches on Subject: below --
2023-03-10 5:34 Feng Liu via Virtualization
2023-03-10 5:34 ` [PATCH v2 3/3] virtio_ring: Use const to annotate read-only pointer params Feng Liu via Virtualization
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).