All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kurz <gkurz@linux.vnet.ibm.com>
To: Alexander Graf <agraf@suse.de>
Cc: "Kevin Wolf" <kwolf@redhat.com>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Stefan Hajnoczi" <stefanha@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"Rusty Russell" <rusty@rustcorp.com.au>,
	qemu-devel@nongnu.org, "Juan Quintela" <quintela@redhat.com>,
	aneesh.kumar@linux.vnet.ibm.com,
	"Anthony Liguori" <aliguori@amazon.com>,
	"Amit Shah" <amit.shah@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH v8 11/20] virtio: add endian-ambivalent support to VirtIODevice
Date: Fri, 13 Jun 2014 14:52:46 +0200	[thread overview]
Message-ID: <20140613145246.7d012445@bahia.local> (raw)
In-Reply-To: <539AF17A.6020205@suse.de>

On Fri, 13 Jun 2014 14:41:30 +0200
Alexander Graf <agraf@suse.de> wrote:

> 
> On 13.06.14 14:14, Greg Kurz wrote:
> > On Fri, 13 Jun 2014 13:46:39 +0200
> > Alexander Graf <agraf@suse.de> wrote:
> >
> >> On 13.06.14 13:23, Greg Kurz wrote:
> >>> Some CPU families can dynamically change their endianness. This means we
> >>> can have little endian ppc or big endian arm guests for example. This has
> >>> an impact on legacy virtio data structures since they are target endian.
> >>> We hence introduce a new property to track the endianness of each virtio
> >>> device. It is reasonnably assumed that endianness won't change while the
> >>> device is in use : we hence capture the device endianness when it gets
> >>> reset.
> >>>
> >>> We migrate this property in a subsection, after the device descriptor. This
> >>> means the load code must not rely on it until it is restored. As a consequence,
> >>> the vring sanity checks had to be moved after the call to vmstate_load_state().
> >>> We enforce paranoia by poisoning the property at the begining of virtio_load().
> >>>
> >>> Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
> >>> ---
> >>>
> >>>    Changes since last version (virtio migration RFC):
> >>>    - endianness cached at device reset time
> >>>    - reworked migration support
> >>>
> >>>    hw/virtio/virtio-pci.c     |    8 ++--
> >>>    hw/virtio/virtio.c         |  100 +++++++++++++++++++++++++++++++++++++++-----
> >>>    include/hw/virtio/virtio.h |   12 ++++-
> >>>    3 files changed, 102 insertions(+), 18 deletions(-)
> >>>
> >>> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> >>> index 390c8d2..2ffceb8 100644
> >>> --- a/hw/virtio/virtio-pci.c
> >>> +++ b/hw/virtio/virtio-pci.c
> >>> @@ -406,13 +406,13 @@ static uint64_t virtio_pci_config_read(void *opaque, hwaddr addr,
> >>>            break;
> >>>        case 2:
> >>>            val = virtio_config_readw(vdev, addr);
> >>> -        if (virtio_is_big_endian()) {
> >>> +        if (virtio_is_big_endian(vdev)) {
> >>>                val = bswap16(val);
> >>>            }
> >>>            break;
> >>>        case 4:
> >>>            val = virtio_config_readl(vdev, addr);
> >>> -        if (virtio_is_big_endian()) {
> >>> +        if (virtio_is_big_endian(vdev)) {
> >>>                val = bswap32(val);
> >>>            }
> >>>            break;
> >>> @@ -440,13 +440,13 @@ static void virtio_pci_config_write(void *opaque, hwaddr addr,
> >>>            virtio_config_writeb(vdev, addr, val);
> >>>            break;
> >>>        case 2:
> >>> -        if (virtio_is_big_endian()) {
> >>> +        if (virtio_is_big_endian(vdev)) {
> >>>                val = bswap16(val);
> >>>            }
> >>>            virtio_config_writew(vdev, addr, val);
> >>>            break;
> >>>        case 4:
> >>> -        if (virtio_is_big_endian()) {
> >>> +        if (virtio_is_big_endian(vdev)) {
> >>>                val = bswap32(val);
> >>>            }
> >>>            virtio_config_writel(vdev, addr, val);
> >>> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> >>> index 16b73d9..6235df8 100644
> >>> --- a/hw/virtio/virtio.c
> >>> +++ b/hw/virtio/virtio.c
> >>> @@ -545,6 +545,24 @@ void virtio_set_status(VirtIODevice *vdev, uint8_t val)
> >>>        vdev->status = val;
> >>>    }
> >>>    
> >>> +static void virtio_set_endian_target_default(VirtIODevice *vdev)
> >>> +{
> >>> +#ifdef TARGET_WORDS_BIGENDIAN
> >>> +    vdev->device_endian = VIRTIO_DEVICE_ENDIAN_BIG;
> >>> +#else
> >>> +    vdev->device_endian = VIRTIO_DEVICE_ENDIAN_LITTLE;
> >>> +#endif
> >>> +}
> >>> +
> >>> +static void virtio_set_endian_cpu(VirtIODevice *vdev, CPUState *cpu)
> >>> +{
> >>> +    if (cpu_virtio_is_big_endian(cpu)) {
> >>> +        vdev->device_endian = VIRTIO_DEVICE_ENDIAN_BIG;
> >>> +    } else {
> >>> +        vdev->device_endian = VIRTIO_DEVICE_ENDIAN_LITTLE;
> >>> +    }
> >>> +}
> >>> +
> >>>    void virtio_reset(void *opaque)
> >>>    {
> >>>        VirtIODevice *vdev = opaque;
> >>> @@ -552,6 +570,13 @@ void virtio_reset(void *opaque)
> >>>        int i;
> >>>    
> >>>        virtio_set_status(vdev, 0);
> >>> +    if (current_cpu) {
> >>> +        /* Guest initiated reset */
> >>> +        virtio_set_endian_cpu(vdev, current_cpu);
> >>> +    } else {
> >>> +        /* System reset */
> >>> +        virtio_set_endian_target_default(vdev);
> >>> +    }
> >>>    
> >>>        if (k->reset) {
> >>>            k->reset(vdev);
> >>> @@ -840,6 +865,28 @@ void virtio_notify_config(VirtIODevice *vdev)
> >>>        virtio_notify_vector(vdev, vdev->config_vector);
> >>>    }
> >>>    
> >>> +static bool virtio_device_endian_needed(void *opaque)
> >>> +{
> >>> +    VirtIODevice *vdev = opaque;
> >>> +
> >>> +    assert(vdev->device_endian != VIRTIO_DEVICE_ENDIAN_UNKNOWN);
> >>> +#ifdef TARGET_WORDS_BIGENDIAN
> >>> +    return vdev->device_endian == VIRTIO_DEVICE_ENDIAN_LITTLE;
> >>> +#else
> >>> +    return vdev->device_endian == VIRTIO_DEVICE_ENDIAN_BIG;
> >>> +#endif
> >> if (target_words_bigendian()) {
> >>       return virtio_is_big_endian();
> >> } else {
> >>       return !virtio_is_big_endian();
> >> }
> >>
> >> Then we have one less dependency on TARGET_WORDS_BIGENDIAN which means a
> >> step towards compiling virtio once ;).
> >>
> >>
> >> Alex
> >>
> > Heh ! It used to be target_words_bigendian() in the first place and I turned
> > it into TARGET_WORDS_BIGENDIAN to avoid "hey virtio isn't soon to be common
> > why don't you sort this out at compile time?" remarks. :)
> >
> > Since we are definitely not on a fastpath here, I'll gladly fix this.
> 
> Yeah, just combine it with virtio_set_endian_target_default.
> 
> static enum foo virtio_default_endian(vdev)
> {
>      if (target_words_bigendian()) {
>          return VIRTIO_DEVICE_ENDIAN_BIG;
>      ....
> }
> 
> Instead of calling virtio_set_endian_target_default, you do
> 
>      vdev->device_endian = virtio_default_endian(vdev);
> 
> and
> 
> static bool virtio_biendian_section_needed(vdev)
> {
>      assert(unknown);
>      return vdev->device_endian != virtio_default_endian(vdev);
> }
> 
> 
> Alex
> 

It sure looks better. Thanks !

-- 
Gregory Kurz                                     kurzgreg@fr.ibm.com
                                                 gkurz@linux.vnet.ibm.com
Software Engineer @ IBM/Meiosys                  http://www.ibm.com
Tel +33 (0)562 165 496

"Anarchy is about taking complete responsibility for yourself."
        Alan Moore.

  reply	other threads:[~2014-06-13 12:53 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-13 11:18 [Qemu-devel] [PATCH v8 00/20] virtio endian-ambivalent target Greg Kurz
2014-06-13 11:18 ` [Qemu-devel] [PATCH v8 01/20] virtio-serial: don't migrate the config space Greg Kurz
2014-06-13 11:33   ` Alexander Graf
2014-06-19 10:40   ` Amit Shah
2014-06-19 11:17     ` Greg Kurz
2014-06-19 11:32   ` Michael S. Tsirkin
2014-06-13 11:19 ` [Qemu-devel] [PATCH v8 02/20] virtio: introduce device specific migration calls Greg Kurz
2014-06-13 11:19 ` [Qemu-devel] [PATCH v8 03/20] virtio-net: implement per-device " Greg Kurz
2014-06-13 11:19 ` [Qemu-devel] [PATCH v8 04/20] virtio-blk: " Greg Kurz
2014-06-13 11:20 ` [Qemu-devel] [PATCH v8 05/20] virtio-serial: " Greg Kurz
2014-06-13 11:20 ` [Qemu-devel] [PATCH v8 06/20] virtio-balloon: " Greg Kurz
2014-06-13 11:21 ` [Qemu-devel] [PATCH v8 07/20] virtio-rng: " Greg Kurz
2014-06-13 11:21 ` [Qemu-devel] [PATCH v8 08/20] virtio: add subsections to the migration stream Greg Kurz
2014-06-13 11:21 ` [Qemu-devel] [PATCH v8 09/20] exec: introduce target_words_bigendian() helper Greg Kurz
2014-06-13 11:41   ` Alexander Graf
2014-06-13 12:05     ` Greg Kurz
2014-06-13 11:22 ` [Qemu-devel] [PATCH v8 10/20] cpu: introduce CPUClass::virtio_is_big_endian() Greg Kurz
2014-06-13 11:42   ` Alexander Graf
2014-06-13 12:08     ` Greg Kurz
2014-06-13 11:23 ` [Qemu-devel] [PATCH v8 11/20] virtio: add endian-ambivalent support to VirtIODevice Greg Kurz
2014-06-13 11:46   ` Alexander Graf
2014-06-13 12:14     ` Greg Kurz
2014-06-13 12:41       ` Alexander Graf
2014-06-13 12:52         ` Greg Kurz [this message]
2014-06-13 11:23 ` [Qemu-devel] [PATCH v8 12/20] virtio: memory accessors for endian-ambivalent targets Greg Kurz
2014-06-13 11:24 ` [Qemu-devel] [PATCH v8 13/20] virtio: allow byte swapping for vring Greg Kurz
2014-06-13 11:24 ` [Qemu-devel] [PATCH v8 14/20] virtio-net: use virtio wrappers to access headers Greg Kurz
2014-06-13 11:52   ` Alexander Graf
2014-06-13 12:24     ` Cedric Le Goater
2014-06-13 12:40       ` Greg Kurz
2014-06-13 11:24 ` [Qemu-devel] [PATCH v8 15/20] virtio-balloon: use virtio wrappers to access page frame numbers Greg Kurz
2014-06-13 11:24 ` [Qemu-devel] [PATCH v8 16/20] virtio-blk: use virtio wrappers to access headers Greg Kurz
2014-06-13 11:24 ` [Qemu-devel] [PATCH v8 17/20] virtio-scsi: " Greg Kurz
2014-06-19 15:05   ` Greg Kurz
2014-06-20  8:24   ` Paolo Bonzini
2014-06-20  8:33     ` Greg Kurz
2014-06-13 11:25 ` [Qemu-devel] [PATCH v8 18/20] virtio-serial-bus: " Greg Kurz
2014-06-13 11:25 ` [Qemu-devel] [PATCH v8 19/20] virtio-9p: " Greg Kurz
2014-06-13 11:26 ` [Qemu-devel] [PATCH v8 20/20] target-ppc: enable virtio endian ambivalent support Greg Kurz
2014-06-13 11:56 ` [Qemu-devel] [PATCH v8 00/20] virtio endian-ambivalent target Alexander Graf
2014-06-16 15:07   ` Greg Kurz
2014-06-16 16:53     ` Amit Shah
2014-06-17  7:36 ` Stefan Hajnoczi
2014-06-17  7:40   ` Alexander Graf
2014-06-18 10:38     ` Stefan Hajnoczi
2014-06-18 12:35       ` Greg Kurz
2014-06-18 15:12         ` Michael S. Tsirkin
2014-06-18 15:14           ` Alexander Graf
2014-06-18 15:26             ` Michael S. Tsirkin
2014-06-19  9:51         ` Stefan Hajnoczi
2014-06-18 12:53       ` Peter Maydell
2014-06-18 13:42         ` Michael S. Tsirkin
2014-06-18 14:28           ` Greg Kurz
2014-06-18 15:05             ` Michael S. Tsirkin
2014-06-18 15:35             ` Peter Maydell
2014-06-18 15:37               ` Alexander Graf
2014-06-18 15:40                 ` Peter Maydell
2014-06-18 15:41                   ` Alexander Graf

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=20140613145246.7d012445@bahia.local \
    --to=gkurz@linux.vnet.ibm.com \
    --cc=afaerber@suse.de \
    --cc=agraf@suse.de \
    --cc=aliguori@amazon.com \
    --cc=amit.shah@redhat.com \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=kwolf@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=rusty@rustcorp.com.au \
    --cc=stefanha@redhat.com \
    /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.