diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/examples/xend-config.sxp | 7 | ||||
-rw-r--r-- | tools/python/xen/util/pci.py | 6 | ||||
-rw-r--r-- | tools/python/xen/xend/XendDomainInfo.py | 5 | ||||
-rw-r--r-- | tools/python/xen/xend/XendOptions.py | 7 | ||||
-rw-r--r-- | tools/python/xen/xend/server/pciif.py | 14 |
5 files changed, 35 insertions, 4 deletions
diff --git a/tools/examples/xend-config.sxp b/tools/examples/xend-config.sxp index 283949e29c..6c6dd2e253 100644 --- a/tools/examples/xend-config.sxp +++ b/tools/examples/xend-config.sxp @@ -260,3 +260,10 @@ #(device-create-timeout 100) #(device-destroy-timeout 100) +# When assigning device to HVM guest, we use the strict check for HVM guest by +# default. (For PV guest, we use loose check automatically if necessary.) +# When we assign device to HVM guest, if we meet with the co-assignment +# issues or the ACS issue, we could try changing the option to 'no' -- however, +# we have to realize this may incur security issue and we can't make sure the +# device assignment could really work properly even after we do this. +#(pci-passthrough-strict-check yes) diff --git a/tools/python/xen/util/pci.py b/tools/python/xen/util/pci.py index 6191f9e62b..8334e3d437 100644 --- a/tools/python/xen/util/pci.py +++ b/tools/python/xen/util/pci.py @@ -1065,7 +1065,7 @@ class PciDevice: ', but it is not owned by pciback or pci-stub.' raise PciDeviceAssignmentError(err_msg % (pci_dev, self.name)) - def do_FLR(self, is_hvm): + def do_FLR(self, is_hvm, strict_check): """ Perform FLR (Functional Level Reset) for the device. """ if self.dev_type == DEV_TYPE_PCIe_ENDPOINT: @@ -1085,6 +1085,8 @@ class PciDevice: if not is_hvm and (len(funcs) > 1): return + if is_hvm and not strict_check: + return self.devs_check_driver(funcs) @@ -1113,6 +1115,8 @@ class PciDevice: if not is_hvm and (len(devs) > 1): return + if is_hvm and not strict_check: + return self.devs_check_driver(devs) diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 53bdf4eaa6..cf9611e212 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -311,7 +311,7 @@ def do_FLR(domid, is_hvm): except Exception, e: raise VmError("pci: failed to locate device and "+ "parse it's resources - "+str(e)) - dev.do_FLR(is_hvm) + dev.do_FLR(is_hvm, xoptions.get_pci_dev_assign_strict_check()) class XendDomainInfo: """An object represents a domain. @@ -711,6 +711,9 @@ class XendDomainInfo: if not self.info.is_hvm(): return + if not xoptions.get_pci_dev_assign_strict_check(): + return + # Check if there is intermediate PCIe switch bewteen the device and # Root Complex. if pci_device.is_behind_switch_lacking_acs(): diff --git a/tools/python/xen/xend/XendOptions.py b/tools/python/xen/xend/XendOptions.py index 976e8b091c..e4a79825b7 100644 --- a/tools/python/xen/xend/XendOptions.py +++ b/tools/python/xen/xend/XendOptions.py @@ -148,6 +148,10 @@ class XendOptions: """Default timeout for device destruction.""" device_destroy_timeout_default = 100 + """By default, we use the strict check for HVM guest. (For PV guest, we + use loose check automatically if necessary.""" + pci_dev_assign_strict_check_default = True + def __init__(self): self.configure() @@ -413,6 +417,9 @@ class XendOptions: return self.get_config_int("device-destroy-timeout", self.device_destroy_timeout_default) + def get_pci_dev_assign_strict_check(self): + return self.get_config_bool("pci-passthrough-strict-check", + self.pci_dev_assign_strict_check_default) class XendOptionsFile(XendOptions): diff --git a/tools/python/xen/xend/server/pciif.py b/tools/python/xen/xend/server/pciif.py index 460a937a53..b56cf3b650 100644 --- a/tools/python/xen/xend/server/pciif.py +++ b/tools/python/xen/xend/server/pciif.py @@ -21,6 +21,9 @@ import types import time from xen.xend import sxp +from xen.xend import XendOptions +xoptions = XendOptions.instance() + from xen.xend import arch from xen.xend.XendError import VmError from xen.xend.XendLogging import log @@ -356,6 +359,7 @@ class PciController(DevController): if len(pci_str_list) != len(set(pci_str_list)): raise VmError('pci: duplicate devices specified in guest config?') + strict_check = xoptions.get_pci_dev_assign_strict_check() for pci_dev in pci_dev_list: try: dev = PciDevice(pci_dev) @@ -365,7 +369,8 @@ class PciController(DevController): # Check if there is intermediate PCIe switch bewteen the device and # Root Complex. - if self.vm.info.is_hvm() and dev.is_behind_switch_lacking_acs(): + if self.vm.info.is_hvm() and dev.is_behind_switch_lacking_acs() \ + and strict_check: err_msg = 'pci: to avoid potential security issue, %s is not'+\ ' allowed to be assigned to guest since it is behind'+\ ' PCIe switch that does not support or enable ACS.' @@ -382,6 +387,8 @@ class PciController(DevController): else: if not self.vm.info.is_hvm(): continue + if not strict_check: + continue funcs = dev.find_all_the_multi_functions() dev.devs_check_driver(funcs) @@ -405,6 +412,8 @@ class PciController(DevController): else: if not self.vm.info.is_hvm(): continue + if not strict_check: + continue # All devices behind the uppermost PCI/PCI-X bridge must be\ # co-assigned to the same guest. @@ -466,7 +475,8 @@ class PciController(DevController): # Need to do FLR here before deassign device in order to terminate # DMA transaction, etc - dev.do_FLR(self.vm.info.is_hvm()) + dev.do_FLR(self.vm.info.is_hvm(), + xoptions.get_pci_dev_assign_strict_check()) bdf = xc.deassign_device(fe_domid, pci_dict_to_xc_str(pci_dev)) pci_str = pci_dict_to_bdf_str(pci_dev) |