From 6b14a5dad4b40d0ae8908750eabab2699e7f8ae3 Mon Sep 17 00:00:00 2001 From: Lucas Cavalcante Date: Thu, 30 Sep 2021 11:50:54 -0300 Subject: [PATCH] Fix pci-irq-affinity-agent xml parser (devices) There are issues when the agent tries to parse domxml from instances using multiple 'device/interface'. Furthermore, instances using pci-passtrough creates creates devices at 'device/hostdev' in some cases. Signed-off-by: hbrito Signed-off-by: Lucas Cavalcante Partial-bug: 1945201 Change-Id: Ia486ab61286c2474878856ae5e7bce0216e618d0 --- .../pci_irq_affinity/guest.py | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/utilities/pci-irq-affinity-agent/pci_irq_affinity/pci_irq_affinity/guest.py b/utilities/pci-irq-affinity-agent/pci_irq_affinity/pci_irq_affinity/guest.py index 8345519b..d6d6157b 100644 --- a/utilities/pci-irq-affinity-agent/pci_irq_affinity/pci_irq_affinity/guest.py +++ b/utilities/pci-irq-affinity-agent/pci_irq_affinity/pci_irq_affinity/guest.py @@ -229,17 +229,29 @@ def get_guest_domain_info(dom): d_nodelist = list(sorted(nodeset)) # Get pci info. + def find_pci_addr(dom_xml, device_type): + LOG.debug("Finding pci_addrs for %s devices" % device_type) + + def parse_pci_addr(tag): + return "%04x:%02x:%02x.%01x" % ( + int(tag.get('domain'), base=16), + int(tag.get('bus'), base=16), + int(tag.get('slot'), base=16), + int(tag.get('function'), base=16)) + + for node in dom_xml.findall('./devices/' + device_type): + for driver in node.findall('driver'): + if driver.get('name').startswith('vfio'): + addr_tag = node.find('source/address') + if (addr_tag.get('type') == 'pci' or + node.get('type') == 'pci'): + pci_addr = parse_pci_addr(addr_tag) + LOG.debug("Add pci device: %s" % pci_addr) + pci_addrs.update([pci_addr]) + pci_addrs = set() - for interface in dom_xml.findall('./devices/interface'): - if interface.find('driver').get('name').startswith('vfio'): - addr_tag = interface.find('source/address') - if addr_tag.get('type') == 'pci': - pci_addr = "%04x:%02x:%02x.%01x" % ( - addr_tag.get('domain'), - addr_tag.get('bus'), - addr_tag.get('slot'), - addr_tag.get('function')) - pci_addrs.update([pci_addr]) + pci_addrs.update([find_pci_addr(dom_xml, 'interface')]) + pci_addrs.update([find_pci_addr(dom_xml, 'hostdev')]) # Update dictionary with per-domain information domain = {