test-runner: automatically find PCI passthrough config

When PCI adapters are properly configured they should exist in the
vfio-pci system tree. It is assumed any devices configured as such
are used for test-runner.

This removes the need for a hw.conf file to be supplied, but still
is required for USB adapters. Because of this the --hw option was
updated to allow no value, or a file path.
This commit is contained in:
James Prestwood 2022-07-19 11:52:23 -07:00 committed by Denis Kenzior
parent 99773ea7e8
commit 07a3b1d655
1 changed files with 32 additions and 10 deletions

View File

@ -116,6 +116,9 @@ class RunnerCoreArgParse(ArgumentParser):
help='Writes PASS/FAIL to results file')
self.add_argument('--hw', '-w',
type=str,
nargs='?',
const=True,
action='store',
help='Use physical adapters for tests (passthrough)')
self.add_argument('--testhome', help=SUPPRESS)
self.add_argument('--monitor-parent', help=SUPPRESS)
@ -382,18 +385,18 @@ class QemuRunner(RunnerAbstract):
self._prepare_outfiles()
if args.hw:
hw_conf = ConfigParser()
hw_conf.read(args.hw)
if os.path.isfile(args.hw):
hw_conf = ConfigParser()
hw_conf.read(args.hw)
if hw_conf.has_section('USBAdapters'):
# The actual key name of the adapter
# doesn't matter since all we need is the
# bus/address. This gets named by the kernel
# anyways once in the VM.
usb_adapters = [v for v in hw_conf['USBAdapters'].values()]
if hw_conf.has_section('USBAdapters'):
# The actual key name of the adapter
# doesn't matter since all we need is the
# bus/address. This gets named by the kernel
# anyways once in the VM.
usb_adapters = [v for v in hw_conf['USBAdapters'].values()]
if hw_conf.has_section('PCIAdapters'):
pci_adapters = [v for v in hw_conf['PCIAdapters'].values()]
pci_adapters = self._find_pci_adapters()
kern_log = "ignore_loglevel" if "kernel" in args.verbose else "quiet"
@ -473,6 +476,25 @@ class QemuRunner(RunnerAbstract):
self.cmdline = qemu_cmdline
def _find_pci_adapters(self):
adapters = []
try:
files = os.listdir('/sys/module/vfio_pci/drivers/pci:vfio-pci')
except:
return None
for bus_addr in files:
if not bus_addr.startswith('0000:'):
continue
adapters.append(bus_addr.replace('0000:', ''))
if len(adapters) == 0:
return None
return adapters
def prepare_environment(self):
mounts = [ MountInfo('debugfs', 'debugfs', '/sys/kernel/debug', '', 0) ]