From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id DA814EE021A for ; Thu, 14 Sep 2023 03:07:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 28CAB8D0013; Wed, 13 Sep 2023 23:07:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 217888D0001; Wed, 13 Sep 2023 23:07:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0B69C8D0013; Wed, 13 Sep 2023 23:07:28 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id ED7C68D0001 for ; Wed, 13 Sep 2023 23:07:27 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id B4AEB80F56 for ; Thu, 14 Sep 2023 03:07:27 +0000 (UTC) X-FDA: 81233717334.22.13CC2D9 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.65]) by imf02.hostedemail.com (Postfix) with ESMTP id 257228000E for ; Thu, 14 Sep 2023 03:07:24 +0000 (UTC) Authentication-Results: imf02.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=mCXXyygr; dmarc=pass (policy=none) header.from=intel.com; spf=none (imf02.hostedemail.com: domain of binbin.wu@linux.intel.com has no SPF policy when checking 134.134.136.65) smtp.mailfrom=binbin.wu@linux.intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1694660845; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=cE3xWV4mry2nnCQW3Je65Z9a4JjRVqgzlFHgsm7udIs=; b=IcsF+fi8fMlq6tYya1GHe+O27SpXzDN71vVTXwOt7soBMWXs5RVRRwpsoDhfMCqrk6AjW1 H+25KPXBBM8Th7Qmw5+M2bcmXoRXSMuxKRamGXxNh8XmdlqGBZyWx1TYViKXFJFKses3KS Tdy7mBh7I5PtzzD9kNv7CKD5jyVt8/w= ARC-Authentication-Results: i=1; imf02.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=mCXXyygr; dmarc=pass (policy=none) header.from=intel.com; spf=none (imf02.hostedemail.com: domain of binbin.wu@linux.intel.com has no SPF policy when checking 134.134.136.65) smtp.mailfrom=binbin.wu@linux.intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694660845; a=rsa-sha256; cv=none; b=aUt/AmKH0Z6VyhwOVfMgDlBS9lRTFnFpRB8SMcY17kNE5GmIgmbsiqM8zh2XLusEl+I2gr HMzx2P85nshGdjQaFSFnffxT6XZ7bI4LP+VKGpWA53pvUh84ZkvYGl8eMxtJdqFBdZWeNs D/Jqs1U2wAS7g9ix8u9IQ/lPnFMdiFE= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1694660845; x=1726196845; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=hQLGmdNELjYMZnPnnmaVF9DnSi0UkgWqzZbEZVq1o/k=; b=mCXXyygruGOfHd5Hi/MSRLkRhy4D1wsFatChc/O7EqsYgEJJBq4ANTaO BPDTeexuOIrMKYORdcqau306OIoOxgHKMMRgX/cOK8zONN1dORd8l+84Q xMxTsVt/f4Wifn1MO4IogM1N7I1JWWS0KP96WXIktJc+vto1ogkqVKmmc 3EJ6EExaTFQW0MY32xy57YJ66QBdUg4eWWilc4B8L7bBDOOHftMMCpWNr H4WRawaSRlJtggjeT6NyspWMk7wVtCj6allqEJv3MDpYRg769QTcMgnHv 3Ub6qX0G2urAWY16KNvj9FeRdO1S4G0dz89Y3g1k26IZ8xfFEp50KQxPQ A==; X-IronPort-AV: E=McAfee;i="6600,9927,10832"; a="382644872" X-IronPort-AV: E=Sophos;i="6.02,144,1688454000"; d="scan'208";a="382644872" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Sep 2023 20:07:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10832"; a="747565104" X-IronPort-AV: E=Sophos;i="6.02,144,1688454000"; d="scan'208";a="747565104" Received: from binbinwu-mobl.ccr.corp.intel.com (HELO [10.238.8.84]) ([10.238.8.84]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Sep 2023 20:07:14 -0700 Message-ID: <54d3e6bf-d374-caa5-0920-bb2fe3b7595c@linux.intel.com> Date: Thu, 14 Sep 2023 11:07:12 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.15.1 Subject: Re: [RFC PATCH v12 02/33] KVM: Use gfn instead of hva for mmu_notifier_retry To: Sean Christopherson , Chao Peng Cc: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" , Fuad Tabba , Jarkko Sakkinen , Anish Moorthy , Yu Zhang , Isaku Yamahata , Xu Yilun , Vlastimil Babka , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" References: <20230914015531.1419405-1-seanjc@google.com> <20230914015531.1419405-3-seanjc@google.com> From: Binbin Wu In-Reply-To: <20230914015531.1419405-3-seanjc@google.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspam-User: X-Stat-Signature: i5p5ugxi57deu8ymejy3pi5rgwr15jxr X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 257228000E X-HE-Tag: 1694660844-752116 X-HE-Meta: U2FsdGVkX19o2HHH7lgokByUyELsFg6lVpo9G/acLW88Dm/9IXPgr6bWYwWBHenb83czQpjyvi67qKeeAR1P5NjSzMqxAP6IJdA/q49sLXz7G7X/QU3uol2OGY+PXumc0XqgHPY4TGobxMcfoZLjrH9bOJ52UHzaeM3SUPTDC/vp2o2wAMVZvI71uOKV3cDI+uJVvz3VRwEt9jo6r7FfbZ10GxlzO5gF9p5Snl7yiNv5FRnFcF2x52BZPZx3tMImM9v2tqCkrMHS+akm4e8cB+K/rWru0fTzM00HjeKECQ946KwrOEiarzzMccskw8eHs8aPBESbyYv94BOwdEUgHbB1mXZ4O1TOwsLWYbC2oSamtob+nKkXkXxdknd/qtdB6sykfh8AP0G2MyJjr1ZVy/H6CsRsnjO8JR2FjL1aQjPqNdX/P3Ga3pfr1O04RF0yZVoCHE204AiPYbHIrPmj9UyIZPVpSnfqtPccFLAUO5ZPepPkBxl6KZXZPMatKZRjHTNDAFgRIQbTxsAYjw4KvvwIurKrYgu1qsaZuxGLNR3D/mTA/OQijuUgPUMRhqXdhmc4C+yM7oJ2nSmeoMss4XS4eC7VkJYeo1V/GMYXFaHOzy5+tltKTCoT2pqOCjbf5zwSc/m2dhfm8jKmFa+Ub5QiehjgWsCE7VSRYCJpPiWw05GaWpJmCfAiLP0Ud6ECWt54FVqOHtvzpm++d3zo24d6EKafTibEkEVAWIFqnTlbFZdWSRB12VM2QqANtquaLBf34K9osFs+23fsCXFk2wAiSynd+JtYfhH242y3ijYPzhudKYEXgkXQWZW9MB1CTVZljFsql3sHjfMAY9ql0Rpcq9tkMGW1b23ywlroyE4qnHzMUsDmElIVRb7eRYTgGEw2HbaldLMKm4QZHiSw0WlCWOC0yiSqtEqLT/KqNgMuZvXP59JYsAadaI6Rw1iXSBGPwmLV8uOdn+X0G3M 9ztNASHa Ux0QeAztwDx0t1bqYfmXrFe2MZD7YW57tX+rDqlN9oKnGuo0gYNxz192fiV2Y//vfsTFOpam6bV7+fP3Yh/d47PGHmwg1gorXryu2cLaScjaWfemS+Q65nP9SRHU98P3MN68fePDe3cZQJiw6rfmRR7prlbKrUeQfYsD8Z2FC8+x0FVGe8FgjMcKKVEgZJ084fcUl5pZsZS0eYTNHB+V1cDKJ2OPG9XK6m1JWGhflHwUmR0LCfMxjz6vyLxxy9YwG+/3+SUyLmDNQj5ZKQabVzmbesiWy5G4b+i3I01t566n0MDA= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On 9/14/2023 9:55 AM, Sean Christopherson wrote: > From: Chao Peng > > Currently in mmu_notifier invalidate path, hva range is recorded and > then checked against by mmu_notifier_retry_hva() in the page fault > handling path. However, for the to be introduced private memory, a page > fault may not have a hva associated, checking gfn(gpa) makes more sense. > > For existing hva based shared memory, gfn is expected to also work. The > only downside is when aliasing multiple gfns to a single hva, the > current algorithm of checking multiple ranges could result in a much > larger range being rejected. Such aliasing should be uncommon, so the > impact is expected small. > > Suggested-by: Sean Christopherson > Signed-off-by: Chao Peng > Reviewed-by: Fuad Tabba > Tested-by: Fuad Tabba > [sean: convert vmx_set_apic_access_page_addr() to gfn-based API] > Signed-off-by: Sean Christopherson > --- > arch/x86/kvm/mmu/mmu.c | 10 ++++++---- > arch/x86/kvm/vmx/vmx.c | 11 +++++------ > include/linux/kvm_host.h | 33 +++++++++++++++++++++------------ > virt/kvm/kvm_main.c | 40 +++++++++++++++++++++++++++++++--------- > 4 files changed, 63 insertions(+), 31 deletions(-) > [...] > > -void kvm_mmu_invalidate_begin(struct kvm *kvm, unsigned long start, > - unsigned long end) > +void kvm_mmu_invalidate_begin(struct kvm *kvm) > { > + lockdep_assert_held_write(&kvm->mmu_lock); > /* > * The count increase must become visible at unlock time as no > * spte can be established without taking the mmu_lock and > * count is also read inside the mmu_lock critical section. > */ > kvm->mmu_invalidate_in_progress++; > + > + if (likely(kvm->mmu_invalidate_in_progress == 1)) > + kvm->mmu_invalidate_range_start = INVALID_GPA; > +} > + > +void kvm_mmu_invalidate_range_add(struct kvm *kvm, gfn_t start, gfn_t end) > +{ > + lockdep_assert_held_write(&kvm->mmu_lock); > + > + WARN_ON_ONCE(!kvm->mmu_invalidate_in_progress); > + > if (likely(kvm->mmu_invalidate_in_progress == 1)) { > kvm->mmu_invalidate_range_start = start; > kvm->mmu_invalidate_range_end = end; > @@ -771,6 +781,12 @@ void kvm_mmu_invalidate_begin(struct kvm *kvm, unsigned long start, > } > } > > +static bool kvm_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) > +{ > + kvm_mmu_invalidate_range_add(kvm, range->start, range->end); > + return kvm_unmap_gfn_range(kvm, range); > +} > + > static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, > const struct mmu_notifier_range *range) > { > @@ -778,7 +794,7 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, > const struct kvm_mmu_notifier_range hva_range = { > .start = range->start, > .end = range->end, > - .handler = kvm_unmap_gfn_range, > + .handler = kvm_mmu_unmap_gfn_range, > .on_lock = kvm_mmu_invalidate_begin, > .on_unlock = kvm_arch_guest_memory_reclaimed, > .flush_on_ret = true, > @@ -817,8 +833,7 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, > return 0; > } > > -void kvm_mmu_invalidate_end(struct kvm *kvm, unsigned long start, > - unsigned long end) > +void kvm_mmu_invalidate_end(struct kvm *kvm) > { > /* > * This sequence increase will notify the kvm page fault that > @@ -833,6 +848,13 @@ void kvm_mmu_invalidate_end(struct kvm *kvm, unsigned long start, > * in conjunction with the smp_rmb in mmu_invalidate_retry(). > */ > kvm->mmu_invalidate_in_progress--; > + > + /* > + * Assert that at least one range must be added between start() and > + * end(). Not adding a range isn't fatal, but it is a KVM bug. > + */ > + WARN_ON_ONCE(kvm->mmu_invalidate_in_progress && > + kvm->mmu_invalidate_range_start == INVALID_GPA); Should the check happen before the decrease of kvm->mmu_invalidate_in_progress? Otherwise, KVM calls kvm_mmu_invalidate_begin(), then kvm_mmu_invalidate_end() the check will not take effect. > } > > static void kvm_mmu_notifier_invalidate_range_end(struct mmu_notifier *mn,