aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Trautman <ctrautma@redhat.com>2017-08-09 15:11:15 -0400
committerMartin Klozik <martinx.klozik@intel.com>2017-08-18 07:13:38 +0000
commitf023e531fe8e02cfb2bcc76dd6226746b183e4b4 (patch)
tree5372a24237c787d115c598e5ee7f38c0cadec2bf
parent73025baf2e393c61c59957e8714d2ddd54d25e51 (diff)
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 <ctrautma@redhat.com>
-rw-r--r--docs/testing/user/configguide/installation.rst13
-rw-r--r--src/dpdk/dpdk.py53
2 files changed, 49 insertions, 17 deletions
diff --git a/docs/testing/user/configguide/installation.rst b/docs/testing/user/configguide/installation.rst
index f5b0b7a4..207e50a4 100644
--- a/docs/testing/user/configguide/installation.rst
+++ b/docs/testing/user/configguide/installation.rst
@@ -256,6 +256,19 @@ running any of the above. For example:
.. _vloop-vnf-ubuntu-14.04_20160303: http://artifacts.opnfv.org/vswitchperf/vnf/vloop-vnf-ubuntu-14.04_20160303.qcow2
.. _vloop-vnf-ubuntu-14.04_20151216: http://artifacts.opnfv.org/vswitchperf/vnf/vloop-vnf-ubuntu-14.04_20151216.qcow2
+Bind Tools DPDK
+===============
+
+VSPerf supports the default DPDK bind tool, but also supports driverctl. The
+driverctl tool is a new tool being used that allows driver binding to be
+persistent across reboots. The driverctl tool is not provided by VSPerf, but can
+be downloaded from upstream sources. Once installed set the bind tool to
+driverctl to allow VSPERF to correctly bind cards for DPDK tests.
+
+.. code:: python
+
+ PATHS['dpdk']['src']['bind-tool'] = 'driverctl'
+
Hugepage Configuration
----------------------
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.
"""