Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753072AbdGCIsK (ORCPT ); Mon, 3 Jul 2017 04:48:10 -0400 Received: from mx2.suse.de ([195.135.220.15]:35774 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752034AbdGCIsG (ORCPT ); Mon, 3 Jul 2017 04:48:06 -0400 Subject: Re: [PATCH] KVM: arm/arm64: Handle hva aging while destroying the vm To: Christoffer Dall References: <1498231319-199734-1-git-send-email-agraf@suse.de> <20170703080313.GB4066@cbox> Cc: kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Andrea Arcangeli From: Alexander Graf Message-ID: Date: Mon, 3 Jul 2017 10:48:03 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 In-Reply-To: <20170703080313.GB4066@cbox> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2116 Lines: 72 On 07/03/2017 10:03 AM, Christoffer Dall wrote: > Hi Alex, > > On Fri, Jun 23, 2017 at 05:21:59PM +0200, Alexander Graf wrote: >> If we want to age an HVA while the VM is getting destroyed, we have a >> tiny race window during which we may end up dereferencing an invalid >> kvm->arch.pgd value. >> >> CPU0 CPU1 >> >> kvm_age_hva() >> kvm_mmu_notifier_release() >> kvm_arch_flush_shadow_all() >> kvm_free_stage2_pgd() >> >> stage2_get_pmd() >> >> set kvm->arch.pgd = 0 >> >> >> stage2_get_pud() >> arch.pgd> >> > I don't think this sequence, can happen, but I think kvm_age_hva() can > be called with the mmu_lock held and kvm->pgd already being NULL. > > Is that possible for the mmu notifiers to be calling clear(_flush)_young > while also calling notifier_release? I *think* the aging happens completely orthogonally to release. But let's ask Andrea - I'm sure he knows :). Alex > > If so, the patch below looks good to me. > > Thanks, > -Christoffer > > >> This patch adds a check for that case. >> >> Signed-off-by: Alexander Graf >> --- >> virt/kvm/arm/mmu.c | 4 ++++ >> 1 file changed, 4 insertions(+) >> >> diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c >> index f2d5b6c..227931f 100644 >> --- a/virt/kvm/arm/mmu.c >> +++ b/virt/kvm/arm/mmu.c >> @@ -861,6 +861,10 @@ static pud_t *stage2_get_pud(struct kvm *kvm, struct kvm_mmu_memory_cache *cache >> pgd_t *pgd; >> pud_t *pud; >> >> + /* Do we clash with kvm_free_stage2_pgd()? */ >> + if (!kvm->arch.pgd) >> + return NULL; >> + >> pgd = kvm->arch.pgd + stage2_pgd_index(addr); >> if (WARN_ON(stage2_pgd_none(*pgd))) { >> if (!cache) >> -- >> 1.8.5.6 >> >> _______________________________________________ >> kvmarm mailing list >> kvmarm@lists.cs.columbia.edu >> https://lists.cs.columbia.edu/mailman/listinfo/kvmarm