This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
Home Products Support Community News


[Xen-devel] [PATCH]xend: fix dual destroy

To: "Jim Fehlig" <jfehlig@xxxxxxxxxx>, "Keir Fraser" <keir.fraser@xxxxxxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH]xend: fix dual destroy
From: "Cui, Dexuan" <dexuan.cui@xxxxxxxxx>
Date: Fri, 25 Jul 2008 18:39:36 +0800
Delivery-date: Fri, 25 Jul 2008 03:40:02 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Thread-index: AcjuQrh1+kBma6P8RHOWw2RoMpqPGQ==
Thread-topic: [PATCH]xend: fix dual destroy
After changeset 18030 and 18064 were checked in, I found some issues
when creating HVM domains with devices assigned:

In XendDomainInfo.py, we have the call trace: the global function
create() => vm.start()  => _constructDomain().
In _constructDomain(), we invoke xc.test_assign_device() and when the
function fails (maybe because iommu=1 is not specified in grub entry
since iommu is 0 by defaut now; maybe because the device doesn't exist;
maybe because the device has been assigned, or something) we raise
Then start() will invoke self.destroy() and re-raise the exception;
Next, the global create() will invoke vm.destroy() again; finally,
_cleanupVm()  and "self.metrics.destroy()" will be invoked again. Here
when we execute metrics.destroy() for the second time, the deregister()
in XendAPIStore.py will complain: there is no such an element in the
dict __classes and a KeyError exception is raised!

We can avoid the dual destroy by adding a check as follows.

Signed-off-by: Dexuan Cui <dexuan.cui@xxxxxxxxx>

diff -r f0cd9df566ec tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Thu Jul 24 17:36:27 2008
+++ b/tools/python/xen/xend/XendDomainInfo.py   Fri Jul 25 18:00:29 2008
@@ -2374,6 +2374,9 @@ class XendDomainInfo:
     def destroy(self):
         """Cleanup VM and destroy domain.  Nothrow guarantee."""

+        if self.domid is None:
+            return
         log.debug("XendDomainInfo.destroy: domid=%s", str(self.domid))

         paths = self._prepare_phantom_paths()

Xen-devel mailing list

<Prev in Thread] Current Thread [Next in Thread>