Skip to contentSkip to conversation

vhost: support for cross endian guests

PATCH In review Greg Kurz 5 participants 42 messages Apr 24, 2015 – Jun 1, 2015

Subsystems (7)
lore
Share & tools
lore

Greg Kurz

author
#0 lore raw

v6 cover vhost: support for cross endian guests

Only cosmetic and documentation changes since v5.

---

Greg Kurz (8):
virtio: introduce virtio_is_little_endian() helper
tun: add tun_is_little_endian() helper
macvtap: introduce macvtap_is_little_endian() helper
vringh: introduce vringh_is_little_endian() helper
vhost: introduce vhost_is_little_endian() helper
virtio: add explicit big-endian support to memory accessors
vhost: cross-endian support for legacy devices macvtap/tun: cross-endian support for little-endian hosts

 drivers/net/Kconfig              |   14 ++++++
 drivers/net/macvtap.c            |   66 +++++++++++++++++++++++++++++-
 drivers/net/tun.c                |   68 ++++++++++++++++++++++++++++++
 drivers/vhost/Kconfig            |   15 +++++++
 drivers/vhost/vhost.c            |   85 ++++++++++++++++++++++++++++++++++++++
 drivers/vhost/vhost.h            |   25 ++++++++---
 include/linux/virtio_byteorder.h |   24 ++++++-----
 include/linux/virtio_config.h    |   18 +++++---
 include/linux/vringh.h           |   18 +++++---
 include/uapi/linux/if_tun.h      |    6 +++
 include/uapi/linux/vhost.h       |   14 ++++++
 11 files changed, 320 insertions(+), 33 deletions(-)

--
Greg

author
#1 lore raw

PATCH v6 1/8 virtio: introduce virtio_is_little_endian() helper

---
 include/linux/virtio_config.h |   17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)
include/linux/virtio_config.h +11 -6
index ca3ed78..bd1a582 100644
@@ -205,35 +205,40 @@ int virtqueue_set_affinity(struct virtqueue *vq, int cpu)
 	return 0;
 }
 
+static inline bool virtio_is_little_endian(struct virtio_device *vdev)
+{
+	return virtio_has_feature(vdev, VIRTIO_F_VERSION_1);
+}
+
 /* Memory accessors */
 static inline u16 virtio16_to_cpu(struct virtio_device *vdev, __virtio16 val)
 {
-	return __virtio16_to_cpu(virtio_has_feature(vdev, VIRTIO_F_VERSION_1), val);
+	return __virtio16_to_cpu(virtio_is_little_endian(vdev), val);
 }
 
 static inline __virtio16 cpu_to_virtio16(struct virtio_device *vdev, u16 val)
 {
-	return __cpu_to_virtio16(virtio_has_feature(vdev, VIRTIO_F_VERSION_1), val);
+	return __cpu_to_virtio16(virtio_is_little_endian(vdev), val);
 }
 
 static inline u32 virtio32_to_cpu(struct virtio_device *vdev, __virtio32 val)
 {
-	return __virtio32_to_cpu(virtio_has_feature(vdev, VIRTIO_F_VERSION_1), val);
+	return __virtio32_to_cpu(virtio_is_little_endian(vdev), val);
 }
 
 static inline __virtio32 cpu_to_virtio32(struct virtio_device *vdev, u32 val)
 {
-	return __cpu_to_virtio32(virtio_has_feature(vdev, VIRTIO_F_VERSION_1), val);
+	return __cpu_to_virtio32(virtio_is_little_endian(vdev), val);
 }
 
 static inline u64 virtio64_to_cpu(struct virtio_device *vdev, __virtio64 val)
 {
-	return __virtio64_to_cpu(virtio_has_feature(vdev, VIRTIO_F_VERSION_1), val);
+	return __virtio64_to_cpu(virtio_is_little_endian(vdev), val);
 }
 
 static inline __virtio64 cpu_to_virtio64(struct virtio_device *vdev, u64 val)
 {
-	return __cpu_to_virtio64(virtio_has_feature(vdev, VIRTIO_F_VERSION_1), val);
+	return __cpu_to_virtio64(virtio_is_little_endian(vdev), val);
 }
 
 /* Config space accessors. */
Acked-by on v6 1/8
#2 lore raw

Re: [PATCH v6 1/8] virtio: introduce virtio_is_little_endian() helper

Quoted 10 lines · On Fri, 24 Apr 2015 14:24:27 +0200 Greg Kurz <[email protected]> wrote:
---
 include/linux/virtio_config.h |   17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)
include/linux/virtio_config.h +0 -0
index ca3ed78..bd1a582 100644

include/linux/virtio_config.h int virtqueue_set_affinity(struct virtqueue *vq, int cpu) · line 212

Quoted 8 lines
include/linux/virtio_config.h +5 -0
@@ -205,35 +205,40 @@ int virtqueue_set_affinity(struct virtqueue *vq, int cpu)
 	return 0;
 }
 
+static inline bool virtio_is_little_endian(struct virtio_device *vdev)
+{
+	return virtio_has_feature(vdev, VIRTIO_F_VERSION_1);
+}
+

While this reads a bit funny in this patch, it will end up correctly at the end of the series, so

Reviewed-by on v6 1/8
#4 lore raw

Re: [PATCH v6 1/8] virtio: introduce virtio_is_little_endian() helper

In reply to Greg Kurz
Quoted 1 line · Greg Kurz
Signature · 4 lines
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

author
#5 lore raw

PATCH v6 2/8 tun: add tun_is_little_endian() helper

In reply to Greg Kurz
---
 drivers/net/tun.c |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/tun.c +7 -2
index 857dca4..3c3d6c0 100644
@@ -206,14 +206,19 @@ struct tun_struct {
 	u32 flow_count;
 };
 
