aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorVadim Rozenfeld <vrozenfe@redhat.com>2014-01-23 02:12:53 -0500
committerPaolo Bonzini <pbonzini@redhat.com>2014-01-24 10:51:15 -0500
commitb3af1e889ec4909f6b48dabd19a311d9c9f8d58e (patch)
tree7817262c9300d08bc95b74be396288e91518de52 /arch/x86
parentb94b64c9a79a322802f13f44e9690a7b6a22710e (diff)
KVM: x86: mark hyper-v vapic assist page as dirty
Signed-off-by: Vadim Rozenfeld <vrozenfe@redhat.com> Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kvm/x86.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 0fa9c84e36cb..dc11b4f98577 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1869,19 +1869,21 @@ static int set_msr_hyperv(struct kvm_vcpu *vcpu, u32 msr, u64 data)
1869{ 1869{
1870 switch (msr) { 1870 switch (msr) {
1871 case HV_X64_MSR_APIC_ASSIST_PAGE: { 1871 case HV_X64_MSR_APIC_ASSIST_PAGE: {
1872 u64 gfn;
1872 unsigned long addr; 1873 unsigned long addr;
1873 1874
1874 if (!(data & HV_X64_MSR_APIC_ASSIST_PAGE_ENABLE)) { 1875 if (!(data & HV_X64_MSR_APIC_ASSIST_PAGE_ENABLE)) {
1875 vcpu->arch.hv_vapic = data; 1876 vcpu->arch.hv_vapic = data;
1876 break; 1877 break;
1877 } 1878 }
1878 addr = gfn_to_hva(vcpu->kvm, data >> 1879 gfn = data >> HV_X64_MSR_APIC_ASSIST_PAGE_ADDRESS_SHIFT;
1879 HV_X64_MSR_APIC_ASSIST_PAGE_ADDRESS_SHIFT); 1880 addr = gfn_to_hva(vcpu->kvm, gfn);
1880 if (kvm_is_error_hva(addr)) 1881 if (kvm_is_error_hva(addr))
1881 return 1; 1882 return 1;
1882 if (__clear_user((void __user *)addr, PAGE_SIZE)) 1883 if (__clear_user((void __user *)addr, PAGE_SIZE))
1883 return 1; 1884 return 1;
1884 vcpu->arch.hv_vapic = data; 1885 vcpu->arch.hv_vapic = data;
1886 mark_page_dirty(vcpu->kvm, gfn);
1885 break; 1887 break;
1886 } 1888 }
1887 case HV_X64_MSR_EOI: 1889 case HV_X64_MSR_EOI: