All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kurz <gkurz@linux.vnet.ibm.com>
To: Laurent Vivier <lvivier@redhat.com>
Cc: qemu-devel@nongnu.org, "Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 6/6] virtio: optimize virtio_access_is_big_endian() for little-endian targets
Date: Fri, 8 Jan 2016 10:27:20 +0100	[thread overview]
Message-ID: <20160108102720.67883872@bahia.local> (raw)
In-Reply-To: <568EC9AF.20107@redhat.com>

On Thu, 7 Jan 2016 21:25:19 +0100
Laurent Vivier <lvivier@redhat.com> wrote:

> 
> 
> On 07/01/2016 12:32, Greg Kurz 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, always little-endian targets stop checking for virtio 1.0,
> > since the result is little-endian in all cases.
> > 
> > Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
> > ---
> >  include/hw/virtio/virtio-access.h |    3 +++
> >  1 file changed, 3 insertions(+)
> > 
> > diff --git a/include/hw/virtio/virtio-access.h b/include/hw/virtio/virtio-access.h
> > index f1f12afe9089..fba4b4a4e1b2 100644
> > --- a/include/hw/virtio/virtio-access.h
> > +++ b/include/hw/virtio/virtio-access.h
> > @@ -19,10 +19,13 @@
> >  
> >  static inline bool virtio_access_is_big_endian(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
> 
> 
> virtio_is_big_endian() checks VIRTIO_F_VERSION_1, so you don't need to
> check it here if TARGET_IS_BIENDIAN is defined.
> 
> > +
> >  #if defined(TARGET_IS_BIENDIAN)
> >      return virtio_is_big_endian(vdev);
> >  #elif defined(TARGET_WORDS_BIGENDIAN)
> > 
> > 
> So you can move virtio_vdev_has_feature() here.
> 
> Laurent
> 
> 

Indeed this is one step further and results in:

 static inline bool virtio_access_is_big_endian(VirtIODevice *vdev)
 {
+#if defined(TARGET_IS_BIENDIAN)
+    return virtio_is_big_endian(vdev);
+#elif 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;
     }
-#if defined(TARGET_IS_BIENDIAN)
-    return virtio_is_big_endian(vdev);
-#elif defined(TARGET_WORDS_BIGENDIAN)
     return true;
 #else
     return false;

which looks nicer: slowest path (2 branches) for bi-endian targets,
slow path (1 branch) for big endian targets and fast path for little
endian targets.

Thanks for the suggestion !

--
Greg

      reply	other threads:[~2016-01-08  9:27 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-07 11:31 [Qemu-devel] [PATCH 0/6] virtio/vhost cross-endian cleanup Greg Kurz
2016-01-07 11:32 ` [Qemu-devel] [PATCH 1/6] virtio-net: use the backend cross-endian capabilities Greg Kurz
2016-01-07 16:22   ` Laurent Vivier
2016-01-07 17:23     ` Greg Kurz
2016-01-07 18:32   ` Laurent Vivier
2016-01-08 14:19     ` Greg Kurz
2016-01-08 15:25       ` Laurent Vivier
2016-01-08 16:00         ` Greg Kurz
2016-01-07 11:32 ` [Qemu-devel] [PATCH 2/6] Revert "vhost-net: tell tap backend about the vnet endianness" Greg Kurz
2016-01-07 19:52   ` Laurent Vivier
2016-01-08  9:07     ` Greg Kurz
2016-01-08 10:11   ` Cornelia Huck
2016-01-08 10:26     ` Greg Kurz
2016-01-08 11:09       ` Cornelia Huck
2016-01-07 11:32 ` [Qemu-devel] [PATCH 3/6] virtio: drop the virtio_needs_swap() helper Greg Kurz
2016-01-07 19:55   ` Laurent Vivier
2016-01-08  9:16     ` Greg Kurz
2016-01-07 11:32 ` [Qemu-devel] [PATCH 4/6] virtio: move cross-endian helper to vhost Greg Kurz
2016-01-07 11:32 ` [Qemu-devel] [PATCH 5/6] vhost: move virtio 1.0 check to cross-endian helper Greg Kurz
2016-01-07 20:07   ` Laurent Vivier
2016-01-08  9:21     ` Greg Kurz
2016-01-08 10:07       ` Cornelia Huck
2016-01-08 10:22         ` Laurent Vivier
2016-01-07 11:32 ` [Qemu-devel] [PATCH 6/6] virtio: optimize virtio_access_is_big_endian() for little-endian targets Greg Kurz
2016-01-07 20:25   ` Laurent Vivier
2016-01-08  9:27     ` Greg Kurz [this message]

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=20160108102720.67883872@bahia.local \
    --to=gkurz@linux.vnet.ibm.com \
    --cc=lvivier@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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.