+static inline bool tun_is_little_endian(struct tun_struct *tun)
+{
+	return tun->flags & TUN_VNET_LE;
+}
+
 static inline u16 tun16_to_cpu(struct tun_struct *tun, __virtio16 val)
 {
-	return __virtio16_to_cpu(tun->flags & TUN_VNET_LE, val);
+	return __virtio16_to_cpu(tun_is_little_endian(tun), val);
 }
 
 static inline __virtio16 cpu_to_tun16(struct tun_struct *tun, u16 val)
 {
-	return __cpu_to_virtio16(tun->flags & TUN_VNET_LE, val);
+	return __cpu_to_virtio16(tun_is_little_endian(tun), val);
 }
 
 static inline u32 tun_hashfn(u32 rxhash)
Reviewed-by on v6 2/8
#8 lore raw

Re: [PATCH v6 2/8] tun: add tun_is_little_endian() helper

In reply to Greg Kurz
Quoted 1 line · Greg Kurz
Signature · 4 lines
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

#9 lore raw

Re: [PATCH v6 2/8] tun: add tun_is_little_endian() helper

In reply to Greg Kurz
Quoted 1 line · Greg Kurz

Dave, could you please ack merging this through
the virtio tree?

Quoted 35 lines
---
 drivers/net/tun.c |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/tun.c +7 -2
index 857dca4..3c3d6c0 100644
@@ -206,14 +206,19 @@ struct tun_struct {
 	u32 flow_count;
 };
 
+static inline bool tun_is_little_endian(struct tun_struct *tun)
+{
+	return tun->flags & TUN_VNET_LE;
+}
+
 static inline u16 tun16_to_cpu(struct tun_struct *tun, __virtio16 val)
 {
-	return __virtio16_to_cpu(tun->flags & TUN_VNET_LE, val);
+	return __virtio16_to_cpu(tun_is_little_endian(tun), val);
 }
 
 static inline __virtio16 cpu_to_tun16(struct tun_struct *tun, u16 val)
 {
-	return __cpu_to_virtio16(tun->flags & TUN_VNET_LE, val);
+	return __cpu_to_virtio16(tun_is_little_endian(tun), val);
 }
 
 static inline u32 tun_hashfn(u32 rxhash)

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

author
#11 lore raw

PATCH v6 3/8 macvtap: introduce macvtap_is_little_endian() helper

In reply to Greg Kurz
---
 drivers/net/macvtap.c |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/macvtap.c +7 -2
index 27ecc5c..a2f2958 100644
@@ -49,14 +49,19 @@ struct macvtap_queue {
 
 #define MACVTAP_VNET_LE 0x80000000
 
+static inline bool macvtap_is_little_endian(struct macvtap_queue *q)
+{
+	return q->flags & MACVTAP_VNET_LE;
+}
+
 static inline u16 macvtap16_to_cpu(struct macvtap_queue *q, __virtio16 val)
 {
-	return __virtio16_to_cpu(q->flags & MACVTAP_VNET_LE, val);
+	return __virtio16_to_cpu(macvtap_is_little_endian(q), val);
 }
 
 static inline __virtio16 cpu_to_macvtap16(struct macvtap_queue *q, u16 val)
 {
-	return __cpu_to_virtio16(q->flags & MACVTAP_VNET_LE, val);
+	return __cpu_to_virtio16(macvtap_is_little_endian(q), val);
 }
 
 static struct proto macvtap_proto = {
Reviewed-by on v6 3/8
#14 lore raw

Re: [PATCH v6 3/8] macvtap: introduce macvtap_is_little_endian() helper

In reply to Greg Kurz
Quoted 1 line · Greg Kurz
Signature · 4 lines
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

#15 lore raw

Re: [PATCH v6 3/8] macvtap: introduce macvtap_is_little_endian() helper

In reply to Greg Kurz
Quoted 1 line · Greg Kurz

Dave, could you pls ack merging this through the virtio tree?

Quoted 35 lines
---
 drivers/net/macvtap.c |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/macvtap.c +7 -2
index 27ecc5c..a2f2958 100644
@@ -49,14 +49,19 @@ struct macvtap_queue {
 
 #define MACVTAP_VNET_LE 0x80000000
 
+static inline bool macvtap_is_little_endian(struct macvtap_queue *q)
+{
+	return q->flags & MACVTAP_VNET_LE;
+}
+
 static inline u16 macvtap16_to_cpu(struct macvtap_queue *q, __virtio16 val)
 {
-	return __virtio16_to_cpu(q->flags & MACVTAP_VNET_LE, val);
+	return __virtio16_to_cpu(macvtap_is_little_endian(q), val);
 }
 
 static inline __virtio16 cpu_to_macvtap16(struct macvtap_queue *q, u16 val)
 {
-	return __cpu_to_virtio16(q->flags & MACVTAP_VNET_LE, val);
+	return __cpu_to_virtio16(macvtap_is_little_endian(q), val);
 }
 
 static struct proto macvtap_proto = {

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

author
#17 lore raw

PATCH v6 4/8 vringh: introduce vringh_is_little_endian() helper

In reply to Greg Kurz
---
 include/linux/vringh.h |   17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)
include/linux/vringh.h +11 -6
index a3fa537..3ed62ef 100644
@@ -226,33 +226,38 @@ static inline void vringh_notify(struct vringh *vrh)
 		vrh->notify(vrh);
 }
 
+static inline bool vringh_is_little_endian(const struct vringh *vrh)
+{
+	return vrh->little_endian;
+}
+
 static inline u16 vringh16_to_cpu(const struct vringh *vrh, __virtio16 val)
 {
-	return __virtio16_to_cpu(vrh->little_endian, val);
+	return __virtio16_to_cpu(vringh_is_little_endian(vrh), val);
 }
 
 static inline __virtio16 cpu_to_vringh16(const struct vringh *vrh, u16 val)
 {
-	return __cpu_to_virtio16(vrh->little_endian, val);
+	return __cpu_to_virtio16(vringh_is_little_endian(vrh), val);
 }
 
 static inline u32 vringh32_to_cpu(const struct vringh *vrh, __virtio32 val)
 {
-	return __virtio32_to_cpu(vrh->little_endian, val);
+	return __virtio32_to_cpu(vringh_is_little_endian(vrh), val);
 }
 
 static inline __virtio32 cpu_to_vringh32(const struct vringh *vrh, u32 val)
 {
-	return __cpu_to_virtio32(vrh->little_endian, val);
+	return __cpu_to_virtio32(vringh_is_little_endian(vrh), val);
 }
 
 static inline u64 vringh64_to_cpu(const struct vringh *vrh, __virtio64 val)
 {
-	return __virtio64_to_cpu(vrh->little_endian, val);
+	return __virtio64_to_cpu(vringh_is_little_endian(vrh), val);
 }
 
 static inline __virtio64 cpu_to_vringh64(const struct vringh *vrh, u64 val)
 {
-	return __cpu_to_virtio64(vrh->little_endian, val);
+	return __cpu_to_virtio64(vringh_is_little_endian(vrh), val);
 }
 #endif /* _LINUX_VRINGH_H */
Reviewed-by on v6 4/8
#20 lore raw

Re: [PATCH v6 4/8] vringh: introduce vringh_is_little_endian() helper

In reply to Greg Kurz
Quoted 1 line · Greg Kurz
Signature · 4 lines
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

author
#21 lore raw

PATCH v6 5/8 vhost: introduce vhost_is_little_endian() helper

In reply to Greg Kurz
---
 drivers/vhost/vhost.h |   17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)
drivers/vhost/vhost.h +11 -6
index 8c1c792..6a49960 100644
@@ -173,34 +173,39 @@ static inline bool vhost_has_feature(struct vhost_virtqueue *vq, int bit)
 	return vq->acked_features & (1ULL << bit);
 }
 
+static inline bool vhost_is_little_endian(struct vhost_virtqueue *vq)
+{
+	return vhost_has_feature(vq, VIRTIO_F_VERSION_1);
+}
+
 /* Memory accessors */
 static inline u16 vhost16_to_cpu(struct vhost_virtqueue *vq, __virtio16 val)
 {
-	return __virtio16_to_cpu(vhost_has_feature(vq, VIRTIO_F_VERSION_1), val);
+	return __virtio16_to_cpu(vhost_is_little_endian(vq), val);
 }
 
 static inline __virtio16 cpu_to_vhost16(struct vhost_virtqueue *vq, u16 val)
 {
-	return __cpu_to_virtio16(vhost_has_feature(vq, VIRTIO_F_VERSION_1), val);
+	return __cpu_to_virtio16(vhost_is_little_endian(vq), val);
 }
 
 static inline u32 vhost32_to_cpu(struct vhost_virtqueue *vq, __virtio32 val)
 {
-	return __virtio32_to_cpu(vhost_has_feature(vq, VIRTIO_F_VERSION_1), val);
+	return __virtio32_to_cpu(vhost_is_little_endian(vq), val);
 }
 
 static inline __virtio32 cpu_to_vhost32(struct vhost_virtqueue *vq, u32 val)
 {
-	return __cpu_to_virtio32(vhost_has_feature(vq, VIRTIO_F_VERSION_1), val);
+	return __cpu_to_virtio32(vhost_is_little_endian(vq), val);
 }
 
 static inline u64 vhost64_to_cpu(struct vhost_virtqueue *vq, __virtio64 val)
 {
-	return __virtio64_to_cpu(vhost_has_feature(vq, VIRTIO_F_VERSION_1), val);
+	return __virtio64_to_cpu(vhost_is_little_endian(vq), val);
 }
 
 static inline __virtio64 cpu_to_vhost64(struct vhost_virtqueue *vq, u64 val)
 {
-	return __cpu_to_virtio64(vhost_has_feature(vq, VIRTIO_F_VERSION_1), val);
+	return __cpu_to_virtio64(vhost_is_little_endian(vq), val);
 }
 #endif
Reviewed-by on v6 5/8
#24 lore raw

Re: [PATCH v6 5/8] vhost: introduce vhost_is_little_endian() helper

In reply to Greg Kurz
Quoted 1 line · Greg Kurz
Signature · 4 lines
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

author
#25 lore raw

PATCH v6 6/8 virtio: add explicit big-endian support to memory accessors

In reply to Greg Kurz

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.

---

Changes since v5:
- changed endian checking helpers as suggested by Thomas (use || and line breaker)

 drivers/net/macvtap.c            |    3 ++-
 drivers/net/tun.c                |    3 ++-
 drivers/vhost/vhost.h            |    3 ++-
 include/linux/virtio_byteorder.h |   24 ++++++++++++++----------
 include/linux/virtio_config.h    |    3 ++-
 include/linux/vringh.h           |    3 ++-
 6 files changed, 24 insertions(+), 15 deletions(-)
drivers/net/macvtap.c +2 -1
index a2f2958..0327d9d 100644
@@ -51,7 +51,8 @@ struct macvtap_queue {
 
 static inline bool macvtap_is_little_endian(struct macvtap_queue *q)
 {
-	return q->flags & MACVTAP_VNET_LE;
+	return q->flags & MACVTAP_VNET_LE ||
+		virtio_legacy_is_little_endian();
 }
 
 static inline u16 macvtap16_to_cpu(struct macvtap_queue *q, __virtio16 val)
drivers/net/tun.c +2 -1
index 3c3d6c0..7c4f6b6 100644
@@ -208,7 +208,8 @@ struct tun_struct {
 
 static inline bool tun_is_little_endian(struct tun_struct *tun)
 {
-	return tun->flags & TUN_VNET_LE;
+	return tun->flags & TUN_VNET_LE ||
+		virtio_legacy_is_little_endian();
 }
 
 static inline u16 tun16_to_cpu(struct tun_struct *tun, __virtio16 val)
drivers/vhost/vhost.h +2 -1
index 6a49960..a4fa33a 100644
@@ -175,7 +175,8 @@ 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) ||
+		virtio_legacy_is_little_endian();
 }
 
 /* Memory accessors */
