Message ID | 20230322145529.4079753-1-alex.bennee@linaro.org |
---|---|
State | Accepted |
Commit | 9f95111474659aa28ec98a67118ff79bd05cc6e4 |
Headers | show |
Series | [v2] tests/avocado: re-factor igb test to avoid timeouts | expand |
On 2023/03/22 23:55, Alex Bennée wrote: > The core of the test was utilising "ethtool -t eth1 offline" to run > through a test sequence. For reasons unknown the test hangs under some > configurations of the build on centos8-stream. Fundamentally running > the old fedora-31 cloud-init is just too much for something that is > directed at testing one device. So we: > > - replace fedora with a custom kernel + buildroot rootfs > - rename the test from IGB to NetDevEthtool > - re-factor the common code, add (currently skipped) tests for other > devices which support ethtool > - remove the KVM limitation as its fast enough to run in KVM or TCG > > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> > Cc: Akihiko Odaki <akihiko.odaki@daynix.com> > > --- > v2 > - use squashfs instead of largely empty ext4 device > - use read-only cdrom > - don't bother with login favour of direct call from init > - kill VM once test is passed > - add explicit kvm option Why did you add explicit kvm option? Is there something not likely covered with TCG? Regards, Akihiko Odaki > - add tags for device type > --- > tests/avocado/igb.py | 38 ----------- > tests/avocado/netdev-ethtool.py | 116 ++++++++++++++++++++++++++++++++ > 2 files changed, 116 insertions(+), 38 deletions(-) > delete mode 100644 tests/avocado/igb.py > create mode 100644 tests/avocado/netdev-ethtool.py > > diff --git a/tests/avocado/igb.py b/tests/avocado/igb.py > deleted file mode 100644 > index abf5dfa07f..0000000000 > --- a/tests/avocado/igb.py > +++ /dev/null > @@ -1,38 +0,0 @@ > -# SPDX-License-Identifier: GPL-2.0-or-later > -# ethtool tests for igb registers, interrupts, etc > - > -from avocado_qemu import LinuxTest > - > -class IGB(LinuxTest): > - """ > - :avocado: tags=accel:kvm > - :avocado: tags=arch:x86_64 > - :avocado: tags=distro:fedora > - :avocado: tags=distro_version:31 > - :avocado: tags=machine:q35 > - """ > - > - timeout = 180 > - > - def test(self): > - self.require_accelerator('kvm') > - kernel_url = self.distro.pxeboot_url + 'vmlinuz' > - kernel_hash = '5b6f6876e1b5bda314f93893271da0d5777b1f3c' > - kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) > - initrd_url = self.distro.pxeboot_url + 'initrd.img' > - initrd_hash = 'dd0340a1b39bd28f88532babd4581c67649ec5b1' > - initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash) > - > - # Ideally we want to test MSI as well, but it is blocked by a bug > - # fixed with: > - # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=28e96556baca7056d11d9fb3cdd0aba4483e00d8 > - kernel_params = self.distro.default_kernel_params + ' pci=nomsi' > - > - self.vm.add_args('-kernel', kernel_path, > - '-initrd', initrd_path, > - '-append', kernel_params, > - '-accel', 'kvm', > - '-device', 'igb') > - self.launch_and_wait() > - self.ssh_command('dnf -y install ethtool') > - self.ssh_command('ethtool -t eth1 offline') > diff --git a/tests/avocado/netdev-ethtool.py b/tests/avocado/netdev-ethtool.py > new file mode 100644 > index 0000000000..f7e9464184 > --- /dev/null > +++ b/tests/avocado/netdev-ethtool.py > @@ -0,0 +1,116 @@ > +# ethtool tests for emulated network devices > +# > +# This test leverages ethtool's --test sequence to validate network > +# device behaviour. > +# > +# SPDX-License-Identifier: GPL-2.0-or-late > + > +from avocado import skip > +from avocado_qemu import QemuSystemTest > +from avocado_qemu import exec_command, exec_command_and_wait_for_pattern > +from avocado_qemu import wait_for_console_pattern > + > +class NetDevEthtool(QemuSystemTest): > + """ > + :avocado: tags=arch:x86_64 > + :avocado: tags=machine:q35 > + """ > + > + # Runs in about 17s under KVM, 19s under TCG, 25s under GCOV > + timeout = 45 > + > + # Fetch assets from the netdev-ethtool subdir of my shared test > + # images directory on fileserver.linaro.org. > + def get_asset(self, name, sha1): > + base_url = ('https://fileserver.linaro.org/s/' > + 'kE4nCFLdQcoBF9t/download?' > + 'path=%2Fnetdev-ethtool&files=' ) > + url = base_url + name > + # use explicit name rather than failing to neatly parse the > + # URL into a unique one > + return self.fetch_asset(name=name, locations=(url), asset_hash=sha1) > + > + def common_test_code(self, netdev, extra_args=None, kvm=False): > + > + # This custom kernel has drivers for all the supported network > + # devices we can emulate in QEMU > + kernel = self.get_asset("bzImage", > + "33469d7802732d5815226166581442395cb289e2") > + > + rootfs = self.get_asset("rootfs.squashfs", > + "9793cea7021414ae844bda51f558bd6565b50cdc") > + > + append = 'printk.time=0 console=ttyS0 ' > + append += 'root=/dev/sr0 rootfstype=squashfs ' > + > + # any additional kernel tweaks for the test > + if extra_args: > + append += extra_args > + > + # finally invoke ethtool directly > + append += ' init=/usr/sbin/ethtool -- -t eth1 offline' > + > + # add the rootfs via a readonly cdrom image > + drive = f"file={rootfs},if=ide,index=0,media=cdrom" > + > + self.vm.add_args('-kernel', kernel, > + '-append', append, > + '-drive', drive, > + '-device', netdev) > + > + if kvm: > + self.vm.add_args('-accel', 'kvm') > + > + self.vm.set_console(console_index=0) > + self.vm.launch() > + > + wait_for_console_pattern(self, > + "The test result is PASS", > + "The test result is FAIL", > + vm=None) > + # no need to gracefully shutdown, just finish > + self.vm.kill() > + > + # Skip testing for MSI for now. Allegedly it was fixed by: > + # 28e96556ba (igb: Allocate MSI-X vector when testing) > + # but I'm seeing oops in the kernel > + @skip("Kernel bug with MSI enabled") > + def test_igb(self): > + """ > + :avocado: tags=device:igb > + """ > + self.common_test_code("igb") > + > + def test_igb_nomsi(self): > + """ > + :avocado: tags=device:igb > + """ > + self.common_test_code("igb", "pci=nomsi") > + > + def test_igb_nomsi_kvm(self): > + """ > + :avocado: tags=device:igb > + """ > + self.require_accelerator('kvm') > + self.common_test_code("igb", "pci=nomsi", True) > + > + # It seems the other popular cards we model in QEMU currently fail > + # the pattern test with: > + # > + # pattern test failed (reg 0x00178): got 0x00000000 expected 0x00005A5A > + # > + # So for now we skip them. > + > + @skip("Incomplete reg 0x00178 support") > + def test_e1000(self): > + """ > + :avocado: tags=device:e1000 > + """ > + self.common_test_code("e1000") > + > + @skip("Incomplete reg 0x00178 support") > + def test_i82550(self): > + """ > + :avocado: tags=device:i82550 > + """ > + self.common_test_code("i82550")
Akihiko Odaki <akihiko.odaki@daynix.com> writes: > On 2023/03/22 23:55, Alex Bennée wrote: >> The core of the test was utilising "ethtool -t eth1 offline" to run >> through a test sequence. For reasons unknown the test hangs under some >> configurations of the build on centos8-stream. Fundamentally running >> the old fedora-31 cloud-init is just too much for something that is >> directed at testing one device. So we: >> - replace fedora with a custom kernel + buildroot rootfs >> - rename the test from IGB to NetDevEthtool >> - re-factor the common code, add (currently skipped) tests for other >> devices which support ethtool >> - remove the KVM limitation as its fast enough to run in KVM or TCG >> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> >> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> >> Cc: Akihiko Odaki <akihiko.odaki@daynix.com> >> --- >> v2 >> - use squashfs instead of largely empty ext4 device >> - use read-only cdrom >> - don't bother with login favour of direct call from init >> - kill VM once test is passed >> - add explicit kvm option > > Why did you add explicit kvm option? Is there something not likely > covered with TCG? I realised it was the case that the previous igb tested so I added for completeness. What I really wanted to do was to make the test agnostic so it would use KVM when available and fall back to TCG when it couldn't. However my attempt to specify --accel kvm,tcg didn't work. But yes I doubt there is much coverage difference between the two - certainly in the emulation side. > > Regards, > Akihiko Odaki > >> - add tags for device type >> --- >> tests/avocado/igb.py | 38 ----------- >> tests/avocado/netdev-ethtool.py | 116 ++++++++++++++++++++++++++++++++ >> 2 files changed, 116 insertions(+), 38 deletions(-) >> delete mode 100644 tests/avocado/igb.py >> create mode 100644 tests/avocado/netdev-ethtool.py >> diff --git a/tests/avocado/igb.py b/tests/avocado/igb.py >> deleted file mode 100644 >> index abf5dfa07f..0000000000 >> --- a/tests/avocado/igb.py >> +++ /dev/null >> @@ -1,38 +0,0 @@ >> -# SPDX-License-Identifier: GPL-2.0-or-later >> -# ethtool tests for igb registers, interrupts, etc >> - >> -from avocado_qemu import LinuxTest >> - >> -class IGB(LinuxTest): >> - """ >> - :avocado: tags=accel:kvm >> - :avocado: tags=arch:x86_64 >> - :avocado: tags=distro:fedora >> - :avocado: tags=distro_version:31 >> - :avocado: tags=machine:q35 >> - """ >> - >> - timeout = 180 >> - >> - def test(self): >> - self.require_accelerator('kvm') >> - kernel_url = self.distro.pxeboot_url + 'vmlinuz' >> - kernel_hash = '5b6f6876e1b5bda314f93893271da0d5777b1f3c' >> - kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) >> - initrd_url = self.distro.pxeboot_url + 'initrd.img' >> - initrd_hash = 'dd0340a1b39bd28f88532babd4581c67649ec5b1' >> - initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash) >> - >> - # Ideally we want to test MSI as well, but it is blocked by a bug >> - # fixed with: >> - # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=28e96556baca7056d11d9fb3cdd0aba4483e00d8 >> - kernel_params = self.distro.default_kernel_params + ' pci=nomsi' >> - >> - self.vm.add_args('-kernel', kernel_path, >> - '-initrd', initrd_path, >> - '-append', kernel_params, >> - '-accel', 'kvm', >> - '-device', 'igb') >> - self.launch_and_wait() >> - self.ssh_command('dnf -y install ethtool') >> - self.ssh_command('ethtool -t eth1 offline') >> diff --git a/tests/avocado/netdev-ethtool.py b/tests/avocado/netdev-ethtool.py >> new file mode 100644 >> index 0000000000..f7e9464184 >> --- /dev/null >> +++ b/tests/avocado/netdev-ethtool.py >> @@ -0,0 +1,116 @@ >> +# ethtool tests for emulated network devices >> +# >> +# This test leverages ethtool's --test sequence to validate network >> +# device behaviour. >> +# >> +# SPDX-License-Identifier: GPL-2.0-or-late >> + >> +from avocado import skip >> +from avocado_qemu import QemuSystemTest >> +from avocado_qemu import exec_command, exec_command_and_wait_for_pattern >> +from avocado_qemu import wait_for_console_pattern >> + >> +class NetDevEthtool(QemuSystemTest): >> + """ >> + :avocado: tags=arch:x86_64 >> + :avocado: tags=machine:q35 >> + """ >> + >> + # Runs in about 17s under KVM, 19s under TCG, 25s under GCOV >> + timeout = 45 >> + >> + # Fetch assets from the netdev-ethtool subdir of my shared test >> + # images directory on fileserver.linaro.org. >> + def get_asset(self, name, sha1): >> + base_url = ('https://fileserver.linaro.org/s/' >> + 'kE4nCFLdQcoBF9t/download?' >> + 'path=%2Fnetdev-ethtool&files=' ) >> + url = base_url + name >> + # use explicit name rather than failing to neatly parse the >> + # URL into a unique one >> + return self.fetch_asset(name=name, locations=(url), asset_hash=sha1) >> + >> + def common_test_code(self, netdev, extra_args=None, kvm=False): >> + >> + # This custom kernel has drivers for all the supported network >> + # devices we can emulate in QEMU >> + kernel = self.get_asset("bzImage", >> + "33469d7802732d5815226166581442395cb289e2") >> + >> + rootfs = self.get_asset("rootfs.squashfs", >> + "9793cea7021414ae844bda51f558bd6565b50cdc") >> + >> + append = 'printk.time=0 console=ttyS0 ' >> + append += 'root=/dev/sr0 rootfstype=squashfs ' >> + >> + # any additional kernel tweaks for the test >> + if extra_args: >> + append += extra_args >> + >> + # finally invoke ethtool directly >> + append += ' init=/usr/sbin/ethtool -- -t eth1 offline' >> + >> + # add the rootfs via a readonly cdrom image >> + drive = f"file={rootfs},if=ide,index=0,media=cdrom" >> + >> + self.vm.add_args('-kernel', kernel, >> + '-append', append, >> + '-drive', drive, >> + '-device', netdev) >> + >> + if kvm: >> + self.vm.add_args('-accel', 'kvm') >> + >> + self.vm.set_console(console_index=0) >> + self.vm.launch() >> + >> + wait_for_console_pattern(self, >> + "The test result is PASS", >> + "The test result is FAIL", >> + vm=None) >> + # no need to gracefully shutdown, just finish >> + self.vm.kill() >> + >> + # Skip testing for MSI for now. Allegedly it was fixed by: >> + # 28e96556ba (igb: Allocate MSI-X vector when testing) >> + # but I'm seeing oops in the kernel >> + @skip("Kernel bug with MSI enabled") >> + def test_igb(self): >> + """ >> + :avocado: tags=device:igb >> + """ >> + self.common_test_code("igb") >> + >> + def test_igb_nomsi(self): >> + """ >> + :avocado: tags=device:igb >> + """ >> + self.common_test_code("igb", "pci=nomsi") >> + >> + def test_igb_nomsi_kvm(self): >> + """ >> + :avocado: tags=device:igb >> + """ >> + self.require_accelerator('kvm') >> + self.common_test_code("igb", "pci=nomsi", True) >> + >> + # It seems the other popular cards we model in QEMU currently fail >> + # the pattern test with: >> + # >> + # pattern test failed (reg 0x00178): got 0x00000000 expected 0x00005A5A >> + # >> + # So for now we skip them. >> + >> + @skip("Incomplete reg 0x00178 support") >> + def test_e1000(self): >> + """ >> + :avocado: tags=device:e1000 >> + """ >> + self.common_test_code("e1000") >> + >> + @skip("Incomplete reg 0x00178 support") >> + def test_i82550(self): >> + """ >> + :avocado: tags=device:i82550 >> + """ >> + self.common_test_code("i82550")
diff --git a/tests/avocado/igb.py b/tests/avocado/igb.py deleted file mode 100644 index abf5dfa07f..0000000000 --- a/tests/avocado/igb.py +++ /dev/null @@ -1,38 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# ethtool tests for igb registers, interrupts, etc - -from avocado_qemu import LinuxTest - -class IGB(LinuxTest): - """ - :avocado: tags=accel:kvm - :avocado: tags=arch:x86_64 - :avocado: tags=distro:fedora - :avocado: tags=distro_version:31 - :avocado: tags=machine:q35 - """ - - timeout = 180 - - def test(self): - self.require_accelerator('kvm') - kernel_url = self.distro.pxeboot_url + 'vmlinuz' - kernel_hash = '5b6f6876e1b5bda314f93893271da0d5777b1f3c' - kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) - initrd_url = self.distro.pxeboot_url + 'initrd.img' - initrd_hash = 'dd0340a1b39bd28f88532babd4581c67649ec5b1' - initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash) - - # Ideally we want to test MSI as well, but it is blocked by a bug - # fixed with: - # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=28e96556baca7056d11d9fb3cdd0aba4483e00d8 - kernel_params = self.distro.default_kernel_params + ' pci=nomsi' - - self.vm.add_args('-kernel', kernel_path, - '-initrd', initrd_path, - '-append', kernel_params, - '-accel', 'kvm', - '-device', 'igb') - self.launch_and_wait() - self.ssh_command('dnf -y install ethtool') - self.ssh_command('ethtool -t eth1 offline') diff --git a/tests/avocado/netdev-ethtool.py b/tests/avocado/netdev-ethtool.py new file mode 100644 index 0000000000..f7e9464184 --- /dev/null +++ b/tests/avocado/netdev-ethtool.py @@ -0,0 +1,116 @@ +# ethtool tests for emulated network devices +# +# This test leverages ethtool's --test sequence to validate network +# device behaviour. +# +# SPDX-License-Identifier: GPL-2.0-or-late + +from avocado import skip +from avocado_qemu import QemuSystemTest +from avocado_qemu import exec_command, exec_command_and_wait_for_pattern +from avocado_qemu import wait_for_console_pattern + +class NetDevEthtool(QemuSystemTest): + """ + :avocado: tags=arch:x86_64 + :avocado: tags=machine:q35 + """ + + # Runs in about 17s under KVM, 19s under TCG, 25s under GCOV + timeout = 45 + + # Fetch assets from the netdev-ethtool subdir of my shared test + # images directory on fileserver.linaro.org. + def get_asset(self, name, sha1): + base_url = ('https://fileserver.linaro.org/s/' + 'kE4nCFLdQcoBF9t/download?' + 'path=%2Fnetdev-ethtool&files=' ) + url = base_url + name + # use explicit name rather than failing to neatly parse the + # URL into a unique one + return self.fetch_asset(name=name, locations=(url), asset_hash=sha1) + + def common_test_code(self, netdev, extra_args=None, kvm=False): + + # This custom kernel has drivers for all the supported network + # devices we can emulate in QEMU + kernel = self.get_asset("bzImage", + "33469d7802732d5815226166581442395cb289e2") + + rootfs = self.get_asset("rootfs.squashfs", + "9793cea7021414ae844bda51f558bd6565b50cdc") + + append = 'printk.time=0 console=ttyS0 ' + append += 'root=/dev/sr0 rootfstype=squashfs ' + + # any additional kernel tweaks for the test + if extra_args: + append += extra_args + + # finally invoke ethtool directly + append += ' init=/usr/sbin/ethtool -- -t eth1 offline' + + # add the rootfs via a readonly cdrom image + drive = f"file={rootfs},if=ide,index=0,media=cdrom" + + self.vm.add_args('-kernel', kernel, + '-append', append, + '-drive', drive, + '-device', netdev) + + if kvm: + self.vm.add_args('-accel', 'kvm') + + self.vm.set_console(console_index=0) + self.vm.launch() + + wait_for_console_pattern(self, + "The test result is PASS", + "The test result is FAIL", + vm=None) + # no need to gracefully shutdown, just finish + self.vm.kill() + + # Skip testing for MSI for now. Allegedly it was fixed by: + # 28e96556ba (igb: Allocate MSI-X vector when testing) + # but I'm seeing oops in the kernel + @skip("Kernel bug with MSI enabled") + def test_igb(self): + """ + :avocado: tags=device:igb + """ + self.common_test_code("igb") + + def test_igb_nomsi(self): + """ + :avocado: tags=device:igb + """ + self.common_test_code("igb", "pci=nomsi") + + def test_igb_nomsi_kvm(self): + """ + :avocado: tags=device:igb + """ + self.require_accelerator('kvm') + self.common_test_code("igb", "pci=nomsi", True) + + # It seems the other popular cards we model in QEMU currently fail + # the pattern test with: + # + # pattern test failed (reg 0x00178): got 0x00000000 expected 0x00005A5A + # + # So for now we skip them. + + @skip("Incomplete reg 0x00178 support") + def test_e1000(self): + """ + :avocado: tags=device:e1000 + """ + self.common_test_code("e1000") + + @skip("Incomplete reg 0x00178 support") + def test_i82550(self): + """ + :avocado: tags=device:i82550 + """ + self.common_test_code("i82550")