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)