mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-20 12:42:54 +00:00
acrn-dm: implement cpu_affinity command line argument
User has a chance to specify VCPU affinity through acrn-dm command line argument. Examples of the command line: 3 PCPUs: 1/2/3 --cpu_affinity 1-3 5 PCPUs: 2/3/6/7/8 --cpu_affinity 2,3,6-8 8 PCPUs: 2/3/6/7/9/10/11/12 --cpu_affinity 2,3,6-7,9,10-12 The specified pCPUs must be included in the guest VM's statically defined vm_config[].cpu_affinity_bitmap. Tracked-On: #4616 Signed-off-by: Zide Chen <zide.chen@intel.com>
This commit is contained in:
parent
3691e305c0
commit
71bdc27a0f
@ -164,6 +164,7 @@ usage(int code)
|
|||||||
#endif
|
#endif
|
||||||
" --vsbl: vsbl file path\n"
|
" --vsbl: vsbl file path\n"
|
||||||
" --ovmf: ovmf file path\n"
|
" --ovmf: ovmf file path\n"
|
||||||
|
" --pcpu_list: list of pCPUs assigned to this VM\n"
|
||||||
" --part_info: guest partition info file path\n"
|
" --part_info: guest partition info file path\n"
|
||||||
" --enable_trusty: enable trusty for guest\n"
|
" --enable_trusty: enable trusty for guest\n"
|
||||||
" --debugexit: enable debug exit function\n"
|
" --debugexit: enable debug exit function\n"
|
||||||
@ -718,6 +719,7 @@ sig_handler_term(int signo)
|
|||||||
enum {
|
enum {
|
||||||
CMD_OPT_VSBL = 1000,
|
CMD_OPT_VSBL = 1000,
|
||||||
CMD_OPT_OVMF,
|
CMD_OPT_OVMF,
|
||||||
|
CMD_OPT_PCPU_LIST,
|
||||||
CMD_OPT_PART_INFO,
|
CMD_OPT_PART_INFO,
|
||||||
CMD_OPT_TRUSTY_ENABLE,
|
CMD_OPT_TRUSTY_ENABLE,
|
||||||
CMD_OPT_VIRTIO_POLL_ENABLE,
|
CMD_OPT_VIRTIO_POLL_ENABLE,
|
||||||
@ -757,6 +759,7 @@ static struct option long_options[] = {
|
|||||||
#endif
|
#endif
|
||||||
{"vsbl", required_argument, 0, CMD_OPT_VSBL},
|
{"vsbl", required_argument, 0, CMD_OPT_VSBL},
|
||||||
{"ovmf", required_argument, 0, CMD_OPT_OVMF},
|
{"ovmf", required_argument, 0, CMD_OPT_OVMF},
|
||||||
|
{"pcpu_list", required_argument, 0, CMD_OPT_PCPU_LIST},
|
||||||
{"part_info", required_argument, 0, CMD_OPT_PART_INFO},
|
{"part_info", required_argument, 0, CMD_OPT_PART_INFO},
|
||||||
{"enable_trusty", no_argument, 0,
|
{"enable_trusty", no_argument, 0,
|
||||||
CMD_OPT_TRUSTY_ENABLE},
|
CMD_OPT_TRUSTY_ENABLE},
|
||||||
@ -874,6 +877,10 @@ main(int argc, char *argv[])
|
|||||||
errx(EX_USAGE, "invalid ovmf param %s", optarg);
|
errx(EX_USAGE, "invalid ovmf param %s", optarg);
|
||||||
skip_pci_mem64bar_workaround = true;
|
skip_pci_mem64bar_workaround = true;
|
||||||
break;
|
break;
|
||||||
|
case CMD_OPT_PCPU_LIST:
|
||||||
|
if (acrn_parse_pcpu_list(optarg) != 0)
|
||||||
|
errx(EX_USAGE, "invalid pcpu param %s", optarg);
|
||||||
|
break;
|
||||||
case CMD_OPT_PART_INFO:
|
case CMD_OPT_PART_INFO:
|
||||||
if (acrn_parse_guest_part_info(optarg) != 0) {
|
if (acrn_parse_guest_part_info(optarg) != 0) {
|
||||||
errx(EX_USAGE,
|
errx(EX_USAGE,
|
||||||
|
@ -85,6 +85,82 @@ check_api(int fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int devfd = -1;
|
static int devfd = -1;
|
||||||
|
static uint64_t cpu_affinity_bitmap = 0UL;
|
||||||
|
|
||||||
|
static void add_one_pcpu(int pcpu_id)
|
||||||
|
{
|
||||||
|
if (cpu_affinity_bitmap & (1UL << pcpu_id)) {
|
||||||
|
pr_err("%s: pcpu_id %d has been allocated to this VM.\n", __func__, pcpu_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu_affinity_bitmap |= (1UL << pcpu_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* example options:
|
||||||
|
* --pcpu_list 1,2,3
|
||||||
|
* --pcpu_list 1-3
|
||||||
|
* --pcpu_list 1,3,4-6
|
||||||
|
* --pcpu_list 1,3,4-6,9
|
||||||
|
*/
|
||||||
|
int acrn_parse_pcpu_list(char *opt)
|
||||||
|
{
|
||||||
|
char *str, *cp;
|
||||||
|
int pcpu_id;
|
||||||
|
int pcpu_start, pcpu_end;
|
||||||
|
|
||||||
|
cp = strdup(opt);
|
||||||
|
if (!cp) {
|
||||||
|
pr_err("%s: strdup returns NULL\n", __func__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (cp) {
|
||||||
|
str = strpbrk(cp, ",-");
|
||||||
|
|
||||||
|
/* no more entries delimited by ',' or '-' */
|
||||||
|
if (!str) {
|
||||||
|
if (!dm_strtoi(cp, NULL, 10, &pcpu_id)) {
|
||||||
|
add_one_pcpu(pcpu_id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*str == ',') {
|
||||||
|
/* after this, 'cp' points to the character after ',' */
|
||||||
|
str = strsep(&cp, ",");
|
||||||
|
|
||||||
|
/* parse the entry before ',' */
|
||||||
|
if (dm_strtoi(str, NULL, 10, &pcpu_id)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
add_one_pcpu(pcpu_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*str == '-') {
|
||||||
|
str = strsep(&cp, "-");
|
||||||
|
|
||||||
|
/* parse the entry before and after '-' respectively */
|
||||||
|
if (dm_strtoi(str, NULL, 10, &pcpu_start) || dm_strtoi(cp, NULL, 10, &pcpu_end)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pcpu_end <= pcpu_start) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; pcpu_start <= pcpu_end; pcpu_start++) {
|
||||||
|
add_one_pcpu(pcpu_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* skip the ',' after pcpu_end */
|
||||||
|
str = strsep(&cp, ",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct vmctx *
|
struct vmctx *
|
||||||
vm_create(const char *name, uint64_t req_buf, int *vcpu_num)
|
vm_create(const char *name, uint64_t req_buf, int *vcpu_num)
|
||||||
@ -150,6 +226,9 @@ vm_create(const char *name, uint64_t req_buf, int *vcpu_num)
|
|||||||
create_vm.vm_flag &= (~GUEST_FLAG_IO_COMPLETION_POLLING);
|
create_vm.vm_flag &= (~GUEST_FLAG_IO_COMPLETION_POLLING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* command line arguments specified CPU affinity could overwrite HV's static configuration */
|
||||||
|
create_vm.cpu_affinity = cpu_affinity_bitmap;
|
||||||
|
|
||||||
if (is_rtvm) {
|
if (is_rtvm) {
|
||||||
create_vm.vm_flag |= GUEST_FLAG_RT;
|
create_vm.vm_flag |= GUEST_FLAG_RT;
|
||||||
create_vm.vm_flag |= GUEST_FLAG_IO_COMPLETION_POLLING;
|
create_vm.vm_flag |= GUEST_FLAG_IO_COMPLETION_POLLING;
|
||||||
|
@ -134,6 +134,7 @@ int vm_set_ptdev_intx_info(struct vmctx *ctx, uint16_t virt_bdf,
|
|||||||
int vm_reset_ptdev_intx_info(struct vmctx *ctx, uint16_t virt_bdf,
|
int vm_reset_ptdev_intx_info(struct vmctx *ctx, uint16_t virt_bdf,
|
||||||
uint16_t phys_bdf, int virt_pin, bool pic_pin);
|
uint16_t phys_bdf, int virt_pin, bool pic_pin);
|
||||||
|
|
||||||
|
int acrn_parse_pcpu_list(char *arg);
|
||||||
int vm_create_vcpu(struct vmctx *ctx, uint16_t vcpu_id);
|
int vm_create_vcpu(struct vmctx *ctx, uint16_t vcpu_id);
|
||||||
int vm_set_vcpu_regs(struct vmctx *ctx, struct acrn_set_vcpu_regs *cpu_regs);
|
int vm_set_vcpu_regs(struct vmctx *ctx, struct acrn_set_vcpu_regs *cpu_regs);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user