HV: CAT: support config CAT from acrn_vm_config

When CAT is supported, UOS can setup acrn_vm_config.clos, to use CAT
feature. Eg.,

struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = {
    {
        .guest_flags |= CLOS_REQUIRED,
        .clos = 1,
    },
};

sanitize_vm_config() will check if CAT is supported and
vm_configs.clos is valid.

Tracked-On: #2462
Signed-off-by: Tao Yuhong <yuhong.tao@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
yuhong.tao@intel.com 2019-01-30 19:08:19 +08:00 committed by Eddie Dong
parent 43ee5590a4
commit 3b2784ec1b
7 changed files with 48 additions and 0 deletions

View File

@ -54,3 +54,19 @@ int32_t init_cat_cap_info(void)
return ret; return ret;
} }
void setup_clos(uint16_t pcpu_id)
{
uint16_t i;
uint32_t msr_index;
uint64_t val;
if (cat_cap_info.enabled) {
for (i = 0U; i < platform_clos_num; i++) {
msr_index = platform_clos_array[i].msr_index;
val = (uint64_t)platform_clos_array[i].clos_mask;
msr_write_pcpu(msr_index, val, pcpu_id);
}
}
}

View File

@ -230,6 +230,8 @@ void init_cpu_post(uint16_t pcpu_id)
/* Wait for boot processor to signal all secondary cores to continue */ /* Wait for boot processor to signal all secondary cores to continue */
wait_sync_change(&pcpu_sync, 0UL); wait_sync_change(&pcpu_sync, 0UL);
} }
setup_clos(pcpu_id);
} }
static uint16_t get_cpu_id_from_lapic_id(uint32_t lapic_id) static uint16_t get_cpu_id_from_lapic_id(uint32_t lapic_id)

View File

@ -18,6 +18,7 @@
#include <vmcs.h> #include <vmcs.h>
#include <mmu.h> #include <mmu.h>
#include <sprintf.h> #include <sprintf.h>
#include <cat.h>
inline uint64_t vcpu_get_gpreg(const struct acrn_vcpu *vcpu, uint32_t reg) inline uint64_t vcpu_get_gpreg(const struct acrn_vcpu *vcpu, uint32_t reg)
{ {
@ -678,6 +679,8 @@ int32_t prepare_vcpu(struct acrn_vm *vm, uint16_t pcpu_id)
int32_t ret = 0; int32_t ret = 0;
struct acrn_vcpu *vcpu = NULL; struct acrn_vcpu *vcpu = NULL;
char thread_name[16]; char thread_name[16];
uint64_t orig_val, final_val;
struct acrn_vm_config *conf;
ret = create_vcpu(pcpu_id, vm, &vcpu); ret = create_vcpu(pcpu_id, vm, &vcpu);
if (ret != 0) { if (ret != 0) {
@ -686,6 +689,14 @@ int32_t prepare_vcpu(struct acrn_vm *vm, uint16_t pcpu_id)
set_pcpu_used(pcpu_id); set_pcpu_used(pcpu_id);
/* Update CLOS for this CPU */
if (cat_cap_info.enabled) {
conf = get_vm_config(vm->vm_id);
orig_val = msr_read(MSR_IA32_PQR_ASSOC);
final_val = (orig_val & 0xffffffffUL) | (((uint64_t)conf->clos) << 32UL);
msr_write_pcpu(MSR_IA32_PQR_ASSOC, final_val, pcpu_id);
}
INIT_LIST_HEAD(&vcpu->sched_obj.run_list); INIT_LIST_HEAD(&vcpu->sched_obj.run_list);
snprintf(thread_name, 16U, "vm%hu:vcpu%hu", vm->vm_id, vcpu->vcpu_id); snprintf(thread_name, 16U, "vm%hu:vcpu%hu", vm->vm_id, vcpu->vcpu_id);
(void)strncpy_s(vcpu->sched_obj.name, 16U, thread_name, 16U); (void)strncpy_s(vcpu->sched_obj.name, 16U, thread_name, 16U);

View File

@ -22,6 +22,7 @@
#include <pgtable.h> #include <pgtable.h>
#include <mmu.h> #include <mmu.h>
#include <logmsg.h> #include <logmsg.h>
#include <cat.h>
vm_sw_loader_t vm_sw_loader; vm_sw_loader_t vm_sw_loader;
@ -622,6 +623,21 @@ int32_t sanitize_vm_config(void)
/* Nothing to do for a UNDEFINED_VM, break directly. */ /* Nothing to do for a UNDEFINED_VM, break directly. */
break; break;
} }
if ((vm_config->guest_flags & CLOS_REQUIRED) != 0U) {
if (cat_cap_info.support) {
if (vm_config->clos > cat_cap_info.clos_max) {
pr_err("%s CLOS exceed MAX CLOS\n", __func__);
ret = -EINVAL;
} else {
cat_cap_info.enabled = true;
}
} else {
pr_err("%s set CLOS but CAT is not supported\n", __func__);
ret = -EINVAL;
}
}
if (ret != 0) { if (ret != 0) {
break; break;
} }

View File

@ -19,6 +19,7 @@ struct cat_hw_info {
}; };
extern struct cat_hw_info cat_cap_info; extern struct cat_hw_info cat_cap_info;
void setup_clos(uint16_t pcpu_id);
#define CAT_RESID_L3 1U #define CAT_RESID_L3 1U
#define CAT_RESID_L2 2U #define CAT_RESID_L2 2U

View File

@ -209,6 +209,7 @@ struct acrn_vm_config {
bool vm_vuart; bool vm_vuart;
#endif #endif
uint16_t clos; /* if guest_flags has CAT_ENABLED, then VM use this CLOS */
} __aligned(8); } __aligned(8);
/* /*

View File

@ -50,6 +50,7 @@
#define SECURE_WORLD_ENABLED (1UL << 0U) /* Whether secure world is enabled */ #define SECURE_WORLD_ENABLED (1UL << 0U) /* Whether secure world is enabled */
#define LAPIC_PASSTHROUGH (1UL << 1U) /* Whether LAPIC is passed through */ #define LAPIC_PASSTHROUGH (1UL << 1U) /* Whether LAPIC is passed through */
#define IO_COMPLETION_POLLING (1UL << 2U) /* Whether need hypervisor poll IO completion */ #define IO_COMPLETION_POLLING (1UL << 2U) /* Whether need hypervisor poll IO completion */
#define CLOS_REQUIRED (1UL << 3U) /* Whether CLOS is required */
/** /**
* @brief Hypercall * @brief Hypercall