From 37d991b70036665e2b4938d0611553f4e8d668f5 Mon Sep 17 00:00:00 2001 From: Michal Dubiel Date: Thu, 21 Apr 2016 16:21:46 +0200 Subject: [PATCH] Allow for creation of multiqueue taps We need this for virtion multiqueue support with the kernel vRouter. Tap created by nova and then passed in to the libvirt has to be multiqueue enabled. Change-Id: I7170bf7c181b038bb3d70a3b86c87ee254d10efc Partial-Bug: #1573067 --- nova/network/linux_net.py | 10 +++++++--- nova/virt/libvirt/vif.py | 13 ++++++++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py index 6487580a28e..8d9501a9631 100644 --- a/nova/network/linux_net.py +++ b/nova/network/linux_net.py @@ -1400,12 +1400,16 @@ def delete_ivs_vif_port(dev): run_as_root=True) -def create_tap_dev(dev, mac_address=None): +def create_tap_dev(dev, mac_address=None, multiqueue=False): if not device_exists(dev): try: # First, try with 'ip' - utils.execute('ip', 'tuntap', 'add', dev, 'mode', 'tap', - run_as_root=True, check_exit_code=[0, 2, 254]) + if multiqueue: + cmd = ('ip', 'tuntap', 'add', dev, 'mode', 'tap', + 'multi_queue') + else: + cmd = ('ip', 'tuntap', 'add', dev, 'mode', 'tap') + utils.execute(*cmd, run_as_root=True, check_exit_code=[0, 2, 254]) except processutils.ProcessExecutionError: # Second option: tunctl utils.execute('tunctl', '-b', '-t', dev, run_as_root=True) diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py index 0a0a6a051a8..89da202d19b 100644 --- a/nova/virt/libvirt/vif.py +++ b/nova/virt/libvirt/vif.py @@ -727,9 +727,20 @@ def plug_vrouter(self, instance, vif): Bind the vif to a Contrail virtual port. """ + def multiqueue_enabled(instance): + metadata = instance['system_metadata'] + mq = metadata.get('image_hw_vif_multiqueue_enabled') + vcpus = 0 if 'vcpus' not in instance else instance['vcpus'] + + if mq and mq.lower() == 'true' and vcpus > 1: + return True + else: + return False + dev = self.get_vif_devname(vif) try: - linux_net.create_tap_dev(dev) + linux_net.create_tap_dev(dev, + multiqueue=multiqueue_enabled(instance)) self._vrouter_port_add(instance, vif) except processutils.ProcessExecutionError: LOG.exception(_LE("Failed while plugging vif"), instance=instance)