acrn-config: parse cpu_affinity from launch config xmls

Parse cpu_affinity from launch config xmls and generate '--cpu_affinity' as
acrn-dm args.

Tracked-On: #4641
Signed-off-by: Wei Liu <weix.w.liu@intel.com>
Acked-by: Victor Sun <victor.sun@intel.com>
Acked-by: Terry Zou <terry.zou@intel.com>
This commit is contained in:
Wei Liu
2020-04-23 12:21:33 +08:00
committed by wenlingz
parent 8cbc6199b7
commit fb5c35d183
6 changed files with 70 additions and 59 deletions

View File

@@ -3,6 +3,7 @@
# SPDX-License-Identifier: BSD-3-Clause
#
import scenario_cfg_lib
import launch_cfg_lib
import common
import pt
@@ -85,10 +86,14 @@ def off_line_cpus(args, vmid, uos_type, config):
:param uos_type: the type of UOS
:param config: it is a file pointer to write offline cpu information
"""
cpus = ''
cpus = '..'.join(list(args["off_pcpus"][vmid]))
if not cpus.strip():
key = "launch script error:"
pcpu_id_list = get_cpu_affinity_list(args["cpu_affinity"], vmid)
if not pcpu_id_list:
sos_vmid = launch_cfg_lib.get_sos_vmid()
cpu_affinity = common.get_leaf_tag_map(common.SCENARIO_INFO_FILE, "cpu_affinity", "pcpu_id")
pcpu_id_list = get_cpu_affinity_list(cpu_affinity, sos_vmid+vmid)
if not pcpu_id_list:
key = "scenario config error"
launch_cfg_lib.ERR_LIST[key] = "No available cpu to offline and pass it to vm {}".format(vmid)
print('offline_path="/sys/class/vhm/acrn_vhm"', file=config)
@@ -100,7 +105,7 @@ def off_line_cpus(args, vmid, uos_type, config):
print('fi', file=config)
print("", file=config)
print("# offline pinned vCPUs from SOS before launch UOS", file=config)
print("for i in `ls -d /sys/devices/system/cpu/cpu[{}]`; do".format(cpus), file=config)
print("for i in `ls -d /sys/devices/system/cpu/cpu[{}]`; do".format('..'.join(pcpu_id_list)), file=config)
print(" online=`cat $i/online`", file=config)
print(' idx=`echo $i | tr -cd "[1-99]"`', file=config)
print(" echo cpu$idx online=$online", file=config)
@@ -397,7 +402,8 @@ def launch_end(names, args, virt_io, vmid, config):
print("", file=config)
i += 1
if args['cpu_sharing'][vmid] == "Disabled":
sos_vmid = launch_cfg_lib.get_sos_vmid()
if args['cpu_sharing'] == "SCHED_NOOP" or common.VM_TYPES[vmid+sos_vmid] == "POST_RT_VM":
off_line_cpus(args, vmid, uos_type, config)
uos_launch(names, args, virt_io, vmid, config)
@@ -506,6 +512,22 @@ def virtio_args_set(dm, virt_io, vmid, config):
launch_cfg_lib.virtual_dev_slot("virtio-console"),
virt_io['console'][vmid]), file=config)
def get_cpu_affinity_list(cpu_affinity, vmid):
pcpu_id_list = ''
for uos_id,cpus in cpu_affinity.items():
if vmid == uos_id:
pcpu_id_list = [id for id in list(cpu_affinity[uos_id]) if id != None]
return pcpu_id_list
def pcpu_arg_set(dm, vmid, config):
if dm['cpu_sharing'] == "SCHED_NOOP":
return
pcpu_id_list = get_cpu_affinity_list(dm["cpu_affinity"], vmid)
if pcpu_id_list:
print(" --cpu_affinity {} \\".format(','.join(pcpu_id_list)), file=config)
def dm_arg_set(names, sel, virt_io, dm, vmid, config):
@@ -582,6 +604,9 @@ def dm_arg_set(names, sel, virt_io, dm, vmid, config):
# vbootloader setting
vboot_arg_set(dm, vmid, config)
# pcpu-list args set
pcpu_arg_set(dm, vmid, config)
# redirect console
if dm['vuart0'][vmid] == "Enable":
print(" -s 1:0,lpc \\", file=config)

View File

@@ -7,6 +7,7 @@ import os
import sys
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'library'))
from launch_item import AvailablePthru, PthruSelected, VirtioDeviceSelect, AcrnDmArgs
import board_cfg_lib
import launch_cfg_lib
import com
import common
@@ -47,8 +48,8 @@ def get_launch_item_values(board_info):
launch_item_values["uos,vbootloader"] = launch_cfg_lib.BOOT_TYPE
launch_item_values['uos,vuart0'] = launch_cfg_lib.DM_VUART0
launch_item_values['uos,cpu_sharing'] = launch_cfg_lib.CPU_SHARING
launch_item_values['uos,poweroff_channel'] = launch_cfg_lib.PM_CHANNEL
launch_item_values["uos,cpu_affinity"] = board_cfg_lib.get_processor_info()
return launch_item_values

View File

@@ -6,6 +6,7 @@
import common
import board_cfg_lib
import launch_cfg_lib
import scenario_cfg_lib
class AcrnDmArgs:
args = {}
@@ -22,9 +23,9 @@ class AcrnDmArgs:
self.args["gvt_args"] = common.get_leaf_tag_map(self.launch_info, "gvt_args")
self.args["vbootloader"] = common.get_leaf_tag_map(self.launch_info, "vbootloader")
self.args["vuart0"] = common.get_leaf_tag_map(self.launch_info, "vuart0")
self.args["cpu_sharing"] = common.get_leaf_tag_map(self.launch_info, "cpu_sharing")
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["off_pcpus"] = common.get_leaf_tag_map(self.scenario_info, "cpu_affinity", "pcpu_id")
self.args["cpu_affinity"] = common.get_leaf_tag_map(self.launch_info, "cpu_affinity", "pcpu_id")
self.args["xhci"] = common.get_leaf_tag_map(self.launch_info, "usb_xhci")
def check_item(self):
@@ -34,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)
launch_cfg_lib.cpu_sharing_check(self.args["cpu_sharing"], "cpu_sharing")
err_dic = scenario_cfg_lib.cpus_per_vm_check(self.launch_info, self.args["cpu_affinity"], "pcpu_id")
launch_cfg_lib.ERR_LIST.update(err_dic)
class AvailablePthru():