In preparation to the patch which adds a hypercall for the guest vcpu to change states between: -> SCHED_FIFO. -> SCHED_NORMAL. Add controls to: 1) Allow control to which priority SCHED_FIFO state will be in place (in the host). 2) Enable/disable ability to use the hypercall, on a per-vcpu basis. Signed-off-by: Marcelo Tosatti --- arch/x86/include/asm/kvm_host.h | 4 ++++ arch/x86/include/uapi/asm/kvm.h | 5 +++++ arch/x86/kvm/x86.c | 29 +++++++++++++++++++++++++++++ include/uapi/linux/kvm.h | 3 +++ 4 files changed, 41 insertions(+) Index: kvm.fifopriohc-submit/arch/x86/include/asm/kvm_host.h =================================================================== --- kvm.fifopriohc-submit.orig/arch/x86/include/asm/kvm_host.h +++ kvm.fifopriohc-submit/arch/x86/include/asm/kvm_host.h @@ -688,6 +688,10 @@ struct kvm_vcpu_arch { /* GPA available (AMD only) */ bool gpa_available; + + /* Enable RT prio hypercall */ + bool enable_rt_prio_hc; + int rt_sched_priority; }; struct kvm_lpage_info { Index: kvm.fifopriohc-submit/arch/x86/kvm/x86.c =================================================================== --- kvm.fifopriohc-submit.orig/arch/x86/kvm/x86.c +++ kvm.fifopriohc-submit/arch/x86/kvm/x86.c @@ -2683,6 +2683,7 @@ int kvm_vm_ioctl_check_extension(struct case KVM_CAP_SET_BOOT_CPU_ID: case KVM_CAP_SPLIT_IRQCHIP: case KVM_CAP_IMMEDIATE_EXIT: + case KVM_CAP_VCPU_RT_PRIO_HC: r = 1; break; case KVM_CAP_ADJUST_CLOCK: @@ -3386,6 +3387,25 @@ static int kvm_set_guest_paused(struct k return 0; } +static int kvm_vcpu_ioctl_set_rt_prio_hc(struct kvm_vcpu *vcpu, + struct kvm_vcpu_rt_prio *rt_prio) +{ + if (rt_prio->enabled == 0) { + vcpu->arch.enable_rt_prio_hc = false; + return 0; + } + + if (rt_prio->sched_priority < 1 || + rt_prio->sched_priority > 99) + return -EINVAL; + + + vcpu->arch.enable_rt_prio_hc = true; + vcpu->arch.rt_sched_priority = rt_prio->sched_priority; + + return 0; +} + static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu, struct kvm_enable_cap *cap) { @@ -3682,6 +3702,15 @@ long kvm_arch_vcpu_ioctl(struct file *fi r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap); break; } + case KVM_SET_VCPU_RT_PRIO_HC: { + struct kvm_vcpu_rt_prio rt_prio; + + r = -EFAULT; + if (copy_from_user(&rt_prio, argp, sizeof(rt_prio))) + goto out; + r = kvm_vcpu_ioctl_set_rt_prio_hc(vcpu, &rt_prio); + break; + } default: r = -EINVAL; } Index: kvm.fifopriohc-submit/include/uapi/linux/kvm.h =================================================================== --- kvm.fifopriohc-submit.orig/include/uapi/linux/kvm.h +++ kvm.fifopriohc-submit/include/uapi/linux/kvm.h @@ -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) Index: kvm.fifopriohc-submit/arch/x86/include/uapi/asm/kvm.h =================================================================== --- kvm.fifopriohc-submit.orig/arch/x86/include/uapi/asm/kvm.h +++ kvm.fifopriohc-submit/arch/x86/include/uapi/asm/kvm.h @@ -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 { };