Thread (22 messages) 22 messages, 3 authors, 2015-04-24

Re: [PATCH v5 6/8] virtio: add explicit big-endian support to memory accessors

flat view

From: Thomas Huth <hidden>
Date: 2015-04-23 19:27:40
Also in: kvm, lkml

On Thu, 23 Apr 2015 17:29:06 +0200
Greg Kurz [off-list ref] wrote:
quoted hunk ↗ jump to hunk
The current memory accessors logic is:
- little endian if little_endian
- native endian (i.e. no byteswap) if !little_endian

If we want to fully support cross-endian vhost, we also need to be
able to convert to big endian.

Instead of changing the little_endian argument to some 3-value enum, this
patch changes the logic to:
- little endian if little_endian
- big endian if !little_endian

The native endian case is handled by all users with a trivial helper. This
patch doesn't change any functionality, nor it does add overhead.

Signed-off-by: Greg Kurz <redacted>
---

Changes since v4:
- style fixes (I have chosen if ... else in most places to stay below
  80 columns, with the notable exception of the vhost helper which gets
  shorten in a later patch)

 drivers/net/macvtap.c            |    5 ++++-
 drivers/net/tun.c                |    5 ++++-
 drivers/vhost/vhost.h            |    2 +-
 include/linux/virtio_byteorder.h |   24 ++++++++++++++----------
 include/linux/virtio_config.h    |    5 ++++-
 include/linux/vringh.h           |    2 +-
 6 files changed, 28 insertions(+), 15 deletions(-)
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index a2f2958..6cf6b3e 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -51,7 +51,10 @@ struct macvtap_queue {
 
 static inline bool macvtap_is_little_endian(struct macvtap_queue *q)
 {
-	return q->flags & MACVTAP_VNET_LE;
+	if (q->flags & MACVTAP_VNET_LE)
+		return true;
+	else
+		return virtio_legacy_is_little_endian();
simply:

	return (q->flags & MACVTAP_VNET_LE) ||
	       virtio_legacy_is_little_endian();

?
quoted hunk ↗ jump to hunk
 }
 
 static inline u16 macvtap16_to_cpu(struct macvtap_queue *q, __virtio16 val)
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 3c3d6c0..5b044d4 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -208,7 +208,10 @@ struct tun_struct {
 
 static inline bool tun_is_little_endian(struct tun_struct *tun)
 {
-	return tun->flags & TUN_VNET_LE;
+	if (tun->flags & TUN_VNET_LE)
+		return true;
+	else
+		return virtio_legacy_is_little_endian();
dito?
quoted hunk ↗ jump to hunk
 }
 
 static inline u16 tun16_to_cpu(struct tun_struct *tun, __virtio16 val)
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
index 6a49960..954c657 100644
--- a/drivers/vhost/vhost.h
+++ b/drivers/vhost/vhost.h
@@ -175,7 +175,7 @@ static inline bool vhost_has_feature(struct vhost_virtqueue *vq, int bit)
 
 static inline bool vhost_is_little_endian(struct vhost_virtqueue *vq)
 {
-	return vhost_has_feature(vq, VIRTIO_F_VERSION_1);
+	return vhost_has_feature(vq, VIRTIO_F_VERSION_1) ? true : virtio_legacy_is_little_endian();
 }
That line is way longer than 80 characters ... may I suggest to switch
at least here to:

	return vhost_has_feature(vq, VIRTIO_F_VERSION_1) ||
	       virtio_legacy_is_little_endian();

?

Apart from the cosmetics, the patch looks good to me.

 Thomas
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help