Adding the class and mac approach as dpdk-devargs in mellanox ConnectX-3

Some NICs (i.e. Mellanox ConnectX-3) have only one PCI address
associated with multiple ports. Using a PCI address as dpdk-devargs
in OvsDpdkPort won't work. Instead, class and mac approach is used
dpdk-devargs="class=eth,mac=<MAC>"
see this http://docs.openvswitch.org/en/latest/howto/dpdk/

Change-Id: I29de6e82a0897ee46953a1e6a966e9c5790068c9
This commit is contained in:
waleed mousa 2018-01-30 04:00:39 -05:00
parent 9e785a4ce0
commit aeaa6fe62b
4 changed files with 72 additions and 6 deletions

View File

@ -304,12 +304,13 @@ class IfcfgNetConfig(os_net_config.NetConfig):
data += "OVS_BRIDGE=%s\n" % base_opt.bridge_name
# Validation of DPDK port having only one interface is done prior
# to this. So accesing the interface name statically.
# Also pci_address would be valid here, since
# Also dpdk_devargs would be valid here, since
# bind_dpdk_interfaces() is invoked before this.
pci_address = utils.get_stored_pci_address(
dpdk_devargs = utils.get_dpdk_devargs(
base_opt.members[0].name, self.noop)
ovs_extra.append("set Interface $DEVICE options:dpdk-devargs="
"%s" % pci_address)
"%s" % dpdk_devargs)
if base_opt.mtu:
ovs_extra.append("set Interface $DEVICE mtu_request=$MTU")
if base_opt.rx_queue:
@ -332,13 +333,13 @@ class IfcfgNetConfig(os_net_config.NetConfig):
for bond_member in base_opt.members:
# Validation of DPDK port having only one interface is done
# prior to this. So accesing the interface name statically.
# Also pci_address would be valid here, since
# Also dpdk_devargs would be valid here, since
# bind_dpdk_interfaces () is invoked before this.
pci_address = utils.get_stored_pci_address(
dpdk_devargs = utils.get_dpdk_devargs(
bond_member.members[0].name, self.noop)
ovs_extra.append("set Interface %s options:"
"dpdk-devargs=%s"
% (bond_member.name, pci_address))
% (bond_member.name, dpdk_devargs))
members = [member.name for member in base_opt.members]
data += ("BOND_IFACES=\"%s\"\n" % " ".join(members))
# MTU configuration given for the OvsDpdkbond shall be applied

View File

@ -209,6 +209,32 @@ class TestUtils(base.TestCase):
pci = utils.get_stored_pci_address('eth1', False)
self.assertEqual(None, pci)
def test_get_vendor_id_success(self):
mocked_open = mock.mock_open(read_data='0x15b3\n')
with mock.patch('os_net_config.utils.open', mocked_open, create=True):
vendor = utils.get_vendor_id('nic2')
self.assertEqual('0x15b3', vendor)
def test_get_vendor_id_exception(self):
mocked_open = mock.mock_open()
mocked_open.side_effect = IOError
with mock.patch('os_net_config.utils.open', mocked_open, create=True):
vendor = utils.get_vendor_id('nic2')
self.assertEqual(None, vendor)
def test_get_device_id_success(self):
mocked_open = mock.mock_open(read_data='0x1003\n')
with mock.patch('os_net_config.utils.open', mocked_open, create=True):
device = utils.get_device_id('nic2')
self.assertEqual('0x1003', device)
def test_get_device_id_exception(self):
mocked_open = mock.mock_open()
mocked_open.side_effect = IOError
with mock.patch('os_net_config.utils.open', mocked_open, create=True):
device = utils.get_device_id('nic2')
self.assertEqual(None, device)
def test_bind_dpdk_interfaces(self):
def test_execute(name, dummy1, dummy2=None, dummy3=None):
if 'ethtool' in name:

View File

@ -336,6 +336,40 @@ def translate_ifname_to_pci_address(ifname, noop):
return pci_address
def get_vendor_id(ifname):
try:
with open('%s/%s/device/vendor' % (_SYS_CLASS_NET, ifname),
'r') as f:
out = f.read().strip()
return out
except IOError:
return
def get_device_id(ifname):
try:
with open('%s/%s/device/device' % (_SYS_CLASS_NET, ifname),
'r') as f:
out = f.read().strip()
return out
except IOError:
return
def get_dpdk_devargs(ifname, noop):
if not noop:
vendor_id = get_vendor_id(ifname)
device_id = get_device_id(ifname)
if vendor_id == "0x15b3" and device_id == "0x1007":
# Some NICs (i.e. Mellanox ConnectX-3) have only one PCI address
# associated with multiple ports. Using a PCI device wont work.
# Instead, we should use "class=eth,mac=<MAC>"
dpdk_devargs = "class=eth,mac=%s" % interface_mac(ifname)
else:
dpdk_devargs = get_stored_pci_address(ifname, noop)
return dpdk_devargs
# Once the interface is bound to a DPDK driver, all the references to the
# interface including '/sys' and '/proc', will be removed. And there is no
# way to identify the nic name after it is bound. So, the DPDK bound nic info

View File

@ -0,0 +1,5 @@
---
features:
- |
Adding dpdk support in meallnox nics.
Dpdk now fully suuported in mellanox nics.