Example #1
0
    def irq_check(session, device_name, devcon_folder, timeout):
        """
        Check virtio device's irq number, irq number should be greater than zero.

        :param session: use for sending cmd
        :param device_name: name of the specified device
        :param devcon_folder: Full path for devcon.exe
        :param timeout: Timeout in seconds.
        """
        hwids = win_dev.get_hwids(session, device_name, devcon_folder, timeout)
        if not hwids:
            test.error("Didn't find %s device info from guest" % device_name)
        if params.get("check_vectors", "no") == "yes":
            vectors = int(get_vectors_fqtree())
        for hwid in hwids:
            get_irq_cmd = params["get_irq_cmd"] % (devcon_folder, hwid)
            irq_list = re.findall(r':\s+(\d+)', session.cmd_output(get_irq_cmd), re.M)
            if not irq_list:
                test.error("device %s's irq checked fail" % device_name)
            irq_nums = len(irq_list)
            for irq_symbol in (ctypes.c_int32(int(irq)).value for irq in irq_list):
                if (irq_nums == 1 and irq_symbol < 0) or (irq_nums > 1 and irq_symbol >= 0):
                    test.fail("%s's irq is not correct." % device_name)
                elif irq_nums > 1 and (irq_nums != vectors):
                    test.fail("%s's irq nums not equal to vectors." % device_name)
Example #2
0
    def verify_virtio_mode_guest_win(session, virtio_mode):
        """
        Verify virtio mode in windows guests. If device is in modern mode,
        device id should be larger than 1040. Else device memory range need
        to checked futher.

        :param session: shell Object
        :param virtio_mode: VirtIO mode for the device
        """
        device_name = params["device_name"]
        driver_name = params["driver_name"]
        session = utils_test.qemu.windrv_check_running_verifier(session, vm,
                                                                test, driver_name)
        devcon_folder = utils_misc.set_winutils_letter(session,
                                                       params["devcon_folder"])

        hwid = win_dev.get_hwids(session, device_name, devcon_folder)[0]
        device_id = int(hwid[17:21])

        if device_id > 1040:
            guest_mode = "modern"
        else:
            guest_mode = win_memory_range(session, devcon_folder, hwid, virtio_mode)

        if virtio_mode != guest_mode:
            test.fail("virtio mode in guest is not correct!")
Example #3
0
    def verify_virtio_mode_guest_win(session, virtio_mode):
        """
        Verify virtio mode in windows guests. If device is in modern mode,
        device id should be larger than 1040. Else device memory range need
        to checked futher.

        :param session: shell Object
        :param virtio_mode: VirtIO mode for the device
        """
        device_name = params["device_name"]
        driver_name = params["driver_name"]
        session = utils_test.qemu.windrv_check_running_verifier(
            session, vm, test, driver_name)
        devcon_folder = utils_misc.set_winutils_letter(session,
                                                       params["devcon_folder"])

        hwid = win_dev.get_hwids(session, device_name, devcon_folder)[0]
        device_id = int(hwid[17:21])

        if device_id > 1040:
            guest_mode = "modern"
        else:
            guest_mode = win_memory_range(session, devcon_folder, hwid,
                                          virtio_mode)

        if virtio_mode != guest_mode:
            test.fail("virtio mode in guest is not correct!")
Example #4
0
 def set_msi_fguest(enable=True):
     """
     Disable or enable MSI from guest.
     """
     hwid = win_dev.get_hwids(session, device_name, devcon_folder,
                              timeout)[0]
     session.cmd(params["msi_cmd"] % (hwid, 0 if enable else 1))
Example #5
0
    def irq_check(session, device_name, devcon_folder, timeout):
        """
        Check virtio device's irq number, irq number should be greater than zero.

        :param session: use for sending cmd
        :param device_name: name of the specified device
        :param devcon_folder: Full path for devcon.exe
        :param timeout: Timeout in seconds.
        """
        hwids = win_dev.get_hwids(session, device_name, devcon_folder, timeout)
        if not hwids:
            test.error("Didn't find %s device info from guest" % device_name)
        if params.get("check_vectors", "no") == "yes":
            vectors = int(get_vectors_fqtree())
        for hwid in hwids:
            get_irq_cmd = params["get_irq_cmd"] % (devcon_folder, hwid)
            irq_list = re.findall(r':\s+(\d+)',
                                  session.cmd_output(get_irq_cmd), re.M)
            if not irq_list:
                test.error("device %s's irq checked fail" % device_name)
            irq_nums = len(irq_list)
            for irq_symbol in (ctypes.c_int32(int(irq)).value
                               for irq in irq_list):
                if (irq_nums == 1 and irq_symbol < 0) or (irq_nums > 1
                                                          and irq_symbol >= 0):
                    test.fail("%s's irq is not correct." % device_name)
                elif irq_nums > 1 and (irq_nums != vectors):
                    test.fail("%s's irq nums not equal to vectors." %
                              device_name)
Example #6
0
 def irq_check(session, device_name, devcon_folder):
     hwid = win_dev.get_hwids(session, device_name, devcon_folder,
                              login_timeout)[0]
     get_irq_cmd = params["get_irq_cmd"] % (devcon_folder, hwid)
     irq_list = re.findall(r':\s+(\d+)', session.cmd_output(get_irq_cmd),
                           re.M)
     if not irq_list:
         test.error("device %s's irq checked fail" % device_name)
     return irq_list
Example #7
0
    def irq_check(session, device_name, devcon_folder, timeout):
        """
        Check virtio device's irq number, irq number should be greater than zero.

        :param session: use for sending cmd
        :param device_name: name of the specified device
        :param devcon_folder: Full path for devcon.exe
        :param timeout: Timeout in seconds.
        """
        hwids = win_dev.get_hwids(session, device_name, devcon_folder, timeout)
        if not hwids:
            test.error("Didn't find %s device info from guest" % device_name)
        for hwid in hwids:
            get_irq_cmd = '%sdevcon.exe resources @"%s" | find "IRQ"' % (
                devcon_folder, hwid)
            output = session.cmd_output(get_irq_cmd)
            irq_value = re.split(r':+', output)[1]
            if ctypes.c_int32(int(irq_value)).value < 0:
                test.fail("%s's irq is not correct." % device_name,
                          logging.info)
Example #8
0
 def set_msi_fguest(enable=True):
     """
     Disable or enable MSI from guest.
     """
     hwid = win_dev.get_hwids(session, device_name, devcon_folder, timeout)[0]
     session.cmd(params["msi_cmd"] % (hwid, 0 if enable else 1))
Example #9
0
def run(test, params, env):
    """
    vhost is no longer disabled when guest does not use MSI-X.
    The vhostforce flag is no longer required.

    1) Start guest with different NIC option
    2) Check virtio device's irq number,irq number should be greater than one.
    3) Disable msi of guest
    4) Reboot guest,check if msi is disabled and irq number should be equal to 1.
    5) Check network and vhost process (transfer data).
    6) Check md5 value of both sides.

    :param test: QEMU test object
    :param params: Dictionary with the test parameters
    :param env: Dictionary with test environment.
    """
    def irq_check(session, device_name, devcon_folder):
        hwid = win_dev.get_hwids(session, device_name, devcon_folder,
                                 login_timeout)[0]
        get_irq_cmd = params["get_irq_cmd"] % (devcon_folder, hwid)
        irq_list = re.findall(r':\s+(\d+)', session.cmd_output(get_irq_cmd),
                              re.M)
        if not irq_list:
            test.error("device %s's irq checked fail" % device_name)
        return irq_list

    def get_file_md5sum(file_name, session, timeout):
        """
        return: Return the md5sum value of the guest.
        """
        logging.info("Get md5sum of the file:'%s'", file_name)
        s, o = session.cmd_status_output("md5sum %s" % file_name,
                                         timeout=timeout)
        if s != 0:
            test.error("Get file md5sum failed as %s" % o)
        return re.findall(r"\w{32}", o)[0]

    tmp_dir = params["tmp_dir"]
    filesize = int(params.get("filesize"))
    dd_cmd = params["dd_cmd"]
    delete_cmd = params["delete_cmd"]
    file_md5_check_timeout = int(params.get("file_md5_check_timeout"))
    login_timeout = int(params.get("login_timeout", 360))
    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()
    session = vm.wait_for_serial_login()

    if params.get("os_type") == "linux":
        error_context.context("Check the pci msi in guest", logging.info)
        pci_id = session.cmd("lspci |grep Eth |awk {'print $1'}").strip()
        status = session.cmd("lspci -vvv -s %s|grep MSI-X" % pci_id).strip()
        enable_status = re.search(r'Enable\+', status, re.M | re.I)
        if enable_status.group() == "Enable+":
            error_context.context("Disable pci msi in guest", logging.info)
            utils_test.update_boot_option(vm, args_added="pci=nomsi")
            session_msi = vm.wait_for_serial_login(timeout=login_timeout)
            pci_id = session_msi.cmd(
                "lspci |grep Eth |awk {'print $1'}").strip()
            status = session_msi.cmd("lspci -vvv -s %s|grep MSI-X" %
                                     pci_id).strip()
            session_msi.close()
            change_status = re.search(r'Enable\-', status, re.M | re.I)
            if change_status.group() != "Enable-":
                test.fail("virtio device's statuts is not correct")
        elif enable_status.group() != "Enable+":
            test.fail("virtio device's statuts is not correct")
    else:
        driver = params.get("driver_name")
        driver_verifier = params.get("driver_verifier", driver)

        device_name = params["device_name"]
        devcon_folder = utils_misc.set_winutils_letter(session,
                                                       params["devcon_folder"])
        error_context.context("Boot guest with %s device" % driver,
                              logging.info)
        session = utils_test.qemu.windrv_check_running_verifier(
            session, vm, test, driver_verifier, login_timeout)
        error_context.context("Check %s's irq number" % device_name,
                              logging.info)
        irq_list = irq_check(session, device_name, devcon_folder)
        irq_nums = len(irq_list)
        if not irq_nums > 1 and\
                max(ctypes.c_int32(int(irq)).value for irq in irq_list) < 0:
            test.fail("%s's irq is not correct." % device_name)
        if params.get("msi_cmd"):
            error_context.context("Disable MSI in guest", logging.info)
            hwid_msi = win_dev.get_hwids(session, device_name, devcon_folder,
                                         login_timeout)[0]
            session.cmd(params["msi_cmd"] % (hwid_msi, 0))
            session = vm.reboot(session=session)
            error_context.context("Check %s's irq number" % device_name,
                                  logging.info)
            irq_list = irq_check(session, device_name, devcon_folder)
            irq_nums = len(irq_list)
            if not irq_nums == 1 and \
                    min(ctypes.c_int32(int(irq)).value for irq in irq_list) > 0:
                test.fail("%s's irq is not correct." % device_name)

    # prepare test data
    guest_path = (tmp_dir + "src-%s" % utils_misc.generate_random_string(8))
    host_path = os.path.join(test.tmpdir,
                             "tmp-%s" % utils_misc.generate_random_string(8))
    logging.info("Test setup: Creating %dMB file on host", filesize)
    process.run(dd_cmd % host_path, shell=True)

    try:
        src_md5 = crypto.hash_file(host_path, algorithm="md5")
        logging.info("md5 value of data from src: %s", src_md5)
        # transfer data
        error_context.context("Transfer data from host to %s" % vm.name,
                              logging.info)
        vm.copy_files_to(host_path, guest_path)
        dst_md5 = get_file_md5sum(guest_path,
                                  session,
                                  timeout=file_md5_check_timeout)
        logging.info("md5 value of data in %s: %s", vm.name, dst_md5)
        if dst_md5 != src_md5:
            test.fail("File changed after transfer host -> %s" % vm.name)
    finally:
        os.remove(host_path)
        session.cmd(delete_cmd % guest_path,
                    timeout=login_timeout,
                    ignore_all_errors=True)
        session.close()