From 0fb65d2afadad1f092788f5a4f251b09851b3ae7 Mon Sep 17 00:00:00 2001 From: Christian Trautman Date: Fri, 22 Jul 2016 15:54:18 -0400 Subject: Vanilla_Multi_Queue: Add vanilla ovs multi-queue functionality Adds multi-queue for vanilla OVS using virtio-net. TunTap ports will use multi_queue parameter when ports are created/deleted if guest nic queues are enabled and vswitch is ovs vanilla. Virtio net will now add guest nic queues to qemu command line if appropriate. Reworked multi-queue documentation to reflect these changes. Adds vhost net thread affinitization which is recommended when performing vanilla ovs multi-queue. Guests will require ethtool if using l2fwd or linux bridge as the loopback application when vanilla ovs multi-queue is enabled. Modified dpdk setting in vswitch conf to be better worded for separation from vanilla ovs multi-queue. Updated release and installation doc for new vloop image that includes required ethtool utility. JIRA: VSPERF-373 Change-Id: Idb550515190b1a93390308c11f54da368f962512 Signed-off-by: Christian Trautman --- vswitches/ovs_dpdk_vhost.py | 13 +++++++------ vswitches/ovs_vanilla.py | 27 +++++++++++++++------------ 2 files changed, 22 insertions(+), 18 deletions(-) (limited to 'vswitches') diff --git a/vswitches/ovs_dpdk_vhost.py b/vswitches/ovs_dpdk_vhost.py index cebc14b2..c0764c87 100644 --- a/vswitches/ovs_dpdk_vhost.py +++ b/vswitches/ovs_dpdk_vhost.py @@ -70,11 +70,11 @@ class OvsDpdkVhost(IVSwitchOvs): super(OvsDpdkVhost, self).start() # old style OVS <= 2.5.0 multi-queue enable if settings.getValue('OVS_OLD_STYLE_MQ') and \ - int(settings.getValue('VSWITCH_MULTI_QUEUES')): + int(settings.getValue('VSWITCH_DPDK_MULTI_QUEUES')): tmp_br = OFBridge(timeout=-1) tmp_br.set_db_attribute( 'Open_vSwitch', '.', 'other_config:' + - 'n-dpdk-rxqs', settings.getValue('VSWITCH_MULTI_QUEUES')) + 'n-dpdk-rxqs', settings.getValue('VSWITCH_DPDK_MULTI_QUEUES')) def stop(self): """See IVswitch for general description @@ -112,10 +112,11 @@ class OvsDpdkVhost(IVSwitchOvs): port_name = 'dpdk' + str(dpdk_count) params = ['--', 'set', 'Interface', port_name, 'type=dpdk'] # multi-queue enable - if int(settings.getValue('VSWITCH_MULTI_QUEUES')) and \ + + if int(settings.getValue('VSWITCH_DPDK_MULTI_QUEUES')) and \ not settings.getValue('OVS_OLD_STYLE_MQ'): params += ['options:n_rxq={}'.format( - settings.getValue('VSWITCH_MULTI_QUEUES'))] + settings.getValue('VSWITCH_DPDK_MULTI_QUEUES'))] of_port = bridge.add_port(port_name, params) return (port_name, of_port) @@ -131,10 +132,10 @@ class OvsDpdkVhost(IVSwitchOvs): port_name = 'dpdkvhostuser' + str(vhost_count) params = ['--', 'set', 'Interface', port_name, 'type=dpdkvhostuser'] # multi queue enable - if int(settings.getValue('VSWITCH_MULTI_QUEUES')) and \ + if int(settings.getValue('VSWITCH_DPDK_MULTI_QUEUES')) and \ not settings.getValue('OVS_OLD_STYLE_MQ'): params += ['options:n_rxq={}'.format( - settings.getValue('VSWITCH_MULTI_QUEUES'))] + settings.getValue('VSWITCH_DPDK_MULTI_QUEUES'))] of_port = bridge.add_port(port_name, params) return (port_name, of_port) diff --git a/vswitches/ovs_vanilla.py b/vswitches/ovs_vanilla.py index f880dfaf..332725e3 100644 --- a/vswitches/ovs_vanilla.py +++ b/vswitches/ovs_vanilla.py @@ -60,9 +60,10 @@ class OvsVanilla(IVSwitchOvs): # remove all tap interfaces for i in range(self._vport_id): tapx = 'tap' + str(i) - tasks.run_task(['sudo', 'ip', 'tuntap', 'del', - tapx, 'mode', 'tap'], - self._logger, 'Deleting ' + tapx, False) + tap_cmd_list = ['sudo', 'ip', 'tuntap', 'del', tapx, 'mode', 'tap'] + if int(settings.getValue('GUEST_NIC_QUEUES')): + tap_cmd_list += ['multi_queue'] + tasks.run_task(tap_cmd_list, self._logger, 'Deleting ' + tapx, False) self._vport_id = 0 super(OvsVanilla, self).stop() @@ -71,7 +72,6 @@ class OvsVanilla(IVSwitchOvs): self._module_manager.remove_modules() - def add_phy_port(self, switch_name): """ Method adds port based on detected device names. @@ -111,14 +111,17 @@ class OvsVanilla(IVSwitchOvs): # Create tap devices for the VM tap_name = 'tap' + str(self._vport_id) self._vport_id += 1 - - tasks.run_task(['sudo', 'ip', 'tuntap', 'del', - tap_name, 'mode', 'tap'], - self._logger, 'Creating tap device...', False) - - tasks.run_task(['sudo', 'ip', 'tuntap', 'add', - tap_name, 'mode', 'tap'], - self._logger, 'Creating tap device...', False) + tap_cmd_list = ['sudo', 'ip', 'tuntap', 'del', tap_name, 'mode', 'tap'] + if int(settings.getValue('GUEST_NIC_QUEUES')): + tap_cmd_list += ['multi_queue'] + tasks.run_task(tap_cmd_list, self._logger, + 'Creating tap device...', False) + + tap_cmd_list = ['sudo', 'ip', 'tuntap', 'add', tap_name, 'mode', 'tap'] + if int(settings.getValue('GUEST_NIC_QUEUES')): + tap_cmd_list += ['multi_queue'] + tasks.run_task(tap_cmd_list, self._logger, + 'Creating tap device...', False) tasks.run_task(['sudo', 'ip', 'addr', 'flush', 'dev', tap_name], self._logger, 'Remove IP', False) -- cgit 1.2.3-korg