Merge "Skip VFs configured for DPDKs during NIC ordering"

This commit is contained in:
Zuul 2020-05-20 01:43:40 +00:00 committed by Gerrit Code Review
commit 6c67963672
2 changed files with 30 additions and 1 deletions

View File

@ -562,6 +562,10 @@ class TestUtils(base.TestCase):
tmpdir = tempfile.mkdtemp()
self.stub_out('os_net_config.utils._SYS_CLASS_NET', tmpdir)
tmp_pci_dir = tempfile.mkdtemp()
self.stub_out('os_net_config.utils._SYS_BUS_PCI_DEV', tmp_pci_dir)
physfn_path = utils._SYS_BUS_PCI_DEV + '/0000:05:01.1/physfn'
os.makedirs(physfn_path)
def test_is_available_nic(interface_name, check_active):
return True
@ -577,6 +581,8 @@ class TestUtils(base.TestCase):
'vfio-pci')
utils._update_dpdk_map('p3p1', '0000:04:00.0', '01:02:03:04:05:07',
'igb_uio')
utils._update_dpdk_map('p3p0_0', '0000:05:01.1', 'AA:02:03:04:05:FF',
'vfio-pci')
nics = utils.ordered_active_nics()
@ -592,6 +598,7 @@ class TestUtils(base.TestCase):
self.assertEqual('z1', nics[9])
shutil.rmtree(tmpdir)
shutil.rmtree(tmp_pci_dir)
def test_interface_mac_raises(self):
self.assertRaises(IOError, utils.interface_mac, 'ens20f2p3')

View File

@ -27,6 +27,7 @@ from oslo_concurrency import processutils
logger = logging.getLogger(__name__)
_SYS_CLASS_NET = '/sys/class/net'
_SYS_BUS_PCI_DEV = '/sys/bus/pci/devices'
# File to contain the DPDK mapped nics, as nic name will not be available after
# binding driver, which is required for correct nic numbering.
# Format of the file (list mapped nic's details):
@ -149,6 +150,23 @@ def is_real_nic(interface_name):
return False
def _is_vf(pci_address):
# If DPDK drivers are bound on a VF, then the path _SYS_CLASS_NET
# wouldn't exist. Instead we look for the path
# /sys/bus/pci/devices/<PCI addr>/physfn to understand if the device
# is actually a VF. This path could be used by VFs not bound with
# DPDK drivers as well
vf_path_check = _SYS_BUS_PCI_DEV + '/%s/physfn' % pci_address
is_sriov_vf = os.path.isdir(vf_path_check)
if is_sriov_vf:
return True
# nic is not VF
return False
def _is_available_nic(interface_name, check_active=True):
try:
if interface_name == 'lo':
@ -222,8 +240,12 @@ def _ordered_nics(check_active):
if contents:
dpdk_map = yaml.safe_load(contents)
for item in dpdk_map:
# If the DPDK drivers are bound to a VF, the same needs
# to be skipped for the NIC ordering
nic = item['name']
if _is_embedded_nic(nic):
if _is_vf(item['pci_address']):
logger.info("%s is a VF, skipping it for NIC ordering" % nic)
elif _is_embedded_nic(nic):
logger.info("%s is an embedded DPDK bound nic" % nic)
embedded_nics.append(nic)
else: