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 13B50C04A94 for ; Thu, 10 Aug 2023 09:29:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A204A6B0075; Thu, 10 Aug 2023 05:29:16 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9D01F6B0078; Thu, 10 Aug 2023 05:29:16 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8C04B6B007B; Thu, 10 Aug 2023 05:29:16 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 7E4186B0075 for ; Thu, 10 Aug 2023 05:29:16 -0400 (EDT) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 40B5BA04E6 for ; Thu, 10 Aug 2023 09:29:16 +0000 (UTC) X-FDA: 81107671512.03.9583912 Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.93]) by imf22.hostedemail.com (Postfix) with ESMTP id 1514CC000F for ; Thu, 10 Aug 2023 09:29:13 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=ZHEmwIhw; spf=pass (imf22.hostedemail.com: domain of yan.y.zhao@intel.com designates 192.55.52.93 as permitted sender) smtp.mailfrom=yan.y.zhao@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1691659754; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:in-reply-to: references:references:dkim-signature; bh=Mnbq+EtiF+3dKuTOus5Jaq0TP3YKNDoVX3nPDSRGP/M=; b=pVysSWUPiCfup8IqQXqvAeHYDbNcYQchBhJSZL0UCtX+MJIIABN+7K9Aik4BaLymlBwHMh Lu1aj5dyBS6F4b8IL29/xHhMzfcR+Ue+pT7t1qkOKVDEQIgSdqdNK0/TNt38vrrkZpbecp InYtQWPYpUiA/IjS8/bc3wtOe5qs1aA= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=ZHEmwIhw; spf=pass (imf22.hostedemail.com: domain of yan.y.zhao@intel.com designates 192.55.52.93 as permitted sender) smtp.mailfrom=yan.y.zhao@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1691659754; a=rsa-sha256; cv=none; b=TZDcfm975qS/oZ9NeLtgpj32qS9NNHQFY05PSBOADAhvoyjo765G9sQce+isIlTgXD3V8v b+Rdfb1tDAJYTYb4E36nIXUNpjPiX/Emb4Q8OFH3STX9DS/OSzqFEjn8N7ErFQ7B0XSNqr AX8BAB3/edHDoMClpApAkoqFofPmbjM= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1691659754; x=1723195754; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=c5lM4VELT+1iO33iaR4/GLXpKT7hVcv5kR8JEqEqxJc=; b=ZHEmwIhwkFmK59G5gH1ENNgmsfbWO7B5kxeB8+iFpO6zQ+MSjmQFWW0f Tz/OilrpLB5HLmmGLWrTiE/BgZCQa42hXqfKgYXsdrFKXRJytXQTGbDr0 lsLrrgapJMhzOw88pT2AEoubT8xnlrWoBL100IHymYvU0wO8JzFVqJ1KM ACrRCqA5W4C3dvg2XSqivez+TQ+PjE90tlu96aUJ7SjSXBhaaaxxrN5rk DQVuK1/YRDHmm48X9wvu+7llx/6mi1PgDl1LWSW2TuGTOiZH8XOieC95E nbfX+vQL5yIRH2o9Yoa2HcEXcEuHigRWz1iTkajbHpUC4GdPuxdJeKCmk g==; X-IronPort-AV: E=McAfee;i="6600,9927,10797"; a="368806346" X-IronPort-AV: E=Sophos;i="6.01,161,1684825200"; d="scan'208";a="368806346" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Aug 2023 02:29:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10797"; a="822172765" X-IronPort-AV: E=Sophos;i="6.01,161,1684825200"; d="scan'208";a="822172765" Received: from yzhao56-desk.sh.intel.com ([10.239.159.62]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Aug 2023 02:29:09 -0700 From: Yan Zhao To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: pbonzini@redhat.com, seanjc@google.com, mike.kravetz@oracle.com, apopple@nvidia.com, jgg@nvidia.com, rppt@kernel.org, akpm@linux-foundation.org, kevin.tian@intel.com, david@redhat.com, Yan Zhao Subject: [RFC PATCH v2 5/5] KVM: Unmap pages only when it's indeed protected for NUMA migration Date: Thu, 10 Aug 2023 17:02:18 +0800 Message-Id: <20230810090218.26244-1-yan.y.zhao@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230810085636.25914-1-yan.y.zhao@intel.com> References: <20230810085636.25914-1-yan.y.zhao@intel.com> X-Rspamd-Queue-Id: 1514CC000F X-Rspam-User: X-Stat-Signature: 1c14frfoj331fgm5ubi46z4pp31oashw X-Rspamd-Server: rspam01 X-HE-Tag: 1691659753-779471 X-HE-Meta: U2FsdGVkX1+gf6pv9Rhxkx/6rGKxmZWk0cBk50SSP0AdrwKfScKwSu59N70NmIpw6w3BcNJOR8vRBhEop3N5OWz/nvazfJaa1e0NgLJkTxrASk8Idn8/yNTfZ0mLdAKNreDcKUJD/WwGNxMwsxlKFU2OZT3vZUVB1v/ZHDDx7E2bcsI+e8xmOeragzaq5o1BD1hfCpcxBXjiPJpGUZkVmxaGwMK24O0I48zThXZ9B6bQE8SVoC9ajip8e+ANl1hCG1DQLJ8rlZNzhDm1bxExz3ayCXqS6My0XuwISoFUU59IMiU97IdWazY5LhMo6ap3AT1t/+YVKmnS6rQLtMM7mOpUpSO5jDN9bFGrBIXIumfJPVrAp0bwknx51qbYN2nDfVnMk5r8Lm8pxdHcq+gfZ6uosJMO85bheaKzuPCFET8OmORdAEbi0J6fp3SyFYFkHc4FWAyGANS6JcGocUU4JzTgL3ts9Tb7NSrl0ZJ06vS1+zfH9dLwHxXBfAIwKJPmBRcfFosELX78X8vrRWvhd5eiHHp2NXG1hMnCNlcANNOBH3DQ68nbiHgolDPOMB4mVTJcOOjxB+ol1hzoYUg8/aBGZueQSfzSYJcuzyv57mL7oE9twFqafQ05zb1N7jkJeUGiHt6ZgwTJxHaDXq/XjVzaCcCT0cTtU7pKaGaoar/sFG1x2nAUq/gQnIZUxlxho1T21iAlS+faGjmR9odjmMyEG1ACG5xM1FZDnhddl7VK61VB1TWb5cYDPuSvjwtr514rpr6Rv1NSu2LEzeXRu4U2hukKGV39xBpgmaG7ecFTxPyHHiOTDdI+k6kkQIGIVOWVpH78Nui1I+MOhGdf9hAC/wL60w9WxGdKuJQLHK3hEXqKfYyPgpA/NB//LLBcLsntuDnOI5+FJvOfp5Bgy+K48vZ8eOXdCqgP6uoyDGj1ISEzcmjAtKedWZcjw1+j2p8hhIdWradaDMz61Zk tAA5vUbj baFVphK2Qc4w3BTXm/3YkFsqYDOkSSDUzxBFCMB1xs2qtjhQj9ErvGo6+8NkLsfTmoOlb23gYkjLsWDTvAWx1m0/q6NdpkS+QanGv5kuyO1xCJTj8APmgWuz9sA== 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: Register to .numa_protect() callback in mmu notifier so that KVM can get acurate information about when a page is PROT_NONE protected in primary MMU and unmap it in secondary MMU accordingly. In KVM's .invalidate_range_start() handler, if the event is to notify that the range may be protected to PROT_NONE for NUMA migration purpose, don't do the unmapping in secondary MMU. Hold on until.numa_protect() comes. Signed-off-by: Yan Zhao --- virt/kvm/kvm_main.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index dfbaafbe3a00..907444a1761b 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -711,6 +711,20 @@ static void kvm_mmu_notifier_change_pte(struct mmu_notifier *mn, kvm_handle_hva_range(mn, address, address + 1, pte, kvm_change_spte_gfn); } +static void kvm_mmu_notifier_numa_protect(struct mmu_notifier *mn, + struct mm_struct *mm, + unsigned long start, + unsigned long end) +{ + struct kvm *kvm = mmu_notifier_to_kvm(mn); + + WARN_ON_ONCE(!READ_ONCE(kvm->mn_active_invalidate_count)); + if (!READ_ONCE(kvm->mmu_invalidate_in_progress)) + return; + + kvm_handle_hva_range(mn, start, end, __pte(0), kvm_unmap_gfn_range); +} + void kvm_mmu_invalidate_begin(struct kvm *kvm, unsigned long start, unsigned long end) { @@ -744,14 +758,18 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, const struct mmu_notifier_range *range) { struct kvm *kvm = mmu_notifier_to_kvm(mn); + bool is_numa = (range->event == MMU_NOTIFY_PROTECTION_VMA) && + (range->flags & MMU_NOTIFIER_RANGE_NUMA); const struct kvm_hva_range hva_range = { .start = range->start, .end = range->end, .pte = __pte(0), - .handler = kvm_unmap_gfn_range, + .handler = !is_numa ? kvm_unmap_gfn_range : + (void *)kvm_null_fn, .on_lock = kvm_mmu_invalidate_begin, - .on_unlock = kvm_arch_guest_memory_reclaimed, - .flush_on_ret = true, + .on_unlock = !is_numa ? kvm_arch_guest_memory_reclaimed : + (void *)kvm_null_fn, + .flush_on_ret = !is_numa ? true : false, .may_block = mmu_notifier_range_blockable(range), }; @@ -899,6 +917,7 @@ static const struct mmu_notifier_ops kvm_mmu_notifier_ops = { .clear_young = kvm_mmu_notifier_clear_young, .test_young = kvm_mmu_notifier_test_young, .change_pte = kvm_mmu_notifier_change_pte, + .numa_protect = kvm_mmu_notifier_numa_protect, .release = kvm_mmu_notifier_release, }; -- 2.17.1