aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2017-06-09 10:56:12 +0000
committerGerrit Code Review <review@openstack.org>2017-06-09 10:56:12 +0000
commit187c1e66d4341e6c1fad308ca4d17d4d5026f61a (patch)
treee7e5aa68af1af1a07afe76b885d482343b6b4a4d
parent58a913e1554c5dd71a6fb7f7ba354d25379e2c97 (diff)
parentc8901b8ac34cf180c0a62c39a2b31def9c28aaf3 (diff)
Merge "Multiqueue support for OvsDpdkBond"
-rw-r--r--etc/os-net-config/samples/ovs_dpdk_bond.json1
-rw-r--r--etc/os-net-config/samples/ovs_dpdk_bond.yaml8
-rw-r--r--os_net_config/impl_ifcfg.py5
-rw-r--r--os_net_config/objects.py6
-rw-r--r--os_net_config/tests/test_impl_ifcfg.py79
5 files changed, 97 insertions, 2 deletions
diff --git a/etc/os-net-config/samples/ovs_dpdk_bond.json b/etc/os-net-config/samples/ovs_dpdk_bond.json
index a921d60..410d459 100644
--- a/etc/os-net-config/samples/ovs_dpdk_bond.json
+++ b/etc/os-net-config/samples/ovs_dpdk_bond.json
@@ -7,6 +7,7 @@
"type" : "ovs_dpdk_bond",
"name" : "dpdkbond0",
"mtu" : 9000,
+ "rx_queue": 4,
"members": [
{
"type" : "ovs_dpdk_port",
diff --git a/etc/os-net-config/samples/ovs_dpdk_bond.yaml b/etc/os-net-config/samples/ovs_dpdk_bond.yaml
index 3fc9f7d..17a73a3 100644
--- a/etc/os-net-config/samples/ovs_dpdk_bond.yaml
+++ b/etc/os-net-config/samples/ovs_dpdk_bond.yaml
@@ -15,6 +15,14 @@ network_config:
name: dpdkbond0
# MTU is optional, e.g. for jumbo frames
mtu: 9000
+ # rx_queue is optional, used for multi-queue option. It configures the
+ # maximum number of queues for each interface associated with the
+ # ovs_dpdk_bond. If not defined, the physical interfaces will have
+ # single queue.
+ # (rx_queue) x (Number of members in the ovs_dpdk_bond) should be less
+ # than the number of PMD cores, as each queue will have one PMD thread
+ # (CPU) associated with it.
+ rx_queue: 4
members:
-
type: ovs_dpdk_port
diff --git a/os_net_config/impl_ifcfg.py b/os_net_config/impl_ifcfg.py
index d98df31..997b695 100644
--- a/os_net_config/impl_ifcfg.py
+++ b/os_net_config/impl_ifcfg.py
@@ -326,6 +326,11 @@ class IfcfgNetConfig(os_net_config.NetConfig):
for member in base_opt.members:
ovs_extra.append("set Interface %s mtu_request=$MTU" %
member.name)
+ if base_opt.rx_queue:
+ data += "RX_QUEUE=%i\n" % base_opt.rx_queue
+ for member in base_opt.members:
+ ovs_extra.append("set Interface %s options:n_rxq="
+ "$RX_QUEUE" % member.name)
if base_opt.ovs_options:
data += "OVS_OPTIONS=\"%s\"\n" % base_opt.ovs_options
ovs_extra.extend(base_opt.ovs_extra)
diff --git a/os_net_config/objects.py b/os_net_config/objects.py
index 86e0895..5fe6e49 100644
--- a/os_net_config/objects.py
+++ b/os_net_config/objects.py
@@ -1057,7 +1057,7 @@ class OvsDpdkBond(_BaseOpts):
routes=None, mtu=None, primary=False, members=None,
ovs_options=None, ovs_extra=None, nic_mapping=None,
persist_mapping=False, defroute=True, dhclient_args=None,
- dns_servers=None, nm_controlled=False):
+ dns_servers=None, nm_controlled=False, rx_queue=None):
super(OvsDpdkBond, self).__init__(name, use_dhcp, use_dhcpv6,
addresses, routes, mtu, primary,
nic_mapping, persist_mapping,
@@ -1066,6 +1066,7 @@ class OvsDpdkBond(_BaseOpts):
self.members = members or []
self.ovs_options = ovs_options
self.ovs_extra = format_ovs_extra(self, ovs_extra)
+ self.rx_queue = rx_queue
for member in self.members:
if member.primary:
@@ -1088,6 +1089,7 @@ class OvsDpdkBond(_BaseOpts):
persist_mapping, defroute, dhclient_args,
dns_servers, nm_controlled) = _BaseOpts.base_opts_from_json(
json, include_primary=False)
+ rx_queue = json.get('rx_queue', None)
ovs_options = json.get('ovs_options')
ovs_extra = json.get('ovs_extra', [])
if not isinstance(ovs_extra, list):
@@ -1119,7 +1121,7 @@ class OvsDpdkBond(_BaseOpts):
persist_mapping=persist_mapping,
defroute=defroute, dhclient_args=dhclient_args,
dns_servers=dns_servers,
- nm_controlled=nm_controlled)
+ nm_controlled=nm_controlled, rx_queue=rx_queue)
class VppInterface(_BaseOpts):
diff --git a/os_net_config/tests/test_impl_ifcfg.py b/os_net_config/tests/test_impl_ifcfg.py
index c67115b..80f83f1 100644
--- a/os_net_config/tests/test_impl_ifcfg.py
+++ b/os_net_config/tests/test_impl_ifcfg.py
@@ -1035,6 +1035,85 @@ OVS_EXTRA="set Interface dpdk0 mtu_request=$MTU \
self.assertEqual(dpdk_bond_config,
self.get_interface_config('dpdkbond0'))
+ def test_network_ovs_dpdk_bond_with_rx_queue(self):
+ nic_mapping = {'nic1': 'eth0', 'nic2': 'eth1', 'nic3': 'eth2'}
+ self.stubbed_mapped_nics = nic_mapping
+
+ iface0 = objects.Interface(name='nic2')
+ dpdk0 = objects.OvsDpdkPort(name='dpdk0', members=[iface0])
+ iface1 = objects.Interface(name='nic3')
+ dpdk1 = objects.OvsDpdkPort(name='dpdk1', members=[iface1])
+ bond = objects.OvsDpdkBond('dpdkbond0', rx_queue=4,
+ members=[dpdk0, dpdk1])
+ bridge = objects.OvsUserBridge('br-link', members=[bond])
+
+ def test_bind_dpdk_interfaces(ifname, driver, noop):
+ self.assertIn(ifname, ['eth1', 'eth2'])
+ self.assertEqual(driver, 'vfio-pci')
+ self.stubs.Set(utils, 'bind_dpdk_interfaces',
+ test_bind_dpdk_interfaces)
+
+ self.provider.add_ovs_dpdk_bond(bond)
+ self.provider.add_ovs_user_bridge(bridge)
+
+ dpdk_bond_config = """# This file is autogenerated by os-net-config
+DEVICE=dpdkbond0
+ONBOOT=yes
+HOTPLUG=no
+NM_CONTROLLED=no
+PEERDNS=no
+DEVICETYPE=ovs
+TYPE=OVSDPDKBond
+OVS_BRIDGE=br-link
+BOND_IFACES="dpdk0 dpdk1"
+RX_QUEUE=4
+OVS_EXTRA="set Interface dpdk0 options:n_rxq=$RX_QUEUE \
+-- set Interface dpdk1 options:n_rxq=$RX_QUEUE"
+"""
+ self.assertEqual(dpdk_bond_config,
+ self.get_interface_config('dpdkbond0'))
+
+ def test_network_ovs_dpdk_bond_with_mtu_and_rx_queue(self):
+ nic_mapping = {'nic1': 'eth0', 'nic2': 'eth1', 'nic3': 'eth2'}
+ self.stubbed_mapped_nics = nic_mapping
+
+ iface0 = objects.Interface(name='nic2')
+ dpdk0 = objects.OvsDpdkPort(name='dpdk0', members=[iface0])
+ iface1 = objects.Interface(name='nic3')
+ dpdk1 = objects.OvsDpdkPort(name='dpdk1', members=[iface1])
+ bond = objects.OvsDpdkBond('dpdkbond0', rx_queue=4, mtu=9000,
+ members=[dpdk0, dpdk1])
+ bridge = objects.OvsUserBridge('br-link', members=[bond])
+
+ def test_bind_dpdk_interfaces(ifname, driver, noop):
+ self.assertIn(ifname, ['eth1', 'eth2'])
+ self.assertEqual(driver, 'vfio-pci')
+ self.stubs.Set(utils, 'bind_dpdk_interfaces',
+ test_bind_dpdk_interfaces)
+
+ self.provider.add_ovs_dpdk_bond(bond)
+ self.provider.add_ovs_user_bridge(bridge)
+
+ dpdk_bond_config = """# This file is autogenerated by os-net-config
+DEVICE=dpdkbond0
+ONBOOT=yes
+HOTPLUG=no
+NM_CONTROLLED=no
+PEERDNS=no
+DEVICETYPE=ovs
+TYPE=OVSDPDKBond
+OVS_BRIDGE=br-link
+BOND_IFACES="dpdk0 dpdk1"
+RX_QUEUE=4
+MTU=9000
+OVS_EXTRA="set Interface dpdk0 mtu_request=$MTU \
+-- set Interface dpdk1 mtu_request=$MTU \
+-- set Interface dpdk0 options:n_rxq=$RX_QUEUE \
+-- set Interface dpdk1 options:n_rxq=$RX_QUEUE"
+"""
+ self.assertEqual(dpdk_bond_config,
+ self.get_interface_config('dpdkbond0'))
+
class TestIfcfgNetConfigApply(base.TestCase):