From 0c43460a776cc314dfd52ac6b75270e98dd29028 Mon Sep 17 00:00:00 2001 From: Haijiao Zhao Date: Tue, 20 Aug 2024 22:21:54 -0400 Subject: [PATCH] Add new network case of rx tx queue size - VIRT-296306 - [driver][rx_queue_size][tx_queue_size] start vm with rx_queue_size and tx_queue_size setting Signed-off-by: Haijiao Zhao --- .../driver/rx_tx_queue_size.cfg | 33 +++++++ .../driver/rx_tx_queue_size.py | 85 +++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 libvirt/tests/cfg/virtual_network/driver/rx_tx_queue_size.cfg create mode 100644 libvirt/tests/src/virtual_network/driver/rx_tx_queue_size.py diff --git a/libvirt/tests/cfg/virtual_network/driver/rx_tx_queue_size.cfg b/libvirt/tests/cfg/virtual_network/driver/rx_tx_queue_size.cfg new file mode 100644 index 0000000000..d3d7a974a0 --- /dev/null +++ b/libvirt/tests/cfg/virtual_network/driver/rx_tx_queue_size.cfg @@ -0,0 +1,33 @@ +- virtual_network.driver.rx_tx_queue_size: + type = rx_tx_queue_size + start_vm = no + timeout = 240 + outside_ip = 'www.redhat.com' + vm_ping_outside = pass + variants: + - positive: + variants: + - rx_256_tx_256: + rx_tx_attrs = {'rx_queue_size': '256', 'tx_queue_size': '256'} + - rx_512_tx_256: + rx_tx_attrs = {'rx_queue_size': '512', 'tx_queue_size': '256'} + - rx_1024_tx_unset: + rx_tx_attrs = {'rx_queue_size': '1024'} + - negative: + status_error = yes + variants: + - rx_128_tx_unset: + rx_tx_attrs = {'rx_queue_size': '128'} + - rx_2048_tx_unset: + rx_tx_attrs = {'rx_queue_size': '2048'} + - rx_511_tx_unset: + fail_operation = define + rx_tx_attrs = {'rx_queue_size': '511'} + - rx_unset_tx_128: + rx_tx_attrs = {'tx_queue_size': '128'} + - rx_unset_tx_2048: + rx_tx_attrs = {'tx_queue_size': '2048'} + - rx_unset_tx_512: + rx_tx_attrs = {'tx_queue_size': '512'} + + iface_attrs = {'source': {'network': 'default'}, 'type_name': 'network', 'model': 'virtio', 'driver': {'driver_attr': {'name': 'vhost', 'queues': '5', **${rx_tx_attrs}}}} diff --git a/libvirt/tests/src/virtual_network/driver/rx_tx_queue_size.py b/libvirt/tests/src/virtual_network/driver/rx_tx_queue_size.py new file mode 100644 index 0000000000..21b70b9884 --- /dev/null +++ b/libvirt/tests/src/virtual_network/driver/rx_tx_queue_size.py @@ -0,0 +1,85 @@ +import json +import logging + +from avocado.utils import process +from virttest import utils_net +from virttest import virsh +from virttest.libvirt_xml import vm_xml +from virttest.utils_libvirt import libvirt_vmxml +from virttest.utils_test import libvirt + +from provider.virtual_network import network_base + +VIRSH_ARGS = {'ignore_status': False, 'debug': True} + +LOG = logging.getLogger('avocado.' + __name__) + + +def run(test, params, env): + """ + Start vm with rx_queue_size and tx_queue_size setting + + """ + vm_name = params.get('main_vm') + vm = env.get_vm(vm_name) + iface_attrs = eval(params.get('iface_attrs', '{}')) + status_error = 'yes' == params.get('status_error', 'no') + + vmxml = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name) + bkxml = vmxml.copy() + + try: + mac = vm_xml.VMXML.get_first_mac_by_name(vm_name) + iface_attrs['mac_address'] = mac + + vmxml.del_device('interface', by_tag=True) + libvirt_vmxml.modify_vm_device( + vmxml, 'interface', iface_attrs, sync_vm=False) + LOG.debug(f'Modify vmxml to:\n{vmxml}') + + if status_error: + if params.get('fail_operation') == 'define': + virsh_result = virsh.define(vmxml.xml, debug=True) + else: + vmxml.sync() + virsh_result = virsh.start(vm_name, debug=True) + libvirt.check_exit_status(virsh_result, status_error) + return + + vmxml.sync() + vm.start() + LOG.debug(f'VMXML of {vm_name}:\n{virsh.dumpxml(vm_name).stdout_text}') + vm_sess = vm.wait_for_serial_login() + + iface = network_base.get_iface_xml_inst(vm_name, 'after vm start') + actual_rx = int(iface.driver.driver_attr.get('rx_queue_size')) + actual_tx = int(iface.driver.driver_attr.get('tx_queue_size')) + LOG.debug( + f'Actual rx_queue_size={actual_rx} tx_queue_size={actual_tx}') + if str(actual_rx) != iface_attrs['driver']['driver_attr']['rx_queue_size']: + test.fail(f"Wrong rx_queue_size {actual_rx}, should be " + f"{iface_attrs['driver']['driver_attr']['rx_queue_size']}") + if actual_tx != 256: + test.fail(f'Wrong tx_queue_size {actual_tx}, should be 256') + + process.run('ps -ef|grep qemu', shell=True) + + vm_iface = utils_net.get_linux_iface_info( + mac=mac, session=vm_sess)['ifname'] + + eth_output = vm_sess.cmd(f'ethtool -g {vm_iface}') + LOG.debug(eth_output) + eth_output_json = vm_sess.cmd_output(f'ethtool --json -g {vm_iface}') + LOG.debug(eth_output_json) + eth_info = json.loads(eth_output_json)[0] + if eth_info['rx-max'] != actual_rx or eth_info['rx'] != actual_rx: + test.fail('Wrong rx from vm, please check log') + if eth_info['tx-max'] != actual_tx or eth_info['tx'] != actual_tx: + test.fail('Wrong tx from vm, please check log') + + ips = {'outside_ip': params.get('outside_ip')} + network_base.ping_check(params, ips, vm_sess) + vm_sess.close() + + finally: + bkxml.sync()