From 5a18c694197bd4314f619fa2a4cfabdd90da74e0 Mon Sep 17 00:00:00 2001 From: Weiyi Feng Date: Wed, 10 Nov 2021 14:18:26 +0800 Subject: [PATCH] config_tool: add cpu affinity check 1. ensure cpu affinity in launch xml is subset of its scenario settings. 2. cpu_affinity is a must have parameter for acrn_dm, if the user did not provide cpu affinity in launch xml, load it from scenario settings. Tracked-On: #6724 Signed-off-by: Weiyi Feng --- .../config_tools/launch_config/launch_item.py | 12 +++++- misc/config_tools/library/scenario_cfg_lib.py | 43 +++++++++++-------- .../scenario_config/scenario_item.py | 2 +- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/misc/config_tools/launch_config/launch_item.py b/misc/config_tools/launch_config/launch_item.py index 1718f2357..dbb3fe107 100644 --- a/misc/config_tools/launch_config/launch_item.py +++ b/misc/config_tools/launch_config/launch_item.py @@ -26,6 +26,14 @@ class AcrnDmArgs: self.args["cpu_sharing"] = common.get_hv_item_tag(self.scenario_info, "FEATURES", "SCHEDULER") self.args["pm_channel"] = common.get_leaf_tag_map(self.launch_info, "poweroff_channel") self.args["cpu_affinity"] = common.get_leaf_tag_map(self.launch_info, "cpu_affinity", "pcpu_id") + # get default cpu_affinity from scenario file + scenario_cpu_aff = common.get_leaf_tag_map(self.scenario_info, "cpu_affinity", "pcpu_id") + for vm_id, cpu_ids in self.args["cpu_affinity"].items(): + cpu_ids = [x for x in cpu_ids if x is not None] + if cpu_ids: + continue + self.args["cpu_affinity"][vm_id] = scenario_cpu_aff[vm_id] + self.args["shm_enabled"] = common.get_hv_item_tag(self.scenario_info, "FEATURES", "IVSHMEM", "IVSHMEM_ENABLED") self.args["shm_regions"] = common.get_leaf_tag_map(self.launch_info, "shm_regions", "shm_region") for vmid, shm_regions in self.args["shm_regions"].items(): @@ -49,10 +57,10 @@ class AcrnDmArgs: launch_cfg_lib.args_aval_check(self.args["enable_ptm"], "enable_ptm", launch_cfg_lib.y_n) launch_cfg_lib.args_aval_check(self.args["allow_trigger_s5"], "allow_trigger_s5", launch_cfg_lib.y_n) cpu_affinity = launch_cfg_lib.user_vm_cpu_affinity(self.args["cpu_affinity"]) - err_dic = scenario_cfg_lib.vm_cpu_affinity_check(self.launch_info, cpu_affinity, "pcpu_id") + err_dic = scenario_cfg_lib.vm_cpu_affinity_check(self.scenario_info, cpu_affinity) launch_cfg_lib.ERR_LIST.update(err_dic) launch_cfg_lib.check_shm_regions(self.args["shm_regions"], self.scenario_info) - launch_cfg_lib.check_console_vuart(self.args["console_vuart"],self.args["vuart0"], self.scenario_info) + launch_cfg_lib.check_console_vuart(self.args["console_vuart"], self.args["vuart0"], self.scenario_info) launch_cfg_lib.check_communication_vuart(self.args["communication_vuarts"], self.scenario_info) launch_cfg_lib.check_enable_ptm(self.args["enable_ptm"], self.scenario_info) diff --git a/misc/config_tools/library/scenario_cfg_lib.py b/misc/config_tools/library/scenario_cfg_lib.py index 9807f730c..d955929f3 100644 --- a/misc/config_tools/library/scenario_cfg_lib.py +++ b/misc/config_tools/library/scenario_cfg_lib.py @@ -293,10 +293,10 @@ def guest_flag_check(guest_flags, branch_tag, leaf_tag): ERR_LIST[key] = "Unknow guest flag" -def vm_cpu_affinity_check(config_file, id_cpus_per_vm_dic, item): +def vm_cpu_affinity_check(scenario_file, cpu_affinity): """ Check cpu number of per vm - :param item: vm pcpu_id item in xml + :param : vm cpu_affinity item in xml :return: error informations """ err_dic = {} @@ -307,37 +307,46 @@ def vm_cpu_affinity_check(config_file, id_cpus_per_vm_dic, item): if cpu_sharing == "SCHED_NOOP": cpu_sharing_enabled = False - cpu_affinity = common.get_leaf_tag_map(config_file, "cpu_affinity", "pcpu_id") - for vm_i in id_cpus_per_vm_dic.keys(): - for cpu in id_cpus_per_vm_dic[vm_i]: - if cpu is not None and cpu in use_cpus and not cpu_sharing_enabled: - key = "vm:id={},{}".format(vm_i, item) - err_dic[key] = "The same pcpu was configurated in /, but CPU sharing is disabled by 'SCHED_NOOP'. Please re-configurate them!" - return err_dic - else: - use_cpus.append(cpu) + # validate cpu_affinity config with scenario file + scenario_cpu_aff = common.get_leaf_tag_map(scenario_file, "cpu_affinity", "pcpu_id") + for vm_id, cpu_ids in cpu_affinity.items(): + for vm_cpu in cpu_ids: + if vm_cpu not in scenario_cpu_aff[vm_id]: + key = "vm:id={},{}".format(vm_id, 'pcpu_id') + err_dic[key] = "This pCPU is not included in this VM's allowed CPU pool. Please update your scenario file accordingly or remove it from this list." + + if err_dic: + return err_dic + + for vm_i,cpu in cpu_affinity.items(): + if cpu is not None and cpu in use_cpus and not cpu_sharing_enabled: + key = "vm:id={},{}".format(vm_i, 'pcpu_id') + err_dic[key] = "The same pCPU was configured in /, but CPU sharing is disabled by 'SCHED_NOOP'. Please enable CPU sharing or update your CPU affinity configuration." + return err_dic + else: + use_cpus.append(cpu) sos_vm_cpus = [] 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(): + if vm_i not in cpu_affinity.keys(): continue 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] + cpus = [x for x in cpu_affinity[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] + cpus = [x for x in cpu_affinity[vm_i] if not None] post_launch_cpus.extend(cpus) elif VM_DB[vm_type]['load_type'] == "SERVICE_VM": - cpus = [x for x in id_cpus_per_vm_dic[vm_i] if not None] + cpus = [x for x in cpu_affinity[vm_i] if not None] sos_vm_cpus.extend(cpus) # duplicate cpus assign the same VM check - cpus_vm_i = id_cpus_per_vm_dic[vm_i] + cpus_vm_i = cpu_affinity[vm_i] for cpu_id in cpus_vm_i: if cpus_vm_i.count(cpu_id) >= 2: - key = "vm:id={},{}".format(vm_i, item) + key = "vm:id={},{}".format(vm_i, 'pcpu_id') err_dic[key] = "VM should not use the same pcpu id:{}".format(cpu_id) return err_dic diff --git a/misc/config_tools/scenario_config/scenario_item.py b/misc/config_tools/scenario_config/scenario_item.py index 9886c91a2..ca23edacb 100644 --- a/misc/config_tools/scenario_config/scenario_item.py +++ b/misc/config_tools/scenario_config/scenario_item.py @@ -399,7 +399,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.vm_cpu_affinity_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) scenario_cfg_lib.vcpu_clos_check(self.cpus_per_vm, self.clos_per_vm, self.guest_flags, "clos", "vcpu_clos") self.mem_info.check_item()