From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joe Jin Subject: [PATCH] xend: disallow multiple destroy() call Date: Mon, 04 Feb 2013 09:54:23 +0800 Message-ID: <510F14CF.6050801@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Ian Campbell , Konrad Rzeszutek Wilk Cc: xen-devel List-Id: xen-devel@lists.xenproject.org Current Xend allowing multiple call destroy() for same domain, this lead multiple hard resets(FLR) for pci pass-through, and some controller might failed. In our test, we pass through 2 LSI HAB controllers to the PVHVM guest, after guest brought up, call xm-destroy twice, the adapters's BIOS will hung, and we had to reboot the server to recovery it. Signed-off-by: Joe Jin Cc: Konrad Rzeszutek Wilk Cc: Ian Campbell --- tools/python/xen/xend/XendDomainInfo.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index e9d3e7e..658c3b6 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -367,6 +367,8 @@ class XendDomainInfo: @type refresh_shutdown_lock: threading.Condition @ivar _deviceControllers: device controller cache for this domain @type _deviceControllers: dict 'string' to DevControllers + @ivar destroying: Is this domain destroying + @type destroying: bool """ def __init__(self, info, domid = None, dompath = None, augment = False, @@ -455,6 +457,8 @@ class XendDomainInfo: self._checkName(self.info['name_label']) self.metrics = XendVMMetrics(uuid.createString(), self) + + self.destroying = False # @@ -3073,6 +3077,12 @@ class XendDomainInfo: if self.domid is None: return + + if self.destroying == False: + self.destroying = True + else: + raise VmError("Domain (domid=%s) is destroying, please wait!", str(self.domid)) + from xen.xend import XendDomain log.debug("XendDomainInfo.destroy: domid=%s", str(self.domid)) @@ -3088,6 +3098,7 @@ class XendDomainInfo: self.info[state] = 0 self._stateSet(DOM_STATE_HALTED) except: + self.destroying = False log.exception("XendDomainInfo.destroy: domain destruction failed.") XendDomain.instance().remove_domain(self) -- 1.8.1