| From ca3f0874723fad81d0c701b63ae3a17a408d5f25 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= <rkrcmar@redhat.com> |
| Date: Wed, 8 Apr 2015 14:16:48 +0200 |
| Subject: KVM: use slowpath for cross page cached accesses |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= <rkrcmar@redhat.com> |
| |
| commit ca3f0874723fad81d0c701b63ae3a17a408d5f25 upstream. |
| |
| kvm_write_guest_cached() does not mark all written pages as dirty and |
| code comments in kvm_gfn_to_hva_cache_init() talk about NULL memslot |
| with cross page accesses. Fix all the easy way. |
| |
| The check is '<= 1' to have the same result for 'len = 0' cache anywhere |
| in the page. (nr_pages_needed is 0 on page boundary.) |
| |
| Fixes: 8f964525a121 ("KVM: Allow cross page reads and writes from cached translations.") |
| Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> |
| Message-Id: <20150408121648.GA3519@potion.brq.redhat.com> |
| Reviewed-by: Wanpeng Li <wanpeng.li@linux.intel.com> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| virt/kvm/kvm_main.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/virt/kvm/kvm_main.c |
| +++ b/virt/kvm/kvm_main.c |
| @@ -1653,8 +1653,8 @@ int kvm_gfn_to_hva_cache_init(struct kvm |
| ghc->generation = slots->generation; |
| ghc->len = len; |
| ghc->memslot = gfn_to_memslot(kvm, start_gfn); |
| - ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, &nr_pages_avail); |
| - if (!kvm_is_error_hva(ghc->hva) && nr_pages_avail >= nr_pages_needed) { |
| + ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, NULL); |
| + if (!kvm_is_error_hva(ghc->hva) && nr_pages_needed <= 1) { |
| ghc->hva += offset; |
| } else { |
| /* |