]> xenbits.xensource.com Git - xen.git/commitdiff
xend: earlier remove the backend of tapdisk device in
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 22 Apr 2010 08:44:29 +0000 (09:44 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 22 Apr 2010 08:44:29 +0000 (09:44 +0100)
xenstore to release the resource allocated in backend driver
lies in dom0'kernel

Blktapctl thread will use qemu-dm connection instead of tapdisk-ioemu
in the case of FV VM. We found the resource like memory allocated for
this Guest can't be free for backend driver couldn't be closed in qemu-dm.

This patch would  remove the backend of tapdisk device earlier in
xenstore to triger qemu-dm to notify the backend driver to release the
resource allocated.
I have tested this patch at the case of
1, save && restore
2, destory && shutdown
3, snapshot

Signed-off-by: James ( Song Wei ) <jsong@novell.com>
tools/python/xen/xend/XendDomainInfo.py

index dcf26a9886eef15460cea5fcbfd6cd2f2ea0b315..b8f7296a308291c3ce4962de6deb2d66da871973 100644 (file)
@@ -2408,8 +2408,13 @@ class XendDomainInfo:
 
     def _releaseDevices(self, suspend = False):
         """Release all domain's devices.  Nothrow guarantee."""
+        t = xstransact("%s/device" % self.vmpath)
         if self.image:
             try:
+                for dev in t.list('tap'):
+                    log.debug("Early removing %s", dev);
+                    self.getDeviceController('tap').destroyDevice(dev, True)
+                time.sleep(0.1)
                 log.debug("Destroying device model")
                 self.image.destroyDeviceModel()
             except Exception, e:
@@ -2418,9 +2423,10 @@ class XendDomainInfo:
             log.debug("No device model")
 
         log.debug("Releasing devices")
-        t = xstransact("%s/device" % self.vmpath)
         try:
             for devclass in XendDevices.valid_devices():
+                if devclass is 'tap':
+                    continue
                 for dev in t.list(devclass):
                     try:
                         log.debug("Removing %s", dev);