support RT_PRIO_HC hypercall
cover support RT_PRIO_HC hypercall
Add the following CPU options:
allow-rt-prio-hc: allow guest to execute hypercall to change vcpu thread priority.
rt-prio: SCHED_FIFO priority to be used when that hypercall is invoked.
Signed-off-by Marcelo Tosatti <[email protected]>
PATCH 1/2 qemu: sync linux-headers with KVM
Signed-off-by Marcelo Tosatti <[email protected]>
linux-headers/linux/kvm.h +3 -0
@@ -929,6 +929,7 @@ struct kvm_ppc_resize_hpt {#define KVM_CAP_PPC_SMT_POSSIBLE 147#define KVM_CAP_HYPERV_SYNIC2 148#define KVM_CAP_HYPERV_VP_INDEX 149 +#define KVM_CAP_VCPU_RT_PRIO_HC 150#ifdef KVM_CAP_IRQ_ROUTING
@@ -1355,6 +1356,8 @@ struct kvm_s390_ucas_mapping {/* Available with KVM_CAP_S390_CMMA_MIGRATION */ #define KVM_S390_GET_CMMA_BITS _IOWR(KVMIO, 0xb8, struct kvm_s390_cmma_log)#define KVM_S390_SET_CMMA_BITS _IOW(KVMIO, 0xb9, struct kvm_s390_cmma_log) +/* Available with KVM_CAP_VCPU_RT_PRIO_HC */ +#define KVM_SET_VCPU_RT_PRIO_HC _IOW(KVMIO, 0xba, struct kvm_vcpu_rt_prio)#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0)#define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1)
linux-headers/asm-x86/kvm.h +5 -0
@@ -353,6 +353,11 @@ struct kvm_xcrs {__u64 padding[16 ]; }; +struct kvm_vcpu_rt_prio { +__u32 enabled; +__u32 sched_priority; +}; +/* definition of registers in kvm_run */ struct kvm_sync_regs { };
linux-headers/linux/kvm_para.h +2 -0
@@ -15,6 +15,7 @@#define KVM_E2BIG E2BIG#define KVM_EPERM EPERM#define KVM_EOPNOTSUPP 95 +#define KVM_EINVAL EINVAL#define KVM_HC_VAPIC_POLL_IRQ 1#define KVM_HC_MMU_OP 2
@@ -25,6 +26,7 @@#define KVM_HC_MIPS_EXIT_VM 7#define KVM_HC_MIPS_CONSOLE_OUTPUT 8#define KVM_HC_CLOCK_PAIRING 9 +#define KVM_HC_RT_PRIO 10/* * hypercalls use architecture specific
PATCH 2/2 qemu: kvm: support RT_PRIO_HC hypercall
In reply to Marcelo TosattiAdd the following CPU options:
allow-rt-prio-hc: allow guest to execute hypercall to change vcpu thread priority.
rt-prio: SCHED_FIFO priority to be used when that hypercall is invoked.
See kernel patchset for details about this hypercall.
Signed-off-by Marcelo Tosatti <[email protected]>
--- target/i386/cpu.c | 2 ++ target/i386/cpu.h | 4 ++++ target/i386/kvm.c | 23 +++++++++++++++++++++++ 3 files changed, 29 insertions(+)
target/i386/cpu.c +2 -0
@@ -4106,6 +4106,8 @@ static Property x86_cpu_properties[] = { false),DEFINE_PROP_BOOL ("vmware-cpuid-freq" ,X86CPU , vmware_cpuid_freq, true),DEFINE_PROP_BOOL ("tcg-cpuid" ,X86CPU , expose_tcg, true), +DEFINE_PROP_BOOL ("allow-rt-prio-hc" ,X86CPU , allow_rt_prio_hc, false), +DEFINE_PROP_UINT32 ("rt-prio" ,X86CPU , rt_prio_hc,0 ), DEFINE_PROP_END_OF_LIST() };
target/i386/cpu.h +4 -0
@@ -1215,6 +1215,7 @@ struct X86CPU {bool hyperv_runtime;bool hyperv_synic;bool hyperv_stimer; +bool allow_rt_prio_hc;bool check_cpuid;bool enforce_cpuid;bool expose_kvm;
@@ -1270,6 +1271,9 @@ struct X86CPU {/* Number of physical address bits supported */ uint32_t phys_bits; +/* RT priority of VCPU thread, when hypercall is invoked by guest */ +uint32_t rt_prio_hc; +/* in order to simplify APIC support, we leave this pointer to the user */ struct DeviceState *apic_state;
target/i386/kvm.c +28 -0
@@ -673,6 +673,28 @@ static int hyperv_handle_properties(CPUSstatic Error *invtsc_mig_blocker; +static int enable_allow_rt_prio_hc (CPUState *cs) +{ +int ret; +struct kvm_vcpu_rt_prio rt_prio; +X86CPU *cpu =X86_CPU (cs); + +if (!kvm_check_extension (kvm_state,KVM_CAP_VCPU_RT_PRIO_HC )) { +fprintf (stderr,"RT prio hypercall not supported by kernel\n" ); +return -ENOSYS ; + } + + rt_prio.sched_priority = cpu->rt_prio_hc; + rt_prio.enabled =1 ; + + ret =kvm_vcpu_ioctl (cs,KVM_ENABLE_VCPU_RT_PRIO_HC , &rt_prio); +if (ret) { +fprintf (stderr,"RT prio hypercall failed, ret=%d\n" , ret); + } + +return ret; +} +#define KVM_MAX_CPUID_ENTRIES 100int kvm_arch_init_vcpu (CPUState *cs)
@@ -758,6 +780,12 @@ int kvm_arch_init_vcpu(CPUState *cs) has_msr_hv_hypercall = true; } +if (cpu->allow_rt_prio_hc) { +if (enable_allow_rt_prio_hc (cs)) { +abort (); + } + } +if (cpu->expose_kvm) {memcpy (signature,"KVMKVMKVM\0\0\0" ,12 ); c = &cpuid_data.entries[cpuid_i++];