Il 30/04/2013 14:59, Claudio Bley ha scritto: > At Mon, 29 Apr 2013 17:54:37 +0200, > Paolo Bonzini wrote: >> >> Il 12/04/2013 16:02, Claudio Bley ha scritto: >>> Hi. >>> >>> I'm using the latest qemu release 1.4.0 and libvirt 1.0.4. >>> >>> The host system is a Ubuntu 12.04 LTS system, Intel Xeon processor, >>> 4GB RAM. >>> >>> When trying to install Windows XP I constantly receive this error >>> (usually right before the graphical Setup is started). Once, I've seen >>> this error too: >>> >>> hw/lsi53c895a.c:351: lsi_soft_reset: Assertion `((&s->queue)->tqh_first == >>> ((void *)0))' failed. >>> >>> I found the thread here >>> http://lists.gnu.org/archive/html/qemu-devel/2012-11/msg00518.html but >>> it didn't led me nowhere. >>> >>> I recompiled with DEBUG_SCSI and DEBUG_LSI enabled. Here's the command >>> libvirt put together and the last few lines of output. I can provide >>> the complete log if you need it. >> >> Hi, sorry---I just read this now. >> >> Can you please try the patches at >> http://cache.gmane.org//gmane/comp/emulators/qemu/208057-001.bin? > > I gave it a shot and this fixed the bug for me.
Thanks very much. It is late for 1.5 now, but these will be in 1.5.1 and 1.6. Paolo > I've applied the patches to git tag v1.4.1 with minor modifications: > > - skipped patch 1 and 2 since they already had been applied upstream > in the meantime, AFAICS > > - s/vists/visits/ in subject line of patch 3 > > - updated patch 3 and 4 in order to adjust for moved-around files and > some code changes since 1.3.0 > > Thanks! > > Here are the updated patches: > > ------- >8 --------------------------------------------- > From e33168365eae0d6610762ebafd22f26a7a6168e1 Mon Sep 17 00:00:00 2001 > From: Paolo Bonzini <pbonz...@redhat.com> > Date: Mon, 17 Dec 2012 10:37:02 +0100 > Subject: [PATCH 1/2] qdev: allow both pre- and post-order visits in qdev > walking functions > > > Resetting should be done in post-order, not pre-order. However, > qdev_walk_children and qbus_walk_children do not allow this. Fix > it by adding two extra arguments to the functions. > > --- > hw/qdev-core.h | 13 +++++++++---- > hw/qdev.c | 45 +++++++++++++++++++++++++++++++++------------ > 2 files changed, 42 insertions(+), 16 deletions(-) > > diff --git a/hw/qdev-core.h b/hw/qdev-core.h > index 2486f36..a0d05ca 100644 > --- a/hw/qdev-core.h > +++ b/hw/qdev-core.h > @@ -237,10 +237,15 @@ BusState *qbus_create(const char *typename, DeviceState > *parent, const char *nam > /* Returns > 0 if either devfn or busfn skip walk somewhere in cursion, > * < 0 if either devfn or busfn terminate walk somewhere in cursion, > * 0 otherwise. */ > -int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn, > - qbus_walkerfn *busfn, void *opaque); > -int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn, > - qbus_walkerfn *busfn, void *opaque); > +int qbus_walk_children(BusState *bus, > + qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, > + qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, > + void *opaque); > +int qdev_walk_children(DeviceState *dev, > + qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, > + qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, > + void *opaque); > + > void qdev_reset_all(DeviceState *dev); > > /** > diff --git a/hw/qdev.c b/hw/qdev.c > index 689cd54..772cfe0 100644 > --- a/hw/qdev.c > +++ b/hw/qdev.c > @@ -224,12 +224,12 @@ static int qbus_reset_one(BusState *bus, void *opaque) > > void qdev_reset_all(DeviceState *dev) > { > - qdev_walk_children(dev, qdev_reset_one, qbus_reset_one, NULL); > + qdev_walk_children(dev, qdev_reset_one, qbus_reset_one, NULL, NULL, > NULL); > } > > void qbus_reset_all(BusState *bus) > { > - qbus_walk_children(bus, qdev_reset_one, qbus_reset_one, NULL); > + qbus_walk_children(bus, qdev_reset_one, qbus_reset_one, NULL, NULL, > NULL); > } > > void qbus_reset_all_fn(void *opaque) > @@ -327,49 +327,70 @@ BusState *qdev_get_child_bus(DeviceState *dev, const > char *name) > return NULL; > } > > -int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn, > - qbus_walkerfn *busfn, void *opaque) > +int qbus_walk_children(BusState *bus, > + qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, > + qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, > + void *opaque) > { > BusChild *kid; > int err; > > - if (busfn) { > - err = busfn(bus, opaque); > + if (pre_busfn) { > + err = pre_busfn(bus, opaque); > if (err) { > return err; > } > } > > QTAILQ_FOREACH(kid, &bus->children, sibling) { > - err = qdev_walk_children(kid->child, devfn, busfn, opaque); > + err = qdev_walk_children(kid->child, > + pre_devfn, pre_busfn, > + post_devfn, post_busfn, opaque); > if (err < 0) { > return err; > } > } > > + if (post_busfn) { > + err = post_busfn(bus, opaque); > + if (err) { > + return err; > + } > + } > + > return 0; > } > > -int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn, > - qbus_walkerfn *busfn, void *opaque) > +int qdev_walk_children(DeviceState *dev, > + qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, > + qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, > + void *opaque) > { > BusState *bus; > int err; > > - if (devfn) { > - err = devfn(dev, opaque); > + if (pre_devfn) { > + err = pre_devfn(dev, opaque); > if (err) { > return err; > } > } > > QLIST_FOREACH(bus, &dev->child_bus, sibling) { > - err = qbus_walk_children(bus, devfn, busfn, opaque); > + err = qbus_walk_children(bus, pre_devfn, pre_busfn, > + post_devfn, post_busfn, opaque); > if (err < 0) { > return err; > } > } > > + if (post_devfn) { > + err = post_devfn(dev, opaque); > + if (err) { > + return err; > + } > + } > + > return 0; > } > >