include/linux/virtio_byteorder.h +14 -10
index 51865d0..ce63a2c 100644
@@ -3,17 +3,21 @@
 #include <linux/types.h>
 #include <uapi/linux/virtio_types.h>
 
-/*
- * Low-level memory accessors for handling virtio in modern little endian and in
- * compatibility native endian format.
- */
+static inline bool virtio_legacy_is_little_endian(void)
+{
+#ifdef __LITTLE_ENDIAN
+	return true;
+#else
+	return false;
+#endif
+}
 
 static inline u16 __virtio16_to_cpu(bool little_endian, __virtio16 val)
 {
 	if (little_endian)
 		return le16_to_cpu((__force __le16)val);
 	else
-		return (__force u16)val;
+		return be16_to_cpu((__force __be16)val);
 }
 
 static inline __virtio16 __cpu_to_virtio16(bool little_endian, u16 val)
@@ -21,7 +25,7 @@ static inline __virtio16 __cpu_to_virtio16(bool little_endian, u16 val)
 	if (little_endian)
 		return (__force __virtio16)cpu_to_le16(val);
 	else
-		return (__force __virtio16)val;
+		return (__force __virtio16)cpu_to_be16(val);
 }
 
 static inline u32 __virtio32_to_cpu(bool little_endian, __virtio32 val)
@@ -29,7 +33,7 @@ static inline u32 __virtio32_to_cpu(bool little_endian, __virtio32 val)
 	if (little_endian)
 		return le32_to_cpu((__force __le32)val);
 	else
-		return (__force u32)val;
+		return be32_to_cpu((__force __be32)val);
 }
 
 static inline __virtio32 __cpu_to_virtio32(bool little_endian, u32 val)
@@ -37,7 +41,7 @@ static inline __virtio32 __cpu_to_virtio32(bool little_endian, u32 val)
 	if (little_endian)
 		return (__force __virtio32)cpu_to_le32(val);
 	else
-		return (__force __virtio32)val;
+		return (__force __virtio32)cpu_to_be32(val);
 }
 
 static inline u64 __virtio64_to_cpu(bool little_endian, __virtio64 val)
@@ -45,7 +49,7 @@ static inline u64 __virtio64_to_cpu(bool little_endian, __virtio64 val)
 	if (little_endian)
 		return le64_to_cpu((__force __le64)val);
 	else
-		return (__force u64)val;
+		return be64_to_cpu((__force __be64)val);
 }
 
 static inline __virtio64 __cpu_to_virtio64(bool little_endian, u64 val)
@@ -53,7 +57,7 @@ static inline __virtio64 __cpu_to_virtio64(bool little_endian, u64 val)
 	if (little_endian)
 		return (__force __virtio64)cpu_to_le64(val);
 	else
-		return (__force __virtio64)val;
+		return (__force __virtio64)cpu_to_be64(val);
 }
 
 #endif /* _LINUX_VIRTIO_BYTEORDER */
include/linux/virtio_config.h +2 -1
index bd1a582..f64919e 100644
@@ -207,7 +207,8 @@ int virtqueue_set_affinity(struct virtqueue *vq, int cpu)
 
 static inline bool virtio_is_little_endian(struct virtio_device *vdev)
 {
-	return virtio_has_feature(vdev, VIRTIO_F_VERSION_1);
+	return virtio_has_feature(vdev, VIRTIO_F_VERSION_1) ||
+		virtio_legacy_is_little_endian();
 }
 
 /* Memory accessors */
include/linux/vringh.h +2 -1
index 3ed62ef..bc6c28d 100644
@@ -228,7 +228,8 @@ static inline void vringh_notify(struct vringh *vrh)
 
 static inline bool vringh_is_little_endian(const struct vringh *vrh)
 {
-	return vrh->little_endian;
+	return vrh->little_endian ||
+		virtio_legacy_is_little_endian();
 }
 
 static inline u16 vringh16_to_cpu(const struct vringh *vrh, __virtio16 val)
Reviewed-by on v6 6/8
#26 lore raw

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

Quoted 22 lines · On Fri, 24 Apr 2015 14:26:24 +0200 Greg Kurz…

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.

---

Changes since v5:
- changed endian checking helpers as suggested by Thomas (use || and line breaker)

Quoted 8 lines
 drivers/net/macvtap.c            |    3 ++-
 drivers/net/tun.c                |    3 ++-
 drivers/vhost/vhost.h            |    3 ++-
 include/linux/virtio_byteorder.h |   24 ++++++++++++++----------
 include/linux/virtio_config.h    |    3 ++-
 include/linux/vringh.h           |    3 ++-
 6 files changed, 24 insertions(+), 15 deletions(-)
Reviewed-by on v6 6/8
#27 lore raw

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

In reply to Greg Kurz
Quoted 22 lines · On Fri, 24 Apr 2015 14:26:24 +0200 Greg Kurz <[email protected]> wrote:

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.

---

Changes since v5:
- changed endian checking helpers as suggested by Thomas (use || and line breaker)

Quoted 8 lines
 drivers/net/macvtap.c            |    3 ++-
 drivers/net/tun.c                |    3 ++-
 drivers/vhost/vhost.h            |    3 ++-
 include/linux/virtio_byteorder.h |   24 ++++++++++++++----------
 include/linux/virtio_config.h    |    3 ++-
 include/linux/vringh.h           |    3 ++-
 6 files changed, 24 insertions(+), 15 deletions(-)
Reviewed-by on v6 6/8
#28 lore raw

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

In reply to Greg Kurz
Quoted 12 lines · Greg Kurz

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

Quoted 4 lines

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.

Signature · 4 lines
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

author
#29 lore raw

PATCH v6 7/8 vhost: cross-endian support for legacy devices

In reply to Greg Kurz

This patch brings cross-endian support to vhost when used to implement legacy virtio devices. Since it is a relatively rare situation, the feature availability is controlled by a kernel config option (not set by default).

