diff mbox

virtio: move bi-endian target support to a single location

Message ID 146468219419.25446.8053365248306938869.stgit@bahia.huguette.org (mailing list archive)
State New, archived
Headers show

Commit Message

Greg Kurz May 31, 2016, 8:09 a.m. UTC
Paolo's recent cpu.h cleanups broke legacy virtio for ppc64 LE guests (and
arm BE guests as well, even if I have not verified that). Especially, commit
"33c11879fd42 qemu-common: push cpu.h inclusion out of qemu-common.h" has
the side-effect of silently hiding the TARGET_IS_BIENDIAN macro from the
virtio memory accessors, and thus fully disabling support of endian changing
targets.

To be sure this cannot happen again, let's gather all the bi-endian bits
where they belong in include/hw/virtio/virtio-access.h.

The changes in hw/virtio/vhost.c are safe because vhost_needs_vring_endian()
is not called on a hot path and non bi-endian targets will return false
anyway.

While here, also rename TARGET_IS_BIENDIAN to be more precise: it is only for
legacy virtio and bi-endian guests.

Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
---
 hw/virtio/vhost.c                 |    4 ----
 include/hw/virtio/virtio-access.h |    6 +++++-
 target-arm/cpu.h                  |    2 --
 target-ppc/cpu.h                  |    2 --
 4 files changed, 5 insertions(+), 9 deletions(-)

Comments

Cédric Le Goater May 31, 2016, 9:19 a.m. UTC | #1
On 05/31/2016 10:09 AM, Greg Kurz wrote:
> Paolo's recent cpu.h cleanups broke legacy virtio for ppc64 LE guests (and
> arm BE guests as well, even if I have not verified that). Especially, commit
> "33c11879fd42 qemu-common: push cpu.h inclusion out of qemu-common.h" has
> the side-effect of silently hiding the TARGET_IS_BIENDIAN macro from the
> virtio memory accessors, and thus fully disabling support of endian changing
> targets.
> 
> To be sure this cannot happen again, let's gather all the bi-endian bits
> where they belong in include/hw/virtio/virtio-access.h.
> 
> The changes in hw/virtio/vhost.c are safe because vhost_needs_vring_endian()
> is not called on a hot path and non bi-endian targets will return false
> anyway.
> 
> While here, also rename TARGET_IS_BIENDIAN to be more precise: it is only for
> legacy virtio and bi-endian guests.
> 
> Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>

biendian-ness being only used by virtio devices, I think this is a good place 
where to put it.

Acked-by: Cédric Le Goater <clg@kaod.org>

