From patchwork Thu Mar 19 03:16:53 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marvin Liu X-Patchwork-Id: 4059 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 828DD6A80; Thu, 19 Mar 2015 04:17:14 +0100 (CET) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 102ED6837 for ; Thu, 19 Mar 2015 04:17:12 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga101.fm.intel.com with ESMTP; 18 Mar 2015 20:17:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,427,1422950400"; d="scan'208";a="682242890" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga001.fm.intel.com with ESMTP; 18 Mar 2015 20:17:11 -0700 Received: from shecgisg003.sh.intel.com (shecgisg003.sh.intel.com [10.239.29.90]) by shvmail01.sh.intel.com with ESMTP id t2J3H9C0024359; Thu, 19 Mar 2015 11:17:09 +0800 Received: from shecgisg003.sh.intel.com (localhost [127.0.0.1]) by shecgisg003.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id t2J3H6Wd019468; Thu, 19 Mar 2015 11:17:08 +0800 Received: (from yliu84x@localhost) by shecgisg003.sh.intel.com (8.13.6/8.13.6/Submit) id t2J3H6Zh019464; Thu, 19 Mar 2015 11:17:06 +0800 From: Yong Liu To: dev@dpdk.org Date: Thu, 19 Mar 2015 11:16:53 +0800 Message-Id: <1426735018-19411-4-git-send-email-yong.liu@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1426735018-19411-1-git-send-email-yong.liu@intel.com> References: <1426735018-19411-1-git-send-email-yong.liu@intel.com> Subject: [dpdk-dev] [PATCH] fix the net device bugs and add some funcs to generate vfs in net_device X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: sjiajiax add some codes to test the vf actions diff --git a/tools/DTF/framework/dut.py b/tools/DTF/framework/dut.py index 02c7639..2b85f23 100644 --- a/tools/DTF/framework/dut.py +++ b/tools/DTF/framework/dut.py @@ -10,7 +10,7 @@ from ssh_connection import SSHConnection from crb import Crb from net_device import NetDevice from logger import getLogger - +import pdb class Dut(Crb): @@ -390,7 +390,8 @@ class Dut(Crb): for (pci_bus, pci_id) in self.pci_devices_info: - if not dts.accepted_nic(pci_id): + #if not dts.accepted_nic(pci_id): + if pci_id == '1106:3119': self.logger.info("DUT: [000:%s %s] %s" % (pci_bus, pci_id, skipped)) continue @@ -488,25 +489,31 @@ class Dut(Crb): """ Generate SRIOV VFs with default driver it is bound now or specifid driver. """ - pci_bus = self.port_info[port_id]['pci'] - port = self.port_info[port_id]['port'] - - bus_id = pci_bus.split(':')[0] - devfun_id = pci_bus.split(':')[1] - port_driver = self.get_dev_driver(bus_id, devfun_id) + port = self.ports_info[port_id]['port'] + port_driver = port.get_nic_driver() if driver == 'default': - if not port_dirver: + if not port_driver: self.logger.info("No driver on specified port, can not generate SRIOV VF.") return None else: if port_driver != driver: - self.bind_interfaces_linux(driver, pci_bus) + port.bind_driver(driver) port.generate_sriov_vfs(vf_num) - sriov_vfs_pci = port.get_sriov_vfs_pci(bus_id, devfun_id) + sriov_vfs_pci = port.get_sriov_vfs_pci() self.ports_info[port_id]['sriov_vfs_pci'] = sriov_vfs_pci + def destroy_sriov_vfs_by_port(self, port_id): + port = self.ports_info[port_id]['port'] + port_driver = port.get_nic_driver() + + if not port_driver: + self.logger.info("No driver on specified port, skip destroy SRIOV VF.") + else: + sriov_vfs_pci = port.destroy_sriov_vfs() + self.ports_info[port_id]['sriov_vfs_pci'] = '' + def get_vm_core_list(self): return VMCORELIST[self.crb['VM CoreList']] diff --git a/tools/DTF/framework/net_device.py b/tools/DTF/framework/net_device.py index 9186ad6..1a99f68 100644 --- a/tools/DTF/framework/net_device.py +++ b/tools/DTF/framework/net_device.py @@ -1,3 +1,5 @@ +import os +import re from functools import wraps import pdb @@ -12,19 +14,21 @@ class NetDevice(object): self.crb = crb self.bus_id = bus_id self.devfun_id = devfun_id + self.default_driver = self.get_nic_driver() self.intf_name = self.get_interface_name() def __send_expect(self, cmds, expected, timeout=TIMEOUT, alt_session=False): return self.crb.send_expect(cmds, expected, timeout=TIMEOUT, alt_session=False) def __get_os_type(self): - return self.crb.__get_os_type() + return self.crb.get_os_type() def nic_has_driver(func): @wraps(func) - def wrapper(self, *args, **kwargs): - self.current_driver = self.get_nic_driver() - if not self.current_driver: + def wrapper(*args, **kwargs): + nic_instance = args[0] + nic_instance.current_driver = nic_instance.get_nic_driver() + if not nic_instance.current_driver: return '' return func(*args, **kwargs) return wrapper @@ -201,17 +205,17 @@ class NetDevice(object): generic_driver = 'generic' get_sriov_vfs_pci_linux = getattr(self, 'get_sriov_vfs_pci_linux_%s' % generic_driver) - return get_sriov_vfs_pci_linux(intf, bus_id, devfun_id) + return get_sriov_vfs_pci_linux(bus_id, devfun_id) def get_sriov_vfs_pci_linux_generic(self, bus_id, devfun_id): sriov_numvfs = self.__send_expect("cat /sys/bus/pci/devices/0000\:%s\:%s/sriov_numvfs" % (bus_id, devfun_id), "# ") sriov_vfs_pci = [] - if sriov_numvfs == 0: + if int(sriov_numvfs) == 0: pass else: try: - virtfns = self.send_exepct("ls -d /sys/bus/pci/devices/0000\:%s\:%s/virtfn*" % + virtfns = self.__send_expect("ls -d /sys/bus/pci/devices/0000\:%s\:%s/virtfn*" % (bus_id, devfun_id), "# ") for virtfn in virtfns.split(): vf_uevent = self.__send_expect("cat %s" % os.path.join(virtfn, "uevent"), "# ") @@ -243,53 +247,59 @@ class NetDevice(object): return generate_sriov_vfs_linux(bus_id, devfun_id, vf_num) def generate_sriov_vfs_linux_generic(self, bus_id, devfun_id, vf_num): - pci_dev_driver = self.crb.get_pci_dev_driver(bus_id, devfun_id) + pdb.set_trace() + nic_driver = self.get_nic_driver() - if pci_dev_driver: + if not nic_driver: return None vf_reg_file = "sriov_numvfs" - vf_reg_path = os.path.join("/sys/bus/pci/device/0000:%s\:%s" % + vf_reg_path = os.path.join("/sys/bus/pci/devices/0000:%s:%s" % (bus_id, devfun_id), vf_reg_file) self.__send_expect("echo %d > %s" % (int(vf_num), vf_reg_path), "# ") def generate_sriov_vfs_linux_igb_uio(self, bus_id, devfun_id, vf_num): - pci_dev_driver = self.crb.get_pci_dev_driver(bus_id, devfun_id) + nic_driver = self.get_nic_driver() - if pci_dev_driver: + if not nic_driver: return None vf_reg_file = "max_vfs" - vf_reg_path = os.path.join("/sys/bus/pci/device/0000:%s\:%s" % + vf_reg_path = os.path.join("/sys/bus/pci/devices/0000:%s:%s" % (bus_id, devfun_id), vf_reg_file) self.__send_expect("echo %d > %s" % (int(vf_num), vf_reg_path), "# ") def destroy_sriov_vfs(self): - self.generate_sriov_vfs_linux(self.bus_id, self.devfun_id, 0) - - def bind_vf(self, driver='pci-stub'): - bind_vf = getattr(self, 'bind_vf_%s' % self.__get_os_type()) - return bind_vf(driver) - - def bind_vf_linux(self, driver): + self.generate_sriov_vfs(0) + + def bind_driver(self, driver=''): + bind_driver = getattr(self, 'bind_driver_%s' % self.__get_os_type()) + if not driver: + if not self.default_driver: + print "Must specify a driver because default driver is NULL!" + return + driver = self.default_driver + return bind_driver(driver) + + def bind_driver_linux(self, driver): driver_alias = driver.replace('-', '_') try: - bind_vf_linux = getattr(self, 'bind_vf_linux_%s' % driver_alias) - return bind_vf_linux(self.bus_id, self.devfun_id) + bind_driver_linux = getattr(self, 'bind_driver_linux_%s' % driver_alias) + return bind_driver_linux(self.bus_id, self.devfun_id) except Exception,e: driver_alias = 'generic' - bind_vf_linux = getattr(self, 'bind_vf_linux_%s' % driver_alias) - return bind_vf_linux(self.bus_id, self.devfun_id, driver) + bind_driver_linux = getattr(self, 'bind_driver_linux_%s' % driver_alias) + return bind_driver_linux(self.bus_id, self.devfun_id, driver) - def bind_vf_linux_generic(self, bus_id, devfun_id, driver): + def bind_driver_linux_generic(self, bus_id, devfun_id, driver): nic_pci_num = ':'.join(['0000', bus_id, devfun_id]) self.__send_expect("echo %s > /sys/bus/pci/devices/0000\:%s\:%s/driver/unbind" % (nic_pci_num, bus_id, devfun_id), "# ") - self.__send_expect("echo %s > /sys/bus/pci/drivers/pci-stub/bind" % nic_pci_num, "# ") + self.__send_expect("echo %s > /sys/bus/pci/drivers/%s/bind" % (nic_pci_num, driver), "# ") - def bind_vf_linux_pci_stub(self, bus_id, devfun_id): + def bind_driver_linux_pci_stub(self, bus_id, devfun_id): nic_pci_num = ':'.join(['0000', bus_id, devfun_id]) pci_id = self.get_card_type() self.__send_expect("echo %s > /sys/bus/pci/drivers/pci-stub/new_id" % nic_pci_num, "# ") @@ -297,11 +307,21 @@ class NetDevice(object): (nic_pci_num, bus_id, devfun_id), "# ") self.__send_expect("echo %s > /sys/bus/pci/drivers/pci-stub/bind" % nic_pci_num, "# ") - def unbind_vf(self): - unbind_vf = getattr(self, 'unbind_vf_%s' % self.__get_os_type()) - return unbind_vf(self.bus_id, self.devfun_id) + @nic_has_driver + def unbind_driver(self, driver=''): + unbind_driver = getattr(self, 'unbind_driver_%s' % self.__get_os_type()) + if not driver: + driver = 'generic' + return unbind_driver(self.bus_id, self.devfun_id, driver) - def unbind_vf_linux(self, bus_id, devfun_id): + def unbind_driver_linux(self, bus_id, devfun_id, driver): + driver_alias = driver.replace('-', '_') + + unbind_driver_linux = getattr(self, 'unbind_driver_linux_%s' % driver_alias) + return unbind_driver_linux(bus_id, devfun_id) + + def unbind_driver_linux_generic(self, bus_id, devfun_id): nic_pci_num = ':'.join(['0000', bus_id, devfun_id]) - self.__send_expect("echo %s > /sys/bus/pci/driver/unbind" % nic_pci_num, "# ") + self.__send_expect("echo %s > /sys/bus/pci/devices/0000\:%s\:%s/driver/unbind" % + (nic_pci_num, bus_id, devfun_id), "# ") diff --git a/tools/DTF/framework/qemu_kvm.py b/tools/DTF/framework/qemu_kvm.py index 687851f..f405c49 100644 --- a/tools/DTF/framework/qemu_kvm.py +++ b/tools/DTF/framework/qemu_kvm.py @@ -299,21 +299,39 @@ if __name__ == "__main__": dut.set_speedup_options(read_cache, skip_setup) tester.set_speedup_options(read_cache, skip_setup) + dut.dut_prerequisites() + port0 = dut.ports_info[0]['port'] + dut.generate_sriov_vfs_by_port(0, 4) + print "port 0 sriov vfs: ", dut.ports_info[0] + + dut.destroy_sriov_vfs_by_port(0) + + time.sleep(2) + + pdb.set_trace() + port0.unbind_driver() + port0_pci = dut.ports_info[0]['pci'] + # Start VM by the command options virt_proxy = VirtProxy('qemu_kvm', dut) cmd = [('enable-kvm',''), ('cpu','host'), ('drive','file=/home/image/fedora21-try-02.qcow2'), ('net','nic,macaddr=00:00:00:55:00:06'), - ('net', 'tap,script=/etc/qemu-ifup')] + ('net', 'tap,script=/etc/qemu-ifup'), + ('device', 'pci-assign,host=%s' % port0_pci)] vm_name = virt_proxy.virt.start_vm(*cmd) try: print virt_proxy.virt.session.send_expect("ifconfig", '# ') - print virt_proxy.virt.vm_info + print "VM info:", virt_proxy.virt.vm_info vm_dut = virt_proxy.virt.get_vm_dut(vm_name) print vm_dut.session.send_expect('ifconfig', '# ') + print vm_dut.session.send_expect('lspci -nn | grep -i eth', '# ') + + pdb.set_trace() + port0.bind_driver() dut.logger.logger_exit() tester.logger.logger_exit()