The vq->is_le boolean field is added to cache the endianness to be used for ring accesses. It defaults to native endian, as expected by legacy virtio devices. When the ring gets active, we force little endian if the device is modern. When the ring is deactivated, we revert to the native endian default.

If cross-endian was compiled in, a vq->user_be boolean field is added so that userspace may request a specific endianness. This field is used to override the default when activating the ring of a legacy device. It has no effect on modern devices.

---

Changes since v5:
- fixed description in Kconfig
- fixed error description in uapi header
- dropped useless semi-colon in the vhost_vq_reset_user_be() stub

 drivers/vhost/Kconfig      |   15 ++++++++
 drivers/vhost/vhost.c      |   85 +++++++++++++++++++++++++++++++++++++++++++-
 drivers/vhost/vhost.h      |   11 +++++-
 include/uapi/linux/vhost.h |   14 +++++++
 4 files changed, 122 insertions(+), 3 deletions(-)
drivers/vhost/Kconfig +15 -0
index 017a1e8..533eaf0 100644
@@ -32,3 +32,18 @@ config VHOST
 	---help---
 	  This option is selected by any driver which needs to access
 	  the core of vhost.
+
+config VHOST_CROSS_ENDIAN_LEGACY
+	bool "Cross-endian support for vhost"
+	default n
+	---help---
+	  This option allows vhost to support guests with a different byte
+	  ordering from host while using legacy virtio.
+
+	  Userspace programs can control the feature using the
+	  VHOST_SET_VRING_ENDIAN and VHOST_GET_VRING_ENDIAN ioctls.
+
+	  This is only useful on a few platforms (ppc64 and arm64). Since it
+	  adds some overhead, it is disabled by default.
+
+	  If unsure, say "N".
drivers/vhost/vhost.c +84 -1

110 lines not on this page · raw message

drivers/vhost/vhost.h +9 -2
index a4fa33a..ce6f6da 100644
@@ -106,6 +106,14 @@ struct vhost_virtqueue {
 	/* Log write descriptors */
 	void __user *log_base;
 	struct vhost_log *log;
+
+	/* Ring endianness. Defaults to legacy native endianness.
+	 * Set to true when starting a modern virtio device. */
+	bool is_le;
+#ifdef CONFIG_VHOST_CROSS_ENDIAN_LEGACY
+	/* Ring endianness requested by userspace for cross-endian support. */
+	bool user_be;
+#endif
 };
 
 struct vhost_dev {
@@ -175,8 +183,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) ||
-		virtio_legacy_is_little_endian();
+	return vq->is_le;
 }
 
 /* Memory accessors */