> ---
>  hw/virtio/vhost.c                 |    4 ----
>  include/hw/virtio/virtio-access.h |    6 +++++-
>  target-arm/cpu.h                  |    2 --
>  target-ppc/cpu.h                  |    2 --
>  4 files changed, 5 insertions(+), 9 deletions(-)
> 
> diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> index 440071815408..81cc5b0ae35c 100644
> --- a/hw/virtio/vhost.c
> +++ b/hw/virtio/vhost.c
> @@ -767,15 +767,11 @@ 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 vdev->device_endian == VIRTIO_DEVICE_ENDIAN_LITTLE;
>  #else
>      return vdev->device_endian == VIRTIO_DEVICE_ENDIAN_BIG;
>  #endif
> -#else
> -    return false;
> -#endif
>  }
> 
>  static int vhost_virtqueue_set_vring_endian_legacy(struct vhost_dev *dev,
> diff --git a/include/hw/virtio/virtio-access.h b/include/hw/virtio/virtio-access.h
> index 8dc84f520316..4b2803814642 100644
> --- a/include/hw/virtio/virtio-access.h
> +++ b/include/hw/virtio/virtio-access.h
> @@ -17,9 +17,13 @@
>  #include "hw/virtio/virtio.h"
>  #include "exec/address-spaces.h"
> 
> +#if defined(TARGET_PPC64) || defined(TARGET_ARM)
> +#define LEGACY_VIRTIO_IS_BIENDIAN 1
> +#endif
> +
>  static inline bool virtio_access_is_big_endian(VirtIODevice *vdev)
>  {
> -#if defined(TARGET_IS_BIENDIAN)
> +#if defined(LEGACY_VIRTIO_IS_BIENDIAN)
>      return virtio_is_big_endian(vdev);
>  #elif defined(TARGET_WORDS_BIGENDIAN)
>      if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) {
> diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> index c741b53ad45f..60971e16f7a4 100644
> --- a/target-arm/cpu.h
> +++ b/target-arm/cpu.h
> @@ -29,8 +29,6 @@
>  #  define TARGET_LONG_BITS 32
>  #endif
> 
> -#define TARGET_IS_BIENDIAN 1
> -
>  #define CPUArchState struct CPUARMState
> 
>  #include "qemu-common.h"
> diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
> index cd33539d1ce9..556d66c39d11 100644
> --- a/target-ppc/cpu.h
> +++ b/target-ppc/cpu.h
> @@ -28,8 +28,6 @@
>  #define TARGET_LONG_BITS 64
>  #define TARGET_PAGE_BITS 12
> 
> -#define TARGET_IS_BIENDIAN 1
> -
>  /* Note that the official physical address space bits is 62-M where M
>     is implementation dependent.  I've not looked up M for the set of
>     cpus we emulate at the system level.  */
> 
>
Paolo Bonzini May 31, 2016, 11:54 a.m. UTC | #2
On 31/05/2016 10:09, Greg Kurz wrote:
> diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> index 440071815408..81cc5b0ae35c 100644
> --- a/hw/virtio/vhost.c
> +++ b/hw/virtio/vhost.c
> @@ -767,15 +767,11 @@ 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 vdev->device_endian == VIRTIO_DEVICE_ENDIAN_LITTLE;
>  #else
>      return vdev->device_endian == VIRTIO_DEVICE_ENDIAN_BIG;
>  #endif
> -#else
> -    return false;
> -#endif

This should be okay.

>  }
>  
>  static int vhost_virtqueue_set_vring_endian_legacy(struct vhost_dev *dev,
> diff --git a/include/hw/virtio/virtio-access.h b/include/hw/virtio/virtio-access.h
> index 8dc84f520316..4b2803814642 100644
> --- a/include/hw/virtio/virtio-access.h
> +++ b/include/hw/virtio/virtio-access.h
> @@ -17,9 +17,13 @@
>  #include "hw/virtio/virtio.h"
>  #include "exec/address-spaces.h"
>  
> +#if defined(TARGET_PPC64) || defined(TARGET_ARM)
> +#define LEGACY_VIRTIO_IS_BIENDIAN 1
> +#endif

These will only be correct if something else includes cpu.h.  Instead of
defining this, you should add

#include "cpu.h"

at the top of include/hw/virtio-access.h and leave the definitions in
target-*/cpu.h.

Thanks,

Paolo

>  static inline bool virtio_access_is_big_endian(VirtIODevice *vdev)
>  {
> -#if defined(TARGET_IS_BIENDIAN)
> +#if defined(LEGACY_VIRTIO_IS_BIENDIAN)
>      return virtio_is_big_endian(vdev);
>  #elif defined(TARGET_WORDS_BIGENDIAN)
>      if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) {
> diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> index c741b53ad45f..60971e16f7a4 100644
> --- a/target-arm/cpu.h
> +++ b/target-arm/cpu.h
> @@ -29,8 +29,6 @@
>  #  define TARGET_LONG_BITS 32
>  #endif
>  
> -#define TARGET_IS_BIENDIAN 1
> -
>  #define CPUArchState struct CPUARMState
>  
>  #include "qemu-common.h"
> diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
> index cd33539d1ce9..556d66c39d11 100644
> --- a/target-ppc/cpu.h
> +++ b/target-ppc/cpu.h
> @@ -28,8 +28,6 @@
>  #define TARGET_LONG_BITS 64
>  #define TARGET_PAGE_BITS 12
>  
> -#define TARGET_IS_BIENDIAN 1
> -
>  /* Note that the official physical address space bits is 62-M where M
>     is implementation dependent.  I've not looked up M for the set of
>     cpus we emulate at the system level.  */
>
Greg Kurz May 31, 2016, 1:10 p.m. UTC | #3
On Tue, 31 May 2016 13:54:11 +0200
Paolo Bonzini <pbonzini@redhat.com> wrote:

> On 31/05/2016 10:09, Greg Kurz wrote:
> > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> > index 440071815408..81cc5b0ae35c 100644
> > --- a/hw/virtio/vhost.c
> > +++ b/hw/virtio/vhost.c
> > @@ -767,15 +767,11 @@ 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 vdev->device_endian == VIRTIO_DEVICE_ENDIAN_LITTLE;
> >  #else
> >      return vdev->device_endian == VIRTIO_DEVICE_ENDIAN_BIG;
> >  #endif
> > -#else
> > -    return false;
> > -#endif  
> 
> This should be okay.
> 
> >  }
> >  
> >  static int vhost_virtqueue_set_vring_endian_legacy(struct vhost_dev *dev,
> > diff --git a/include/hw/virtio/virtio-access.h b/include/hw/virtio/virtio-access.h
> > index 8dc84f520316..4b2803814642 100644
> > --- a/include/hw/virtio/virtio-access.h
> > +++ b/include/hw/virtio/virtio-access.h
> > @@ -17,9 +17,13 @@
> >  #include "hw/virtio/virtio.h"
> >  #include "exec/address-spaces.h"
> >  
> > +#if defined(TARGET_PPC64) || defined(TARGET_ARM)
> > +#define LEGACY_VIRTIO_IS_BIENDIAN 1
> > +#endif  
> 
> These will only be correct if something else includes cpu.h.  Instead of

Unless I missed something, the TARGET_* macros come from the generated
config-target.h header, which is in turn included by qemu/osdep.h and
thus included by most of the code.

> defining this, you should add
> 
> #include "cpu.h"
> 
> at the top of include/hw/virtio-access.h and leave the definitions in
> target-*/cpu.h.
> 

All this bi-endian stuff is really an old-virtio-only thing... it is
only to be used by virtio_access_is_big_endian(). The fact that it
broke silently with your cleanup series is yet another proof that
this workaround is fragile.

Hence my tentative to put all the details in one place... would it
be ok if I include "config-target.h" to ensure we have the TARGET macros ?


> Thanks,
> 
> Paolo
> 
> >  static inline bool virtio_access_is_big_endian(VirtIODevice *vdev)
> >  {
> > -#if defined(TARGET_IS_BIENDIAN)
> > +#if defined(LEGACY_VIRTIO_IS_BIENDIAN)
> >      return virtio_is_big_endian(vdev);
> >  #elif defined(TARGET_WORDS_BIGENDIAN)
> >      if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) {
> > diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> > index c741b53ad45f..60971e16f7a4 100644~/Work/qemu/qemu-gkurz/.mbuild/bin/qemu-system-ppc64 -snapshot -machine pseries,accel=kvm -nodefaults -no-shutdown -nographic -serial mon:stdio -m 8G -device virtio-net,netdev=netdev0,mac=C0:FF:EE:00:00:66,id=net0 -netdev tap,id=netdev0,vhost=off,helper='/usr/libexec/qemu-bridge-helper --br=br0' -drive file=/home/greg/images/fedora23-ppc64-ppc64le.qcow2,id=drive0,if=virtio -fsdev local,security_model=none,id=fsdev1,path=/home/greg -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=host
> > --- a/target-arm/cpu.h
> > +++ b/target-arm/cpu.h
> > @@ -29,8 +29,6 @@
> >  #  define TARGET_LONG_BITS 32
> >  #endif
> >  
> > -#define TARGET_IS_BIENDIAN 1
> > -
> >  #define CPUArchState struct CPUARMState
> >  
> >  #include "qemu-common.h"
> > diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
> > index cd33539d1ce9..556d66c39d11 100644
> > --- a/target-ppc/cpu.h
> > +++ b/target-ppc/cpu.h
> > @@ -28,8 +28,6 @@
> >  #define TARGET_LONG_BITS 64
> >  #define TARGET_PAGE_BITS 12
> >  
> > -#define TARGET_IS_BIENDIAN 1
> > -
> >  /* Note that the official physical address space bits is 62-M where M
> >     is implementation dependent.  I've not looked up M for the set of
> >     cpus we emulate at the system level.  */
> >   
>
Peter Maydell May 31, 2016, 1:14 p.m. UTC | #4
On 31 May 2016 at 14:10, Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:
> Hence my tentative to put all the details in one place... would it
> be ok if I include "config-target.h" to ensure we have the TARGET macros ?

No, config-target.h is one of the headers that should never be
included by any file except osdep.h (and scripts/clean-includes
will check for this). You're guaranteed that it's always included
for you.

thanks
-- PMM
Paolo Bonzini May 31, 2016, 1:15 p.m. UTC | #5
On 31/05/2016 15:10, Greg Kurz wrote:
>>> > > +#if defined(TARGET_PPC64) || defined(TARGET_ARM)
>>> > > +#define LEGACY_VIRTIO_IS_BIENDIAN 1
>>> > > +#endif  
>> > 
>> > These will only be correct if something else includes cpu.h.  Instead of
> Unless I missed something, the TARGET_* macros come from the generated
> config-target.h header, which is in turn included by qemu/osdep.h and
> thus included by most of the code.

You're right.  Problems _could_ happen if virtio-access.h is included in
a file compiled without -DNEED_CPU_H (i.e. with common-obj-y instead of
obj-y) but include/exec/poison.h should take care of that.

>> > defining this, you should add
>> > 
>> > #include "cpu.h"
>> > 
>> > at the top of include/hw/virtio-access.h and leave the definitions in
>> > target-*/cpu.h.
>> > 
> All this bi-endian stuff is really an old-virtio-only thing... it is
> only to be used by virtio_access_is_big_endian(). The fact that it
> broke silently with your cleanup series is yet another proof that
> this workaround is fragile.

It is not fragile actually.  cpu.h doesn't exist in common-obj-y, so the
TARGET_IS_BIENDIAN define can be safely taken from cpu.h.

Anyway because of poison.h your solution isn't fragile either, so

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

Paolo
Greg Kurz May 31, 2016, 2:10 p.m. UTC | #6
On Tue, 31 May 2016 14:14:15 +0100
Peter Maydell <peter.maydell@linaro.org> wrote:

> On 31 May 2016 at 14:10, Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:
> > Hence my tentative to put all the details in one place... would it
> > be ok if I include "config-target.h" to ensure we have the TARGET macros ?  
> 
> No, config-target.h is one of the headers that should never be
> included by any file except osdep.h (and scripts/clean-includes
> will check for this). You're guaranteed that it's always included
> for you.
> 

So we don't even need to include osdep.h in virtio-access.h because we
are sure all .c files that include virtio-access.h also include osdep.h
first. Correct ?

> thanks
> -- PMM
>
David Gibson June 1, 2016, 2:33 a.m. UTC | #7
On Tue, May 31, 2016 at 03:15:21PM +0200, Paolo Bonzini wrote:
> 
> 
> On 31/05/2016 15:10, Greg Kurz wrote:
> >>> > > +#if defined(TARGET_PPC64) || defined(TARGET_ARM)
> >>> > > +#define LEGACY_VIRTIO_IS_BIENDIAN 1
> >>> > > +#endif  
> >> > 
> >> > These will only be correct if something else includes cpu.h.  Instead of
> > Unless I missed something, the TARGET_* macros come from the generated
> > config-target.h header, which is in turn included by qemu/osdep.h and
> > thus included by most of the code.
> 
> You're right.  Problems _could_ happen if virtio-access.h is included in
> a file compiled without -DNEED_CPU_H (i.e. with common-obj-y instead of
> obj-y) but include/exec/poison.h should take care of that.
> 
> >> > defining this, you should add
> >> > 
> >> > #include "cpu.h"
> >> > 
> >> > at the top of include/hw/virtio-access.h and leave the definitions in
> >> > target-*/cpu.h.
> >> > 
> > All this bi-endian stuff is really an old-virtio-only thing... it is
> > only to be used by virtio_access_is_big_endian(). The fact that it
> > broke silently with your cleanup series is yet another proof that
> > this workaround is fragile.
> 
> It is not fragile actually.  cpu.h doesn't exist in common-obj-y, so the
> TARGET_IS_BIENDIAN define can be safely taken from cpu.h.
> 
> Anyway because of poison.h your solution isn't fragile either, so
> 
> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

Should I take this through my tree?
Paolo Bonzini June 1, 2016, 8:30 a.m. UTC | #8
On 01/06/2016 04:33, David Gibson wrote:
> On Tue, May 31, 2016 at 03:15:21PM +0200, Paolo Bonzini wrote:
>>
>>
>> On 31/05/2016 15:10, Greg Kurz wrote:
>>>>>>> +#if defined(TARGET_PPC64) || defined(TARGET_ARM)
>>>>>>> +#define LEGACY_VIRTIO_IS_BIENDIAN 1
>>>>>>> +#endif  
>>>>>
>>>>> These will only be correct if something else includes cpu.h.  Instead of
>>> Unless I missed something, the TARGET_* macros come from the generated
>>> config-target.h header, which is in turn included by qemu/osdep.h and
>>> thus included by most of the code.
>>
>> You're right.  Problems _could_ happen if virtio-access.h is included in
>> a file compiled without -DNEED_CPU_H (i.e. with common-obj-y instead of
>> obj-y) but include/exec/poison.h should take care of that.
>>
>>>>> defining this, you should add
>>>>>
>>>>> #include "cpu.h"
>>>>>
>>>>> at the top of include/hw/virtio-access.h and leave the definitions in
>>>>> target-*/cpu.h.
>>>>>
>>> All this bi-endian stuff is really an old-virtio-only thing... it is
>>> only to be used by virtio_access_is_big_endian(). The fact that it
>>> broke silently with your cleanup series is yet another proof that
>>> this workaround is fragile.
>>
>> It is not fragile actually.  cpu.h doesn't exist in common-obj-y, so the
>> TARGET_IS_BIENDIAN define can be safely taken from cpu.h.
>>
>> Anyway because of poison.h your solution isn't fragile either, so
>>
>> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
> 
> Should I take this through my tree?

If you don't hear from mst, go ahead.

Paolo
Greg Kurz June 2, 2016, 4:04 p.m. UTC | #9
On Wed, 1 Jun 2016 12:33:28 +1000
David Gibson <david@gibson.dropbear.id.au> wrote:

> On Tue, May 31, 2016 at 03:15:21PM +0200, Paolo Bonzini wrote:
> > 
> > 
> > On 31/05/2016 15:10, Greg Kurz wrote:  
> > >>> > > +#if defined(TARGET_PPC64) || defined(TARGET_ARM)
> > >>> > > +#define LEGACY_VIRTIO_IS_BIENDIAN 1
> > >>> > > +#endif    
> > >> > 
> > >> > These will only be correct if something else includes cpu.h.  Instead of  
> > > Unless I missed something, the TARGET_* macros come from the generated
> > > config-target.h header, which is in turn included by qemu/osdep.h and
> > > thus included by most of the code.  
> > 
> > You're right.  Problems _could_ happen if virtio-access.h is included in
> > a file compiled without -DNEED_CPU_H (i.e. with common-obj-y instead of
> > obj-y) but include/exec/poison.h should take care of that.
> >   
> > >> > defining this, you should add
> > >> > 
> > >> > #include "cpu.h"
> > >> > 
> > >> > at the top of include/hw/virtio-access.h and leave the definitions in
> > >> > target-*/cpu.h.
> > >> >   
> > > All this bi-endian stuff is really an old-virtio-only thing... it is
> > > only to be used by virtio_access_is_big_endian(). The fact that it
> > > broke silently with your cleanup series is yet another proof that
> > > this workaround is fragile.  
> > 
> > It is not fragile actually.  cpu.h doesn't exist in common-obj-y, so the
> > TARGET_IS_BIENDIAN define can be safely taken from cpu.h.
> > 
> > Anyway because of poison.h your solution isn't fragile either, so
> > 
> > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>  
> 
> Should I take this through my tree?
> 

That would be great !

--
Greg
David Gibson June 3, 2016, 1:16 a.m. UTC | #10
On Thu, Jun 02, 2016 at 06:04:37PM +0200, Greg Kurz wrote:
> On Wed, 1 Jun 2016 12:33:28 +1000
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > On Tue, May 31, 2016 at 03:15:21PM +0200, Paolo Bonzini wrote:
> > > 
> > > 
> > > On 31/05/2016 15:10, Greg Kurz wrote:  
> > > >>> > > +#if defined(TARGET_PPC64) || defined(TARGET_ARM)
> > > >>> > > +#define LEGACY_VIRTIO_IS_BIENDIAN 1
> > > >>> > > +#endif    
> > > >> > 
> > > >> > These will only be correct if something else includes cpu.h.  Instead of  
> > > > Unless I missed something, the TARGET_* macros come from the generated
> > > > config-target.h header, which is in turn included by qemu/osdep.h and
> > > > thus included by most of the code.  
> > > 
> > > You're right.  Problems _could_ happen if virtio-access.h is included in
> > > a file compiled without -DNEED_CPU_H (i.e. with common-obj-y instead of
> > > obj-y) but include/exec/poison.h should take care of that.
> > >   
> > > >> > defining this, you should add
> > > >> > 
> > > >> > #include "cpu.h"
> > > >> > 
> > > >> > at the top of include/hw/virtio-access.h and leave the definitions in
> > > >> > target-*/cpu.h.
> > > >> >   
> > > > All this bi-endian stuff is really an old-virtio-only thing... it is
> > > > only to be used by virtio_access_is_big_endian(). The fact that it
> > > > broke silently with your cleanup series is yet another proof that
> > > > this workaround is fragile.  
> > > 
> > > It is not fragile actually.  cpu.h doesn't exist in common-obj-y, so the
> > > TARGET_IS_BIENDIAN define can be safely taken from cpu.h.
> > > 
> > > Anyway because of poison.h your solution isn't fragile either, so
> > > 
> > > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>  
> > 
> > Should I take this through my tree?
> > 
> 
> That would be great !

Actually, that was a question for Paolo..
Greg Kurz June 3, 2016, 6:05 a.m. UTC | #11
On Fri, 3 Jun 2016 11:16:04 +1000
David Gibson <david@gibson.dropbear.id.au> wrote:

> On Thu, Jun 02, 2016 at 06:04:37PM +0200, Greg Kurz wrote:
> > On Wed, 1 Jun 2016 12:33:28 +1000
> > David Gibson <david@gibson.dropbear.id.au> wrote:
> >   
> > > On Tue, May 31, 2016 at 03:15:21PM +0200, Paolo Bonzini wrote:  
> > > > 
> > > > 
> > > > On 31/05/2016 15:10, Greg Kurz wrote:    
> > > > >>> > > +#if defined(TARGET_PPC64) || defined(TARGET_ARM)
> > > > >>> > > +#define LEGACY_VIRTIO_IS_BIENDIAN 1
> > > > >>> > > +#endif      
> > > > >> > 
> > > > >> > These will only be correct if something else includes cpu.h.  Instead of    
> > > > > Unless I missed something, the TARGET_* macros come from the generated
> > > > > config-target.h header, which is in turn included by qemu/osdep.h and
> > > > > thus included by most of the code.    
> > > > 
> > > > You're right.  Problems _could_ happen if virtio-access.h is included in
> > > > a file compiled without -DNEED_CPU_H (i.e. with common-obj-y instead of
> > > > obj-y) but include/exec/poison.h should take care of that.
> > > >     
> > > > >> > defining this, you should add
> > > > >> > 
> > > > >> > #include "cpu.h"
> > > > >> > 
> > > > >> > at the top of include/hw/virtio-access.h and leave the definitions in
> > > > >> > target-*/cpu.h.
> > > > >> >     
> > > > > All this bi-endian stuff is really an old-virtio-only thing... it is
> > > > > only to be used by virtio_access_is_big_endian(). The fact that it
> > > > > broke silently with your cleanup series is yet another proof that
> > > > > this workaround is fragile.    
> > > > 
> > > > It is not fragile actually.  cpu.h doesn't exist in common-obj-y, so the
> > > > TARGET_IS_BIENDIAN define can be safely taken from cpu.h.
> > > > 
> > > > Anyway because of poison.h your solution isn't fragile either, so
> > > > 
> > > > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>    
> > > 
> > > Should I take this through my tree?
> > >   
> > 
> > That would be great !  
> 
> Actually, that was a question for Paolo..
> 
> 

Sure, I was just expressing my interest for this possibility... :)
Paolo Bonzini June 6, 2016, 1:41 p.m. UTC | #12
On 03/06/2016 03:16, David Gibson wrote:
> On Thu, Jun 02, 2016 at 06:04:37PM +0200, Greg Kurz wrote:
>> On Wed, 1 Jun 2016 12:33:28 +1000
>> David Gibson <david@gibson.dropbear.id.au> wrote:
>>
>>> On Tue, May 31, 2016 at 03:15:21PM +0200, Paolo Bonzini wrote:
>>>>
>>>>
>>>> On 31/05/2016 15:10, Greg Kurz wrote:  
>>>>>>>>> +#if defined(TARGET_PPC64) || defined(TARGET_ARM)
>>>>>>>>> +#define LEGACY_VIRTIO_IS_BIENDIAN 1
>>>>>>>>> +#endif    
>>>>>>>
>>>>>>> These will only be correct if something else includes cpu.h.  Instead of  
>>>>> Unless I missed something, the TARGET_* macros come from the generated
>>>>> config-target.h header, which is in turn included by qemu/osdep.h and
>>>>> thus included by most of the code.  
>>>>
>>>> You're right.  Problems _could_ happen if virtio-access.h is included in
>>>> a file compiled without -DNEED_CPU_H (i.e. with common-obj-y instead of
>>>> obj-y) but include/exec/poison.h should take care of that.
>>>>   
>>>>>>> defining this, you should add
>>>>>>>
>>>>>>> #include "cpu.h"
>>>>>>>
>>>>>>> at the top of include/hw/virtio-access.h and leave the definitions in
>>>>>>> target-*/cpu.h.
>>>>>>>   
>>>>> All this bi-endian stuff is really an old-virtio-only thing... it is
>>>>> only to be used by virtio_access_is_big_endian(). The fact that it
>>>>> broke silently with your cleanup series is yet another proof that
>>>>> this workaround is fragile.  
>>>>
>>>> It is not fragile actually.  cpu.h doesn't exist in common-obj-y, so the
>>>> TARGET_IS_BIENDIAN define can be safely taken from cpu.h.
>>>>
>>>> Anyway because of poison.h your solution isn't fragile either, so
>>>>
>>>> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>  
>>>
>>> Should I take this through my tree?
>>>
>>
>> That would be great !
> 
> Actually, that was a question for Paolo..

It would be more of a question for mst; I do not maintain virtio (that's
why I wrote R-b and not Acked-by).

Thanks,

Paolo
diff mbox

Patch

diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index 440071815408..81cc5b0ae35c 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -767,15 +767,11 @@  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 vdev->device_endian == VIRTIO_DEVICE_ENDIAN_LITTLE;
 #else
     return vdev->device_endian == VIRTIO_DEVICE_ENDIAN_BIG;
 #endif
-#else
-    return false;
-#endif
 }
 
 static int vhost_virtqueue_set_vring_endian_legacy(struct vhost_dev *dev,
diff --git a/include/hw/virtio/virtio-access.h b/include/hw/virtio/virtio-access.h
index 8dc84f520316..4b2803814642 100644
--- a/include/hw/virtio/virtio-access.h
+++ b/include/hw/virtio/virtio-access.h
@@ -17,9 +17,13 @@ 
 #include "hw/virtio/virtio.h"
 #include "exec/address-spaces.h"
 
+#if defined(TARGET_PPC64) || defined(TARGET_ARM)
+#define LEGACY_VIRTIO_IS_BIENDIAN 1
+#endif
+
 static inline bool virtio_access_is_big_endian(VirtIODevice *vdev)
 {
-#if defined(TARGET_IS_BIENDIAN)
+#if defined(LEGACY_VIRTIO_IS_BIENDIAN)
     return virtio_is_big_endian(vdev);
 #elif defined(TARGET_WORDS_BIGENDIAN)
     if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) {
diff --git a/target-arm/cpu.h b/target-arm/cpu.h
index c741b53ad45f..60971e16f7a4 100644
--- a/target-arm/cpu.h
+++ b/target-arm/cpu.h
@@ -29,8 +29,6 @@ 
 #  define TARGET_LONG_BITS 32
 #endif
 
-#define TARGET_IS_BIENDIAN 1
-
 #define CPUArchState struct CPUARMState
 
 #include "qemu-common.h"
diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
index cd33539d1ce9..556d66c39d11 100644
--- a/target-ppc/cpu.h
+++ b/target-ppc/cpu.h
@@ -28,8 +28,6 @@ 
 #define TARGET_LONG_BITS 64
 #define TARGET_PAGE_BITS 12
 
-#define TARGET_IS_BIENDIAN 1
-
 /* Note that the official physical address space bits is 62-M where M
    is implementation dependent.  I've not looked up M for the set of
    cpus we emulate at the system level.  */