From f023e531fe8e02cfb2bcc76dd6226746b183e4b4 Mon Sep 17 00:00:00 2001 From: Christian Trautman Date: Wed, 9 Aug 2017 15:11:15 -0400 Subject: driverctl: Add driverctl binding tool Adds driverctl as a binding tool option for dpdk devices. JIRA ticket contains test results to verify it works when using dpdk-devbind or driverctl. JIRA: VSPERF-525 Change-Id: Ia7a6e43a4b6fb3ba21f5d87d601f4ea4b95b7dab Signed-off-by: Christian Trautman --- src/dpdk/dpdk.py | 53 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 17 deletions(-) (limited to 'src/dpdk/dpdk.py') diff --git a/src/dpdk/dpdk.py b/src/dpdk/dpdk.py index 438fe40b..2f120129 100644 --- a/src/dpdk/dpdk.py +++ b/src/dpdk/dpdk.py @@ -138,7 +138,7 @@ def _vhost_user_cleanup(): def _bind_nics(): - """Bind NICs using the Intel DPDK ``dpdk*bind.py`` tool. + """Bind NICs using the bind tool specified in the configuration. """ if not len(_NICS_PCI): _LOGGER.info('NICs are not configured - nothing to bind') @@ -153,26 +153,39 @@ def _bind_nics(): tasks.run_task(['sudo', 'chmod', '-R', '666', '/dev/vfio/'], _LOGGER, 'Setting VFIO permissions .. 0666', True) - - tasks.run_task(['sudo', S.getValue('TOOLS')['bind-tool'], - '--bind=' + _driver] + - _NICS_PCI, _LOGGER, - 'Binding NICs %s...' % _NICS_PCI, - True) + if 'driverctl' in S.getValue('TOOLS')['bind-tool'].lower(): + for nic in _NICS_PCI: + tasks.run_task(['sudo', S.getValue('TOOLS')['bind-tool'], '-v', + 'set-override'] + [nic] + [_driver], _LOGGER, + 'Binding NIC %s...' % nic, True) + else: + tasks.run_task(['sudo', S.getValue('TOOLS')['bind-tool'], + '--bind=' + _driver] + + _NICS_PCI, _LOGGER, + 'Binding NICs %s...' % _NICS_PCI, + True) except subprocess.CalledProcessError: _LOGGER.error('Unable to bind NICs %s', str(_NICS_PCI)) + def _unbind_nics(): - """Unbind NICs using the Intel DPDK ``dpdk*bind.py`` tool. + """Unbind NICs using the bind tool specified in the configuration. """ if not len(_NICS_PCI): _LOGGER.info('NICs are not configured - nothing to unbind') return try: - tasks.run_task(['sudo', S.getValue('TOOLS')['bind-tool'], '--unbind'] + - _NICS_PCI, _LOGGER, - 'Unbinding NICs %s...' % str(_NICS_PCI), - True) + if 'driverctl' in S.getValue('TOOLS')['bind-tool'].lower(): + for nic in _NICS_PCI: + tasks.run_task(['sudo', S.getValue('TOOLS')['bind-tool'], '-v', + 'unset-override'] + [nic], _LOGGER, + 'Binding NIC %s...' % nic, True) + else: + tasks.run_task(['sudo', S.getValue('TOOLS')['bind-tool'], + '--unbind'] + + _NICS_PCI, _LOGGER, + 'Unbinding NICs %s...' % str(_NICS_PCI), + True) except subprocess.CalledProcessError: _LOGGER.error('Unable to unbind NICs %s', str(_NICS_PCI)) # Rebind NICs to their original drivers @@ -180,15 +193,21 @@ def _unbind_nics(): for nic in _NICS: try: if nic['driver']: - tasks.run_task(['sudo', S.getValue('TOOLS')['bind-tool'], '--bind', - nic['driver'], nic['pci']], - _LOGGER, 'Binding NIC %s to %s...' % - (nic['pci'], nic['driver']), - True) + if 'driverctl' in S.getValue('TOOLS')['bind-tool'].lower(): + # driverctl restores the driver automatically on unset + break + else: + tasks.run_task(['sudo', S.getValue('TOOLS')['bind-tool'], + '--bind', + nic['driver'], nic['pci']], + _LOGGER, 'Binding NIC %s to %s...' % + (nic['pci'], nic['driver']), + True) except subprocess.CalledProcessError: _LOGGER.error('Unable to bind NIC %s to driver %s', nic['pci'], nic['driver']) + class Dpdk(object): """A context manager for the system init/cleanup. """ -- cgit 1.2.3-korg