[libvirt] [PATCH 4/6] qemu: use virObject to manage reference-counting for qemu monitor
Hu Tao
hutao at cn.fujitsu.com
Fri Apr 8 09:09:22 UTC 2011
On Fri, Apr 08, 2011 at 09:57:16AM +0100, Daniel P. Berrange wrote:
> On Fri, Apr 08, 2011 at 11:07:44AM +0800, Hu Tao wrote:
> > On Thu, Apr 07, 2011 at 10:38:34AM +0100, Daniel P. Berrange wrote:
> > > On Wed, Apr 06, 2011 at 03:19:55PM +0800, Hu Tao wrote:
> > > > ---
> > > > src/qemu/qemu_domain.c | 30 ++-----------
> > > > src/qemu/qemu_migration.c | 2 -
> > > > src/qemu/qemu_monitor.c | 109 ++++++++++++++++++++++++--------------------
> > > > src/qemu/qemu_monitor.h | 4 +-
> > > > src/qemu/qemu_process.c | 32 +++++++-------
> > > > 5 files changed, 81 insertions(+), 96 deletions(-)
> > > >
> > > > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> > > > index 3a3c953..d11dc5f 100644
> > > > --- a/src/qemu/qemu_domain.c
> > > > +++ b/src/qemu/qemu_domain.c
> > > > @@ -560,9 +560,8 @@ void qemuDomainObjEnterMonitor(virDomainObjPtr obj)
> > > > {
> > > > qemuDomainObjPrivatePtr priv = obj->privateData;
> > > >
> > > > - qemuMonitorLock(priv->mon);
> > > > - qemuMonitorRef(priv->mon);
> > > > virDomainObjUnlock(obj);
> > > > + qemuMonitorLock(priv->mon);
> > > > }
> > > >
> > > >
> > > > @@ -573,18 +572,9 @@ void qemuDomainObjEnterMonitor(virDomainObjPtr obj)
> > > > void qemuDomainObjExitMonitor(virDomainObjPtr obj)
> > > > {
> > > > qemuDomainObjPrivatePtr priv = obj->privateData;
> > > > - int refs;
> > > > -
> > > > - refs = qemuMonitorUnref(priv->mon);
> > > > -
> > > > - if (refs > 0)
> > > > - qemuMonitorUnlock(priv->mon);
> > > >
> > > > + qemuMonitorUnlock(priv->mon);
> > > > virDomainObjLock(obj);
> > > > -
> > > > - if (refs == 0) {
> > > > - priv->mon = NULL;
> > > > - }
> > > > }
> > > >
> > > >
> > > > @@ -601,10 +591,8 @@ void qemuDomainObjEnterMonitorWithDriver(struct qemud_driver *driver,
> > > > {
> > > > qemuDomainObjPrivatePtr priv = obj->privateData;
> > > >
> > > > - qemuMonitorLock(priv->mon);
> > > > - qemuMonitorRef(priv->mon);
> > > > virDomainObjUnlock(obj);
> > > > - qemuDriverUnlock(driver);
> > > > + qemuMonitorLock(priv->mon);
> > > > }
> > > >
> > > >
> > > > @@ -617,19 +605,9 @@ void qemuDomainObjExitMonitorWithDriver(struct qemud_driver *driver,
> > > > virDomainObjPtr obj)
> > > > {
> > > > qemuDomainObjPrivatePtr priv = obj->privateData;
> > > > - int refs;
> > > > -
> > > > - refs = qemuMonitorUnref(priv->mon);
> > > > -
> > > > - if (refs > 0)
> > > > - qemuMonitorUnlock(priv->mon);
> > > >
> > > > - qemuDriverLock(driver);
> > > > + qemuMonitorUnlock(priv->mon);
> > > > virDomainObjLock(obj);
> > > > -
> > > > - if (refs == 0) {
> > > > - priv->mon = NULL;
> > > > - }
> > > > }
> > >
> > > This means that the 'driver' lock is now whenever any QEMU
> > > monitor command is runing, which blocks the entire driver.
> >
> > qemuDomainObjEnterMonitorWithDriver is now called without holding qemu
> > driver lock.
>
> Well, this and the other changes in this series are completely
> altering all the locking rules used throughout the QEMU
> driver, with no clear explanation of what you are actually
> doing. Please read src/qemu/THREADS.txt and then provide an
> equivalent document explaining what you think the new rules
> should be, otherwise it is impossible to tell if these patches
> are at all threadsafe.
Sorry I didn't make this clear, will do in next version.
More information about the libvir-list
mailing list