QEMU/KVM: PIT interrupt reinjection control support (v2)
cover QEMU/KVM: PIT interrupt reinjection control support (v2)
Userspace support for KVM_PIT_REINJECT_CONTROL.
PATCH 1/2 libkvm: pit not reinject support
Signed-off-by Marcelo Tosatti <[email protected]>
libkvm/libkvm-x86.c +17 -0
@@ -75,6 +75,23 @@ int kvm_create_pit(kvm_context_t kvm)return 0 ; } +int kvm_pit_reinject_control (kvm_context_t kvm,int reinject) +{ +#ifdef KVM_CAP_PIT_REINJECT_CONTROL +int r; +struct kvm_pit_reinject_control control; + + control.reinject = reinject; + + r =ioctl (kvm->fd,KVM_CHECK_EXTENSION ,KVM_CAP_PIT_REINJECT_CONTROL ); +if (r >0 ) { + r =ioctl (kvm->vm_fd,KVM_PIT_REINJECT_CONTROL , &control); +return r; + } +#endif +return -ENOSYS ; +} +int kvm_arch_create (kvm_context_t kvm,unsigned long phys_mem_bytes,void **vm_mem) {
libkvm/libkvm.h +2 -0
@@ -646,6 +646,8 @@ int kvm_get_pit(kvm_context_t kvm, strucint kvm_set_pit (kvm_context_t kvm,struct kvm_pit_state *s);#endif +int kvm_pit_reinject_control (kvm_context_t kvm,int reinject); +#endif #ifdef KVM_CAP_VAPIC
Re: [patch 1/2] libkvm: pit not reinject support
Quoted 18 lines · Marcelo Tosatti
Signed-off-by Marcelo Tosatti <[email protected]>Index:
kvm-userspace.pit/libkvm/libkvm-x86.c
===================================================================libkvm/libkvm-x86.c +8
-0@@ -75,6 +75,23 @@ int kvm_create_pit(kvm_context_t kvm)return 0 ; } +int kvm_pit_reinject_control (kvm_context_t kvm,int reinject) +{ +#ifdef KVM_CAP_PIT_REINJECT_CONTROL +int r; +struct kvm_pit_reinject_control control; + + control.reinject = reinject; +
libkvm/libkvm-x86.c int kvm_create_pit(kvm_context_t kvm) · line 95
Quoted 10 lines
libkvm/libkvm-x86.c +9
-0+ r =ioctl (kvm->fd,KVM_CHECK_EXTENSION ,KVM_CAP_PIT_REINJECT_CONTROL ); +if (r >0 ) { + r =ioctl (kvm->vm_fd,KVM_PIT_REINJECT_CONTROL , &control); +return r; + } +#endif +return -ENOSYS ; +} +
I moved this to libkvm.c to avoid a link error on non-x86.
Signature · 1 line
error compiling committee.c: too many arguments to function
PATCH 2/2 QEMU/KVM: provide an option to disable in-kernel PIT int reinjection
In reply to Marcelo TosattiSigned-off-by Marcelo Tosatti <[email protected]>
qemu/qemu-kvm.c +7 -0
@@ -11,6 +11,7 @@int kvm_allowed =1 ;int kvm_irqchip =1 ;int kvm_pit =1 ; +int kvm_pit_reinject =1 ;int kvm_nested =0 ;#include <assert.h>
@@ -795,6 +796,12 @@ int kvm_qemu_create_context(void) r =kvm_arch_qemu_create_context ();if (r <0 )kvm_qemu_destroy (); +if (kvm_pit && !kvm_pit_reinject) { +if (kvm_pit_reinject_control (kvm_context,0 )) { +fprintf (stderr,"failure to disable in-kernel PIT reinjection\n" ); +return -1 ; + } + }#ifdef TARGET_I386 destroy_region_works =kvm_destroy_memory_region_works (kvm_context);#endif
qemu/vl.c +8 -0
@@ -4071,6 +4071,7 @@ static void help(int exitcode)#endif "-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC\n" "-no-kvm-pit disable KVM kernel mode PIT\n" +"-no-kvm-pit-reinjection disable KVM kernel mode PIT interrupt reinjection\n" "-enable-nesting enable support for running a VM inside the VM (AMD only)\n"#if defined(TARGET_I386 ) || defined(TARGET_X86_64 ) || defined(TARGET_IA64 ) || defined(__linux__)"-pcidevice host=bus:dev.func[,dma=none][,name=string]\n"
@@ -4202,6 +4203,7 @@ enum { QEMU_OPTION_no_kvm, QEMU_OPTION_no_kvm_irqchip, QEMU_OPTION_no_kvm_pit, + QEMU_OPTION_no_kvm_pit_reinjection, #if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__) QEMU_OPTION_pcidevice, #endif
@@ -4298,6 +4300,7 @@ static const QEMUOption qemu_options[] =#endif { "no-kvm-irqchip", 0, QEMU_OPTION_no_kvm_irqchip }, { "no-kvm-pit", 0, QEMU_OPTION_no_kvm_pit }, + { "no-kvm-pit-reinjection", 0, QEMU_OPTION_no_kvm_pit_reinjection }, { "enable-nesting", 0, QEMU_OPTION_enable_nesting }, #if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__) { "pcidevice", HAS_ARG, QEMU_OPTION_pcidevice },
@@ -5267,6 +5270,11 @@ int main(int argc, char **argv, char **e kvm_pit =0 ;break ; } +case QEMU_OPTION_no_kvm_pit_reinjection: { +extern int kvm_pit_reinject; + kvm_pit_reinject =0 ; +break ; + }case QEMU_OPTION_enable_nesting: { kvm_nested =1 ;break ;