From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: marcandre.lureau@redhat.com
Cc: qemu-devel@nongnu.org, stefanha@redhat.com, armbru@redhat.com
Subject: Re: [PATCH 1/2] libvhost-user: replace qemu/bswap.h with glibc endian.h
Date: Tue, 24 Nov 2020 11:31:04 +0000 [thread overview]
Message-ID: <20201124113104.GD3366@work-vm> (raw)
In-Reply-To: <20201118080902.30033-2-marcandre.lureau@redhat.com>
* marcandre.lureau@redhat.com (marcandre.lureau@redhat.com) wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> ---
> contrib/libvhost-user/libvhost-user.c | 77 ++++++++++++++-------------
> 1 file changed, 40 insertions(+), 37 deletions(-)
>
> diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c
> index 5c73ffdd6b..1c1cfbf1e7 100644
> --- a/contrib/libvhost-user/libvhost-user.c
> +++ b/contrib/libvhost-user/libvhost-user.c
> @@ -26,6 +26,7 @@
> #include <sys/socket.h>
> #include <sys/eventfd.h>
> #include <sys/mman.h>
> +#include <endian.h>
> #include "qemu/compiler.h"
>
> #if defined(__linux__)
> @@ -42,7 +43,6 @@
>
> #include "qemu/atomic.h"
> #include "qemu/osdep.h"
> -#include "qemu/bswap.h"
> #include "qemu/memfd.h"
>
> #include "libvhost-user.h"
> @@ -1081,7 +1081,7 @@ vu_set_vring_addr_exec(VuDev *dev, VhostUserMsg *vmsg)
> return false;
> }
>
> - vq->used_idx = lduw_le_p(&vq->vring.used->idx);
> + vq->used_idx = le16toh(vq->vring.used->idx);
>
> if (vq->last_avail_idx != vq->used_idx) {
> bool resume = dev->iface->queue_is_processed_in_order &&
> @@ -1198,7 +1198,7 @@ vu_check_queue_inflights(VuDev *dev, VuVirtq *vq)
> return 0;
> }
>
> - vq->used_idx = lduw_le_p(&vq->vring.used->idx);
> + vq->used_idx = le16toh(vq->vring.used->idx);
> vq->resubmit_num = 0;
> vq->resubmit_list = NULL;
> vq->counter = 0;
> @@ -2031,13 +2031,13 @@ vu_queue_started(const VuDev *dev, const VuVirtq *vq)
> static inline uint16_t
> vring_avail_flags(VuVirtq *vq)
> {
> - return lduw_le_p(&vq->vring.avail->flags);
> + return le16toh(vq->vring.avail->flags);
> }
>
> static inline uint16_t
> vring_avail_idx(VuVirtq *vq)
> {
> - vq->shadow_avail_idx = lduw_le_p(&vq->vring.avail->idx);
> + vq->shadow_avail_idx = le16toh(vq->vring.avail->idx);
>
> return vq->shadow_avail_idx;
> }
> @@ -2045,7 +2045,7 @@ vring_avail_idx(VuVirtq *vq)
> static inline uint16_t
> vring_avail_ring(VuVirtq *vq, int i)
> {
> - return lduw_le_p(&vq->vring.avail->ring[i]);
> + return le16toh(vq->vring.avail->ring[i]);
> }
>
> static inline uint16_t
> @@ -2133,12 +2133,12 @@ virtqueue_read_next_desc(VuDev *dev, struct vring_desc *desc,
> int i, unsigned int max, unsigned int *next)
> {
> /* If this descriptor says it doesn't chain, we're done. */
> - if (!(lduw_le_p(&desc[i].flags) & VRING_DESC_F_NEXT)) {
> + if (!(le16toh(desc[i].flags) & VRING_DESC_F_NEXT)) {
> return VIRTQUEUE_READ_DESC_DONE;
> }
>
> /* Check they're not leading us off end of descriptors. */
> - *next = lduw_le_p(&desc[i].next);
> + *next = le16toh(desc[i].next);
> /* Make sure compiler knows to grab that: we don't want it changing! */
> smp_wmb();
>
> @@ -2181,8 +2181,8 @@ vu_queue_get_avail_bytes(VuDev *dev, VuVirtq *vq, unsigned int *in_bytes,
> }
> desc = vq->vring.desc;
>
> - if (lduw_le_p(&desc[i].flags) & VRING_DESC_F_INDIRECT) {
> - if (ldl_le_p(&desc[i].len) % sizeof(struct vring_desc)) {
> + if (le16toh(desc[i].flags) & VRING_DESC_F_INDIRECT) {
> + if (le32toh(desc[i].len) % sizeof(struct vring_desc)) {
> vu_panic(dev, "Invalid size for indirect buffer table");
> goto err;
> }
> @@ -2195,8 +2195,8 @@ vu_queue_get_avail_bytes(VuDev *dev, VuVirtq *vq, unsigned int *in_bytes,
>
> /* loop over the indirect descriptor table */
> indirect = 1;
> - desc_addr = ldq_le_p(&desc[i].addr);
> - desc_len = ldl_le_p(&desc[i].len);
> + desc_addr = le64toh(desc[i].addr);
> + desc_len = le32toh(desc[i].len);
> max = desc_len / sizeof(struct vring_desc);
> read_len = desc_len;
> desc = vu_gpa_to_va(dev, &read_len, desc_addr);
> @@ -2223,10 +2223,10 @@ vu_queue_get_avail_bytes(VuDev *dev, VuVirtq *vq, unsigned int *in_bytes,
> goto err;
> }
>
> - if (lduw_le_p(&desc[i].flags) & VRING_DESC_F_WRITE) {
> - in_total += ldl_le_p(&desc[i].len);
> + if (le16toh(desc[i].flags) & VRING_DESC_F_WRITE) {
> + in_total += le32toh(desc[i].len);
> } else {
> - out_total += ldl_le_p(&desc[i].len);
> + out_total += le32toh(desc[i].len);
> }
> if (in_total >= max_in_bytes && out_total >= max_out_bytes) {
> goto done;
> @@ -2377,7 +2377,7 @@ vring_used_flags_set_bit(VuVirtq *vq, int mask)
>
> flags = (uint16_t *)((char*)vq->vring.used +
> offsetof(struct vring_used, flags));
> - stw_le_p(flags, lduw_le_p(flags) | mask);
> + *flags = htole16(le16toh(*flags) | mask);
> }
>
> static inline void
> @@ -2387,17 +2387,20 @@ vring_used_flags_unset_bit(VuVirtq *vq, int mask)
>
> flags = (uint16_t *)((char*)vq->vring.used +
> offsetof(struct vring_used, flags));
> - stw_le_p(flags, lduw_le_p(flags) & ~mask);
> + *flags = htole16(le16toh(*flags) & ~mask);
> }
>
> static inline void
> vring_set_avail_event(VuVirtq *vq, uint16_t val)
> {
> + uint16_t *avail;
> +
> if (!vq->notification) {
> return;
> }
>
> - stw_le_p(&vq->vring.used->ring[vq->vring.num], val);
> + avail = (uint16_t *)&vq->vring.used->ring[vq->vring.num];
> + *avail = htole16(val);
> }
>
> void
> @@ -2487,15 +2490,15 @@ vu_queue_map_desc(VuDev *dev, VuVirtq *vq, unsigned int idx, size_t sz)
> struct vring_desc desc_buf[VIRTQUEUE_MAX_SIZE];
> int rc;
>
> - if (lduw_le_p(&desc[i].flags) & VRING_DESC_F_INDIRECT) {
> - if (ldl_le_p(&desc[i].len) % sizeof(struct vring_desc)) {
> + if (le16toh(desc[i].flags) & VRING_DESC_F_INDIRECT) {
> + if (le32toh(desc[i].len) % sizeof(struct vring_desc)) {
> vu_panic(dev, "Invalid size for indirect buffer table");
> return NULL;
> }
>
> /* loop over the indirect descriptor table */
> - desc_addr = ldq_le_p(&desc[i].addr);
> - desc_len = ldl_le_p(&desc[i].len);
> + desc_addr = le64toh(desc[i].addr);
> + desc_len = le32toh(desc[i].len);
> max = desc_len / sizeof(struct vring_desc);
> read_len = desc_len;
> desc = vu_gpa_to_va(dev, &read_len, desc_addr);
> @@ -2517,11 +2520,11 @@ vu_queue_map_desc(VuDev *dev, VuVirtq *vq, unsigned int idx, size_t sz)
>
> /* Collect all the descriptors */
> do {
> - if (lduw_le_p(&desc[i].flags) & VRING_DESC_F_WRITE) {
> + if (le16toh(desc[i].flags) & VRING_DESC_F_WRITE) {
> if (!virtqueue_map_desc(dev, &in_num, iov + out_num,
> VIRTQUEUE_MAX_SIZE - out_num, true,
> - ldq_le_p(&desc[i].addr),
> - ldl_le_p(&desc[i].len))) {
> + le64toh(desc[i].addr),
> + le32toh(desc[i].len))) {
> return NULL;
> }
> } else {
> @@ -2531,8 +2534,8 @@ vu_queue_map_desc(VuDev *dev, VuVirtq *vq, unsigned int idx, size_t sz)
> }
> if (!virtqueue_map_desc(dev, &out_num, iov,
> VIRTQUEUE_MAX_SIZE, false,
> - ldq_le_p(&desc[i].addr),
> - ldl_le_p(&desc[i].len))) {
> + le64toh(desc[i].addr),
> + le32toh(desc[i].len))) {
> return NULL;
> }
> }
> @@ -2731,15 +2734,15 @@ vu_log_queue_fill(VuDev *dev, VuVirtq *vq,
> max = vq->vring.num;
> i = elem->index;
>
> - if (lduw_le_p(&desc[i].flags) & VRING_DESC_F_INDIRECT) {
> - if (ldl_le_p(&desc[i].len) % sizeof(struct vring_desc)) {
> + if (le16toh(desc[i].flags) & VRING_DESC_F_INDIRECT) {
> + if (le32toh(desc[i].len) % sizeof(struct vring_desc)) {
> vu_panic(dev, "Invalid size for indirect buffer table");
> return;
> }
>
> /* loop over the indirect descriptor table */
> - desc_addr = ldq_le_p(&desc[i].addr);
> - desc_len = ldl_le_p(&desc[i].len);
> + desc_addr = le64toh(desc[i].addr);
> + desc_len = le32toh(desc[i].len);
> max = desc_len / sizeof(struct vring_desc);
> read_len = desc_len;
> desc = vu_gpa_to_va(dev, &read_len, desc_addr);
> @@ -2765,9 +2768,9 @@ vu_log_queue_fill(VuDev *dev, VuVirtq *vq,
> return;
> }
>
> - if (lduw_le_p(&desc[i].flags) & VRING_DESC_F_WRITE) {
> - min = MIN(ldl_le_p(&desc[i].len), len);
> - vu_log_write(dev, ldq_le_p(&desc[i].addr), min);
> + if (le16toh(desc[i].flags) & VRING_DESC_F_WRITE) {
> + min = MIN(le32toh(desc[i].len), len);
> + vu_log_write(dev, le64toh(desc[i].addr), min);
> len -= min;
> }
>
> @@ -2792,15 +2795,15 @@ vu_queue_fill(VuDev *dev, VuVirtq *vq,
>
> idx = (idx + vq->used_idx) % vq->vring.num;
>
> - stl_le_p(&uelem.id, elem->index);
> - stl_le_p(&uelem.len, len);
> + uelem.id = htole32(elem->index);
> + uelem.len = htole32(len);
> vring_used_write(dev, vq, &uelem, idx);
> }
>
> static inline
> void vring_used_idx_set(VuDev *dev, VuVirtq *vq, uint16_t val)
> {
> - stw_le_p(&vq->vring.used->idx, val);
> + vq->vring.used->idx = htole16(val);
> vu_log_write(dev,
> vq->vring.log_guest_addr + offsetof(struct vring_used, idx),
> sizeof(vq->vring.used->idx));
> --
> 2.29.0
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2020-11-24 11:32 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-18 8:09 [PATCH 0/2] libvhost-user: lower dependency on QEMU headers marcandre.lureau
2020-11-18 8:09 ` [PATCH 1/2] libvhost-user: replace qemu/bswap.h with glibc endian.h marcandre.lureau
2020-11-24 11:31 ` Dr. David Alan Gilbert [this message]
2020-11-18 8:09 ` [PATCH 2/2] libvhost-user: replace qemu/memfd.h usage marcandre.lureau
2020-11-24 11:54 ` Dr. David Alan Gilbert
2020-11-24 13:32 ` Marc-André Lureau
2020-11-24 13:35 ` Marc-André Lureau
2020-11-24 14:39 ` Dr. David Alan Gilbert
2020-11-18 8:58 ` [PATCH 0/2] libvhost-user: lower dependency on QEMU headers Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201124113104.GD3366@work-vm \
--to=dgilbert@redhat.com \
--cc=armbru@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.