include/uapi/linux/vhost.h +14 -0
index bb6a5b4..ab373191 100644
@@ -103,6 +103,20 @@ struct vhost_memory {
 /* Get accessor: reads index, writes value in num */
 #define VHOST_GET_VRING_BASE _IOWR(VHOST_VIRTIO, 0x12, struct vhost_vring_state)
 
+/* Set the vring byte order in num. Valid values are VHOST_VRING_LITTLE_ENDIAN
+ * or VHOST_VRING_BIG_ENDIAN (other values return -EINVAL).
+ * The byte order cannot be changed while the device is active: trying to do so
+ * returns -EBUSY.
+ * This is a legacy only API that is simply ignored when VIRTIO_F_VERSION_1 is
+ * set.
+ * Not all kernel configurations support this ioctl, but all configurations that
+ * support SET also support GET.
+ */
+#define VHOST_VRING_LITTLE_ENDIAN 0
+#define VHOST_VRING_BIG_ENDIAN 1
+#define VHOST_SET_VRING_ENDIAN _IOW(VHOST_VIRTIO, 0x13, struct vhost_vring_state)
+#define VHOST_GET_VRING_ENDIAN _IOW(VHOST_VIRTIO, 0x14, struct vhost_vring_state)
+
 /* The following ioctls use eventfd file descriptors to signal and poll
  * for events. */
Reviewed-by on v6 7/8
#30 lore raw

Re: [PATCH v6 7/8] vhost: cross-endian support for legacy devices

Quoted 24 lines · On Fri, 24 Apr 2015 14:27:24 +0200 Greg Kurz <[email protected]> wrote:

This patch brings cross-endian support to vhost when used to implement legacy virtio devices. Since it is a relatively rare situation, the feature availability is controlled by a kernel config option (not set by default).

The vq->is_le boolean field is added to cache the endianness to be used for ring accesses. It defaults to native endian, as expected by legacy virtio devices. When the ring gets active, we force little endian if the device is modern. When the ring is deactivated, we revert to the native endian default.

If cross-endian was compiled in, a vq->user_be boolean field is added so that userspace may request a specific endianness. This field is used to override the default when activating the ring of a legacy device. It has no effect on modern devices.

---

Changes since v5:
- fixed description in Kconfig
- fixed error description in uapi header
- dropped useless semi-colon in the vhost_vq_reset_user_be() stub

Quoted 6 lines
 drivers/vhost/Kconfig      |   15 ++++++++
 drivers/vhost/vhost.c      |   85 +++++++++++++++++++++++++++++++++++++++++++-
 drivers/vhost/vhost.h      |   11 +++++-
 include/uapi/linux/vhost.h |   14 +++++++
 4 files changed, 122 insertions(+), 3 deletions(-)
Reviewed-by on v6 7/8
#31 lore raw

Re: [PATCH v6 7/8] vhost: cross-endian support for legacy devices

In reply to Greg Kurz
Quoted 24 lines · On Fri, 24 Apr 2015 14:27:24 +0200 Greg Kurz <[email protected]> wrote:

This patch brings cross-endian support to vhost when used to implement legacy virtio devices. Since it is a relatively rare situation, the feature availability is controlled by a kernel config option (not set by default).

The vq->is_le boolean field is added to cache the endianness to be used for ring accesses. It defaults to native endian, as expected by legacy virtio devices. When the ring gets active, we force little endian if the device is modern. When the ring is deactivated, we revert to the native endian default.

If cross-endian was compiled in, a vq->user_be boolean field is added so that userspace may request a specific endianness. This field is used to override the default when activating the ring of a legacy device. It has no effect on modern devices.

---

Changes since v5:
- fixed description in Kconfig
- fixed error description in uapi header
- dropped useless semi-colon in the vhost_vq_reset_user_be() stub

Quoted 6 lines
 drivers/vhost/Kconfig      |   15 ++++++++
 drivers/vhost/vhost.c      |   85 +++++++++++++++++++++++++++++++++++++++++++-
 drivers/vhost/vhost.h      |   11 +++++-
 include/uapi/linux/vhost.h |   14 +++++++
 4 files changed, 122 insertions(+), 3 deletions(-)
Reviewed-by on v6 7/8
#32 lore raw

Re: [PATCH v6 7/8] vhost: cross-endian support for legacy devices

In reply to Greg Kurz
Quoted 11 lines · Greg Kurz

This patch brings cross-endian support to vhost when used to implement legacy virtio devices. Since it is a relatively rare situation, the feature availability is controlled by a kernel config option (not set by default).

The vq->is_le boolean field is added to cache the endianness to be used for ring accesses. It defaults to native endian, as expected by legacy virtio devices. When the ring gets active, we force little endian if the device is modern. When the ring is deactivated, we revert to the native endian default.

Quoted 6 lines

If cross-endian was compiled in, a vq->user_be boolean field is added so that userspace may request a specific endianness. This field is used to override the default when activating the ring of a legacy device. It has no effect on modern devices.

Signature · 4 lines
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

author
#33 lore raw

PATCH v6 8/8 macvtap/tun: cross-endian support for little-endian hosts

In reply to Greg Kurz

The VNET_LE flag was introduced to fix accesses to virtio 1.0 headers that are always little-endian. It can also be used to handle the special case of a legacy little-endian device implemented by a big-endian host.

Let's add a flag and ioctls for big-endian devices as well. If both flags are set, little-endian wins.

Since this is isn't a common usecase, the feature is controlled by a kernel config option (not set by default).

Both macvtap and tun are covered by this patch since they share the same API with userland.

---

Changes since v5:
- changed {macvtapi,tun}_legacy_is_little_endian() to use ?:

 drivers/net/Kconfig         |   14 ++++++++++
 drivers/net/macvtap.c       |   57 +++++++++++++++++++++++++++++++++++++++++-
 drivers/net/tun.c           |   59 ++++++++++++++++++++++++++++++++++++++++++-
 include/uapi/linux/if_tun.h |    6 ++++
 4 files changed, 134 insertions(+), 2 deletions(-)
drivers/net/Kconfig +14 -0
index df51d60..71ac0ec 100644
@@ -244,6 +244,20 @@ config TUN
 
 	  If you don't know what to use this for, you don't need it.
 
+config TUN_VNET_CROSS_LE
+	bool "Support for cross-endian vnet headers on little-endian kernels"
+	default n
+	---help---
+	  This option allows TUN/TAP and MACVTAP device drivers in a
+	  little-endian kernel to parse vnet headers that come from a
+	  big-endian legacy virtio device.
+
+	  Userspace programs can control the feature using the TUNSETVNETBE
+	  and TUNGETVNETBE ioctls.
+
+	  Unless you have a little-endian system hosting a big-endian virtual
+	  machine with a legacy virtio NIC, you should say N.
+
 config VETH
 	tristate "Virtual ethernet pair device"
 	---help---
drivers/net/macvtap.c +56 -1

73 lines not on this page · raw message

drivers/net/tun.c +58 -1

80 lines not on this page · raw message

include/uapi/linux/if_tun.h +6 -0
index 50ae243..3cb5e1d 100644
@@ -50,6 +50,12 @@
 #define TUNGETFILTER _IOR('T', 219, struct sock_fprog)
 #define TUNSETVNETLE _IOW('T', 220, int)
 #define TUNGETVNETLE _IOR('T', 221, int)
+/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on
+ * little-endian hosts. Not all kernel configurations support them, but all
+ * configurations that support SET also support GET.
+ */
+#define TUNSETVNETBE _IOW('T', 222, int)
+#define TUNGETVNETBE _IOR('T', 223, int)
 
 /* TUNSETIFF ifr flags */
 #define IFF_TUN		0x0001
Reviewed-by on v6 8/8
#34 lore raw

Re: [PATCH v6 8/8] macvtap/tun: cross-endian support for little-endian hosts

Quoted 7 lines · Greg Kurz

The VNET_LE flag was introduced to fix accesses to virtio 1.0 headers that are always little-endian. It can also be used to handle the special case of a legacy little-endian device implemented by a big-endian host.

Let's add a flag and ioctls for big-endian devices as well. If both flags are set, little-endian wins.

Quoted 7 lines

Since this is isn't a common usecase, the feature is controlled by a kernel config option (not set by default).

Both macvtap and tun are covered by this patch since they share the same API with userland.

Signature · 4 lines
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

#35 lore raw
In reply to Greg Kurz
Quoted 3 lines · Greg Kurz

Only cosmetic and documentation changes since v5.

---

Looks sane to me. I plan to review and apply next week.

Quoted 26 lines

Greg Kurz (8):
virtio: introduce virtio_is_little_endian() helper
tun: add tun_is_little_endian() helper
macvtap: introduce macvtap_is_little_endian() helper
vringh: introduce vringh_is_little_endian() helper
vhost: introduce vhost_is_little_endian() helper
virtio: add explicit big-endian support to memory accessors
vhost: cross-endian support for legacy devices macvtap/tun: cross-endian support for little-endian hosts

 drivers/net/Kconfig              |   14 ++++++
 drivers/net/macvtap.c            |   66 +++++++++++++++++++++++++++++-
 drivers/net/tun.c                |   68 ++++++++++++++++++++++++++++++
 drivers/vhost/Kconfig            |   15 +++++++
 drivers/vhost/vhost.c            |   85 ++++++++++++++++++++++++++++++++++++++
 drivers/vhost/vhost.h            |   25 ++++++++---
 include/linux/virtio_byteorder.h |   24 ++++++-----
 include/linux/virtio_config.h    |   18 +++++---
 include/linux/vringh.h           |   18 +++++---
 include/uapi/linux/if_tun.h      |    6 +++
 include/uapi/linux/vhost.h       |   14 ++++++
 11 files changed, 320 insertions(+), 33 deletions(-)

--
Greg

author
#36 lore raw
Quoted 7 lines · On Fri, 24 Apr 2015 15:31:54 +0200 "Michael S. Tsirkin"…
Quoted 3 lines · Greg Kurz

Only cosmetic and documentation changes since v5.

---

Looks sane to me. I plan to review and apply next week.

Hi Michael,

I realize you just got back and have tons of things to do... Do you still plan to apply shortly ? Would you also have time to comment the QEMU part ?

Thanks.

--
Greg

Quoted 27 lines
Quoted 26 lines

Greg Kurz (8):
virtio: introduce virtio_is_little_endian() helper
tun: add tun_is_little_endian() helper
macvtap: introduce macvtap_is_little_endian() helper
vringh: introduce vringh_is_little_endian() helper
vhost: introduce vhost_is_little_endian() helper
virtio: add explicit big-endian support to memory accessors
vhost: cross-endian support for legacy devices macvtap/tun: cross-endian support for little-endian hosts

 drivers/net/Kconfig              |   14 ++++++
 drivers/net/macvtap.c            |   66 +++++++++++++++++++++++++++++-
 drivers/net/tun.c                |   68 ++++++++++++++++++++++++++++++
 drivers/vhost/Kconfig            |   15 +++++++
 drivers/vhost/vhost.c            |   85 ++++++++++++++++++++++++++++++++++++++
 drivers/vhost/vhost.h            |   25 ++++++++---
 include/linux/virtio_byteorder.h |   24 ++++++-----
 include/linux/virtio_config.h    |   18 +++++---
 include/linux/vringh.h           |   18 +++++---
 include/uapi/linux/if_tun.h      |    6 +++
 include/uapi/linux/vhost.h       |   14 ++++++
 11 files changed, 320 insertions(+), 33 deletions(-)

--
Greg

#37 lore raw
Quoted 13 lines · Greg Kurz
Quoted 7 lines · On Fri, 24 Apr 2015 15:31:54 +0200 "Michael S. Tsirkin"…
Quoted 3 lines · Greg Kurz

Only cosmetic and documentation changes since v5.

---

Looks sane to me. I plan to review and apply next week.

Hi Michael,

Quoted 8 lines

I realize you just got back and have tons of things to do... Do you still plan to apply shortly ? Would you also have time to comment the QEMU part ?

Thanks.

--
Greg

Yes, sorry about the delay - I also got virtio upstream landed on my lap. I'll do my best to prioritize.

Quoted 27 lines
Quoted 27 lines
Quoted 26 lines

Greg Kurz (8):
virtio: introduce virtio_is_little_endian() helper
tun: add tun_is_little_endian() helper
macvtap: introduce macvtap_is_little_endian() helper
vringh: introduce vringh_is_little_endian() helper
vhost: introduce vhost_is_little_endian() helper
virtio: add explicit big-endian support to memory accessors
vhost: cross-endian support for legacy devices macvtap/tun: cross-endian support for little-endian hosts

 drivers/net/Kconfig              |   14 ++++++
 drivers/net/macvtap.c            |   66 +++++++++++++++++++++++++++++-
 drivers/net/tun.c                |   68 ++++++++++++++++++++++++++++++
 drivers/vhost/Kconfig            |   15 +++++++
 drivers/vhost/vhost.c            |   85 ++++++++++++++++++++++++++++++++++++++
 drivers/vhost/vhost.h            |   25 ++++++++---
 include/linux/virtio_byteorder.h |   24 ++++++-----
 include/linux/virtio_config.h    |   18 +++++---
 include/linux/vringh.h           |   18 +++++---
 include/uapi/linux/if_tun.h      |    6 +++
 include/uapi/linux/vhost.h       |   14 ++++++
 11 files changed, 320 insertions(+), 33 deletions(-)

--
Greg

author
#38 lore raw
Quoted 18 lines · On Tue, 12 May 2015 12:52:55 +0200 "Michael S. Tsirkin" <[email protected]> wrote:
Quoted 17 lines · Greg Kurz
Quoted 7 lines · On Fri, 24 Apr 2015 15:31:54 +0200 "Michael S. Tsirkin" <[email protected]> wrote:
Quoted 3 lines · Greg Kurz

Only cosmetic and documentation changes since v5.

---

Looks sane to me. I plan to review and apply next week.

Hi Michael,

I realize you just got back and have tons of things to do... Do you still plan to apply shortly ? Would you also have time to comment the QEMU part ?

Quoted 8 lines
Quoted 4 lines

Thanks.

--
Greg

Yes, sorry about the delay - I also got virtio upstream landed on my lap. I'll do my best to prioritize.

Hi Michael,

This is just a friendly reminder. Are there chances you pick up this kernel series before virtio 1.0 is in upstream QEMU ?

Cheers.

--
Greg

Quoted 28 lines
Quoted 27 lines
Quoted 27 lines
Quoted 26 lines

Greg Kurz (8):
virtio: introduce virtio_is_little_endian() helper
tun: add tun_is_little_endian() helper
macvtap: introduce macvtap_is_little_endian() helper
vringh: introduce vringh_is_little_endian() helper
vhost: introduce vhost_is_little_endian() helper
virtio: add explicit big-endian support to memory accessors
vhost: cross-endian support for legacy devices macvtap/tun: cross-endian support for little-endian hosts

 drivers/net/Kconfig              |   14 ++++++
 drivers/net/macvtap.c            |   66 +++++++++++++++++++++++++++++-
 drivers/net/tun.c                |   68 ++++++++++++++++++++++++++++++
 drivers/vhost/Kconfig            |   15 +++++++
 drivers/vhost/vhost.c            |   85 ++++++++++++++++++++++++++++++++++++++
 drivers/vhost/vhost.h            |   25 ++++++++---
 include/linux/virtio_byteorder.h |   24 ++++++-----
 include/linux/virtio_config.h    |   18 +++++---
 include/linux/vringh.h           |   18 +++++---
 include/uapi/linux/if_tun.h      |    6 +++
 include/uapi/linux/vhost.h       |   14 ++++++
 11 files changed, 320 insertions(+), 33 deletions(-)

--
Greg

#39 lore raw
In reply to Greg Kurz
Quoted 13 lines · Greg Kurz
Quoted 7 lines · On Fri, 24 Apr 2015 15:31:54 +0200 "Michael S. Tsirkin" <[email protected]> wrote:
Quoted 3 lines · Greg Kurz

Only cosmetic and documentation changes since v5.

---

Looks sane to me. I plan to review and apply next week.

Hi Michael,

Quoted 8 lines

I realize you just got back and have tons of things to do... Do you still plan to apply shortly ? Would you also have time to comment the QEMU part ?

Thanks.

--
Greg

Yes, sorry about the delay - I also got virtio upstream landed on my lap. I'll do my best to prioritize.

Quoted 27 lines
Quoted 27 lines
Quoted 26 lines

Greg Kurz (8):
virtio: introduce virtio_is_little_endian() helper
tun: add tun_is_little_endian() helper
macvtap: introduce macvtap_is_little_endian() helper
vringh: introduce vringh_is_little_endian() helper
vhost: introduce vhost_is_little_endian() helper
virtio: add explicit big-endian support to memory accessors
vhost: cross-endian support for legacy devices macvtap/tun: cross-endian support for little-endian hosts

 drivers/net/Kconfig              |   14 ++++++
 drivers/net/macvtap.c            |   66 +++++++++++++++++++++++++++++-
 drivers/net/tun.c                |   68 ++++++++++++++++++++++++++++++
 drivers/vhost/Kconfig            |   15 +++++++
 drivers/vhost/vhost.c            |   85 ++++++++++++++++++++++++++++++++++++++
 drivers/vhost/vhost.h            |   25 ++++++++---
 include/linux/virtio_byteorder.h |   24 ++++++-----
 include/linux/virtio_config.h    |   18 +++++---
 include/linux/vringh.h           |   18 +++++---
 include/uapi/linux/if_tun.h      |    6 +++
 include/uapi/linux/vhost.h       |   14 ++++++
 11 files changed, 320 insertions(+), 33 deletions(-)

--
Greg

author
#40 lore raw
In reply to Michael S. Tsirkin
Quoted 7 lines · On Fri, 24 Apr 2015 15:31:54 +0200 "Michael S. Tsirkin" <[email protected]> wrote:
Quoted 3 lines · Greg Kurz

Only cosmetic and documentation changes since v5.

---

Looks sane to me. I plan to review and apply next week.

Hi Michael,

I realize you just got back and have tons of things to do... Do you still plan to apply shortly ? Would you also have time to comment the QEMU part ?

Thanks.

--
Greg

Quoted 27 lines
Quoted 26 lines

Greg Kurz (8):
virtio: introduce virtio_is_little_endian() helper
tun: add tun_is_little_endian() helper
macvtap: introduce macvtap_is_little_endian() helper
vringh: introduce vringh_is_little_endian() helper
vhost: introduce vhost_is_little_endian() helper
virtio: add explicit big-endian support to memory accessors
vhost: cross-endian support for legacy devices macvtap/tun: cross-endian support for little-endian hosts

 drivers/net/Kconfig              |   14 ++++++
 drivers/net/macvtap.c            |   66 +++++++++++++++++++++++++++++-
 drivers/net/tun.c                |   68 ++++++++++++++++++++++++++++++
 drivers/vhost/Kconfig            |   15 +++++++
 drivers/vhost/vhost.c            |   85 ++++++++++++++++++++++++++++++++++++++
 drivers/vhost/vhost.h            |   25 ++++++++---
 include/linux/virtio_byteorder.h |   24 ++++++-----
 include/linux/virtio_config.h    |   18 +++++---
 include/linux/vringh.h           |   18 +++++---
 include/uapi/linux/if_tun.h      |    6 +++
 include/uapi/linux/vhost.h       |   14 ++++++
 11 files changed, 320 insertions(+), 33 deletions(-)

--
Greg

#41 lore raw
In reply to Greg Kurz
Quoted 3 lines · Greg Kurz

Only cosmetic and documentation changes since v5.

---

Looks sane to me. I plan to review and apply next week.

Quoted 26 lines

Greg Kurz (8):
virtio: introduce virtio_is_little_endian() helper
tun: add tun_is_little_endian() helper
macvtap: introduce macvtap_is_little_endian() helper
vringh: introduce vringh_is_little_endian() helper
vhost: introduce vhost_is_little_endian() helper
virtio: add explicit big-endian support to memory accessors
vhost: cross-endian support for legacy devices macvtap/tun: cross-endian support for little-endian hosts

 drivers/net/Kconfig              |   14 ++++++
 drivers/net/macvtap.c            |   66 +++++++++++++++++++++++++++++-
 drivers/net/tun.c                |   68 ++++++++++++++++++++++++++++++
 drivers/vhost/Kconfig            |   15 +++++++
 drivers/vhost/vhost.c            |   85 ++++++++++++++++++++++++++++++++++++++
 drivers/vhost/vhost.h            |   25 ++++++++---
 include/linux/virtio_byteorder.h |   24 ++++++-----
 include/linux/virtio_config.h    |   18 +++++---
 include/linux/vringh.h           |   18 +++++---
 include/uapi/linux/if_tun.h      |    6 +++
 include/uapi/linux/vhost.h       |   14 ++++++
 11 files changed, 320 insertions(+), 33 deletions(-)

--
Greg