On Mon, Jul 29, 2019 at 04:56:27PM +0200, Damien Hedde wrote: > It contains the resetting counter and cold flag status. > > At this point, migration of bus reset related state (counter and cold/warm > flag) is handled by parent device. This done using the post_load > function in the vmsd subsection. > > This is last point allow to add an initial support of migration with part of > qdev/qbus tree in reset state under the following condition: > + time-lasting reset are asserted on Device only > > Note that if this condition is not respected, migration will succeed and > no failure will occurs. The only impact is that the resetting counter > of a bus may lower afer a migration. > > Signed-off-by: Damien Hedde <damien.he...@greensocs.com> > --- > hw/core/Makefile.objs | 1 + > hw/core/qdev-vmstate.c | 45 ++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 46 insertions(+) > create mode 100644 hw/core/qdev-vmstate.c > > diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs > index d9234aa98a..49e9be0228 100644 > --- a/hw/core/Makefile.objs > +++ b/hw/core/Makefile.objs > @@ -4,6 +4,7 @@ common-obj-y += bus.o reset.o > common-obj-y += resettable.o > common-obj-$(CONFIG_SOFTMMU) += qdev-fw.o > common-obj-$(CONFIG_SOFTMMU) += fw-path-provider.o > +common-obj-$(CONFIG_SOFTMMU) += qdev-vmstate.o > # irq.o needed for qdev GPIO handling: > common-obj-y += irq.o > common-obj-y += hotplug.o > diff --git a/hw/core/qdev-vmstate.c b/hw/core/qdev-vmstate.c > new file mode 100644 > index 0000000000..07b010811f > --- /dev/null > +++ b/hw/core/qdev-vmstate.c > @@ -0,0 +1,45 @@ > +/* > + * Device vmstate > + * > + * Copyright (c) 2019 GreenSocs > + * > + * Authors: > + * Damien Hedde > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + */ > + > +#include "qemu/osdep.h" > +#include "hw/qdev.h" > +#include "migration/vmstate.h" > + > +static bool device_vmstate_reset_needed(void *opaque) > +{ > + DeviceState *dev = (DeviceState *) opaque; > + return dev->resetting != 0; > +} > + > +static int device_vmstate_reset_post_load(void *opaque, int version_id) > +{ > + DeviceState *dev = (DeviceState *) opaque; > + BusState *bus; > + QLIST_FOREACH(bus, &dev->child_bus, sibling) { > + bus->resetting = dev->resetting;
Having redundant copies of the resetting bit in the bridge and every bus instance seems kind of bogus. > + bus->reset_is_cold = dev->reset_is_cold; > + } > + return 0; > +} > + > +const struct VMStateDescription device_vmstate_reset = { > + .name = "device_reset", > + .version_id = 0, > + .minimum_version_id = 0, > + .needed = device_vmstate_reset_needed, > + .post_load = device_vmstate_reset_post_load, > + .fields = (VMStateField[]) { > + VMSTATE_UINT32(resetting, DeviceState), > + VMSTATE_BOOL(reset_is_cold, DeviceState), > + VMSTATE_END_OF_LIST() > + }, > +}; -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature