From eb47f8f5cbad6e9683d85b1af42868f60b7ddb20 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Sun, 26 Apr 2020 14:22:11 +0800 Subject: [PATCH] acrn-config: refinement for CPU affinity check Refine CPU affinity sanity check for both scenario and launch config xmls. Tracked-On: #4641 Signed-off-by: Wei Liu Acked-by: Victor Sun --- misc/acrn-config/launch_config/launch_item.py | 3 ++- misc/acrn-config/library/launch_cfg_lib.py | 9 +++++++ misc/acrn-config/library/scenario_cfg_lib.py | 25 ++++++++++++++----- .../scenario_config/scenario_item.py | 2 +- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/misc/acrn-config/launch_config/launch_item.py b/misc/acrn-config/launch_config/launch_item.py index 229cd5269..0462ead75 100644 --- a/misc/acrn-config/launch_config/launch_item.py +++ b/misc/acrn-config/launch_config/launch_item.py @@ -35,7 +35,8 @@ class AcrnDmArgs: launch_cfg_lib.mem_size_check(self.args["mem_size"], "mem_size") launch_cfg_lib.args_aval_check(self.args["vbootloader"], "vbootloader", launch_cfg_lib.BOOT_TYPE) launch_cfg_lib.args_aval_check(self.args["vuart0"], "vuart0", launch_cfg_lib.DM_VUART0) - err_dic = scenario_cfg_lib.cpus_per_vm_check(self.launch_info, self.args["cpu_affinity"], "pcpu_id") + cpu_affinity = launch_cfg_lib.uos_cpu_affinity(self.args["cpu_affinity"]) + err_dic = scenario_cfg_lib.vm_cpu_affinity_check(self.launch_info, cpu_affinity, "pcpu_id") launch_cfg_lib.ERR_LIST.update(err_dic) diff --git a/misc/acrn-config/library/launch_cfg_lib.py b/misc/acrn-config/library/launch_cfg_lib.py index abbde4ece..9f459f52c 100644 --- a/misc/acrn-config/library/launch_cfg_lib.py +++ b/misc/acrn-config/library/launch_cfg_lib.py @@ -519,3 +519,12 @@ def get_gpu_vpid(): if GPU_BDF in vpid_line: vpid = " ".join(vpid_line.split()[2].split(':')) return vpid + + +def uos_cpu_affinity(uosid_cpu_affinity): + + cpu_affinity = {} + sos_vm_id = get_sos_vmid() + for uosid,cpu_affinity_list in uosid_cpu_affinity.items(): + cpu_affinity[uosid + sos_vm_id] = cpu_affinity_list + return cpu_affinity diff --git a/misc/acrn-config/library/scenario_cfg_lib.py b/misc/acrn-config/library/scenario_cfg_lib.py index 13262a61f..07b1a6bac 100644 --- a/misc/acrn-config/library/scenario_cfg_lib.py +++ b/misc/acrn-config/library/scenario_cfg_lib.py @@ -210,7 +210,7 @@ def guest_flag_check(guest_flags, branch_tag, leaf_tag): ERR_LIST[key] = "Unknow guest flag" -def cpus_per_vm_check(config_file, id_cpus_per_vm_dic, item): +def vm_cpu_affinity_check(config_file, id_cpus_per_vm_dic, item): """ Check cpu number of per vm :param item: vm pcpu_id item in xml @@ -234,13 +234,17 @@ def cpus_per_vm_check(config_file, id_cpus_per_vm_dic, item): else: use_cpus.append(cpu) + pre_launch_cpus = [] + post_launch_cpus = [] for vm_i, vm_type in common.VM_TYPES.items(): - if vm_i not in id_cpus_per_vm_dic.keys() and "SOS_VM" == VM_DB[vm_type]['load_type']: + if vm_i not in id_cpus_per_vm_dic.keys(): continue - elif vm_i not in id_cpus_per_vm_dic.keys() and VM_DB[vm_type]['load_type'] in ("PRE_LAUNCHED_VM", "POST_LAUNCHED_VM"): - key = "vm:id={},{}".format(vm_i, item) - err_dic[key] = "Pre launched_vm and Post launched vm should have cpus assignment" - return err_dic + elif VM_DB[vm_type]['load_type'] == "PRE_LAUNCHED_VM": + cpus = [x for x in id_cpus_per_vm_dic[vm_i] if not None] + pre_launch_cpus.extend(cpus) + elif VM_DB[vm_type]['load_type'] == "POST_LAUNCHED_VM": + cpus = [x for x in id_cpus_per_vm_dic[vm_i] if not None] + post_launch_cpus.extend(cpus) # duplicate cpus assign the same VM check cpus_vm_i = id_cpus_per_vm_dic[vm_i] @@ -250,6 +254,15 @@ def cpus_per_vm_check(config_file, id_cpus_per_vm_dic, item): err_dic[key] = "VM should not use the same pcpu id:{}".format(cpu_id) return err_dic + if pre_launch_cpus: + for pcpu in pre_launch_cpus: + if pre_launch_cpus.count(pcpu) >= 2: + key = "Pre launched VM cpu_affinity" + err_dic[key] = "Pre_launched_vm vm should not have the same cpus assignment" + if pcpu in post_launch_cpus: + key = "Pre launched vm and Post launchded VM cpu_affinity" + err_dic[key] = "Pre launched_vm and Post launched vm should not have the same cpus assignment" + return err_dic diff --git a/misc/acrn-config/scenario_config/scenario_item.py b/misc/acrn-config/scenario_config/scenario_item.py index 22b4ca34c..bf0b83087 100644 --- a/misc/acrn-config/scenario_config/scenario_item.py +++ b/misc/acrn-config/scenario_config/scenario_item.py @@ -312,7 +312,7 @@ class VmInfo: scenario_cfg_lib.vm_name_check(self.name, "name") scenario_cfg_lib.load_vm_check(self.load_vm, "load_vm") scenario_cfg_lib.guest_flag_check(self.guest_flags, "guest_flags", "guest_flag") - err_dic = scenario_cfg_lib.cpus_per_vm_check(self.scenario_info, self.cpus_per_vm, "pcpu_id") + err_dic = scenario_cfg_lib.vm_cpu_affinity_check(self.scenario_info, self.cpus_per_vm, "pcpu_id") self.mem_info.check_item() self.os_cfg.check_item()