From: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
To: gleb@kernel.org
Cc: avi.kivity@gmail.com, mtosatti@redhat.com, pbonzini@redhat.com,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
stable@vger.kernel.org, David Matlack <dmatlack@google.com>
Subject: Re: [PATCH 1/2] KVM: fix cache stale memslot info with correct mmio generation number
Date: Thu, 14 Aug 2014 15:06:15 +0800 [thread overview]
Message-ID: <53EC5FE7.6040904@linux.vnet.ibm.com> (raw)
In-Reply-To: <1407999713-3726-1-git-send-email-xiaoguangrong@linux.vnet.ibm.com>
Sorry, the title is not clear enough.
This is the v2 which fixes the issue pointed out by David:
" the generation number actually decreases."
Please review.
On 08/14/2014 03:01 PM, Xiao Guangrong wrote:
> We may cache the current mmio generation number and stale memslot info
> into spte, like this scenario:
>
> CPU 0 CPU 1
> page fault: add a new memslot
> read memslot and detecting its a mmio access
> update memslots
> update generation number
> read generation number
> cache the gpa and current gen number into spte
>
> So, if guest accesses the gpa later, it will generate a incorrect
> mmio exit
>
> This patch fixes it by updating the generation number after
> synchronize_srcu_expedited() that makes sure the generation
> number updated only if memslots update is finished
>
> Cc: stable@vger.kernel.org
> Cc: David Matlack <dmatlack@google.com>
> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
> ---
> virt/kvm/kvm_main.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 33712fb..bb40df3 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -96,7 +96,7 @@ static void hardware_disable_all(void);
>
> static void kvm_io_bus_destroy(struct kvm_io_bus *bus);
> static void update_memslots(struct kvm_memslots *slots,
> - struct kvm_memory_slot *new, u64 last_generation);
> + struct kvm_memory_slot *new);
>
> static void kvm_release_pfn_dirty(pfn_t pfn);
> static void mark_page_dirty_in_slot(struct kvm *kvm,
> @@ -687,8 +687,7 @@ static void sort_memslots(struct kvm_memslots *slots)
> }
>
> static void update_memslots(struct kvm_memslots *slots,
> - struct kvm_memory_slot *new,
> - u64 last_generation)
> + struct kvm_memory_slot *new)
> {
> if (new) {
> int id = new->id;
> @@ -699,8 +698,6 @@ static void update_memslots(struct kvm_memslots *slots,
> if (new->npages != npages)
> sort_memslots(slots);
> }
> -
> - slots->generation = last_generation + 1;
> }
>
> static int check_memory_region_flags(struct kvm_userspace_memory_region *mem)
> @@ -722,9 +719,12 @@ static struct kvm_memslots *install_new_memslots(struct kvm *kvm,
> {
> struct kvm_memslots *old_memslots = kvm->memslots;
>
> - update_memslots(slots, new, kvm->memslots->generation);
> + /* ensure generation number is always increased. */
> + slots->generation = old_memslots->generation;
> + update_memslots(slots, new);
> rcu_assign_pointer(kvm->memslots, slots);
> synchronize_srcu_expedited(&kvm->srcu);
> + slots->generation++;
>
> kvm_arch_memslots_updated(kvm);
>
next prev parent reply other threads:[~2014-08-14 7:06 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-14 7:01 [PATCH 1/2] KVM: fix cache stale memslot info with correct mmio generation number Xiao Guangrong
2014-08-14 7:01 ` [PATCH 2/2] kvm: x86: fix stale mmio cache bug Xiao Guangrong
2014-08-14 16:25 ` David Matlack
2014-08-18 21:24 ` Paolo Bonzini
2014-08-14 7:06 ` Xiao Guangrong [this message]
2014-08-18 13:57 ` [PATCH 1/2] KVM: fix cache stale memslot info with correct mmio generation number Paolo Bonzini
2014-08-18 16:35 ` Xiao Guangrong
2014-08-18 16:35 ` Xiao Guangrong
2014-08-18 18:20 ` David Matlack
2014-08-18 18:47 ` Paolo Bonzini
2014-08-18 18:47 ` Paolo Bonzini
2014-08-18 19:56 ` Xiao Guangrong
2014-08-18 19:56 ` Xiao Guangrong
2014-08-18 21:15 ` David Matlack
2014-08-18 21:24 ` Paolo Bonzini
2014-08-18 21:33 ` David Matlack
2014-08-19 3:50 ` Xiao Guangrong
2014-08-19 4:31 ` David Matlack
2014-08-19 4:41 ` Xiao Guangrong
2014-08-19 5:00 ` David Matlack
2014-08-19 5:19 ` Xiao Guangrong
2014-08-19 5:40 ` David Matlack
2014-08-19 5:55 ` Xiao Guangrong
2014-08-19 8:28 ` Paolo Bonzini
2014-08-19 8:50 ` Xiao Guangrong
2014-08-19 9:03 ` Paolo Bonzini
2014-08-20 0:29 ` Xiao Guangrong
2014-08-20 1:03 ` David Matlack
2014-08-20 8:38 ` Paolo Bonzini
-- strict thread matches above, loose matches on Subject: below --
2014-08-12 5:02 Xiao Guangrong
2014-08-12 21:18 ` David Matlack
2014-08-14 5:41 ` Xiao Guangrong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=53EC5FE7.6040904@linux.vnet.ibm.com \
--to=xiaoguangrong@linux.vnet.ibm.com \
--cc=avi.kivity@gmail.com \
--cc=dmatlack@google.com \
--cc=gleb@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=pbonzini@redhat.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.