[PATCH 4/5] KVM test: setup tap fd and pass it to qemu-kvm v3
We used to use qemu-ifup to manage the tap which have several limitations: 1) If we want to specify a bridge, we must create a customized qemu-ifup file as the default script always match the first bridge. 2) It's hard to add support for macvtap device. So this patch let kvm subtest control the tap creation and setup then pass it to qemu-kvm. User could specify the bridge he want to used in configuration file. The original autoconfiguration was changed by private bridge setup. Changes from v1: * Combine the private bridge config and TAP fd in one patchset, dropped the auto mode * Close TAP fds on VM.destroy() (thanks to Amos Kong for finding the problem) Signed-off-by: Jason Wang jasow...@redhat.com Signed-off-by: Lucas Meneghel Rodrigues l...@redhat.com --- client/tests/kvm/scripts/qemu-ifup | 11 -- client/virt/kvm_vm.py | 63 --- client/virt/virt_utils.py |8 +++- 3 files changed, 49 insertions(+), 33 deletions(-) delete mode 100755 client/tests/kvm/scripts/qemu-ifup diff --git a/client/tests/kvm/scripts/qemu-ifup b/client/tests/kvm/scripts/qemu-ifup deleted file mode 100755 index c4debf5..000 --- a/client/tests/kvm/scripts/qemu-ifup +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# The following expression selects the first bridge listed by 'brctl show'. -# Modify it to suit your needs. -switch=$(/usr/sbin/brctl show | awk 'NR==2 { print $1 }') - -/bin/echo 1 /proc/sys/net/ipv6/conf/${switch}/disable_ipv6 -/sbin/ifconfig $1 0.0.0.0 up -/usr/sbin/brctl addif ${switch} $1 -/usr/sbin/brctl setfd ${switch} 0 -/usr/sbin/brctl stp ${switch} off diff --git a/client/virt/kvm_vm.py b/client/virt/kvm_vm.py index 343488f..7cec1d0 100644 --- a/client/virt/kvm_vm.py +++ b/client/virt/kvm_vm.py @@ -7,7 +7,7 @@ Utility classes and functions to handle Virtual Machine creation using qemu. import time, os, logging, fcntl, re, commands, glob from autotest_lib.client.common_lib import error from autotest_lib.client.bin import utils -import virt_utils, virt_vm, kvm_monitor, aexpect +import virt_utils, virt_vm, virt_test_setup, kvm_monitor, aexpect class VM(virt_vm.BaseVM): @@ -41,6 +41,7 @@ class VM(virt_vm.BaseVM): self.pci_assignable = None self.netdev_id = [] self.device_id = [] +self.tapfds = [] self.uuid = None @@ -240,19 +241,17 @@ class VM(virt_vm.BaseVM): cmd += ,id='%s' % device_id return cmd -def add_net(help, vlan, mode, ifname=None, script=None, -downscript=None, tftp=None, bootfile=None, hostfwd=[], -netdev_id=None, netdev_extra_params=None): +def add_net(help, vlan, mode, ifname=None, tftp=None, bootfile=None, +hostfwd=[], netdev_id=None, netdev_extra_params=None, +tapfd=None): if has_option(help, netdev): cmd = -netdev %s,id=%s % (mode, netdev_id) if netdev_extra_params: cmd += ,%s % netdev_extra_params else: cmd = -net %s,vlan=%d % (mode, vlan) -if mode == tap: -if ifname: cmd += ,ifname='%s' % ifname -if script: cmd += ,script='%s' % script -cmd += ,downscript='%s' % (downscript or no) +if mode == tap and tapfd: +cmd += ,fd=%d % tapfd elif mode == user: if tftp and [,tftp= in help: cmd += ,tftp='%s' % tftp @@ -422,20 +421,22 @@ class VM(virt_vm.BaseVM): qemu_cmd += add_nic(help, vlan, nic_params.get(nic_model), mac, device_id, netdev_id, nic_params.get(nic_extra_params)) # Handle the '-net tap' or '-net user' or '-netdev' part -script = nic_params.get(nic_script) -downscript = nic_params.get(nic_downscript) tftp = nic_params.get(tftp) -if script: -script = virt_utils.get_path(root_dir, script) -if downscript: -downscript = virt_utils.get_path(root_dir, downscript) if tftp: tftp = virt_utils.get_path(root_dir, tftp) -qemu_cmd += add_net(help, vlan, nic_params.get(nic_mode, user), -vm.get_ifname(vlan), -script, downscript, tftp, +if nic_params.get(nic_mode) == tap: +try: +tapfd = vm.tapfds[vlan] +except: +tapfd = None +else: +tapfd = None +qemu_cmd += add_net(help, vlan, +nic_params.get(nic_mode, user), +vm.get_ifname(vlan), tftp, nic_params.get(bootp), redirs, netdev_id, -
[PATCH 4/5] KVM test: setup tap fd and pass it to qemu-kvm v3
We used to use qemu-ifup to manage the tap which have several limitations: 1) If we want to specify a bridge, we must create a customized qemu-ifup file as the default script always match the first bridge. 2) It's hard to add support for macvtap device. So this patch let kvm subtest control the tap creation and setup then pass it to qemu-kvm. User could specify the bridge he want to used in configuration file. The original autoconfiguration was changed by private bridge setup. Changes from v1: * Combine the private bridge config and TAP fd in one patchset, dropped the auto mode * Close TAP fds on VM.destroy() (thanks to Amos Kong for finding the problem) Signed-off-by: Jason Wang jasow...@redhat.com Signed-off-by: Lucas Meneghel Rodrigues l...@redhat.com --- client/tests/kvm/scripts/qemu-ifup | 11 --- client/virt/kvm_vm.py | 59 +++ client/virt/virt_utils.py |8 - 3 files changed, 45 insertions(+), 33 deletions(-) delete mode 100755 client/tests/kvm/scripts/qemu-ifup diff --git a/client/tests/kvm/scripts/qemu-ifup b/client/tests/kvm/scripts/qemu-ifup deleted file mode 100755 index c4debf5..000 --- a/client/tests/kvm/scripts/qemu-ifup +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# The following expression selects the first bridge listed by 'brctl show'. -# Modify it to suit your needs. -switch=$(/usr/sbin/brctl show | awk 'NR==2 { print $1 }') - -/bin/echo 1 /proc/sys/net/ipv6/conf/${switch}/disable_ipv6 -/sbin/ifconfig $1 0.0.0.0 up -/usr/sbin/brctl addif ${switch} $1 -/usr/sbin/brctl setfd ${switch} 0 -/usr/sbin/brctl stp ${switch} off diff --git a/client/virt/kvm_vm.py b/client/virt/kvm_vm.py index c9bb273..9b26dee 100644 --- a/client/virt/kvm_vm.py +++ b/client/virt/kvm_vm.py @@ -7,7 +7,7 @@ Utility classes and functions to handle Virtual Machine creation using qemu. import time, os, logging, fcntl, re, commands, glob from autotest_lib.client.common_lib import error from autotest_lib.client.bin import utils -import virt_utils, virt_vm, kvm_monitor, aexpect +import virt_utils, virt_vm, virt_test_setup, kvm_monitor, aexpect class VM(virt_vm.BaseVM): @@ -41,6 +41,7 @@ class VM(virt_vm.BaseVM): self.pci_assignable = None self.netdev_id = [] self.device_id = [] +self.tapfds = [] self.uuid = None @@ -240,19 +241,17 @@ class VM(virt_vm.BaseVM): cmd += ,id='%s' % device_id return cmd -def add_net(help, vlan, mode, ifname=None, script=None, -downscript=None, tftp=None, bootfile=None, hostfwd=[], -netdev_id=None, netdev_extra_params=None): +def add_net(help, vlan, mode, ifname=None, tftp=None, bootfile=None, +hostfwd=[], netdev_id=None, netdev_extra_params=None, +tapfd=None): if has_option(help, netdev): cmd = -netdev %s,id=%s % (mode, netdev_id) if netdev_extra_params: cmd += ,%s % netdev_extra_params else: cmd = -net %s,vlan=%d % (mode, vlan) -if mode == tap: -if ifname: cmd += ,ifname='%s' % ifname -if script: cmd += ,script='%s' % script -cmd += ,downscript='%s' % (downscript or no) +if mode == tap and tapfd: +cmd += ,fd=%d % tapfd elif mode == user: if tftp and [,tftp= in help: cmd += ,tftp='%s' % tftp @@ -422,20 +421,22 @@ class VM(virt_vm.BaseVM): qemu_cmd += add_nic(help, vlan, nic_params.get(nic_model), mac, device_id, netdev_id, nic_params.get(nic_extra_params)) # Handle the '-net tap' or '-net user' or '-netdev' part -script = nic_params.get(nic_script) -downscript = nic_params.get(nic_downscript) tftp = nic_params.get(tftp) -if script: -script = virt_utils.get_path(root_dir, script) -if downscript: -downscript = virt_utils.get_path(root_dir, downscript) if tftp: tftp = virt_utils.get_path(root_dir, tftp) -qemu_cmd += add_net(help, vlan, nic_params.get(nic_mode, user), -vm.get_ifname(vlan), -script, downscript, tftp, +if nic_params.get(nic_mode) == tap: +try: +tapfd = vm.tapfds[vlan] +except: +tapfd = None +else: +tapfd = None +qemu_cmd += add_net(help, vlan, +nic_params.get(nic_mode, user), +vm.get_ifname(vlan), tftp, nic_params.get(bootp), redirs, netdev_id, -