From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@gmail.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>, QEMU <qemu-devel@nongnu.org>,
"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [PATCH] serial: Fix double migration data
Date: Mon, 30 Mar 2020 18:41:16 +0100 [thread overview]
Message-ID: <20200330174116.GC2843@work-vm> (raw)
In-Reply-To: <CAJ+F1CKd9x3BQKCGFPF8ouW4Fzvw0R5z3ZRT_0XPNSepP5hMZQ@mail.gmail.com>
* Marc-André Lureau (marcandre.lureau@gmail.com) wrote:
> Hi
>
> On Mon, Mar 30, 2020 at 6:47 PM Dr. David Alan Gilbert (git)
> <dgilbert@redhat.com> wrote:
> >
> > From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> >
> > After c9808d60281 we have both an object representing the serial-isa
> > device and a separate object representing the underlying common serial
> > uart. Both of these have vmsd's associated with them and thus the
> > migration stream ends up with two copies of the migration data - the
> > serial-isa includes the vmstate of the core serial. Besides
> > being wrong, it breaks backwards migration compatibility.
> >
> > Fix this by removing the dc->vmsd from the core device, so it only
> > gets migrated by any parent devices including it.
> > Add a vmstate_serial_mm so that any device that uses serial_mm_init
> > rather than creating a device still gets migrated.
> > (That doesn't fix backwards migration for serial_mm_init users,
> > but does seem to work forwards for ppce500).
> >
> > Fixes: c9808d60281 ('serial: realize the serial device')
> > Buglink: https://bugs.launchpad.net/qemu/+bug/1869426
> > Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> > ---
> > hw/char/serial.c | 12 +++++++++++-
> > 1 file changed, 11 insertions(+), 1 deletion(-)
> >
> > diff --git a/hw/char/serial.c b/hw/char/serial.c
> > index 2ab8b69e03..c822a9ae6c 100644
> > --- a/hw/char/serial.c
> > +++ b/hw/char/serial.c
> > @@ -1043,7 +1043,6 @@ static void serial_class_init(ObjectClass *klass, void* data)
> > dc->user_creatable = false;
> > dc->realize = serial_realize;
> > dc->unrealize = serial_unrealize;
> > - dc->vmsd = &vmstate_serial;
> > device_class_set_props(dc, serial_properties);
> > }
> >
> > @@ -1113,6 +1112,16 @@ static void serial_mm_realize(DeviceState *dev, Error **errp)
> > sysbus_init_irq(SYS_BUS_DEVICE(smm), &smm->serial.irq);
> > }
> >
> > +static const VMStateDescription vmstate_serial_mm = {
> > + .name = "serial",
> > + .version_id = 3,
> > + .minimum_version_id = 2,
> > + .fields = (VMStateField[]) {
> > + VMSTATE_STRUCT(serial, SerialMM, 0, vmstate_serial, SerialState),
> > + VMSTATE_END_OF_LIST()
> > + }
> > +};
> > +
>
> Why do you make it a sub-state?
Because it's consistent with serial-isa and it's simple.
> # qemu-system-ppc -M ppce500 -monitor stdio -serial pty
> in 4.2 and 5.0:
> "serial (8)": {
> "divider": "0x00d9",
> "rbr": "0x00",
> "ier": "0x00",
> "iir": "0xc1",
> "lcr": "0x03",
> "mcr": "0x03",
> "lsr": "0x60",
> "msr": "0xb0",
> "scr": "0x00",
> "fcr_vmstate": "0x01"
> },
>
> With this patch:
> "serial (8)": {
> "serial": {
> "divider": "0x00d9",
> "rbr": "0x00",
> "ier": "0x00",
> "iir": "0xc1",
> "lcr": "0x03",
> "mcr": "0x03",
> "lsr": "0x60",
> "msr": "0xb0",
> "scr": "0x00",
> "fcr_vmstate": "0x01"
> }
> },
>
> > SerialMM *serial_mm_init(MemoryRegion *address_space,
> > hwaddr base, int regshift,
> > qemu_irq irq, int baudbase,
> > @@ -1162,6 +1171,7 @@ static void serial_mm_class_init(ObjectClass *oc, void *data)
> >
> > device_class_set_props(dc, serial_mm_properties);
> > dc->realize = serial_mm_realize;
> > + dc->vmsd = &vmstate_serial_mm;
> > }
> >
> > static const TypeInfo serial_mm_info = {
> > --
> > 2.25.1
> >
> >
>
> I understand removing the serial state from SerialClass solves the
> double state issue for ISA. But at the same time, I think we should
> aim to migrate ISASerial state to SerialClass state. I can take a look
> if you want.
I don't think there's anything wrong with having a separate layer here;
the physical reality of what we have is a UART (Serial) that is on the
ISA bus where the ISA bus interfacing doesn't require any extra state
to be migrated.
Dave
>
>
> --
> Marc-André Lureau
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2020-03-30 17:46 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-30 16:47 [PATCH] serial: Fix double migration data Dr. David Alan Gilbert (git)
2020-03-30 17:29 ` Marc-André Lureau
2020-03-30 17:41 ` Dr. David Alan Gilbert [this message]
2020-03-30 17:56 ` Marc-André Lureau
2020-03-31 15:23 ` Paolo Bonzini
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=20200330174116.GC2843@work-vm \
--to=dgilbert@redhat.com \
--cc=marcandre.lureau@gmail.com \
--cc=mst@redhat.com \
--cc=pbonzini@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.