diff options
author | Christian Trautman <ctrautma@redhat.com> | 2017-08-09 15:11:15 -0400 |
---|---|---|
committer | Martin Klozik <martinx.klozik@intel.com> | 2017-08-18 07:13:38 +0000 |
commit | f023e531fe8e02cfb2bcc76dd6226746b183e4b4 (patch) | |
tree | 5372a24237c787d115c598e5ee7f38c0cadec2bf | |
parent | 73025baf2e393c61c59957e8714d2ddd54d25e51 (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.rst | 13 | ||||
-rw-r--r-- | src/dpdk/dpdk.py | 53 |
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. """ |