* [Qemu-devel] [PATCH 0/3] virtio: cross-endian helpers fixes @ 2015-11-09 17:58 Greg Kurz 2015-11-09 17:58 ` [Qemu-devel] [PATCH 1/3] virtio: move cross-endian helper to vhost Greg Kurz ` (2 more replies) 0 siblings, 3 replies; 11+ messages in thread From: Greg Kurz @ 2015-11-09 17:58 UTC (permalink / raw) To: Michael S. Tsirkin; +Cc: qemu-devel This series tries to rework cross-endian helpers for better clarity. It does not change behaviour, except perhaps patch 3/3 even if I could not measure any performance gain. --- Greg Kurz (3): virtio: move cross-endian helper to vhost vhost: move virtio 1.0 check to cross-endian helper virtio: optimize virtio_access_is_big_endian() for little-endian targets hw/virtio/vhost.c | 22 ++++++++++++--- include/hw/virtio/virtio-access.h | 56 +++++++++++++++---------------------- 2 files changed, 41 insertions(+), 37 deletions(-) ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 1/3] virtio: move cross-endian helper to vhost 2015-11-09 17:58 [Qemu-devel] [PATCH 0/3] virtio: cross-endian helpers fixes Greg Kurz @ 2015-11-09 17:58 ` Greg Kurz 2015-11-12 18:00 ` Cornelia Huck 2015-11-09 17:58 ` [Qemu-devel] [PATCH 2/3] vhost: move virtio 1.0 check to cross-endian helper Greg Kurz 2015-11-09 17:58 ` [Qemu-devel] [PATCH 3/3] virtio: optimize virtio_access_is_big_endian() for little-endian targets Greg Kurz 2 siblings, 1 reply; 11+ messages in thread From: Greg Kurz @ 2015-11-09 17:58 UTC (permalink / raw) To: Michael S. Tsirkin; +Cc: qemu-devel If target is bi-endian (ppc64, arm), the virtio_legacy_is_cross_endian() indeed returns the runtime state of the virtio device. However, it returns false unconditionally in the general case. This sounds a bit strange given the name of the function. This helper is only useful for vhost actually, where indeed non bi-endian targets don't have to deal with cross-endian issues. This patch moves the helper to vhost.c and gives it a more appropriate name. Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> --- hw/virtio/vhost.c | 17 +++++++++++++++-- include/hw/virtio/virtio-access.h | 13 ------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index de29968a7945..2e1e792d599e 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -748,6 +748,19 @@ static void vhost_log_stop(MemoryListener *listener, /* FIXME: implement */ } +static inline bool vhost_needs_vring_endian(VirtIODevice *vdev) +{ +#ifdef TARGET_IS_BIENDIAN +#ifdef HOST_WORDS_BIGENDIAN + return !virtio_is_big_endian(vdev); +#else + return virtio_is_big_endian(vdev); +#endif +#else + return false; +#endif +} + static int vhost_virtqueue_set_vring_endian_legacy(struct vhost_dev *dev, bool is_big_endian, int vhost_vq_index) @@ -799,7 +812,7 @@ static int vhost_virtqueue_start(struct vhost_dev *dev, } if (!virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1) && - virtio_legacy_is_cross_endian(vdev)) { + vhost_needs_vring_endian(vdev)) { r = vhost_virtqueue_set_vring_endian_legacy(dev, virtio_is_big_endian(vdev), vhost_vq_index); @@ -896,7 +909,7 @@ static void vhost_virtqueue_stop(struct vhost_dev *dev, * native as legacy devices expect so by default. */ if (!virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1) && - virtio_legacy_is_cross_endian(vdev)) { + vhost_needs_vring_endian(vdev)) { r = vhost_virtqueue_set_vring_endian_legacy(dev, !virtio_is_big_endian(vdev), vhost_vq_index); diff --git a/include/hw/virtio/virtio-access.h b/include/hw/virtio/virtio-access.h index 8aec843c8ff3..ba1530619939 100644 --- a/include/hw/virtio/virtio-access.h +++ b/include/hw/virtio/virtio-access.h @@ -32,19 +32,6 @@ static inline bool virtio_access_is_big_endian(VirtIODevice *vdev) #endif } -static inline bool virtio_legacy_is_cross_endian(VirtIODevice *vdev) -{ -#ifdef TARGET_IS_BIENDIAN -#ifdef HOST_WORDS_BIGENDIAN - return !virtio_is_big_endian(vdev); -#else - return virtio_is_big_endian(vdev); -#endif -#else - return false; -#endif -} - static inline uint16_t virtio_lduw_phys(VirtIODevice *vdev, hwaddr pa) { if (virtio_access_is_big_endian(vdev)) { ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 1/3] virtio: move cross-endian helper to vhost 2015-11-09 17:58 ` [Qemu-devel] [PATCH 1/3] virtio: move cross-endian helper to vhost Greg Kurz @ 2015-11-12 18:00 ` Cornelia Huck 2015-11-13 8:28 ` Greg Kurz 0 siblings, 1 reply; 11+ messages in thread From: Cornelia Huck @ 2015-11-12 18:00 UTC (permalink / raw) To: Greg Kurz; +Cc: qemu-devel, Michael S. Tsirkin On Mon, 09 Nov 2015 18:58:16 +0100 Greg Kurz <gkurz@linux.vnet.ibm.com> wrote: > If target is bi-endian (ppc64, arm), the virtio_legacy_is_cross_endian() > indeed returns the runtime state of the virtio device. However, it returns > false unconditionally in the general case. This sounds a bit strange > given the name of the function. > > This helper is only useful for vhost actually, where indeed non bi-endian > targets don't have to deal with cross-endian issues. > > This patch moves the helper to vhost.c and gives it a more appropriate name. > > Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> > --- > hw/virtio/vhost.c | 17 +++++++++++++++-- > include/hw/virtio/virtio-access.h | 13 ------------- > 2 files changed, 15 insertions(+), 15 deletions(-) That's on top of your vnet header cleanup, right? With that in mind: Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 1/3] virtio: move cross-endian helper to vhost 2015-11-12 18:00 ` Cornelia Huck @ 2015-11-13 8:28 ` Greg Kurz 0 siblings, 0 replies; 11+ messages in thread From: Greg Kurz @ 2015-11-13 8:28 UTC (permalink / raw) To: Cornelia Huck; +Cc: qemu-devel, Michael S. Tsirkin On Thu, 12 Nov 2015 19:00:54 +0100 Cornelia Huck <cornelia.huck@de.ibm.com> wrote: > On Mon, 09 Nov 2015 18:58:16 +0100 > Greg Kurz <gkurz@linux.vnet.ibm.com> wrote: > > > If target is bi-endian (ppc64, arm), the virtio_legacy_is_cross_endian() > > indeed returns the runtime state of the virtio device. However, it returns > > false unconditionally in the general case. This sounds a bit strange > > given the name of the function. > > > > This helper is only useful for vhost actually, where indeed non bi-endian > > targets don't have to deal with cross-endian issues. > > > > This patch moves the helper to vhost.c and gives it a more appropriate name. > > > > Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> > > --- > > hw/virtio/vhost.c | 17 +++++++++++++++-- > > include/hw/virtio/virtio-access.h | 13 ------------- > > 2 files changed, 15 insertions(+), 15 deletions(-) > > That's on top of your vnet header cleanup, right? With that in mind: > Yes. > Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Thanks for your time ! -- Greg ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 2/3] vhost: move virtio 1.0 check to cross-endian helper 2015-11-09 17:58 [Qemu-devel] [PATCH 0/3] virtio: cross-endian helpers fixes Greg Kurz 2015-11-09 17:58 ` [Qemu-devel] [PATCH 1/3] virtio: move cross-endian helper to vhost Greg Kurz @ 2015-11-09 17:58 ` Greg Kurz 2015-11-12 18:03 ` Cornelia Huck 2015-11-09 17:58 ` [Qemu-devel] [PATCH 3/3] virtio: optimize virtio_access_is_big_endian() for little-endian targets Greg Kurz 2 siblings, 1 reply; 11+ messages in thread From: Greg Kurz @ 2015-11-09 17:58 UTC (permalink / raw) To: Michael S. Tsirkin; +Cc: qemu-devel Indeed vhost doesn't need to ask for vring endian fixing if the device is virtio 1.0, since it is already handled by the in-kernel vhost driver. This patch simply consolidates the logic into the existing helper. Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> --- hw/virtio/vhost.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 2e1e792d599e..aef750df22ad 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -750,6 +750,9 @@ static void vhost_log_stop(MemoryListener *listener, static inline bool vhost_needs_vring_endian(VirtIODevice *vdev) { + if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) { + return false; + } #ifdef TARGET_IS_BIENDIAN #ifdef HOST_WORDS_BIGENDIAN return !virtio_is_big_endian(vdev); @@ -811,8 +814,7 @@ static int vhost_virtqueue_start(struct vhost_dev *dev, return -errno; } - if (!virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1) && - vhost_needs_vring_endian(vdev)) { + if (vhost_needs_vring_endian(vdev)) { r = vhost_virtqueue_set_vring_endian_legacy(dev, virtio_is_big_endian(vdev), vhost_vq_index); @@ -908,8 +910,7 @@ static void vhost_virtqueue_stop(struct vhost_dev *dev, /* In the cross-endian case, we need to reset the vring endianness to * native as legacy devices expect so by default. */ - if (!virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1) && - vhost_needs_vring_endian(vdev)) { + if (vhost_needs_vring_endian(vdev)) { r = vhost_virtqueue_set_vring_endian_legacy(dev, !virtio_is_big_endian(vdev), vhost_vq_index); ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 2/3] vhost: move virtio 1.0 check to cross-endian helper 2015-11-09 17:58 ` [Qemu-devel] [PATCH 2/3] vhost: move virtio 1.0 check to cross-endian helper Greg Kurz @ 2015-11-12 18:03 ` Cornelia Huck 0 siblings, 0 replies; 11+ messages in thread From: Cornelia Huck @ 2015-11-12 18:03 UTC (permalink / raw) To: Greg Kurz; +Cc: qemu-devel, Michael S. Tsirkin On Mon, 09 Nov 2015 18:58:25 +0100 Greg Kurz <gkurz@linux.vnet.ibm.com> wrote: > Indeed vhost doesn't need to ask for vring endian fixing if the device is > virtio 1.0, since it is already handled by the in-kernel vhost driver. This > patch simply consolidates the logic into the existing helper. > > Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> > --- > hw/virtio/vhost.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 3/3] virtio: optimize virtio_access_is_big_endian() for little-endian targets 2015-11-09 17:58 [Qemu-devel] [PATCH 0/3] virtio: cross-endian helpers fixes Greg Kurz 2015-11-09 17:58 ` [Qemu-devel] [PATCH 1/3] virtio: move cross-endian helper to vhost Greg Kurz 2015-11-09 17:58 ` [Qemu-devel] [PATCH 2/3] vhost: move virtio 1.0 check to cross-endian helper Greg Kurz @ 2015-11-09 17:58 ` Greg Kurz 2015-11-12 18:08 ` Cornelia Huck 2 siblings, 1 reply; 11+ messages in thread From: Greg Kurz @ 2015-11-09 17:58 UTC (permalink / raw) To: Michael S. Tsirkin; +Cc: qemu-devel When adding cross-endian support, we introduced the TARGET_IS_BIENDIAN macro and the virtio_access_is_big_endian() helper to have a branchless fast path in the virtio memory accessors for targets that don't switch endian. This was considered as a strong requirement at the time. Now we have added a runtime check for virtio 1.0, which ruins the benefit of the virtio_access_is_big_endian() helper for always little-endian targets. With this patch, fixed little-endian targets stop checking for virtio 1.0, since the result is little-endian in all cases. The helper also gets renamed so it is clear it is optimized for fast paths. Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> --- include/hw/virtio/virtio-access.h | 43 ++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/include/hw/virtio/virtio-access.h b/include/hw/virtio/virtio-access.h index ba1530619939..ff013519b9dc 100644 --- a/include/hw/virtio/virtio-access.h +++ b/include/hw/virtio/virtio-access.h @@ -17,12 +17,15 @@ #include "hw/virtio/virtio.h" #include "exec/address-spaces.h" -static inline bool virtio_access_is_big_endian(VirtIODevice *vdev) +static inline bool virtio_is_big_endian_fast(VirtIODevice *vdev) { +#if defined(TARGET_IS_BIENDIAN) || defined(TARGET_WORDS_BIGENDIAN) if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) { /* Devices conforming to VIRTIO 1.0 or later are always LE. */ return false; } +#endif + #if defined(TARGET_IS_BIENDIAN) return virtio_is_big_endian(vdev); #elif defined(TARGET_WORDS_BIGENDIAN) @@ -34,7 +37,7 @@ static inline bool virtio_access_is_big_endian(VirtIODevice *vdev) static inline uint16_t virtio_lduw_phys(VirtIODevice *vdev, hwaddr pa) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { return lduw_be_phys(&address_space_memory, pa); } return lduw_le_phys(&address_space_memory, pa); @@ -42,7 +45,7 @@ static inline uint16_t virtio_lduw_phys(VirtIODevice *vdev, hwaddr pa) static inline uint32_t virtio_ldl_phys(VirtIODevice *vdev, hwaddr pa) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { return ldl_be_phys(&address_space_memory, pa); } return ldl_le_phys(&address_space_memory, pa); @@ -50,7 +53,7 @@ static inline uint32_t virtio_ldl_phys(VirtIODevice *vdev, hwaddr pa) static inline uint64_t virtio_ldq_phys(VirtIODevice *vdev, hwaddr pa) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { return ldq_be_phys(&address_space_memory, pa); } return ldq_le_phys(&address_space_memory, pa); @@ -59,7 +62,7 @@ static inline uint64_t virtio_ldq_phys(VirtIODevice *vdev, hwaddr pa) static inline void virtio_stw_phys(VirtIODevice *vdev, hwaddr pa, uint16_t value) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { stw_be_phys(&address_space_memory, pa, value); } else { stw_le_phys(&address_space_memory, pa, value); @@ -69,7 +72,7 @@ static inline void virtio_stw_phys(VirtIODevice *vdev, hwaddr pa, static inline void virtio_stl_phys(VirtIODevice *vdev, hwaddr pa, uint32_t value) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { stl_be_phys(&address_space_memory, pa, value); } else { stl_le_phys(&address_space_memory, pa, value); @@ -78,7 +81,7 @@ static inline void virtio_stl_phys(VirtIODevice *vdev, hwaddr pa, static inline void virtio_stw_p(VirtIODevice *vdev, void *ptr, uint16_t v) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { stw_be_p(ptr, v); } else { stw_le_p(ptr, v); @@ -87,7 +90,7 @@ static inline void virtio_stw_p(VirtIODevice *vdev, void *ptr, uint16_t v) static inline void virtio_stl_p(VirtIODevice *vdev, void *ptr, uint32_t v) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { stl_be_p(ptr, v); } else { stl_le_p(ptr, v); @@ -96,7 +99,7 @@ static inline void virtio_stl_p(VirtIODevice *vdev, void *ptr, uint32_t v) static inline void virtio_stq_p(VirtIODevice *vdev, void *ptr, uint64_t v) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { stq_be_p(ptr, v); } else { stq_le_p(ptr, v); @@ -105,7 +108,7 @@ static inline void virtio_stq_p(VirtIODevice *vdev, void *ptr, uint64_t v) static inline int virtio_lduw_p(VirtIODevice *vdev, const void *ptr) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { return lduw_be_p(ptr); } else { return lduw_le_p(ptr); @@ -114,7 +117,7 @@ static inline int virtio_lduw_p(VirtIODevice *vdev, const void *ptr) static inline int virtio_ldl_p(VirtIODevice *vdev, const void *ptr) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { return ldl_be_p(ptr); } else { return ldl_le_p(ptr); @@ -123,7 +126,7 @@ static inline int virtio_ldl_p(VirtIODevice *vdev, const void *ptr) static inline uint64_t virtio_ldq_p(VirtIODevice *vdev, const void *ptr) { - if (virtio_access_is_big_endian(vdev)) { + if (virtio_is_big_endian_fast(vdev)) { return ldq_be_p(ptr); } else { return ldq_le_p(ptr); @@ -133,18 +136,18 @@ static inline uint64_t virtio_ldq_p(VirtIODevice *vdev, const void *ptr) static inline bool virtio_needs_swap(VirtIODevice *vdev) { #ifdef HOST_WORDS_BIGENDIAN - return virtio_access_is_big_endian(vdev) ? false : true; + return virtio_is_big_endian_fast(vdev) ? false : true; #else - return virtio_access_is_big_endian(vdev) ? true : false; + return virtio_is_big_endian_fast(vdev) ? true : false; #endif } static inline uint16_t virtio_tswap16(VirtIODevice *vdev, uint16_t s) { #ifdef HOST_WORDS_BIGENDIAN - return virtio_access_is_big_endian(vdev) ? s : bswap16(s); + return virtio_is_big_endian_fast(vdev) ? s : bswap16(s); #else - return virtio_access_is_big_endian(vdev) ? bswap16(s) : s; + return virtio_is_big_endian_fast(vdev) ? bswap16(s) : s; #endif } @@ -156,9 +159,9 @@ static inline void virtio_tswap16s(VirtIODevice *vdev, uint16_t *s) static inline uint32_t virtio_tswap32(VirtIODevice *vdev, uint32_t s) { #ifdef HOST_WORDS_BIGENDIAN - return virtio_access_is_big_endian(vdev) ? s : bswap32(s); + return virtio_is_big_endian_fast(vdev) ? s : bswap32(s); #else - return virtio_access_is_big_endian(vdev) ? bswap32(s) : s; + return virtio_is_big_endian_fast(vdev) ? bswap32(s) : s; #endif } @@ -170,9 +173,9 @@ static inline void virtio_tswap32s(VirtIODevice *vdev, uint32_t *s) static inline uint64_t virtio_tswap64(VirtIODevice *vdev, uint64_t s) { #ifdef HOST_WORDS_BIGENDIAN - return virtio_access_is_big_endian(vdev) ? s : bswap64(s); + return virtio_is_big_endian_fast(vdev) ? s : bswap64(s); #else - return virtio_access_is_big_endian(vdev) ? bswap64(s) : s; + return virtio_is_big_endian_fast(vdev) ? bswap64(s) : s; #endif } ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] virtio: optimize virtio_access_is_big_endian() for little-endian targets 2015-11-09 17:58 ` [Qemu-devel] [PATCH 3/3] virtio: optimize virtio_access_is_big_endian() for little-endian targets Greg Kurz @ 2015-11-12 18:08 ` Cornelia Huck 2015-11-13 9:28 ` Greg Kurz 0 siblings, 1 reply; 11+ messages in thread From: Cornelia Huck @ 2015-11-12 18:08 UTC (permalink / raw) To: Greg Kurz; +Cc: qemu-devel, Michael S. Tsirkin On Mon, 09 Nov 2015 18:58:34 +0100 Greg Kurz <gkurz@linux.vnet.ibm.com> wrote: > When adding cross-endian support, we introduced the TARGET_IS_BIENDIAN macro > and the virtio_access_is_big_endian() helper to have a branchless fast path > in the virtio memory accessors for targets that don't switch endian. > > This was considered as a strong requirement at the time. > > Now we have added a runtime check for virtio 1.0, which ruins the benefit > of the virtio_access_is_big_endian() helper for always little-endian targets. > > With this patch, fixed little-endian targets stop checking for virtio 1.0, > since the result is little-endian in all cases. So always-LE gets optimized, while always-BE and bi-endian stay the same? (Is there a measurable impact?) > The helper also gets renamed > so it is clear it is optimized for fast paths. Even if it isn't actually 'fast' on anything other than fixed-LE? > > Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> > --- > include/hw/virtio/virtio-access.h | 43 ++++++++++++++++++++----------------- > 1 file changed, 23 insertions(+), 20 deletions(-) ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] virtio: optimize virtio_access_is_big_endian() for little-endian targets 2015-11-12 18:08 ` Cornelia Huck @ 2015-11-13 9:28 ` Greg Kurz 2015-11-13 14:42 ` Cornelia Huck 0 siblings, 1 reply; 11+ messages in thread From: Greg Kurz @ 2015-11-13 9:28 UTC (permalink / raw) To: Cornelia Huck; +Cc: qemu-devel, Michael S. Tsirkin On Thu, 12 Nov 2015 19:08:59 +0100 Cornelia Huck <cornelia.huck@de.ibm.com> wrote: > On Mon, 09 Nov 2015 18:58:34 +0100 > Greg Kurz <gkurz@linux.vnet.ibm.com> wrote: > > > When adding cross-endian support, we introduced the TARGET_IS_BIENDIAN macro > > and the virtio_access_is_big_endian() helper to have a branchless fast path > > in the virtio memory accessors for targets that don't switch endian. > > > > This was considered as a strong requirement at the time. > > > > Now we have added a runtime check for virtio 1.0, which ruins the benefit > > of the virtio_access_is_big_endian() helper for always little-endian targets. > > > > With this patch, fixed little-endian targets stop checking for virtio 1.0, > > since the result is little-endian in all cases. > > So always-LE gets optimized, while always-BE and bi-endian stay the same? > Yes. > (Is there a measurable impact?) > I tried to measure using iperf between host and guest but I could not find any significant change... do you think about another test I could try ? > > The helper also gets renamed > > so it is clear it is optimized for fast paths. > > Even if it isn't actually 'fast' on anything other than fixed-LE? Yes this is definitely a fixed-LE only optimization... should I drop the name change and add a comment instead ? > > > > Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> > > --- > > include/hw/virtio/virtio-access.h | 43 ++++++++++++++++++++----------------- > > 1 file changed, 23 insertions(+), 20 deletions(-) ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] virtio: optimize virtio_access_is_big_endian() for little-endian targets 2015-11-13 9:28 ` Greg Kurz @ 2015-11-13 14:42 ` Cornelia Huck 2015-11-13 15:25 ` Greg Kurz 0 siblings, 1 reply; 11+ messages in thread From: Cornelia Huck @ 2015-11-13 14:42 UTC (permalink / raw) To: Greg Kurz; +Cc: qemu-devel, Michael S. Tsirkin On Fri, 13 Nov 2015 10:28:31 +0100 Greg Kurz <gkurz@linux.vnet.ibm.com> wrote: > On Thu, 12 Nov 2015 19:08:59 +0100 > Cornelia Huck <cornelia.huck@de.ibm.com> wrote: > > > On Mon, 09 Nov 2015 18:58:34 +0100 > > Greg Kurz <gkurz@linux.vnet.ibm.com> wrote: > > > > > When adding cross-endian support, we introduced the TARGET_IS_BIENDIAN macro > > > and the virtio_access_is_big_endian() helper to have a branchless fast path > > > in the virtio memory accessors for targets that don't switch endian. > > > > > > This was considered as a strong requirement at the time. > > > > > > Now we have added a runtime check for virtio 1.0, which ruins the benefit > > > of the virtio_access_is_big_endian() helper for always little-endian targets. > > > > > > With this patch, fixed little-endian targets stop checking for virtio 1.0, > > > since the result is little-endian in all cases. > > > > So always-LE gets optimized, while always-BE and bi-endian stay the same? > > > > Yes. > > > (Is there a measurable impact?) > > > > I tried to measure using iperf between host and guest but I could not > find any significant change... do you think about another test I could > try ? My hunch is that the impact is small anyway. > > > > The helper also gets renamed > > > so it is clear it is optimized for fast paths. > > > > Even if it isn't actually 'fast' on anything other than fixed-LE? > > Yes this is definitely a fixed-LE only optimization... should I drop the name > change and add a comment instead ? I think that would be better as it does not raise expectations :) > > > > > > > Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> > > > --- > > > include/hw/virtio/virtio-access.h | 43 ++++++++++++++++++++----------------- > > > 1 file changed, 23 insertions(+), 20 deletions(-) > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] virtio: optimize virtio_access_is_big_endian() for little-endian targets 2015-11-13 14:42 ` Cornelia Huck @ 2015-11-13 15:25 ` Greg Kurz 0 siblings, 0 replies; 11+ messages in thread From: Greg Kurz @ 2015-11-13 15:25 UTC (permalink / raw) To: Cornelia Huck; +Cc: qemu-devel, Michael S. Tsirkin On Fri, 13 Nov 2015 15:42:53 +0100 Cornelia Huck <cornelia.huck@de.ibm.com> wrote: > On Fri, 13 Nov 2015 10:28:31 +0100 > Greg Kurz <gkurz@linux.vnet.ibm.com> wrote: > > > On Thu, 12 Nov 2015 19:08:59 +0100 > > Cornelia Huck <cornelia.huck@de.ibm.com> wrote: > > > > > On Mon, 09 Nov 2015 18:58:34 +0100 > > > Greg Kurz <gkurz@linux.vnet.ibm.com> wrote: > > > > > > > When adding cross-endian support, we introduced the TARGET_IS_BIENDIAN macro > > > > and the virtio_access_is_big_endian() helper to have a branchless fast path > > > > in the virtio memory accessors for targets that don't switch endian. > > > > > > > > This was considered as a strong requirement at the time. > > > > > > > > Now we have added a runtime check for virtio 1.0, which ruins the benefit > > > > of the virtio_access_is_big_endian() helper for always little-endian targets. > > > > > > > > With this patch, fixed little-endian targets stop checking for virtio 1.0, > > > > since the result is little-endian in all cases. > > > > > > So always-LE gets optimized, while always-BE and bi-endian stay the same? > > > > > > > Yes. > > > > > (Is there a measurable impact?) > > > > > > > I tried to measure using iperf between host and guest but I could not > > find any significant change... do you think about another test I could > > try ? > > My hunch is that the impact is small anyway. > Yeah... even when running TCG I don't see any difference. > > > > > > The helper also gets renamed > > > > so it is clear it is optimized for fast paths. > > > > > > Even if it isn't actually 'fast' on anything other than fixed-LE? > > > > Yes this is definitely a fixed-LE only optimization... should I drop the name > > change and add a comment instead ? > > I think that would be better as it does not raise expectations :) > Ok I'll revert to the original name then. Thanks for the review. -- Greg > > > > > > > > > > Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> > > > > --- > > > > include/hw/virtio/virtio-access.h | 43 ++++++++++++++++++++----------------- > > > > 1 file changed, 23 insertions(+), 20 deletions(-) > > > ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-11-13 15:25 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-11-09 17:58 [Qemu-devel] [PATCH 0/3] virtio: cross-endian helpers fixes Greg Kurz 2015-11-09 17:58 ` [Qemu-devel] [PATCH 1/3] virtio: move cross-endian helper to vhost Greg Kurz 2015-11-12 18:00 ` Cornelia Huck 2015-11-13 8:28 ` Greg Kurz 2015-11-09 17:58 ` [Qemu-devel] [PATCH 2/3] vhost: move virtio 1.0 check to cross-endian helper Greg Kurz 2015-11-12 18:03 ` Cornelia Huck 2015-11-09 17:58 ` [Qemu-devel] [PATCH 3/3] virtio: optimize virtio_access_is_big_endian() for little-endian targets Greg Kurz 2015-11-12 18:08 ` Cornelia Huck 2015-11-13 9:28 ` Greg Kurz 2015-11-13 14:42 ` Cornelia Huck 2015-11-13 15:25 ` Greg Kurz
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).