Re: [Qemu-devel] [PATCH v3 9/9] kvm/x86: Hyper-V kvm exit
On Tue, Nov 03, 2015 at 03:51:16PM +0100, Paolo Bonzini wrote: > > > On 03/11/2015 15:36, Andrey Smetanin wrote: > >> > >> > >> if I run a patched QEMU but I *do not* enable the synthetic interrupt > >> controller. I can fix it by wrapping the calls to synic_exit with "if > >> (!host)", but I haven't checked yet the source---so that may not be the > >> proper fix. Sorry for not having looked more in detail. > >> > > Could you please specify test case(kvm unit tests ?) and kernel/qemu(if > > it's not standard)? > > It happens just by starting QEMU. > > Kernel: kvm/queue > + kvm/irqchip: kvm_arch_irq_routing_update renaming split > + kvm/x86: split ioapic-handled and EOI exit bitmaps > + kvm/x86: Hyper-V synthetic interrupt controller > + kvm/x86: Hyper-V kvm exit > > QEMU: 3a958f559ecd > + standard-headers/x86: add Hyper-V SynIC constants > + target-i386/kvm: Hyper-V SynIC MSR's support > + linux-headers/kvm: add Hyper-V SynIC irq routing type and struct > + kvm: Hyper-V SynIC irq routing support > + linux-headers/kvm: KVM_EXIT_HYPERV type and struct > + target-i386/hyperv: Hyper-V SynIC SINT routing and vCPU exit > + hw/misc: Hyper-V test device 'hyperv-testdev' > > Can be reproduced just with > "../qemu/+build/x86_64-softmmu/qemu-system-x86_64 --enable-kvm -cpu > kvm64 -display none". Thanks! We've figured it out: qemu initializes the MSRs if has_msr_hv_synic is set, which depends only on whether the kernel supports the MSRs and ignores the cpu property. OTOH setting those MSRs (on the host side) triggers a vcpu exit which checks the cpu property and aborts if it's unset. Voila. This way we also discovered that no error was triggered when the cpu property was set but the kernel didn't support it (and this problem was also present in other hyperv-related features). The solution appears to be to bail out when a hyperv property is requested but the host doesn't support it, and then check for the property only when deciding if the relevant actions need to be taken. Protecting vcpu exits with !host in the kernel seems to make sense, too. We're in progress of preparing the updated patches. Thanks, Roman. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 9/9] kvm/x86: Hyper-V kvm exit
On 11/03/2015 05:51 PM, Paolo Bonzini wrote: On 03/11/2015 15:36, Andrey Smetanin wrote: if I run a patched QEMU but I *do not* enable the synthetic interrupt controller. I can fix it by wrapping the calls to synic_exit with "if (!host)", but I haven't checked yet the source---so that may not be the proper fix. Sorry for not having looked more in detail. Could you please specify test case(kvm unit tests ?) and kernel/qemu(if it's not standard)? It happens just by starting QEMU. Kernel: kvm/queue + kvm/irqchip: kvm_arch_irq_routing_update renaming split + kvm/x86: split ioapic-handled and EOI exit bitmaps + kvm/x86: Hyper-V synthetic interrupt controller + kvm/x86: Hyper-V kvm exit QEMU: 3a958f559ecd + standard-headers/x86: add Hyper-V SynIC constants + target-i386/kvm: Hyper-V SynIC MSR's support + linux-headers/kvm: add Hyper-V SynIC irq routing type and struct + kvm: Hyper-V SynIC irq routing support + linux-headers/kvm: KVM_EXIT_HYPERV type and struct + target-i386/hyperv: Hyper-V SynIC SINT routing and vCPU exit + hw/misc: Hyper-V test device 'hyperv-testdev' Can be reproduced just with "../qemu/+build/x86_64-softmmu/qemu-system-x86_64 --enable-kvm -cpu kvm64 -display none". Thanks! We probably found root case - qemu reads/writes Hyper-V SynIC msrs just by check SynIC MSR's support in kernel. So KVM synic exits into userspace(at SynIC MSR's writes), while userspace Hyper-V SynIC handler doesn't expect this exit(cpu 'hv-synic' option is not set), so handler returns -1 and qemu exits. Paolo -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 9/9] kvm/x86: Hyper-V kvm exit
On 03/11/2015 15:36, Andrey Smetanin wrote: >> >> >> if I run a patched QEMU but I *do not* enable the synthetic interrupt >> controller. I can fix it by wrapping the calls to synic_exit with "if >> (!host)", but I haven't checked yet the source---so that may not be the >> proper fix. Sorry for not having looked more in detail. >> > Could you please specify test case(kvm unit tests ?) and kernel/qemu(if > it's not standard)? It happens just by starting QEMU. Kernel: kvm/queue + kvm/irqchip: kvm_arch_irq_routing_update renaming split + kvm/x86: split ioapic-handled and EOI exit bitmaps + kvm/x86: Hyper-V synthetic interrupt controller + kvm/x86: Hyper-V kvm exit QEMU: 3a958f559ecd + standard-headers/x86: add Hyper-V SynIC constants + target-i386/kvm: Hyper-V SynIC MSR's support + linux-headers/kvm: add Hyper-V SynIC irq routing type and struct + kvm: Hyper-V SynIC irq routing support + linux-headers/kvm: KVM_EXIT_HYPERV type and struct + target-i386/hyperv: Hyper-V SynIC SINT routing and vCPU exit + hw/misc: Hyper-V test device 'hyperv-testdev' Can be reproduced just with "../qemu/+build/x86_64-softmmu/qemu-system-x86_64 --enable-kvm -cpu kvm64 -display none". Paolo -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 9/9] kvm/x86: Hyper-V kvm exit
On 11/03/2015 04:28 PM, Paolo Bonzini wrote: On 22/10/2015 18:10, Andrey Smetanin wrote: A new vcpu exit is introduced to notify the userspace of the changes in Hyper-V SynIC configuration triggered by guest writing to the corresponding MSRs. Changes v3: * added KVM_EXIT_HYPERV types and structs notes into docs Signed-off-by: Andrey Smetanin Reviewed-by: Roman Kagan Signed-off-by: Denis V. Lunev CC: Vitaly Kuznetsov CC: "K. Y. Srinivasan" CC: Gleb Natapov CC: Paolo Bonzini CC: Roman Kagan --- Documentation/virtual/kvm/api.txt | 22 ++ arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/hyperv.c | 17 + arch/x86/kvm/x86.c| 6 ++ include/linux/kvm_host.h | 1 + include/uapi/linux/kvm.h | 17 + 6 files changed, 64 insertions(+) diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 8710418..a6858eb 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -3337,6 +3337,28 @@ the userspace IOAPIC should process the EOI and retrigger the interrupt if it is still asserted. Vector is the LAPIC interrupt vector for which the EOI was received. + struct kvm_hyperv_exit { +#define KVM_EXIT_HYPERV_SYNIC 1 + __u32 type; + union { + struct { + __u32 msr; + __u64 control; + __u64 evt_page; + __u64 msg_page; + } synic; + } u; + }; + /* KVM_EXIT_HYPERV */ +struct kvm_hyperv_exit hyperv; +Indicates that the VCPU exits into userspace to process some tasks +related to Hyper-V emulation. +Valid values for 'type' are: + KVM_EXIT_HYPERV_SYNIC -- synchronously notify user-space about +Hyper-V SynIC state change. Notification is used to remap SynIC +event/message pages and to enable/disable SynIC messages/events processing +in userspace. + /* Fix the size of the union. */ char padding[256]; }; diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 8434f88..54c90d3 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -392,6 +392,7 @@ struct kvm_vcpu_hv { u64 hv_vapic; s64 runtime_offset; struct kvm_vcpu_hv_synic synic; + struct kvm_hyperv_exit exit; }; struct kvm_vcpu_arch { diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c index 8ff71f3..9443920 100644 --- a/arch/x86/kvm/hyperv.c +++ b/arch/x86/kvm/hyperv.c @@ -129,6 +129,20 @@ static void kvm_hv_notify_acked_sint(struct kvm_vcpu *vcpu, u32 sint) srcu_read_unlock(&kvm->irq_srcu, idx); } +static void synic_exit(struct kvm_vcpu_hv_synic *synic, u32 msr) +{ + struct kvm_vcpu *vcpu = synic_to_vcpu(synic); + struct kvm_vcpu_hv *hv_vcpu = &vcpu->arch.hyperv; + + hv_vcpu->exit.type = KVM_EXIT_HYPERV_SYNIC; + hv_vcpu->exit.u.synic.msr = msr; + hv_vcpu->exit.u.synic.control = synic->control; + hv_vcpu->exit.u.synic.evt_page = synic->evt_page; + hv_vcpu->exit.u.synic.msg_page = synic->msg_page; + + kvm_make_request(KVM_REQ_HV_EXIT, vcpu); +} + static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, u32 msr, u64 data, bool host) { @@ -141,6 +155,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, switch (msr) { case HV_X64_MSR_SCONTROL: synic->control = data; + synic_exit(synic, msr); Another note. I am getting: EAX= EBX= ECX= EDX=0663 ESI= EDI= EBP= ESP= EIP=fff0 EFL=0002 [---] CPL=0 II=0 A20=1 SMM=0 HLT=0 ES = 9300 CS =f000 9b00 SS = 9300 DS = 9300 FS = 9300 GS = 9300 LDT= 8200 TR = 8b00 GDT= IDT= CR0=6010 CR2= CR3= CR4= DR0= DR1= DR2= DR3= DR6=0ff0 DR7=0400 EFER= Code=90 90 90 90 eb c3 90 90 90 90 90 90 00 00 00 00 56 54 46 00 <90> 90 eb ac 90 90 90 90 90 90 90 90 90 90 90 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 if I run a patched QEMU but I *do not* enable the synthetic interrupt controller. I can fix it by wrapping the calls to synic_exit with "if (!host)", but I haven't checked yet the source---so that may not be the proper fix. Sorry for not having looked more in detail. Could you please spe
Re: [PATCH v3 9/9] kvm/x86: Hyper-V kvm exit
On 11/03/2015 04:28 PM, Paolo Bonzini wrote: On 22/10/2015 18:10, Andrey Smetanin wrote: A new vcpu exit is introduced to notify the userspace of the changes in Hyper-V SynIC configuration triggered by guest writing to the corresponding MSRs. Changes v3: * added KVM_EXIT_HYPERV types and structs notes into docs Signed-off-by: Andrey Smetanin Reviewed-by: Roman Kagan Signed-off-by: Denis V. Lunev CC: Vitaly Kuznetsov CC: "K. Y. Srinivasan" CC: Gleb Natapov CC: Paolo Bonzini CC: Roman Kagan --- Documentation/virtual/kvm/api.txt | 22 ++ arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/hyperv.c | 17 + arch/x86/kvm/x86.c| 6 ++ include/linux/kvm_host.h | 1 + include/uapi/linux/kvm.h | 17 + 6 files changed, 64 insertions(+) diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 8710418..a6858eb 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -3337,6 +3337,28 @@ the userspace IOAPIC should process the EOI and retrigger the interrupt if it is still asserted. Vector is the LAPIC interrupt vector for which the EOI was received. + struct kvm_hyperv_exit { +#define KVM_EXIT_HYPERV_SYNIC 1 + __u32 type; + union { + struct { + __u32 msr; + __u64 control; + __u64 evt_page; + __u64 msg_page; + } synic; + } u; + }; + /* KVM_EXIT_HYPERV */ +struct kvm_hyperv_exit hyperv; +Indicates that the VCPU exits into userspace to process some tasks +related to Hyper-V emulation. +Valid values for 'type' are: + KVM_EXIT_HYPERV_SYNIC -- synchronously notify user-space about +Hyper-V SynIC state change. Notification is used to remap SynIC +event/message pages and to enable/disable SynIC messages/events processing +in userspace. + /* Fix the size of the union. */ char padding[256]; }; diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 8434f88..54c90d3 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -392,6 +392,7 @@ struct kvm_vcpu_hv { u64 hv_vapic; s64 runtime_offset; struct kvm_vcpu_hv_synic synic; + struct kvm_hyperv_exit exit; }; struct kvm_vcpu_arch { diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c index 8ff71f3..9443920 100644 --- a/arch/x86/kvm/hyperv.c +++ b/arch/x86/kvm/hyperv.c @@ -129,6 +129,20 @@ static void kvm_hv_notify_acked_sint(struct kvm_vcpu *vcpu, u32 sint) srcu_read_unlock(&kvm->irq_srcu, idx); } +static void synic_exit(struct kvm_vcpu_hv_synic *synic, u32 msr) +{ + struct kvm_vcpu *vcpu = synic_to_vcpu(synic); + struct kvm_vcpu_hv *hv_vcpu = &vcpu->arch.hyperv; + + hv_vcpu->exit.type = KVM_EXIT_HYPERV_SYNIC; + hv_vcpu->exit.u.synic.msr = msr; + hv_vcpu->exit.u.synic.control = synic->control; + hv_vcpu->exit.u.synic.evt_page = synic->evt_page; + hv_vcpu->exit.u.synic.msg_page = synic->msg_page; + + kvm_make_request(KVM_REQ_HV_EXIT, vcpu); +} + static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, u32 msr, u64 data, bool host) { @@ -141,6 +155,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, switch (msr) { case HV_X64_MSR_SCONTROL: synic->control = data; + synic_exit(synic, msr); Another note. I am getting: EAX= EBX= ECX= EDX=0663 ESI= EDI= EBP= ESP= EIP=fff0 EFL=0002 [---] CPL=0 II=0 A20=1 SMM=0 HLT=0 ES = 9300 CS =f000 9b00 SS = 9300 DS = 9300 FS = 9300 GS = 9300 LDT= 8200 TR = 8b00 GDT= IDT= CR0=6010 CR2= CR3= CR4= DR0= DR1= DR2= DR3= DR6=0ff0 DR7=0400 EFER= Code=90 90 90 90 eb c3 90 90 90 90 90 90 00 00 00 00 56 54 46 00 <90> 90 eb ac 90 90 90 90 90 90 90 90 90 90 90 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 if I run a patched QEMU but I *do not* enable the synthetic interrupt controller. I can fix it by wrapping the calls to synic_exit with "if (!host)", but I haven't checked yet the source---so that may not be the proper fix. Sorry for not having looked more in detail. Paolo Thank you, w
Re: [PATCH v3 9/9] kvm/x86: Hyper-V kvm exit
On 22/10/2015 18:10, Andrey Smetanin wrote: > A new vcpu exit is introduced to notify the userspace of the > changes in Hyper-V SynIC configuration triggered by guest writing to the > corresponding MSRs. > > Changes v3: > * added KVM_EXIT_HYPERV types and structs notes into docs > > Signed-off-by: Andrey Smetanin > Reviewed-by: Roman Kagan > Signed-off-by: Denis V. Lunev > CC: Vitaly Kuznetsov > CC: "K. Y. Srinivasan" > CC: Gleb Natapov > CC: Paolo Bonzini > CC: Roman Kagan > > --- > Documentation/virtual/kvm/api.txt | 22 ++ > arch/x86/include/asm/kvm_host.h | 1 + > arch/x86/kvm/hyperv.c | 17 + > arch/x86/kvm/x86.c| 6 ++ > include/linux/kvm_host.h | 1 + > include/uapi/linux/kvm.h | 17 + > 6 files changed, 64 insertions(+) > > diff --git a/Documentation/virtual/kvm/api.txt > b/Documentation/virtual/kvm/api.txt > index 8710418..a6858eb 100644 > --- a/Documentation/virtual/kvm/api.txt > +++ b/Documentation/virtual/kvm/api.txt > @@ -3337,6 +3337,28 @@ the userspace IOAPIC should process the EOI and > retrigger the interrupt if > it is still asserted. Vector is the LAPIC interrupt vector for which the > EOI was received. > > + struct kvm_hyperv_exit { > +#define KVM_EXIT_HYPERV_SYNIC 1 > + __u32 type; > + union { > + struct { > + __u32 msr; > + __u64 control; > + __u64 evt_page; > + __u64 msg_page; > + } synic; > + } u; > + }; > + /* KVM_EXIT_HYPERV */ > +struct kvm_hyperv_exit hyperv; > +Indicates that the VCPU exits into userspace to process some tasks > +related to Hyper-V emulation. > +Valid values for 'type' are: > + KVM_EXIT_HYPERV_SYNIC -- synchronously notify user-space about > +Hyper-V SynIC state change. Notification is used to remap SynIC > +event/message pages and to enable/disable SynIC messages/events processing > +in userspace. > + > /* Fix the size of the union. */ > char padding[256]; > }; > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 8434f88..54c90d3 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -392,6 +392,7 @@ struct kvm_vcpu_hv { > u64 hv_vapic; > s64 runtime_offset; > struct kvm_vcpu_hv_synic synic; > + struct kvm_hyperv_exit exit; > }; > > struct kvm_vcpu_arch { > diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c > index 8ff71f3..9443920 100644 > --- a/arch/x86/kvm/hyperv.c > +++ b/arch/x86/kvm/hyperv.c > @@ -129,6 +129,20 @@ static void kvm_hv_notify_acked_sint(struct kvm_vcpu > *vcpu, u32 sint) > srcu_read_unlock(&kvm->irq_srcu, idx); > } > > +static void synic_exit(struct kvm_vcpu_hv_synic *synic, u32 msr) > +{ > + struct kvm_vcpu *vcpu = synic_to_vcpu(synic); > + struct kvm_vcpu_hv *hv_vcpu = &vcpu->arch.hyperv; > + > + hv_vcpu->exit.type = KVM_EXIT_HYPERV_SYNIC; > + hv_vcpu->exit.u.synic.msr = msr; > + hv_vcpu->exit.u.synic.control = synic->control; > + hv_vcpu->exit.u.synic.evt_page = synic->evt_page; > + hv_vcpu->exit.u.synic.msg_page = synic->msg_page; > + > + kvm_make_request(KVM_REQ_HV_EXIT, vcpu); > +} > + > static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, >u32 msr, u64 data, bool host) > { > @@ -141,6 +155,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, > switch (msr) { > case HV_X64_MSR_SCONTROL: > synic->control = data; > + synic_exit(synic, msr); Another note. I am getting: EAX= EBX= ECX= EDX=0663 ESI= EDI= EBP= ESP= EIP=fff0 EFL=0002 [---] CPL=0 II=0 A20=1 SMM=0 HLT=0 ES = 9300 CS =f000 9b00 SS = 9300 DS = 9300 FS = 9300 GS = 9300 LDT= 8200 TR = 8b00 GDT= IDT= CR0=6010 CR2= CR3= CR4= DR0= DR1= DR2= DR3= DR6=0ff0 DR7=0400 EFER= Code=90 90 90 90 eb c3 90 90 90 90 90 90 00 00 00 00 56 54 46 00 <90> 90 eb ac 90 90 90 90 90 90 90 90 90 90 90 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 if I run a patched QEMU but I *do not* enable the synthetic interrupt controller. I can fix it by wrapping the calls to synic_exit with "if (!host)", but I haven't checked yet the source---so that may not be the pr
Re: [PATCH v3 9/9] kvm/x86: Hyper-V kvm exit
On 10/22/2015 07:34 PM, Paolo Bonzini wrote: On 22/10/2015 18:10, Andrey Smetanin wrote: A new vcpu exit is introduced to notify the userspace of the changes in Hyper-V SynIC configuration triggered by guest writing to the corresponding MSRs. Changes v3: * added KVM_EXIT_HYPERV types and structs notes into docs Thanks. The changes look good. I look forward to the unit tests so I can merge it. Paolo sent. Den -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v3 9/9] kvm/x86: Hyper-V kvm exit
A new vcpu exit is introduced to notify the userspace of the changes in Hyper-V SynIC configuration triggered by guest writing to the corresponding MSRs. Changes v3: * added KVM_EXIT_HYPERV types and structs notes into docs Signed-off-by: Andrey Smetanin Reviewed-by: Roman Kagan Signed-off-by: Denis V. Lunev CC: Vitaly Kuznetsov CC: "K. Y. Srinivasan" CC: Gleb Natapov CC: Paolo Bonzini CC: Roman Kagan --- Documentation/virtual/kvm/api.txt | 22 ++ arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/hyperv.c | 17 + arch/x86/kvm/x86.c| 6 ++ include/linux/kvm_host.h | 1 + include/uapi/linux/kvm.h | 17 + 6 files changed, 64 insertions(+) diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 8710418..a6858eb 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -3337,6 +3337,28 @@ the userspace IOAPIC should process the EOI and retrigger the interrupt if it is still asserted. Vector is the LAPIC interrupt vector for which the EOI was received. + struct kvm_hyperv_exit { +#define KVM_EXIT_HYPERV_SYNIC 1 + __u32 type; + union { + struct { + __u32 msr; + __u64 control; + __u64 evt_page; + __u64 msg_page; + } synic; + } u; + }; + /* KVM_EXIT_HYPERV */ +struct kvm_hyperv_exit hyperv; +Indicates that the VCPU exits into userspace to process some tasks +related to Hyper-V emulation. +Valid values for 'type' are: + KVM_EXIT_HYPERV_SYNIC -- synchronously notify user-space about +Hyper-V SynIC state change. Notification is used to remap SynIC +event/message pages and to enable/disable SynIC messages/events processing +in userspace. + /* Fix the size of the union. */ char padding[256]; }; diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 8434f88..54c90d3 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -392,6 +392,7 @@ struct kvm_vcpu_hv { u64 hv_vapic; s64 runtime_offset; struct kvm_vcpu_hv_synic synic; + struct kvm_hyperv_exit exit; }; struct kvm_vcpu_arch { diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c index 8ff71f3..9443920 100644 --- a/arch/x86/kvm/hyperv.c +++ b/arch/x86/kvm/hyperv.c @@ -129,6 +129,20 @@ static void kvm_hv_notify_acked_sint(struct kvm_vcpu *vcpu, u32 sint) srcu_read_unlock(&kvm->irq_srcu, idx); } +static void synic_exit(struct kvm_vcpu_hv_synic *synic, u32 msr) +{ + struct kvm_vcpu *vcpu = synic_to_vcpu(synic); + struct kvm_vcpu_hv *hv_vcpu = &vcpu->arch.hyperv; + + hv_vcpu->exit.type = KVM_EXIT_HYPERV_SYNIC; + hv_vcpu->exit.u.synic.msr = msr; + hv_vcpu->exit.u.synic.control = synic->control; + hv_vcpu->exit.u.synic.evt_page = synic->evt_page; + hv_vcpu->exit.u.synic.msg_page = synic->msg_page; + + kvm_make_request(KVM_REQ_HV_EXIT, vcpu); +} + static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, u32 msr, u64 data, bool host) { @@ -141,6 +155,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, switch (msr) { case HV_X64_MSR_SCONTROL: synic->control = data; + synic_exit(synic, msr); break; case HV_X64_MSR_SVERSION: if (!host) { @@ -157,6 +172,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, break; } synic->evt_page = data; + synic_exit(synic, msr); break; case HV_X64_MSR_SIMP: if (data & HV_SYNIC_SIMP_ENABLE) @@ -166,6 +182,7 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *synic, break; } synic->msg_page = data; + synic_exit(synic, msr); break; case HV_X64_MSR_EOM: { int i; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index b853b2df..0704ee3 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6342,6 +6342,12 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) r = 0; goto out; } + if (kvm_check_request(KVM_REQ_HV_EXIT, vcpu)) { + vcpu->run->exit_reason = KVM_EXIT_HYPERV; + vcpu->run->hyperv = vcpu->arch.hyperv.exit; + r = 0; + goto out; + } }
Re: [PATCH v3 9/9] kvm/x86: Hyper-V kvm exit
On 22/10/2015 18:10, Andrey Smetanin wrote: > A new vcpu exit is introduced to notify the userspace of the > changes in Hyper-V SynIC configuration triggered by guest writing to the > corresponding MSRs. > > Changes v3: > * added KVM_EXIT_HYPERV types and structs notes into docs Thanks. The changes look good. I look forward to the unit tests so I can merge it. Paolo -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html