aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-04-24 13:19:37 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-04-24 13:19:37 +0100
commit94e98d9fffa20e107c22098222fcb2df157e267a (patch)
tree45e31c78d8b341aa6d2f0d67e6f63d32d5062494
parent4a696a0a8618ca0f7502bfb98ef847890e6d53d6 (diff)
downloadxen-94e98d9fffa20e107c22098222fcb2df157e267a.tar.gz
xen-94e98d9fffa20e107c22098222fcb2df157e267a.tar.bz2
xen-94e98d9fffa20e107c22098222fcb2df157e267a.zip
xend: modify the order of resetting/deassigning device.
When guest OS shutdowns or a device is hotremoved. 1. Xend resets devices. 2. Xend deassigns devices. Because if devices are deassigned before the reset, dom0 memory may be overwritten by DMA. Signed-off-by: Yuji Shimada <shimada-yxb@necst.nec.co.jp>
-rw-r--r--tools/python/xen/xend/server/pciif.py18
1 files changed, 10 insertions, 8 deletions
diff --git a/tools/python/xen/xend/server/pciif.py b/tools/python/xen/xend/server/pciif.py
index 1515c9f05d..7820fd0edb 100644
--- a/tools/python/xen/xend/server/pciif.py
+++ b/tools/python/xen/xend/server/pciif.py
@@ -489,13 +489,16 @@ class PciController(DevController):
"bind your slot/device to the PCI backend using sysfs" \
)%(dev.name))
- if not self.vm.info.is_hvm():
- pci_str = "0x%x, 0x%x, 0x%x, 0x%x" % (domain, bus, slot, func)
- bdf = xc.deassign_device(fe_domid, pci_str)
- if bdf > 0:
- raise VmError("Failed to deassign device from IOMMU (%x:%x.%x)"
- % (bus, slot, func))
- log.debug("pci: deassign device %x:%x.%x" % (bus, slot, func))
+ # Need to do FLR here before deassign device in order to terminate
+ # DMA transaction, etc
+ dev.do_FLR()
+
+ pci_str = "0x%x, 0x%x, 0x%x, 0x%x" % (domain, bus, slot, func)
+ bdf = xc.deassign_device(fe_domid, pci_str)
+ if bdf > 0:
+ raise VmError("Failed to deassign device from IOMMU (%x:%x.%x)"
+ % (bus, slot, func))
+ log.debug("pci: Deassign device %x:%x.%x" % (bus, slot, func))
for (start, size) in dev.ioports:
log.debug('pci: disabling ioport 0x%x/0x%x'%(start,size))
@@ -528,7 +531,6 @@ class PciController(DevController):
if rc<0:
raise VmError(('pci: failed to configure irq on device '+
'%s - errno=%d')%(dev.name,rc))
- dev.do_FLR()
def cleanupDevice(self, devid):
""" Detach I/O resources for device and cleanup xenstore nodes