"Michael S. Tsirkin" <m...@redhat.com> wrote:
> On Thu, Dec 09, 2010 at 03:14:17PM -0700, Alex Williamson wrote:
>> On Thu, 2010-12-09 at 22:49 +0100, Juan Quintela wrote:
>> > Alex Williamson <alex.william...@redhat.com> wrote:
>> > > The cpu_register_io_memory() value is unique to the VM instance and
>> > > should not be restored after migration/save.  Doing so means we
>> > > could be pointing at arbitrary device's io regions after 
>> > > migration/restore.
>> > >
>> > > In this case, if we start a VM with a single rtl8139, hot add a 2nd,
>> > > migrate the VM, then hot remove the added NIC, the 1st NIC stops
>> > > working and the VM segfaults on reboot.
>> > >
>> > > Signed-off-by: Alex Williamson <alex.william...@redhat.com>
>> > > ---
>> > >
>> > >  hw/rtl8139.c |    4 ++--
>> > >  1 files changed, 2 insertions(+), 2 deletions(-)
>> > >
>> > > diff --git a/hw/rtl8139.c b/hw/rtl8139.c
>> > > index d92981d..9c5fc84 100644
>> > > --- a/hw/rtl8139.c
>> > > +++ b/hw/rtl8139.c
>> > > @@ -3186,7 +3186,7 @@ static void rtl8139_pre_save(void *opaque)
>> > >  
>> > >  static const VMStateDescription vmstate_rtl8139 = {
>> > >      .name = "rtl8139",
>> > > -    .version_id = 4,
>> > > +    .version_id = 5,
>> > 
>> > No need to change version, format is still the same.
>> > 
>> > >      .minimum_version_id = 3,
>> > >      .minimum_version_id_old = 3,
>> > >      .post_load = rtl8139_post_load,
>> > > @@ -3234,7 +3234,7 @@ static const VMStateDescription vmstate_rtl8139 = {
>> > >  
>> > >          VMSTATE_UNUSED(4),
>> > >          VMSTATE_MACADDR(conf.macaddr, RTL8139State),
>> > > -        VMSTATE_INT32(rtl8139_mmio_io_addr, RTL8139State),
>> > > +        VMSTATE_UNUSED(4),
>> > 
>> > If we migrate from an old guest: we just ignore the value.
>> > If we migrate to one old guest, we send garbage, but as you told that we
>> > were already sending garbage, it looks ok, no?
>> 
>> NAK, if we don't bump the version, we don't know if we're migration
>> to/from a version 4 that includes the io address or not.  We have no
>> good way to debug different binaries on different systems.  It seems to
>> work today if we don't involve hotplug, so I think we have to maintain
>> version 4 as including the io address, and let version 5 drop it.  I
>> tested old to new migrations, and as you expect, it does work.
>> 
>> Alex
>
> How about we keep migrating the index for the benefit of
> old versions, but ignore the value on load?
> Something like the following:

This was my 1st suggestion to Alex O:-)
So, I am in.  he think this is bad for upstream,  I don't think so (but
I understand that it is oppinable).

Later, Juan.


>
> Signed-off-by: Michael S. Tsirkin <m...@redhat.com>
>
> diff --git a/hw/rtl8139.c b/hw/rtl8139.c
> index d92981d..e999dd9 100644
> --- a/hw/rtl8139.c
> +++ b/hw/rtl8139.c
> @@ -494,6 +494,13 @@ typedef struct RTL8139State {
>      QEMUTimer *timer;
>      int64_t TimerExpire;
>  
> +    /* Hack for migration compatibility: older
> +     * versions of rtl8139 put mmio index in save image,
> +     * and override the index that we have with that one.
> +     * This does not make any sense but happens to
> +     * work sometimes, if we are lucky and index matches.
> +     * On load, we can simply ignore this value. */
> +    int compat_rtl8139_mmio_io_addr;
>  } RTL8139State;
>  
>  static void rtl8139_set_next_tctr_time(RTL8139State *s, int64_t 
> current_time);
> @@ -3182,6 +3189,7 @@ static void rtl8139_pre_save(void *opaque)
>      rtl8139_set_next_tctr_time(s, current_time);
>      s->TCTR = muldiv64(current_time - s->TCTR_base, PCI_FREQUENCY,
>                         get_ticks_per_sec());
> +    s->compat_rtl8139_mmio_io_addr = s->rtl8139_mmio_io_addr;
>  }
>  
>  static const VMStateDescription vmstate_rtl8139 = {
> @@ -3234,7 +3242,7 @@ static const VMStateDescription vmstate_rtl8139 = {
>  
>          VMSTATE_UNUSED(4),
>          VMSTATE_MACADDR(conf.macaddr, RTL8139State),
> -        VMSTATE_INT32(rtl8139_mmio_io_addr, RTL8139State),
> +        VMSTATE_INT32(compat_rtl8139_mmio_io_addr, RTL8139State),
>  
>          VMSTATE_UINT32(currTxDesc, RTL8139State),
>          VMSTATE_UINT32(currCPlusRxDesc, RTL8139State),

Reply via email to