From patchwork Tue Jul 18 23:44:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317870 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 65D60C001DE for ; Tue, 18 Jul 2023 23:48:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D5B778D0020; Tue, 18 Jul 2023 19:48:36 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CE48D8D0012; Tue, 18 Jul 2023 19:48:36 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B5D6F8D0020; Tue, 18 Jul 2023 19:48:36 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id A41CC8D0012 for ; Tue, 18 Jul 2023 19:48:36 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 71A811604FA for ; Tue, 18 Jul 2023 23:48:36 +0000 (UTC) X-FDA: 81026374632.11.518DD7E Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf28.hostedemail.com (Postfix) with ESMTP id 7EF5AC001B for ; Tue, 18 Jul 2023 23:48:34 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=1t0P5wmE; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf28.hostedemail.com: domain of 30SS3ZAYKCCQSEANJCGOOGLE.COMLINUX-MMKVACK.ORG@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=30SS3ZAYKCCQSEANJCGOOGLE.COMLINUX-MMKVACK.ORG@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724114; a=rsa-sha256; cv=none; b=3Bme0lWsUHeJMN0F4KEEgOonGA9fe9ZW2LCxcpr922ie64MaRNr+dJsG33UoqZNWumcraT pLrRV+uO9wn/HsP5RAIX3IU2CIMWUa7fIw0JKkeRwvJ1ycJ0hwRHuunvwkPowvNOAmq3zW 8kUuRLbRxuUmORhoknodf4zuMNOnIz8= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=1t0P5wmE; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf28.hostedemail.com: domain of 30SS3ZAYKCCQSEANJCGOOGLE.COMLINUX-MMKVACK.ORG@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=30SS3ZAYKCCQSEANJCGOOGLE.COMLINUX-MMKVACK.ORG@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724114; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=LxdpiWTpX3B7gMKbPihLQ6FRzF4V55oVGzPxSGe/+4U=; b=odIU6E+8o1h0Q+EWUTFd3/3LaQ1Y7Wvtdh0ZQsR//GAZt7Oy5NWcX08n2XeCVJ8qcALzxc jzzXS0Gq0g5sYKvouRD5G3hJ455LKJj5HW13E5Vhl4BEs2NaOznwZ8TuE+fzQ4n27FrXC4 bvW5d7Avcd/aCfz0U3xgC9YWF7T0MKY= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b8b2a2e720so32164375ad.3 for ; Tue, 18 Jul 2023 16:48:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724113; x=1692316113; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=LxdpiWTpX3B7gMKbPihLQ6FRzF4V55oVGzPxSGe/+4U=; b=1t0P5wmE/XmWdqU7J55641EABrTeVarxWaQR4bJ8HE5kvt+bT2Zvilx6zvBC6IhCug lxtaG0ZNNeNxKJwNRyofNcY/3UY8SXaGscGhXtOBqjuhZKJLWAvQEL/Od2vXIHWkp721 m6ADzg8L3JrLCsaJYeIfX0G7ZaqvY3dbA4PpFF78/ivmcmih9CPggzA6FpbWCll6Rc7J s/iuth191O25UoKCd/SjRjFkh1FVoiOHo2ymxYD/iPBQpPOGMgrdqXeht4Yx5rEFGAGu E6MjDgW0gFgwwVKsMh4xUPmBsbIlsG5Mzs33eQjh6Yww/GhiF/1eZ4NrCcSo7R/KWv9Z IRkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724113; x=1692316113; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=LxdpiWTpX3B7gMKbPihLQ6FRzF4V55oVGzPxSGe/+4U=; b=ZwaJww+icOryJKFPcQmuCTShjfNKsCWdZ1xjzC8ARfpeAjOHRIb4km3QyyAfZSyTPV nJ68Ox+Undg9XJngBtJzA8sXlofPT1CxypI2ESfHRSLTkOjZ4rI34XXoM878IkubLPC6 6e5bty/ngI1Yz/wZ6Jb31MUhkKbs5r3MXrFSS8KfaAzg3ixLZdXsQbl/Zh3ori64xRzP SdmkY9GSNDj4TTvEQ1/BWMMq7EC9zRkEICm3peMzaibvGfBAUBjpa/G2pFwiYdMaserF ON3FR2L/y+O4vFVW1DLPUOn7T726CoxsGLY3a/BhQH93Y7/nPmtyYiy+uj3lZM/4trAd C3TA== X-Gm-Message-State: ABy/qLanE6w4bAeTOw8cuMlVeYQqkvbRVHe4rrjQY+r0WMN6FOE1nDM5 NsJpF/DKeNHGalmwDTNlFPi/Q9QNEe4= X-Google-Smtp-Source: APBJJlECbx+0jj+7Hb3hGFg2pirZsYDF3lE8aX5+9Q/S485STdtV3M1qZMxLbtNxaVklqPoT+BTJIsFwzzk= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:903:2349:b0:1b9:de12:475 with SMTP id c9-20020a170903234900b001b9de120475mr8788plh.6.1689724113231; Tue, 18 Jul 2023 16:48:33 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:44 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-2-seanjc@google.com> Subject: [RFC PATCH v11 01/29] KVM: Wrap kvm_gfn_range.pte in a per-action union From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 7EF5AC001B X-Stat-Signature: 6q5ojbqgcm6pdps6gy83u6s97icjxa7m X-HE-Tag: 1689724114-539381 X-HE-Meta: U2FsdGVkX19VyZrkTbmWELTfdIZOzkU6WcP6Hg5apLUayPEnY6/havpyUlsb3dde5xGyoLP44Xe0hU1T4R4+UHHW1FkKPyQY3ECKVw3TQHPNZGvX6KzuIa5jeI8rDk2jLbr/XULgMBFHsht8J7Tfydkz5tsSAe8Mp2kyPn+mzaj3LwrYDrt+An7DEtYQDz2d4CnYYIy5ZeIfq876lS2CfIjbrzaSSZFg6EWn76y+9aYXX2/0UAidNrF7bwlJGm2Gk0rvRnuJ15oXnpVeGBSF6fNTkGtEsGqlhuF9W9MdIEfNqQWyzPAAqsblS5Y81X+ZSzSaNHG2tvyRl21urb/Oncd+NjeYRKOBR+sdAkaeRA/OyDohiyfvDCcAlAXk4293OMGQoAVNFf4iWdmYY25BURFB2rZ3QaTKlMHe+iEP9amrs1GkeP6q0Z2yaJU2ka6qGHlAJsu5Oy9xSUtQo9nIx4tUpE4s+PlhXgT2dhxEp4yEi66XTdIWv9kmNGKaOyp9h/MANvO6qw8D2t04vMfG1e2lnxSrB26lz+nakDL0J0pAySwS28bf/NW8t41FNnVNT2ZRUK7Un+GX0MQj3VLL09dd2NmMI0JkvqBjDzqUbltXa70qA58uhe7yvYTKnQWa0Zfqt/PwBfcOnAV7T6QyowGWMlTMmYwR9xKMBMG90LyAu884Q1G3ZdM2N6z++XvC/OUxolHc2kmiLa4osD4JAAQcftFzOBKvmqzPuKKn5jPzWEvemvQs2WWkeDAvBcKYI4KdjlWn0eXmFChLfEfTiZnXwccCAsY3Ll10uaU4Oj6gqdm/STpmSy1tYljapOAtPNIJaGXXuXdNg1iy/2F+W19bMuoPyt3dJvUDVdZXXpR0hVHu0hZ+nO/dAkhYJVVhJFlzcw3QEdzPDDUef2FD7b1w7eV22d6TluFFu/9lzQChyvv675vgKIKgrvwN/xtrTdReqzalp3ZC5B2Unpc DapGY9Z/ UBpagHf2u4aMluRJMWcZFbQIXw2OyAxWpAyX/cEbjLyqgUqqYg4Nw8pMOV19NKAgvZXDZ1eCs0bs9oBAlPjnKZawoBSb1TiFkoIWEZhOl+MvT5WfYr0qtViOd/TA51FxSdimxc//qHLGebg68WJ6/ebbN8uM+Ntw2KE1Ed/5PtzK5g1K2eeyx8tYD5J1GuleQeZI6zcwmdZoD5ThrDXf9/aKXtWDEJxwysIdZWlz7XrCUScQVcUwpyhfpvUPLJmfi2CS3Ze3Z5jz1oK4I/t54HYTBI8DU3iLe69Www386yIGJbzFNGm5P4zUSFqDvx6XB3dXMs7fJtedimncTQYuMbkU/QuHW2KcEvorC2VwgjgxwrO1xUWiVhPqrhTqj03/g8AeFLfPV5mS++DBb1ql9WoB+uCHB0rHOyJ8rmsuU9RsrbtCtm4ZrbJdeuI+IP/gWjEMme7gK27M+4f8S8KU+twEhENORwTou6sSCJOANXArj88CJV9wT+wzc3SanCvD6tWFcRFahmGdFs42WFhf2ckfNYv4D/uEVDBo9OKStozKhHp3Tgc8dRQ2TzfEmkEz/ZwQVyaFdMcDdnZBEooi9sZUdo9mIL6GET/gEOt760eR05qpetXnvpfrkR10Xj+Pz9zjC7PgzrOPms6zYqCaDMYlFTdzttPC0XFcv7+qe6NHwO7HjsM7pC1asmyt/oufz4IRkO3p1cap4mYHJCmpR68aKtl9RhJ0K0D4ZnCGWhnTUcerlc1y//ZM+zF52ANgZYHap0bgmO7UGF09932ZhgPX50JhEFIvTIXtS4a9RjPKmsFE5ZxGirXm6zvRc+tN39+xZ 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: Signed-off-by: Sean Christopherson Reviewed-by: Paolo Bonzini --- arch/arm64/kvm/mmu.c | 2 +- arch/mips/kvm/mmu.c | 2 +- arch/riscv/kvm/mmu.c | 2 +- arch/x86/kvm/mmu/mmu.c | 2 +- arch/x86/kvm/mmu/tdp_mmu.c | 6 +++--- include/linux/kvm_host.h | 5 ++++- virt/kvm/kvm_main.c | 16 ++++++++++------ 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 6db9ef288ec3..55f03a68f1cd 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -1721,7 +1721,7 @@ bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) bool kvm_set_spte_gfn(struct kvm *kvm, struct kvm_gfn_range *range) { - kvm_pfn_t pfn = pte_pfn(range->pte); + kvm_pfn_t pfn = pte_pfn(range->arg.pte); if (!kvm->arch.mmu.pgt) return false; diff --git a/arch/mips/kvm/mmu.c b/arch/mips/kvm/mmu.c index e8c08988ed37..7b2ac1319d70 100644 --- a/arch/mips/kvm/mmu.c +++ b/arch/mips/kvm/mmu.c @@ -447,7 +447,7 @@ bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) bool kvm_set_spte_gfn(struct kvm *kvm, struct kvm_gfn_range *range) { gpa_t gpa = range->start << PAGE_SHIFT; - pte_t hva_pte = range->pte; + pte_t hva_pte = range->arg.pte; pte_t *gpa_pte = kvm_mips_pte_for_gpa(kvm, NULL, gpa); pte_t old_pte; diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c index f2eb47925806..857f4312b0f8 100644 --- a/arch/riscv/kvm/mmu.c +++ b/arch/riscv/kvm/mmu.c @@ -559,7 +559,7 @@ bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) bool kvm_set_spte_gfn(struct kvm *kvm, struct kvm_gfn_range *range) { int ret; - kvm_pfn_t pfn = pte_pfn(range->pte); + kvm_pfn_t pfn = pte_pfn(range->arg.pte); if (!kvm->arch.pgd) return false; diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index ec169f5c7dce..d72f2b20f430 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -1588,7 +1588,7 @@ static __always_inline bool kvm_handle_gfn_range(struct kvm *kvm, for_each_slot_rmap_range(range->slot, PG_LEVEL_4K, KVM_MAX_HUGEPAGE_LEVEL, range->start, range->end - 1, &iterator) ret |= handler(kvm, iterator.rmap, range->slot, iterator.gfn, - iterator.level, range->pte); + iterator.level, range->arg.pte); return ret; } diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c index 512163d52194..6250bd3d20c1 100644 --- a/arch/x86/kvm/mmu/tdp_mmu.c +++ b/arch/x86/kvm/mmu/tdp_mmu.c @@ -1241,7 +1241,7 @@ static bool set_spte_gfn(struct kvm *kvm, struct tdp_iter *iter, u64 new_spte; /* Huge pages aren't expected to be modified without first being zapped. */ - WARN_ON(pte_huge(range->pte) || range->start + 1 != range->end); + WARN_ON(pte_huge(range->arg.pte) || range->start + 1 != range->end); if (iter->level != PG_LEVEL_4K || !is_shadow_present_pte(iter->old_spte)) @@ -1255,9 +1255,9 @@ static bool set_spte_gfn(struct kvm *kvm, struct tdp_iter *iter, */ tdp_mmu_iter_set_spte(kvm, iter, 0); - if (!pte_write(range->pte)) { + if (!pte_write(range->arg.pte)) { new_spte = kvm_mmu_changed_pte_notifier_make_spte(iter->old_spte, - pte_pfn(range->pte)); + pte_pfn(range->arg.pte)); tdp_mmu_iter_set_spte(kvm, iter, new_spte); } diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 9d3ac7720da9..b901571ab61e 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -260,7 +260,10 @@ struct kvm_gfn_range { struct kvm_memory_slot *slot; gfn_t start; gfn_t end; - pte_t pte; + union { + pte_t pte; + u64 raw; + } arg; bool may_block; }; bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index dfbaafbe3a00..d58b7a506d27 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -526,7 +526,10 @@ typedef void (*on_unlock_fn_t)(struct kvm *kvm); struct kvm_hva_range { unsigned long start; unsigned long end; - pte_t pte; + union { + pte_t pte; + u64 raw; + } arg; hva_handler_t handler; on_lock_fn_t on_lock; on_unlock_fn_t on_unlock; @@ -562,6 +565,10 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, struct kvm_memslots *slots; int i, idx; + BUILD_BUG_ON(sizeof(gfn_range.arg) != sizeof(gfn_range.arg.raw)); + BUILD_BUG_ON(sizeof(range->arg) != sizeof(range->arg.raw)); + BUILD_BUG_ON(sizeof(gfn_range.arg) != sizeof(range->arg)); + if (WARN_ON_ONCE(range->end <= range->start)) return 0; @@ -591,7 +598,7 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, * bother making these conditional (to avoid writes on * the second or later invocation of the handler). */ - gfn_range.pte = range->pte; + gfn_range.arg.raw = range->arg.raw; gfn_range.may_block = range->may_block; /* @@ -639,7 +646,7 @@ static __always_inline int kvm_handle_hva_range(struct mmu_notifier *mn, const struct kvm_hva_range range = { .start = start, .end = end, - .pte = pte, + .arg.pte = pte, .handler = handler, .on_lock = (void *)kvm_null_fn, .on_unlock = (void *)kvm_null_fn, @@ -659,7 +666,6 @@ static __always_inline int kvm_handle_hva_range_no_flush(struct mmu_notifier *mn const struct kvm_hva_range range = { .start = start, .end = end, - .pte = __pte(0), .handler = handler, .on_lock = (void *)kvm_null_fn, .on_unlock = (void *)kvm_null_fn, @@ -747,7 +753,6 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, const struct kvm_hva_range hva_range = { .start = range->start, .end = range->end, - .pte = __pte(0), .handler = kvm_unmap_gfn_range, .on_lock = kvm_mmu_invalidate_begin, .on_unlock = kvm_arch_guest_memory_reclaimed, @@ -812,7 +817,6 @@ static void kvm_mmu_notifier_invalidate_range_end(struct mmu_notifier *mn, const struct kvm_hva_range hva_range = { .start = range->start, .end = range->end, - .pte = __pte(0), .handler = (void *)kvm_null_fn, .on_lock = kvm_mmu_invalidate_end, .on_unlock = (void *)kvm_null_fn, From patchwork Tue Jul 18 23:44:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317872 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 18A5BC04A94 for ; Tue, 18 Jul 2023 23:48:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3E4C48D0021; Tue, 18 Jul 2023 19:48:38 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 396858D0012; Tue, 18 Jul 2023 19:48:38 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 212238D0021; Tue, 18 Jul 2023 19:48:38 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 0B85D8D0012 for ; Tue, 18 Jul 2023 19:48:38 -0400 (EDT) Received: from smtpin04.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id D7618A04F5 for ; Tue, 18 Jul 2023 23:48:37 +0000 (UTC) X-FDA: 81026374674.04.003C29B Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) by imf06.hostedemail.com (Postfix) with ESMTP id E7B69180016 for ; Tue, 18 Jul 2023 23:48:35 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=tLDg009L; spf=pass (imf06.hostedemail.com: domain of 30yS3ZAYKCCYUGCPLEIQQING.EQONKPWZ-OOMXCEM.QTI@flex--seanjc.bounces.google.com designates 209.85.128.201 as permitted sender) smtp.mailfrom=30yS3ZAYKCCYUGCPLEIQQING.EQONKPWZ-OOMXCEM.QTI@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724115; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=/Q2YqUewU0QJU59tCBKplqkoUGv4ucil0ZC6wcpHcqQ=; b=NbOG0AEI3PijwEursC0fc8A3zIo5N5jGI+ASaUfaB0ORAuJo5xQ0e2TgB8daLJoPYLHvNb 5R+4Wo8QOfCq+EOEvH1nPAIQMRGM/xP8TnUZE1XKZzIp1/5tFbm6rb3tad+R1Sd0xGjY3P +fAD5xOYHONJ9GUAxpwaOwBpWKqEY1g= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724115; a=rsa-sha256; cv=none; b=C1jf8os/Ts4nWyrd775gaxBUS7bfg6foTQt380HaN+LgXluMsBZ5vbn8Pe0cJxJ4uuMi5u wOnlBbWwumBy+i9zjDo3fjQCpyXmmJZWp/s8POxYNsCeJa/b5ScLNe+nmihJeELkuZgoFn 045pn/nBwU6Yjy8gFhkDdBDyd2R3JgU= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=tLDg009L; spf=pass (imf06.hostedemail.com: domain of 30yS3ZAYKCCYUGCPLEIQQING.EQONKPWZ-OOMXCEM.QTI@flex--seanjc.bounces.google.com designates 209.85.128.201 as permitted sender) smtp.mailfrom=30yS3ZAYKCCYUGCPLEIQQING.EQONKPWZ-OOMXCEM.QTI@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-57745160c1dso58219227b3.2 for ; Tue, 18 Jul 2023 16:48:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724115; x=1692316115; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=/Q2YqUewU0QJU59tCBKplqkoUGv4ucil0ZC6wcpHcqQ=; b=tLDg009LSV9Tr1yXeY8d4SfO26PrwJIaLtLynftl5yKXvNFsST0X3aD0RRd4GHX/wv vtU1d3HuUEp4/WvsYO14a7YtyRpqHdAIKX5GRwFujpPChgWaWrOtfOGhpxiDxfb2FIcp Ae9zBTxW6KL3hmvrpUDBJiNqXIyNkauGtse5upwrlxh/E50i4d2vGBX75qEPajnBgZGc 62JFVrZFAM+EhDxD7kWVSnkyBrTTVuPq5qxvIJYKXmn+OcNdrNUgMZjrQKHRGqfkHsON U3BqIvW3OKP/jQkfPxwptTqtHQZYGlpqMzy7K9mx0E1p+mdrooSa+nj413aqHz+roVeF gxuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724115; x=1692316115; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=/Q2YqUewU0QJU59tCBKplqkoUGv4ucil0ZC6wcpHcqQ=; b=ik660ICFlOJbIDj8oiBEgs0QtwUcLG0mBNQmw8g32KHeQ9a+wzv/KczmO/c4zgNoDx iGCbezaT4DAtSd50L0lftB+T1oorLNvTseVQsh8IQ0Sc4AaeEa7pU0uZ7FbEw1EmdT6g wW0PP6WlzMjbu9P1HbclPbrICzFaMkLixxq9XtsaGN0FdB1VnrbwIXiS8b2ypa33jzb6 uY5kicz7nU3EJAY0tRWJCvx9M7qeuBkJ9/uoHPu516krv1ZWINtxS4/SXyzUh3iE1MZ8 Jf61ILbgz+Ep1oVk50MburXqQX38Mu+lyVw1F/DRIOPjX5eZ1pRn4UHoYNyMNGAHblJ5 1Ccg== X-Gm-Message-State: ABy/qLZk5hziaJL0xXhL3mENmBzHyx0cTN5SfwRCojSEHVobW1mWXDYo +TXjOoJopdEf4EvjpstTHbTNvhF8wFE= X-Google-Smtp-Source: APBJJlHjosfFmr47fAQ4FwoHYiy0rQprOrE8ng/AJ+BqBK9Dg+T53fJUISRxGIkaIZYnyupUcGSciTRGnxE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a81:b61d:0:b0:57a:141f:b4f7 with SMTP id u29-20020a81b61d000000b0057a141fb4f7mr40058ywh.6.1689724115002; Tue, 18 Jul 2023 16:48:35 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:45 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-3-seanjc@google.com> Subject: [RFC PATCH v11 02/29] KVM: Tweak kvm_hva_range and hva_handler_t to allow reusing for gfn ranges From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Stat-Signature: 31o8bs4das15ctoeszjbkt1rru33bj7g X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: E7B69180016 X-Rspam-User: X-HE-Tag: 1689724115-153078 X-HE-Meta: U2FsdGVkX18+4s9FkTudsDj3zLYHe2+X67U/yXEPPIJrlKQe3vV0UIRHZ5Jo0t/H+yZdRufLHgcTjBdWkB3wJa1nffGVWVs11vf2ubXWmlbotRuzdfZKQ/GU1CdPpIsS4usqV6EoUvSKpcxSdlfVW1QJTGjVo+URobT3DNOZ+DCmC2Dissj0wdDjWGI/KhTRqkx/jGXNlpoUHWGdgtnOLf/8J5n+5JypU0MAaroPX3d+3TKQw4Zkq4jZ0bvU7Gui8Hqk0EYFwIgnGBaPRyEgPKkIGbYsLKuP+0VyuzknG54bre4NeMGi8xFOSnHhtT9t6TLkBujjDS4EHDw993fYyIJw70vvCeTTNqAA4FXOrCD9GgR3ZuvqESHsVTqgqI3iK9akZpUuDwggMF/KNF1W5jOEQy1R6FypuaSO3Kz77W8i5IQzUAQtwLgcmmynzXITxqBa3uTS5XTzEm67MDpIRV1yaEWVVqwV0tdGjxcY3ZkLZpuH4sE95wEZWXeoUz1San7PCk0/b9j6znXf2ISa2ju3fq7tnh8mHCph4/y0B9ZJTV8Ter7x+tkkIrrbIGXLvo117zGWn35cf5gt1hKFmvxsIqQVQTeLvRsnLJzpxRWFf0IzyaEYIX5Lt6UasKnlLpGHqVOYtp/CU8hN28t1EU91wrou4d4yBIt+qejKd4VywUUE0b249inxloX4YRPxxAt/Pr5gaKKb4QzGgwlaxkvVTYena+dkVbx2PymUv0q2P+NeDj7YvjFM7MD25i4qXQqmUrbvpvUi0Y0mhQevZRs+w1VgxHC2x+Vufj1rfctQ96k4Y0WPb1Ixzc7vauUPWf7I9/cp3Q7fCaavznAVx5Wzn9i6XKl87i+luDDK10jJ1UGSBuk4+77+S6nhxeXbQsS4qmxTgC50RNxdKA8AP7rO0JO4IDMsUGWqB5T/GlwvoLBXme5fdlnlFIk7sF9cOMm+u4+yTeEYK5jhVia y9cT3o1A HB3bdTylomwXfN084xSGMsxKhXdaT2wFbF3+GT99ARUr596R+2tCG52PcUcYe65kJnuOxJbJs3Df5WSjrLF3B9JAtGmAGS8s3Qaq4AgHwVq5F0QRpNeILK9TpHBb8DW4BMnf3D5d1sjqnmfPzaF57xBONghNpBoYxGwfsQ1jsZMuhwkE2H5PgNjMyUveQqwrGLK2AI31dCtQt0ertXrTKWz3CbGqzIl7RvJ48AJ7Q3D1W7vvqIDBUh8QFalDu1vG1p0uI5+CGeKCsSAxJE5PBrg0AwyGVdvcdK7Xi/1YXtVK0XezFcDtW/kcZxjx8EUi/X6Iqsmq1pKYeNos/A3o962mA67nxyNaYHg9vFWVdHlpm1whYGZY93Kx9idTG53FVzR/owJuuqDwuihw8ubgY1UHOW/NynG8TuAGK6vYzXdiQnM1lqsGmqUw9BGg8wVPFDZ0C1cVaktKk9uA9t638tZV2ZVhBVt05Y0CiG5Wp8GZg8Rds/MKB6YjaehmuJIWNA/yFn8lFawoKUUTDMapKz6KwEDlU9hRSBEjfX5Wr6JDDE5UgZY+fCRYXOCEU7N0eEIJxA5O21sB8lIfiIbfhVW/ImIjGd4qzqHsfFKIHKlyU270iY9meEibuf2lX3Qp3RMr1IUP0qkxZu82dwh1+kK4uIa/UN0PizXAsHJXw0dmplKvICvBPGu7vwLLJw23mWxg4V1c/7nUhTuiXtkdGwB6sgygYNu3lWUB1/kGbGpcvJ5JbSzi2ihz1PtAkL96Zv1Vy1gsILFySOoRg4vVtgCypQVeesn4zx2SB1RMxP2htbsJNKZAUp+iRMg== 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: Signed-off-by: Sean Christopherson Reviewed-by: Paolo Bonzini --- virt/kvm/kvm_main.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index d58b7a506d27..50aea855eeae 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -516,21 +516,25 @@ static inline struct kvm *mmu_notifier_to_kvm(struct mmu_notifier *mn) return container_of(mn, struct kvm, mmu_notifier); } -typedef bool (*hva_handler_t)(struct kvm *kvm, struct kvm_gfn_range *range); +typedef bool (*gfn_handler_t)(struct kvm *kvm, struct kvm_gfn_range *range); typedef void (*on_lock_fn_t)(struct kvm *kvm, unsigned long start, unsigned long end); typedef void (*on_unlock_fn_t)(struct kvm *kvm); -struct kvm_hva_range { - unsigned long start; - unsigned long end; +struct kvm_mmu_notifier_range { + /* + * 64-bit addresses, as KVM notifiers can operate on host virtual + * addresses (unsigned long) and guest physical addresses (64-bit). + */ + u64 start; + u64 end; union { pte_t pte; u64 raw; } arg; - hva_handler_t handler; + gfn_handler_t handler; on_lock_fn_t on_lock; on_unlock_fn_t on_unlock; bool flush_on_ret; @@ -557,7 +561,7 @@ static void kvm_null_fn(void) node = interval_tree_iter_next(node, start, last)) \ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, - const struct kvm_hva_range *range) + const struct kvm_mmu_notifier_range *range) { bool ret = false, locked = false; struct kvm_gfn_range gfn_range; @@ -588,9 +592,9 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, unsigned long hva_start, hva_end; slot = container_of(node, struct kvm_memory_slot, hva_node[slots->node_idx]); - hva_start = max(range->start, slot->userspace_addr); - hva_end = min(range->end, slot->userspace_addr + - (slot->npages << PAGE_SHIFT)); + hva_start = max_t(unsigned long, range->start, slot->userspace_addr); + hva_end = min_t(unsigned long, range->end, + slot->userspace_addr + (slot->npages << PAGE_SHIFT)); /* * To optimize for the likely case where the address @@ -640,10 +644,10 @@ static __always_inline int kvm_handle_hva_range(struct mmu_notifier *mn, unsigned long start, unsigned long end, pte_t pte, - hva_handler_t handler) + gfn_handler_t handler) { struct kvm *kvm = mmu_notifier_to_kvm(mn); - const struct kvm_hva_range range = { + const struct kvm_mmu_notifier_range range = { .start = start, .end = end, .arg.pte = pte, @@ -660,10 +664,10 @@ static __always_inline int kvm_handle_hva_range(struct mmu_notifier *mn, static __always_inline int kvm_handle_hva_range_no_flush(struct mmu_notifier *mn, unsigned long start, unsigned long end, - hva_handler_t handler) + gfn_handler_t handler) { struct kvm *kvm = mmu_notifier_to_kvm(mn); - const struct kvm_hva_range range = { + const struct kvm_mmu_notifier_range range = { .start = start, .end = end, .handler = handler, @@ -750,7 +754,7 @@ 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); - const struct kvm_hva_range hva_range = { + const struct kvm_mmu_notifier_range hva_range = { .start = range->start, .end = range->end, .handler = kvm_unmap_gfn_range, @@ -814,7 +818,7 @@ static void kvm_mmu_notifier_invalidate_range_end(struct mmu_notifier *mn, const struct mmu_notifier_range *range) { struct kvm *kvm = mmu_notifier_to_kvm(mn); - const struct kvm_hva_range hva_range = { + const struct kvm_mmu_notifier_range hva_range = { .start = range->start, .end = range->end, .handler = (void *)kvm_null_fn, From patchwork Tue Jul 18 23:44:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317873 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 26101C04FDF for ; Tue, 18 Jul 2023 23:48:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B602A8D0022; Tue, 18 Jul 2023 19:48:40 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B10448D0012; Tue, 18 Jul 2023 19:48:40 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 962658D0022; Tue, 18 Jul 2023 19:48:40 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 81F248D0012 for ; Tue, 18 Jul 2023 19:48:40 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 3619E1204EF for ; Tue, 18 Jul 2023 23:48:40 +0000 (UTC) X-FDA: 81026374800.15.C4C3D24 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf18.hostedemail.com (Postfix) with ESMTP id 4B6221C000C for ; Tue, 18 Jul 2023 23:48:38 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=K73Vbg7k; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf18.hostedemail.com: domain of 31CS3ZAYKCCcVHDQMFJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=31CS3ZAYKCCcVHDQMFJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724118; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=13TvpQfWmhj98VTWRgGiYJYYPcBR6KCMHuSUQlwO+hU=; b=RJqif8Uov73RSBOET63Y/XOeN3y8+6TEkDSh2sQnUKmLFTksXf1ZN5Z4yyXRan+xEYBd+9 uyDvaZzs1Yv/ekLCITm/VALxRDQ304RGuTjFsesfNkdjPtWZXC8g3L8nFDuw+oZeegnzCm 57QhNkxTD9sNK30hNz+Iqn/n3rPU78U= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=K73Vbg7k; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf18.hostedemail.com: domain of 31CS3ZAYKCCcVHDQMFJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=31CS3ZAYKCCcVHDQMFJRRJOH.FRPOLQXa-PPNYDFN.RUJ@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724118; a=rsa-sha256; cv=none; b=pgYakLZ8cXzA+iOt7qiEQw0LCP/sKzQAgWj+ubXVOJhUvyGAEV2YK/Ut9qDY9mbBK0MIA0 eSCZVSupOG9FezO5fZLH/ODe/5GqO1xB2lFQA3cvP0uyuVAgE69mJ9ehH0TbaKnAcfx9UN IzSdri3WRRiLkz8GeTRzzDAYLiRAGvE= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b8a7735231so33085885ad.1 for ; Tue, 18 Jul 2023 16:48:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724117; x=1692316117; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=13TvpQfWmhj98VTWRgGiYJYYPcBR6KCMHuSUQlwO+hU=; b=K73Vbg7kksC/z8D2Q5HaDQ7UWFNhH20EcZQeVd3Lf2J0boclBZkYp6kZLyJv4l7d/v 56zL/m0nSTB8tFW2XTPItzxIs14nSlrppiGSTorI7aichxttdeRbEqNHnqUSw3Aw+2kn Fji8j9h2Uv0Ij0eYpo+vRulpevlfNeeaN++p4cr5gXiklm6fhe6e4jDIizxqxGBZJh16 032nb0dR2D1cAOXQ4dh7+UhQLasc5in709vPZ9EttwJPaHiHomwPODSWeSP1mdLy4wFs ++94jsLDULOKu9MnMNrAsqU8w6PnH6mDknBjPD335n+eYk0/ErbJSraNW2wkmXKS+1vk RBZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724117; x=1692316117; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=13TvpQfWmhj98VTWRgGiYJYYPcBR6KCMHuSUQlwO+hU=; b=fCNiAM+0Jj381gY56VbxubzoH44o47dovBtHNNsPQYmy+BV8909yEAUgmNKvBpRFjV gXzHyKKjBkLNbLYz5MQsZsyhDNwcfEIRs08bd+3zI/Wb7saURg4bRZUkqfewhUhbLXU7 AljykF7UosBP91qAy5fdgm7u0pYys2FHBQKjMmB8MAJsc3Mjb51QVm7uA9f8V2X/LvEv xLRmwBisuep+1ATiZ0d3RQGHJ1gtIMvaw4TjAzc8x5/EOielQH1+wfVGcCS39jKaV/MQ L9xUIZX18Q/bqeQvXEQSd8voapGQcx1DtgvkxKc1gOtvdC7bwcd/nHm2nru+InQdOXSY PO6w== X-Gm-Message-State: ABy/qLY9NtJOnL9R13XuJJKwRj7Ll9A7J1q24xsE7qc+ypUW6zx2+AuP 5aIK4YCdSKxGXBNcfwx/CzvH4flfrps= X-Google-Smtp-Source: APBJJlH5YQ6wPq8Bc7b4XW6UeBNdVc47j/U3+KIL9TvdJOwQstWiBaGw54NLH6nPQ2FwABHJaZp4HrtyKKk= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:903:2301:b0:1bb:1ffd:5cc8 with SMTP id d1-20020a170903230100b001bb1ffd5cc8mr7895plh.11.1689724116857; Tue, 18 Jul 2023 16:48:36 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:46 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-4-seanjc@google.com> Subject: [RFC PATCH v11 03/29] KVM: Use gfn instead of hva for mmu_notifier_retry From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspam-User: X-Stat-Signature: cdxqbjrhx3ex5us1y4ho4y554cekn93m X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 4B6221C000C X-HE-Tag: 1689724118-253065 X-HE-Meta: U2FsdGVkX1/vqizpqwTM3WqZH3kBhfDN/mNNSxBCTAe4q+O4Cxyen5IQTKKVtXZ5VsE+Y9WlHE+tdQ9NqUQmQQYazo9mQPRqr7QAGr6Iw/mwZVxACbJb09jp63IuHnGhKWualG2GBVIFx7o5ETLk1lBqnWVNAPQixBvB+7tbytqDmxtx6CADEcbydXm+mosMD5DZooC4b/xgVGimbsYqhndT1v9IbZwi/aHtkgkAVRn9fR0X2OUiXW1G7Uh7is8mWnQhjTIS86ZuPpmEMObSOWaDWuFw18O70srJWMQGGmifG3sqD0fd+nF4d3KysGfYMgeolY7kXfVy91bvNN5KKqfIscS0B8ir5OgRaejcLQuNSEs33ZdwesPuSTSURngXdBUGkI6jw1PgvHzdtrkPrBkcC27ycgCY/d08jA6NDdTmI8HQTLXkZawUSoUHj7OBvbVJO4JMqD71FLstLmDnjEsNSCVjSprFmXNSnjTmxLg3wUgsQ+MHHY/KlenWMoHnNq6qCRNezIKN5nCeYwi/CA1iQ2lYJMrpfwIGMCDcHGEbsuAyk71Ep6h+CBPctWzptlzZtOyqfxJu1QKzN55KLryIoIFuhamPeYQRv3kXZhQNebTjQXakPGJIjnUiHNplqXbus3ibpfRKkQh+MtpGe/AAa2onMefbCb5ZEjD+eJuXN4KfwGofArKSP9gF90YvR34ak+wJbO0Lsq+QjR36Jfv87fvm1MHN7OSRP9lBG7idFadGA/JWJcLMjZCI33g5FvrXGuDV8pWlFcc2E1W8P8TU/AEjOWDCyM2WZKgf5mteQA8UXl+QmX8sHPQgxW925fKLEtUmWiRX5Rra27WgjjPLVte6PVMgAOCkUq1bkoCohB7IggeMdbbAgfUodGblCHSiJtSn//bThYhnVBbJCI1O/ciuiMnrbZGA/3E0mjghwjo1AUtIb+N/mnQArdkzmQia2U6Vo8c2dupTXS1 wcs9u8bt 2g6lMxzStUgfvCmYIjnPTlyIR10z2lypmNJ+gLWk+zNnvVePZ/5cMt3ud+7/nFrjzxy9CruDFSG2WECCStTahsecjsgXAPfY4wNNuJcyRdI8JcRa2j2ChjM1oUAZpjlzHgX82K7sSCTMw2ao5xNbiCBCJBCmLEhSdbyp1f2H3xgU2Xtx0MkJSE+H0CGLFBbf8tXTTU+d+r5bwUOr7Ys2UoFQoY2gbc1GevQIkbFXyHLVItbi1ompy4zazwNHWAMzh1FnMwKKCfEPnrdPZNm0UKfhn4WIdxjqlKBZypQpf7bOxWTyBqdGZCIdP63ySNlajePdoiNodgBRf3WgA5ctRjUg57AfrQuiCdoxL4yMxIswArtQAoa7LrbykyJVZ/gn580i6BJXXuw64YI1xvWbxL8YMl3xjlWOeum2k6+Y0i1lGWvTk2D20qS7ckzo3tBQntkK9ArRp1CU23uiJ3my3hbu2zQlnNwBZ+1s1lkIJc6RuvS4D/+nUJZKjs4W/bH38Mp+YNxUle6+7MDTibWuUCyyFAASMeaarhTcG7zg3DMazEcGDNoVxqHGktS7cEEkKTlM2Zhwge7Ou4o8WJ3oXddNqFCwNYA3cc9LVHVR7UXnKQ14XYpepT9rFNsrNlm/8PjQZb2dqT9XV3Ok9k0SGbX8yZpqzbUfFTdCeG4w/Q8KAZbEvvIYaJI+SuDdO7gxWZY3xLgg88AuUXI4z4qycsQdV6tWvlMsCyrY9l3x0WGFIx3f1I4ijJFkB8dtmuKZHOlGB8ygTSa9g2r0mj4DPH56ANSbV4U+uFBrgsi9kpyP9/mwCtkVqX2WBA09PSJwPVHInzduAjdR0GNzc6LeDUg7G8A== 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: 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 Reviewed-by: Paolo Bonzini --- 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(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index d72f2b20f430..b034727c4cf9 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3087,7 +3087,7 @@ static void direct_pte_prefetch(struct kvm_vcpu *vcpu, u64 *sptep) * * There are several ways to safely use this helper: * - * - Check mmu_invalidate_retry_hva() after grabbing the mapping level, before + * - Check mmu_invalidate_retry_gfn() after grabbing the mapping level, before * consuming it. In this case, mmu_lock doesn't need to be held during the * lookup, but it does need to be held while checking the MMU notifier. * @@ -4400,7 +4400,7 @@ static bool is_page_fault_stale(struct kvm_vcpu *vcpu, return true; return fault->slot && - mmu_invalidate_retry_hva(vcpu->kvm, fault->mmu_seq, fault->hva); + mmu_invalidate_retry_gfn(vcpu->kvm, fault->mmu_seq, fault->gfn); } static int direct_page_fault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault) @@ -6301,7 +6301,9 @@ void kvm_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end) write_lock(&kvm->mmu_lock); - kvm_mmu_invalidate_begin(kvm, 0, -1ul); + kvm_mmu_invalidate_begin(kvm); + + kvm_mmu_invalidate_range_add(kvm, gfn_start, gfn_end); flush = kvm_rmap_zap_gfn_range(kvm, gfn_start, gfn_end); @@ -6314,7 +6316,7 @@ void kvm_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end) if (flush) kvm_flush_remote_tlbs_range(kvm, gfn_start, gfn_end - gfn_start); - kvm_mmu_invalidate_end(kvm, 0, -1ul); + kvm_mmu_invalidate_end(kvm); write_unlock(&kvm->mmu_lock); } diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 0ecf4be2c6af..946380b53cf5 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -6729,10 +6729,10 @@ static void vmx_set_apic_access_page_addr(struct kvm_vcpu *vcpu) return; /* - * Grab the memslot so that the hva lookup for the mmu_notifier retry - * is guaranteed to use the same memslot as the pfn lookup, i.e. rely - * on the pfn lookup's validation of the memslot to ensure a valid hva - * is used for the retry check. + * Explicitly grab the memslot using KVM's internal slot ID to ensure + * KVM doesn't unintentionally grab a userspace memslot. It _should_ + * be impossible for userspace to create a memslot for the APIC when + * APICv is enabled, but paranoia won't hurt in this case. */ slot = id_to_memslot(slots, APIC_ACCESS_PAGE_PRIVATE_MEMSLOT); if (!slot || slot->flags & KVM_MEMSLOT_INVALID) @@ -6757,8 +6757,7 @@ static void vmx_set_apic_access_page_addr(struct kvm_vcpu *vcpu) return; read_lock(&vcpu->kvm->mmu_lock); - if (mmu_invalidate_retry_hva(kvm, mmu_seq, - gfn_to_hva_memslot(slot, gfn))) { + if (mmu_invalidate_retry_gfn(kvm, mmu_seq, gfn)) { kvm_make_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu); read_unlock(&vcpu->kvm->mmu_lock); goto out; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b901571ab61e..90a0be261a5c 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -788,8 +788,8 @@ struct kvm { struct mmu_notifier mmu_notifier; unsigned long mmu_invalidate_seq; long mmu_invalidate_in_progress; - unsigned long mmu_invalidate_range_start; - unsigned long mmu_invalidate_range_end; + gfn_t mmu_invalidate_range_start; + gfn_t mmu_invalidate_range_end; #endif struct list_head devices; u64 manual_dirty_log_protect; @@ -1371,10 +1371,9 @@ void kvm_mmu_free_memory_cache(struct kvm_mmu_memory_cache *mc); void *kvm_mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc); #endif -void kvm_mmu_invalidate_begin(struct kvm *kvm, unsigned long start, - unsigned long end); -void kvm_mmu_invalidate_end(struct kvm *kvm, unsigned long start, - unsigned long end); +void kvm_mmu_invalidate_begin(struct kvm *kvm); +void kvm_mmu_invalidate_range_add(struct kvm *kvm, gfn_t start, gfn_t end); +void kvm_mmu_invalidate_end(struct kvm *kvm); long kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg); @@ -1940,9 +1939,9 @@ static inline int mmu_invalidate_retry(struct kvm *kvm, unsigned long mmu_seq) return 0; } -static inline int mmu_invalidate_retry_hva(struct kvm *kvm, +static inline int mmu_invalidate_retry_gfn(struct kvm *kvm, unsigned long mmu_seq, - unsigned long hva) + gfn_t gfn) { lockdep_assert_held(&kvm->mmu_lock); /* @@ -1951,10 +1950,20 @@ static inline int mmu_invalidate_retry_hva(struct kvm *kvm, * that might be being invalidated. Note that it may include some false * positives, due to shortcuts when handing concurrent invalidations. */ - if (unlikely(kvm->mmu_invalidate_in_progress) && - hva >= kvm->mmu_invalidate_range_start && - hva < kvm->mmu_invalidate_range_end) - return 1; + if (unlikely(kvm->mmu_invalidate_in_progress)) { + /* + * Dropping mmu_lock after bumping mmu_invalidate_in_progress + * but before updating the range is a KVM bug. + */ + if (WARN_ON_ONCE(kvm->mmu_invalidate_range_start == INVALID_GPA || + kvm->mmu_invalidate_range_end == INVALID_GPA)) + return 1; + + if (gfn >= kvm->mmu_invalidate_range_start && + gfn < kvm->mmu_invalidate_range_end) + return 1; + } + if (kvm->mmu_invalidate_seq != mmu_seq) return 1; return 0; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 50aea855eeae..8101b11a13ba 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -518,9 +518,7 @@ static inline struct kvm *mmu_notifier_to_kvm(struct mmu_notifier *mn) typedef bool (*gfn_handler_t)(struct kvm *kvm, struct kvm_gfn_range *range); -typedef void (*on_lock_fn_t)(struct kvm *kvm, unsigned long start, - unsigned long end); - +typedef void (*on_lock_fn_t)(struct kvm *kvm); typedef void (*on_unlock_fn_t)(struct kvm *kvm); struct kvm_mmu_notifier_range { @@ -617,7 +615,8 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, locked = true; KVM_MMU_LOCK(kvm); if (!IS_KVM_NULL_FN(range->on_lock)) - range->on_lock(kvm, range->start, range->end); + range->on_lock(kvm); + if (IS_KVM_NULL_FN(range->handler)) break; } @@ -721,15 +720,26 @@ static void kvm_mmu_notifier_change_pte(struct mmu_notifier *mn, kvm_handle_hva_range(mn, address, address + 1, pte, kvm_change_spte_gfn); } -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; @@ -750,6 +760,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) { @@ -757,7 +773,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, @@ -796,8 +812,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 @@ -812,6 +827,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); } static void kvm_mmu_notifier_invalidate_range_end(struct mmu_notifier *mn, From patchwork Tue Jul 18 23:44:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317874 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 2CC5FEB64DD for ; Tue, 18 Jul 2023 23:48:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B5FAB8D0023; Tue, 18 Jul 2023 19:48:42 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AE9388D0012; Tue, 18 Jul 2023 19:48:42 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 961DD8D0023; Tue, 18 Jul 2023 19:48:42 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 827148D0012 for ; Tue, 18 Jul 2023 19:48:42 -0400 (EDT) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 43F5540505 for ; Tue, 18 Jul 2023 23:48:42 +0000 (UTC) X-FDA: 81026374884.03.750339A Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) by imf23.hostedemail.com (Postfix) with ESMTP id 5F9F614001A for ; Tue, 18 Jul 2023 23:48:40 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=kxtMkPfB; spf=pass (imf23.hostedemail.com: domain of 31yS3ZAYKCCoYKGTPIMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--seanjc.bounces.google.com designates 209.85.214.201 as permitted sender) smtp.mailfrom=31yS3ZAYKCCoYKGTPIMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724120; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=WUfCrqcqzPgtS1UwKv933k1oCAb1hY7UF4nDFC6XfxY=; b=HPvR5XSYPP/OcNjLzGpd2hkr/J0Cr73ctaqERKG6CTKQPJIjTfpoSt1JfvzSw+Wls9Ra7d 8U9SAaHCRHsSe6067sz4nMWwDBWoCbXlSQV+iRXUXPdb5pAprb6IS2/7KTThJJVwS4Rxq4 HVYyLLYumoidukVp+Ir+qyqmrHE1nOc= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724120; a=rsa-sha256; cv=none; b=e5wI+JxRzF+/iydkM/lrFDVDMVtqztoAezS1xIsvqBZ+YaMAFJ1QkRdwEA9rzzOahhg34s wg/pW2i1HsfKdA1m4FyjjFG4jcmUPwovb8e27edOL/qbriqqAPzeA+DmwK+5NV9ZpH8yGF 5W9ReVhJaUnCyvTvaR7kDqF7+qNeFs0= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=kxtMkPfB; spf=pass (imf23.hostedemail.com: domain of 31yS3ZAYKCCoYKGTPIMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--seanjc.bounces.google.com designates 209.85.214.201 as permitted sender) smtp.mailfrom=31yS3ZAYKCCoYKGTPIMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-1b8af49a5d2so48846465ad.2 for ; Tue, 18 Jul 2023 16:48:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724119; x=1692316119; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=WUfCrqcqzPgtS1UwKv933k1oCAb1hY7UF4nDFC6XfxY=; b=kxtMkPfBzSrDgFwiM6lTbnnV1ORifom1wTCX0JDc2o8v5mvJbgd+eW3FzBholZ+QF/ ZB/tw1vxVtp6lnWfOuYWDBnkA/zcHKeYCxsNI4yLGBDWisxt2V2CGW6+/c9nKHHqWO0Z pwjXyxzIVoB/8QMRAPYJ2ESVagoDqveLkahmzeblrfSHi+C7b/LSvjVeGXXFBmG27xpW 46+iHLUL/iDL1W1dNobEnmnSwB6oZXJ54GsRbQDHUEuzlNSG0pgY2rC5/BfRYynN9jnl 9GH+3FZfZFTDU0qQSnRrsV2OdAHlQuwXUaGl7W047p5QIleFQWR+9FWJ+QSsSRbSbDcH Ypxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724119; x=1692316119; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=WUfCrqcqzPgtS1UwKv933k1oCAb1hY7UF4nDFC6XfxY=; b=gMVqars0DAqW8AZcgdh3/OiwiIAkwvTfCl48lQlEclBV4rkXIK+2aUG6DSjoxDUKnb V0KbY1F+yNsEwabag1r9r1ct9yoqczggjDEiocnvKw9rySZRGNAqrxrnUt3GHKIvV0wr 9vWlhzD5B4QInlGJAea7Caa6umzlNBGiF6qzzOyJXeGgw5+bosI4zEB1ZJWqgjkghVKH 5I7Q3zXGT9yvyGaF0o0nQvmneiU60PI+PoZtRRTScxtcA+x182sfRNWKq1rfqS8hApMs fSi1vOp/B3gpIVrcOq4cWPDjbADAjTkvZ/q5Obhi6FcVZPmmiP+QSMz7gk30AwGYXZI3 pp7Q== X-Gm-Message-State: ABy/qLYqPhhTwUwMizVjSjiyQ3BHlpkf1aDVgNNLIiP90VGKGXbBvhn5 fXlxZxhHYrLV+9xCmoGeLTtB9nDHCSE= X-Google-Smtp-Source: APBJJlEMcu/rfMRBwbQ2zq+ymY4hD2c5F3AYtj0FSwyildZO2Oo0gOzBKGYbg9jbJCtpjTvhx4PmM9/8MPA= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:f546:b0:1b8:a552:c8c9 with SMTP id h6-20020a170902f54600b001b8a552c8c9mr7279plf.13.1689724119324; Tue, 18 Jul 2023 16:48:39 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:47 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-5-seanjc@google.com> Subject: [RFC PATCH v11 04/29] KVM: PPC: Drop dead code related to KVM_ARCH_WANT_MMU_NOTIFIER From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Stat-Signature: am7ipjugthoned14kobu8rk6pnq3mnwi X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 5F9F614001A X-Rspam-User: X-HE-Tag: 1689724120-52248 X-HE-Meta: U2FsdGVkX18IDDmVNp5TWOBkvH6EDltEezrz3HrDyLjqzrUAjJ7Sxlb1027CJIVHytvBcRey2HT41FZt5MWFcL77mtF6L3qgwDsK5lcofpaUCiZUHmzlrO5m62wkZqVLkVglgHWQO/nTa3YthEqEv3XHdbsG1Cv9aikWSh3/UzZtjXDgyl2PcLqgJDTvPybVkBnJlycw/UMOzjixMhpy2RrxZ4st+C9+cYIU8PHCg+gvvovjhoV1buF0mW1OVZLz3CW8K0Ac343dXFCyqXpafdfCliuJ012XOEAxyf8riojol1S7hNG0Is+AR3I4Fy7oJH2Pjy06UZ/kv4wxvWbas4Cr6ZaI8+axynVLhYcNHV8Bps2ZEPXvhV6yD+aR7H/OlytlkK3GmZoxyYIchEtmhFUL3mffkAU4aQfvUU78PMAwFYI+vZ12zklq2bNJAokbYhpzki5kSeo9AZntXKJYCdnygePYkLU/KysgAqwxYON9TI8djTkNey6ERAVMKqMAZ/U5BmHTr5eoEjPvke1Ybu8+uUi+rjGR36+cHc/i9J0jM2pNPx4BtixIBwV5DqKh0IKR7gd18RP4SL8x3kcLLgnclG66X8OxVqIUSHc2uto4baqGZ9aE5ivTC8SsLvMe6yN5vrNXCx6I0R4/zZNm2WfPZ0sd0mrAgDOX3+7Gkilv2YgxHC6l2qQpVRnXt6tt/Y10+IkiQwHqIi+Gg70Qou5Kt4Py0yK3VtH9jL91O1ufNEzqKqSwNbZiEmVbPF3Lc4uKiBoVKmpL7YiP1RmH2aoZHREBlApWJU7kJEW8KG8kkpgDtlaIKYbyoFYF5WQIBfVcsOhBOB1I7emPI/MwKzTsGq+IriUEtdBEASCoEx9UIq/eCpfEAIp1yOQquasvgVnTs5h0T/HN+2o6E5WAtuM0p2mkf16fhC+LfeANx0xK2nUs+36RIE2VzTsSJh+EdGf+YtXemn8nCNEzcMn DVv+Ot17 eEi8Sfd0hZG3Kg0NT5/OAGboW8yE6vpO1G8TSAjITQKEIWC6r65g/FlhulR6jD2Nc/hTEm4doylZ7QlMJ9/6aM4RRZOMVV6AQMqaAXHqypALSGB7Gu6Yd7pjF0UXrU9ix53pDna8FmbW7oAOItz9DFUBjAX1PRkkWUhDbrfcm1AwYO+Upca/St3kr5/PwDjvIfz9HxQncOECeUa91hJz2kXumeGikkEeBv02ZV2ZO/EDSbL8w5WZwp9E9KlWb1mg/NfQNO9QNYDQpmRVPUOmVHtcGelMLpyFV3f5FL9ADGiaSgSn2hQQiTjGzuPq7HDXczFWd3qhjgOH4fU/MsNQEl8UKyf1Ap4TJK4M28JZQ4Op57mPv3kGfXwwh5eItzB6344frVS+87AhYB6YOVS/gf/V7/KjBPH2dsy1Ico30LtArpl3qRp4LChHpU0hpxxafRV2/FFkgE06zVC1hN0uKvB7DZAIAgmJKuIzfo8eNAF4CCEmeJQ9542HIEsPUmtoWTtd/zPbYAowJrvl5LjlcM+PsajepR4eMtyZr0mm3y3NKTEPObtN/g9+R2WzvfO0stoZNaKFQcWXg1ZQpbpFRiLyCaqaFGL4vkciuaZo4Gs1FlZ23gGOrOv0rwYuLMTZSlK1fTZKsXPSxcye90aOvXEmVLrcQYeEkxqjhhVmLCTSmRcCArVNjHmduJIcK/KbYZfFJbPVKl914RLUD9K6RdOWvC6WEvDzVgfmR0tU3oSgxQujeAy6DBk+LbZgVqFrX9tFH+jU02VGWjHV+3n2XpQ57F95LO1tDvQyXOZbl4ENabfVaiMxokfaSrlwUo4ANSUiX 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: Signed-off-by: Sean Christopherson --- arch/powerpc/kvm/powerpc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 7197c8256668..5cf9e5e3112a 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -634,10 +634,11 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) case KVM_CAP_SYNC_MMU: #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE r = hv_enabled; -#elif defined(KVM_ARCH_WANT_MMU_NOTIFIER) - r = 1; #else - r = 0; +#ifndef KVM_ARCH_WANT_MMU_NOTIFIER + BUILD_BUG(); +#endif + r = 1; #endif break; #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE From patchwork Tue Jul 18 23:44:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317875 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 5A8A0C001DC for ; Tue, 18 Jul 2023 23:48:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D5FAF8D0024; Tue, 18 Jul 2023 19:48:44 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CE4D98D0012; Tue, 18 Jul 2023 19:48:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AE8668D0024; Tue, 18 Jul 2023 19:48:44 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 96E4E8D0012 for ; Tue, 18 Jul 2023 19:48:44 -0400 (EDT) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 74AD0A0384 for ; Tue, 18 Jul 2023 23:48:44 +0000 (UTC) X-FDA: 81026374968.18.3C18E64 Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) by imf02.hostedemail.com (Postfix) with ESMTP id 7F06980019 for ; Tue, 18 Jul 2023 23:48:42 +0000 (UTC) Authentication-Results: imf02.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=jmuY9roK; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf02.hostedemail.com: domain of 32SS3ZAYKCCwaMIVRKOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--seanjc.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=32SS3ZAYKCCwaMIVRKOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724122; a=rsa-sha256; cv=none; b=aQVH6gI8piWcf40KdtvLTv2xJOZa0uGtiZenYfOb8Rj3TkazLol4aspIr+S+S14dpLhge3 1fo1s8ErZ3lWfKe/xu2p5p1zDvOYYSBl6mbe1Xu8sRNFq8vErk8gBq2g4I1RSefsXi3M8L FPysq1doXF+EK82h/F4gvmIWzgJD6zc= ARC-Authentication-Results: i=1; imf02.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=jmuY9roK; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf02.hostedemail.com: domain of 32SS3ZAYKCCwaMIVRKOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--seanjc.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=32SS3ZAYKCCwaMIVRKOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724122; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Egm/XxJ8ddWbI/DaWjAWd8f37iIZoXJS+wUVmFcRAns=; b=YpbxFg6oA4QzGJuigstvcSevn8V/YAQGPgJ1AdPUq7VpUcAVibhByDVYnYidDjVyZDbokB xfBi6J6AY/TuUfViodOcfWS1g5yoKg0+OU3BYLsY9f426+nqkC04EMtmq5HX9yikHdcZDa TMo1qynIxin+ZW+7Pkdo5xd8aqYtS7U= Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-c850943cf9aso5385922276.1 for ; Tue, 18 Jul 2023 16:48:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724121; x=1692316121; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=Egm/XxJ8ddWbI/DaWjAWd8f37iIZoXJS+wUVmFcRAns=; b=jmuY9roKZMyFhtYvPEoDziDnCcR7JdYNk6MHm5cFsWzUI97GEXVLYK1GdjIllbAuc8 4ySkYVESTYqTzNduR8YSId27LdhHiTgoO/QliIr5NJBmEYoJ3hqAD7mwOWzvFkUx4Bii goVBiLBONUuy9TatGLx00I5NjhWHSEHqUSiN1WkdO1FULfalsZjiiUrIy35lsmGM8gg5 0R9io78Au8wj9A4RGlGH7FDc+jn67CVyDvAeFJPAeD6X9/PbcbAdX5be8ZMA4OH8wO2X REDfKC9pVZc7WTJWTP+0UyFThTKKDkHpI7he51JmdU9wLJq3gXsen7d9rft5gMUHTkyh wERA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724121; x=1692316121; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Egm/XxJ8ddWbI/DaWjAWd8f37iIZoXJS+wUVmFcRAns=; b=SdT8IZvxjG1kz28dMbPvOcSeDKAofKvpNoMXHIQgIHn9qEpRBa2WaCAimdq+RIyoOj U+b+fGpJkJDZHAHiuh3iwvV2ML8fDM5aomTdugfhAmNttuSGa3WWRm45R5vEwvzzsCke PglCRLueK6nSltR7XVluQghlUZntaVQ78tVRqMYu68jiYYFG3By3Zq/gKJiODGCr+MBP WF5KERNnxlEbUrlxrIdVgp8g3V9ws/UyyyBO96iupPqZ/JB5FaDLxdR89RElZK6Ra8P2 oiW5fXvDdFrYJS40WTZBWnnEX2maZ4aREFUT9uGaUqaRGzgXK4+1a/TpKMxpdiKeFM4+ fyAg== X-Gm-Message-State: ABy/qLbMkgX42RDHA8nA9YLzywZ6mEGGYsDiEK6W7ShyDih8KFzW0O4K vOMap8Ek7ZKwE5aSHa4hzS4hEcckWWo= X-Google-Smtp-Source: APBJJlFh2D+dQAa/XLO1xU2e6kFsryQ3DCD95rOJdVXmpZcOUWfUGVGQg2QmRxbQ3p6/rJNCJuKy9Jt0/xg= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6902:1005:b0:c5d:2623:560e with SMTP id w5-20020a056902100500b00c5d2623560emr14047ybt.12.1689724121300; Tue, 18 Jul 2023 16:48:41 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:48 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-6-seanjc@google.com> Subject: [RFC PATCH v11 05/29] KVM: Convert KVM_ARCH_WANT_MMU_NOTIFIER to CONFIG_KVM_GENERIC_MMU_NOTIFIER From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 7F06980019 X-Stat-Signature: 5f7xymeeks77xaufgbkycgwh744osuiu X-HE-Tag: 1689724122-132619 X-HE-Meta: U2FsdGVkX1/GHa6dbhkQ5yTOPqdth/edvG/rf/RwvVC2MNjHDZduj2RL74O+iJC2jbxriG0CRNpmJh8a3hUAWB1AEawRR3ReD0C7yT4mxJYkskwPRetccab/MAO8g/Qzem8mxH9KaXqrHW7FkhSHJ3ILh95gbnniYWTCOxhgJOuXK9t0LkbhYpCc8n8nnOV2Iu4naH4xWPMcTvnLI7WnAqxF2Ie0ZLon3sFOUJ5g65P8oNQes/MfbtqQMMKCMYFfJzNga9ymSmSX8kqBu0FMzTchiJISkIhh9dui0Yj3KafJ9AUzdksC1MjVx9bXSL6B96SNoIrFD/wsFpRjm+PXCI+J2Ye1WuYw+bq01hBY0XrKOyc1rQPhXoN3Sk3rgYwDgowiSXqbZnDTkUHIL7eXUffTNly8E/+ssf4JcSUt3wNN2cc6PHPrOr5xlkNk6EskA2+4v8VGD/zSB4gYhDE6s8Hq+GMCWBiVYgRkSIQgeCfIh2fARePRodDji64/7Clh2aZv1MmHZkG/6qCUe8alw9sRndM6XzrrozubJO4MK+VXYOiUpl7mqnv5AnM6bDFgAJtaOfoCtYwVhHOEPL4TEdLy+KqiIQ4xx0hQfCyuOQL5y/X9F59GfBkMg0HYeZWNq2M3L4WbyDOe62by44gYAwPApEUfV81MYTZUZIE8apyLFzF0PqLoiM/ttvsF61OX1HEqBDokEV5fEdj/bb87ShcWNdCVF1RnrGCxnsmTSjppaTuC7+YMjCM2R/WqRtltwDzMLJhpBykZ4uVr9Hx5OOXccMGUBTAnkppvTyF1p1WqdTmbdhBweGsQ2P3eoWsD2Kto1O3F0SYpz5ZRF6hVewK1APl/T7LUaU5q6kX5glJHU8fZEyF/NG2lW6uY8RTVeG0c0BCGEwzBFro/jCPDxGpFbg5L7ssW2KLCEMlHbPuThjDq2jqgNP8dZvfLU343jpCqznvCu+ud195HnVb 3FZt739E UR3Uq06leLA5EtX6aLo+pq7KVMkOCs5Bj+gR6nxzNubx36VZnebZVf1OwUGGg7C2brY5sOr3dzrtLVRZyFE2RzRWiGKhPWqVyT5a9QaN0My6ETXoLsXujvqqhr10zgtEYq7E/q1wwwcFljD+YdWh+utecbbkZ/sTm3OVvM6lTpvoh7XT5udSl2RQsWx90A0+Q41ULKwIJ0LnjOvhS7vvx6hT6rqgd55mSZSda8WtYfT/5rBueFmvMBPEjgZkIhrj6L1nJQxFUfn40Wd8Clo4QSWlZSh3h8cZTTHkCxmnxTeh0EtgyGIJX+5hcALbcPqrqzQXzVuIzbwVxoL2lb+N2eDNnnCMboUz1xMDQN2OkZeTzuayF6JIW37nTTk4gh6NTWvMrdWR6jtCYMGJPaM58s6alCHi6N2iacq8Plbu8snkRHX3SpHIHweLBFwZKApc+A9+yBy+jhFQMlX4nuzkfG4gN8NhrofSsicgiZIffYyVAiCVqEf7jzH4nAJOethdO7T1ZCtSf6dk9uscEdOnXX+9yPQ5c25m+T5ulqYehqqfNyZidNK6aL/rQETlg0lgQAv8Ev3brAJ0MUVDZy52uFXAnQvVh8EtXziRkoNVpx/8+zThQXJLi0jiV070cyzh2vEiH140XtM9G5sqC/abNPxjde0bOFvoZ5OOPqL6z804lKQGmvyxFC5fTuCYwLhi4z2kYVy4JZfrhQ4vfb0D2n+zfvfuANvb9ka7lHHRZ09POp7EO7KFNQWmrVpy+ZEqT6LUiftXIDGYUu6FCtJsPpRgbNu2QoRhdKuZGEi/OapQNVGr0FLS28KXVcbr7RmenGcr2wYywUefgmQc/v5TtfRdwF+/FIEa6JFnY 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: Signed-off-by: Sean Christopherson --- arch/arm64/include/asm/kvm_host.h | 2 -- arch/arm64/kvm/Kconfig | 2 +- arch/mips/include/asm/kvm_host.h | 2 -- arch/mips/kvm/Kconfig | 2 +- arch/powerpc/include/asm/kvm_host.h | 2 -- arch/powerpc/kvm/Kconfig | 8 ++++---- arch/powerpc/kvm/powerpc.c | 4 +--- arch/riscv/include/asm/kvm_host.h | 2 -- arch/riscv/kvm/Kconfig | 2 +- arch/x86/include/asm/kvm_host.h | 2 -- arch/x86/kvm/Kconfig | 2 +- include/linux/kvm_host.h | 8 +++++--- virt/kvm/Kconfig | 4 ++++ virt/kvm/kvm_main.c | 10 +++++----- 14 files changed, 23 insertions(+), 29 deletions(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 8b6096753740..50d89d400bf1 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -912,8 +912,6 @@ int __kvm_arm_vcpu_get_events(struct kvm_vcpu *vcpu, int __kvm_arm_vcpu_set_events(struct kvm_vcpu *vcpu, struct kvm_vcpu_events *events); -#define KVM_ARCH_WANT_MMU_NOTIFIER - void kvm_arm_halt_guest(struct kvm *kvm); void kvm_arm_resume_guest(struct kvm *kvm); diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index f531da6b362e..a650b46f4f2f 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -22,7 +22,7 @@ menuconfig KVM bool "Kernel-based Virtual Machine (KVM) support" depends on HAVE_KVM select KVM_GENERIC_HARDWARE_ENABLING - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER select PREEMPT_NOTIFIERS select HAVE_KVM_CPU_RELAX_INTERCEPT select HAVE_KVM_ARCH_TLB_FLUSH_ALL diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h index 04cedf9f8811..22a41d941bf3 100644 --- a/arch/mips/include/asm/kvm_host.h +++ b/arch/mips/include/asm/kvm_host.h @@ -810,8 +810,6 @@ int kvm_mips_mkclean_gpa_pt(struct kvm *kvm, gfn_t start_gfn, gfn_t end_gfn); pgd_t *kvm_pgd_alloc(void); void kvm_mmu_free_memory_caches(struct kvm_vcpu *vcpu); -#define KVM_ARCH_WANT_MMU_NOTIFIER - /* Emulation */ enum emulation_result update_pc(struct kvm_vcpu *vcpu, u32 cause); int kvm_get_badinstr(u32 *opc, struct kvm_vcpu *vcpu, u32 *out); diff --git a/arch/mips/kvm/Kconfig b/arch/mips/kvm/Kconfig index a8cdba75f98d..c04987d2ed2e 100644 --- a/arch/mips/kvm/Kconfig +++ b/arch/mips/kvm/Kconfig @@ -25,7 +25,7 @@ config KVM select HAVE_KVM_EVENTFD select HAVE_KVM_VCPU_ASYNC_IOCTL select KVM_MMIO - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER select INTERVAL_TREE select KVM_GENERIC_HARDWARE_ENABLING help diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 14ee0dece853..4b5c3f2acf78 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -62,8 +62,6 @@ #include -#define KVM_ARCH_WANT_MMU_NOTIFIER - #define HPTEG_CACHE_NUM (1 << 15) #define HPTEG_HASH_BITS_PTE 13 #define HPTEG_HASH_BITS_PTE_LONG 12 diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig index 902611954200..b33358ee6424 100644 --- a/arch/powerpc/kvm/Kconfig +++ b/arch/powerpc/kvm/Kconfig @@ -42,7 +42,7 @@ config KVM_BOOK3S_64_HANDLER config KVM_BOOK3S_PR_POSSIBLE bool select KVM_MMIO - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER config KVM_BOOK3S_HV_POSSIBLE bool @@ -85,7 +85,7 @@ config KVM_BOOK3S_64_HV tristate "KVM for POWER7 and later using hypervisor mode in host" depends on KVM_BOOK3S_64 && PPC_POWERNV select KVM_BOOK3S_HV_POSSIBLE - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER select CMA help Support running unmodified book3s_64 guest kernels in @@ -194,7 +194,7 @@ config KVM_E500V2 depends on !CONTEXT_TRACKING_USER select KVM select KVM_MMIO - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER help Support running unmodified E500 guest kernels in virtual machines on E500v2 host processors. @@ -211,7 +211,7 @@ config KVM_E500MC select KVM select KVM_MMIO select KVM_BOOKE_HV - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER help Support running unmodified E500MC/E5500/E6500 guest kernels in virtual machines on E500MC/E5500/E6500 host processors. diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 5cf9e5e3112a..f97fbac7eac9 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -635,9 +635,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE r = hv_enabled; #else -#ifndef KVM_ARCH_WANT_MMU_NOTIFIER - BUILD_BUG(); -#endif + BUILD_BUG_ON(!IS_ENABLED(CONFIG_KVM_GENERIC_MMU_NOTIFIER)); r = 1; #endif break; diff --git a/arch/riscv/include/asm/kvm_host.h b/arch/riscv/include/asm/kvm_host.h index 2d8ee53b66c7..6ddaf0b9278c 100644 --- a/arch/riscv/include/asm/kvm_host.h +++ b/arch/riscv/include/asm/kvm_host.h @@ -249,8 +249,6 @@ struct kvm_vcpu_arch { static inline void kvm_arch_sync_events(struct kvm *kvm) {} static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} -#define KVM_ARCH_WANT_MMU_NOTIFIER - #define KVM_RISCV_GSTAGE_TLB_MIN_ORDER 12 void kvm_riscv_local_hfence_gvma_vmid_gpa(unsigned long vmid, diff --git a/arch/riscv/kvm/Kconfig b/arch/riscv/kvm/Kconfig index dfc237d7875b..ae2e05f050ec 100644 --- a/arch/riscv/kvm/Kconfig +++ b/arch/riscv/kvm/Kconfig @@ -30,7 +30,7 @@ config KVM select KVM_GENERIC_HARDWARE_ENABLING select KVM_MMIO select KVM_XFER_TO_GUEST_WORK - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER select PREEMPT_NOTIFIERS help Support hosting virtualized guest machines. diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 28bd38303d70..f9a927296d85 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2110,8 +2110,6 @@ enum { # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, 0) #endif -#define KVM_ARCH_WANT_MMU_NOTIFIER - int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v); int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu); int kvm_cpu_has_extint(struct kvm_vcpu *v); diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 89ca7f4c1464..a7eb2bdbfb18 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -24,7 +24,7 @@ config KVM depends on HIGH_RES_TIMERS depends on X86_LOCAL_APIC select PREEMPT_NOTIFIERS - select MMU_NOTIFIER + select KVM_GENERIC_MMU_NOTIFIER select HAVE_KVM_IRQCHIP select HAVE_KVM_PFNCACHE select HAVE_KVM_IRQFD diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 90a0be261a5c..d2d3e083ec7f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -255,7 +255,9 @@ bool kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); #endif -#ifdef KVM_ARCH_WANT_MMU_NOTIFIER +struct kvm_gfn_range; + +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER struct kvm_gfn_range { struct kvm_memory_slot *slot; gfn_t start; @@ -784,7 +786,7 @@ struct kvm { struct hlist_head irq_ack_notifier_list; #endif -#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER struct mmu_notifier mmu_notifier; unsigned long mmu_invalidate_seq; long mmu_invalidate_in_progress; @@ -1916,7 +1918,7 @@ extern const struct _kvm_stats_desc kvm_vm_stats_desc[]; extern const struct kvm_stats_header kvm_vcpu_stats_header; extern const struct _kvm_stats_desc kvm_vcpu_stats_desc[]; -#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER static inline int mmu_invalidate_retry(struct kvm *kvm, unsigned long mmu_seq) { if (unlikely(kvm->mmu_invalidate_in_progress)) diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index b74916de5183..2fa11bd26cfc 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -95,3 +95,7 @@ config HAVE_KVM_PM_NOTIFIER config KVM_GENERIC_HARDWARE_ENABLING bool + +config KVM_GENERIC_MMU_NOTIFIER + select MMU_NOTIFIER + bool diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 8101b11a13ba..53346bc2902a 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -510,7 +510,7 @@ void kvm_destroy_vcpus(struct kvm *kvm) } EXPORT_SYMBOL_GPL(kvm_destroy_vcpus); -#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER static inline struct kvm *mmu_notifier_to_kvm(struct mmu_notifier *mn) { return container_of(mn, struct kvm, mmu_notifier); @@ -938,14 +938,14 @@ static int kvm_init_mmu_notifier(struct kvm *kvm) return mmu_notifier_register(&kvm->mmu_notifier, current->mm); } -#else /* !(CONFIG_MMU_NOTIFIER && KVM_ARCH_WANT_MMU_NOTIFIER) */ +#else /* !CONFIG_KVM_GENERIC_MMU_NOTIFIER */ static int kvm_init_mmu_notifier(struct kvm *kvm) { return 0; } -#endif /* CONFIG_MMU_NOTIFIER && KVM_ARCH_WANT_MMU_NOTIFIER */ +#endif /* CONFIG_KVM_GENERIC_MMU_NOTIFIER */ #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER static int kvm_pm_notifier_call(struct notifier_block *bl, @@ -1265,7 +1265,7 @@ static struct kvm *kvm_create_vm(unsigned long type, const char *fdname) out_err_no_debugfs: kvm_coalesced_mmio_free(kvm); out_no_coalesced_mmio: -#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER if (kvm->mmu_notifier.ops) mmu_notifier_unregister(&kvm->mmu_notifier, current->mm); #endif @@ -1325,7 +1325,7 @@ static void kvm_destroy_vm(struct kvm *kvm) kvm->buses[i] = NULL; } kvm_coalesced_mmio_free(kvm); -#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) +#ifdef CONFIG_KVM_GENERIC_MMU_NOTIFIER mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm); /* * At this point, pending calls to invalidate_range_start() From patchwork Tue Jul 18 23:44:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317876 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 C2B71EB64DC for ; Tue, 18 Jul 2023 23:48:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 98B278D0025; Tue, 18 Jul 2023 19:48:46 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 93B238D0012; Tue, 18 Jul 2023 19:48:46 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7B4E88D0025; Tue, 18 Jul 2023 19:48:46 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 59AA68D0012 for ; Tue, 18 Jul 2023 19:48:46 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 396E84050A for ; Tue, 18 Jul 2023 23:48:46 +0000 (UTC) X-FDA: 81026375052.05.27C3DAA Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf22.hostedemail.com (Postfix) with ESMTP id 548F4C000A for ; Tue, 18 Jul 2023 23:48:44 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=LvUy9xBw; spf=pass (imf22.hostedemail.com: domain of 32yS3ZAYKCC4cOKXTMQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=32yS3ZAYKCC4cOKXTMQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724124; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ThXIJqX7As4i3dGm5wOXsZKmYyKWC1w3yhPdFi+UZh4=; b=iuMvu/VbzfBwlE6xa0BNR+Ypt9/zgA7xelfM9FUI1b+VwjMSegS2EYt449MQ9GKZI3mkH5 OUXzdu0Q5x57PFyfIvcjs+Q+QocJN7RC0wGHdoBXhryNm3JR4kQ3Bj8TkLTDitiQwI9qCD ewk9Q8swhdcpCKYGhccDAB92KYF8mdU= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724124; a=rsa-sha256; cv=none; b=4XT9apDtrR9FuFULNLi+BbRQUH3OJHahGpiJ5dKcHtXE1wgdG8PlWosWV92VUZIlTz8nDN f3rr6/GbHtOb5lsSpR/Bwcy6sZkL/KvLS8Cm9UDXompaaaSgtnmOzhGJqXjZiIOTt1JHkt 0V270Rg6gEf0l+BtifO1TicpmAf40rg= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=LvUy9xBw; spf=pass (imf22.hostedemail.com: domain of 32yS3ZAYKCC4cOKXTMQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=32yS3ZAYKCC4cOKXTMQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b9de7951easo32355105ad.0 for ; Tue, 18 Jul 2023 16:48:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724123; x=1692316123; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=ThXIJqX7As4i3dGm5wOXsZKmYyKWC1w3yhPdFi+UZh4=; b=LvUy9xBwtvIfAPCO5pNNhARQQ5SNv50VuwzjIysubxMyr/2WT9iQpqxA6erzK7bWiu qihBKH4SJZf0AvBAqcBEejRsurglq/OJfXy6wCGPqNGQh8Ro3lrbfPRoj8tfypGRMlsn Uqch0IxGwwo0DLlZrr1zeRuXu1xNXvsURj/8G/FFYVp7s8AUP5ynEAUgVaPHCZ8dBxWo XzgPa/CMeeijvZgR9bdbpmr2gQZWkwBUQDlw7rhcaUYjPEJTs8NmkEkBHw+XU/kMKj/i AePIN4rloEM+TeBH/xMOBZ/pVRG+4qprH3PDbeKaJmr2/1mChRw4GYfNQ4J/UBEhhSrm FjFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724123; x=1692316123; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ThXIJqX7As4i3dGm5wOXsZKmYyKWC1w3yhPdFi+UZh4=; b=DxBQHQasQsY2Ubnqn+xPtNuRtAlTJG3HYpnU8y/wNKX4OENB7fuV5jVqfjBmyo9C1f SF6wdhH9xF7MsB8CYW8j5atrxZlaleh0NdFJowkE35K82UtStgB0NnrKm992GS1m0P2y fMQXvXKKbD578pKywX1MC91tnD8sJJbFG5UjaDNCPSPBAT3rhcrPRsuCkTsDD8aMAVF4 HDZqzhbH1N1RZbhwju8SsX4c/0pZvxlH++3NUDfsGQiS/mjwJBOyZLSFK2BTo+elyQvi +7zTfWy2zJCdG8c/ZAVtsKnEmveMlyTqWTNBprV8+YqFMK8HEVOTEuzcexVsLcTNcECq AFjg== X-Gm-Message-State: ABy/qLZc6T7b78EgLNyOb8etapyOQKMy++FBUd/pHFKSy99nIwfyLh50 RBDxh33j37ckr2/d6iFb/U6FJn1mUf8= X-Google-Smtp-Source: APBJJlFjBm3uEK6hEcjuoeBKM7s5L/qQiT85mHjyEzQM1CYgv+bsN7btAmL4QIiVKpupcBcSQ8/VxXwLYM4= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ec88:b0:1b9:df8f:888c with SMTP id x8-20020a170902ec8800b001b9df8f888cmr16353plg.8.1689724123174; Tue, 18 Jul 2023 16:48:43 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:49 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-7-seanjc@google.com> Subject: [RFC PATCH v11 06/29] KVM: Introduce KVM_SET_USER_MEMORY_REGION2 From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: 548F4C000A X-Rspam-User: X-Stat-Signature: 1nsx88uyccf43yyc63f45w4z91w3yuyc X-Rspamd-Server: rspam03 X-HE-Tag: 1689724124-465153 X-HE-Meta: U2FsdGVkX18BUqsAPblcOm2O4fBcnZKVnoJW2lxXcRBPNSkzF2rFAmxl2HLIexleg26ml2MkbzknDp7BA0l17m+Phh2hYPf5pV1r99uNX5nCuvslkoBqOBU5sdR8cNO3uOzLpIgeeAdl/V86++SPZujkqY2CcBm7ixY5cRxBrtAWIyafZ283Vb03pqbpwg5N9scY880grAP9roeNAfaSP3wneOn43QUfphQp4oTNGa9HooYY0nDPDlhD+B9K8sNxgywbKSMPUznL7tJ9qTrTE4AzwY38MNtW3UpkH2TlqOLX6WzUlETRaqR5LGcysB8YYehySfwqHUhpO+CQC4jJ34/jKlkUMkGXuh/HnmQS+9cLlclyASdHE+XBo3nVd8D4UzJIZlAvJFajLcAOoGx/qAM6Fdvd113Sa76LndCcHoiVA7slRfZnNReyrnfxGOQTP4meVYzJDIUn4U02G2tsDQj9IqSXSZm4Z+bEzFAQetZnMP11pngYr7PKgfHnwvDsGN6APH8UmrfSwfhVq0KLiKfJt0BU5XuEVTW26SeGtyoqP0MECAdKqF1xL7H1nWdqUMDJqVCyHNON6qS/90CJgN9S+3/KIdDZHyMva/EEPfy73lmFr9O8P8VJwi5CsQvotU5Pgn9t/u9X9kGUJxEDuPGMGe4LwpOtgEabf4Yd3/tQJu/MJ4Xbpe7BN5MpxyaQ9bjwVjNHHf7OFkeXQuvp3mmjK5UazNKv7suJTkPHwwzXDm/j5hCCJNa5HwBXYbm0FL/fJzWuD9p6sDqScUOMsAQs8Sec/SvqVcVspX2/4IUjq0osOd4fwJRyntbDivP70OMzN6yJSy5MRPx7Kvd9babn+YpJu/vczP8ikMQcenQEhD1OxZ2/zbvt79MFokf+rxSGZlHLemnez/bXntUPsDhYcr02v+FOiTFD2IK4+ia5zlnq5x3wD+AWPZYdHPkPgnLWlolha8+qH9XX8TB ibajP8jN l++gbz684uQGkVnTyCQPw2RmiBlv+8irhOxSFeRD8xOmd0vMHJlW6FzigmCcpEnZOkDGQyg7dkhX2dq92Aquxxl21jQMO4ZpMHwgO62jnvEoBaxP2oSQ1McCl1ssO3f+ITtOlqjwH94qECbVVd4+aj9Q+8eKA/BsJXy4ptf4ooFkCsnx+jpcriBVVW/bR34khMEugo4/V7aAaQfMNtPuzIQPzFmxHjhSphSVJ2Itrz2k7wUBky8WYFtyykX7jYxfU/+zaVxbyQhmf08taOFM8FYiBc43fwcS+4ql0XZYq8zUKJeXaFLOOMWzoPBnK9EuUU1d5TCKztieR9NGAuxd+qGIYHxIRFVwL0gVxJ48d4CIpgHOLTwaCvYFU8qQm8GGQYrUmyfMA3jg04cuKppUTIqwHSYQqlU8Axmz98jMrCy3NM5Nt9gBejJZ3GOgyJsaFztU2IMnyAd4H9E2bANhHWQhFNM3mj9worm1TJan/f4N3bT66x5Ih/JhN8FXP7e5gMdM6E/3NdBHKocqKEU3jQuizF/7lcx3xldeN0JcW2QctUhJULSa4P6m0SqL6fSvKxoUwCuB1x9LtHrzhLbrVpPcoMMt7pMqXa7fLw2Csf0Xt7FsbS9gpw6eSnZp4qeuKtj/UEIZdXgQ7vm2CAkJF8PgNRv8+U/ySGWWsCcFwvfJjixo9tV0Sg9UMyJBMD/o6I959rh0Ehdxwxd0LjSR1uOO9AekU/tEorpXPjzfEPpWuCZR7rY0dzsyQ5xDZnxRKrkAQD/q4yeZlAQRCGfCHoXJ//MlbJYfrKZKjfKkHVhFlqrtp4J7vsLGrjPQ36ZeW9uLdyZSIUiZPARxPfSl1dSu4woAyStQr56v/yyGpf8zFFmQ2xTAjdQWDUg== 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: Cc: Jarkko Sakkinen Signed-off-by: Sean Christopherson Reviewed-by: Paolo Bonzini --- arch/x86/kvm/x86.c | 2 +- include/linux/kvm_host.h | 4 ++-- include/uapi/linux/kvm.h | 13 +++++++++++++ virt/kvm/kvm_main.c | 38 ++++++++++++++++++++++++++++++-------- 4 files changed, 46 insertions(+), 11 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index a6b9bea62fb8..92e77afd3ffd 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12420,7 +12420,7 @@ void __user * __x86_set_memory_region(struct kvm *kvm, int id, gpa_t gpa, } for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { - struct kvm_userspace_memory_region m; + struct kvm_userspace_memory_region2 m; m.slot = id | (i << 16); m.flags = 0; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index d2d3e083ec7f..e9ca49d451f3 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1130,9 +1130,9 @@ enum kvm_mr_change { }; int kvm_set_memory_region(struct kvm *kvm, - const struct kvm_userspace_memory_region *mem); + const struct kvm_userspace_memory_region2 *mem); int __kvm_set_memory_region(struct kvm *kvm, - const struct kvm_userspace_memory_region *mem); + const struct kvm_userspace_memory_region2 *mem); void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot); void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen); int kvm_arch_prepare_memory_region(struct kvm *kvm, diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index f089ab290978..4d4b3de8ac55 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -95,6 +95,16 @@ struct kvm_userspace_memory_region { __u64 userspace_addr; /* start of the userspace allocated memory */ }; +/* for KVM_SET_USER_MEMORY_REGION2 */ +struct kvm_userspace_memory_region2 { + __u32 slot; + __u32 flags; + __u64 guest_phys_addr; + __u64 memory_size; + __u64 userspace_addr; + __u64 pad[16]; +}; + /* * The bit 0 ~ bit 15 of kvm_userspace_memory_region::flags are visible for * userspace, other bits are reserved for kvm internal use which are defined @@ -1192,6 +1202,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_COUNTER_OFFSET 227 #define KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE 228 #define KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES 229 +#define KVM_CAP_USER_MEMORY2 230 #ifdef KVM_CAP_IRQ_ROUTING @@ -1466,6 +1477,8 @@ struct kvm_vfio_spapr_tce { struct kvm_userspace_memory_region) #define KVM_SET_TSS_ADDR _IO(KVMIO, 0x47) #define KVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO, 0x48, __u64) +#define KVM_SET_USER_MEMORY_REGION2 _IOW(KVMIO, 0x49, \ + struct kvm_userspace_memory_region2) /* enable ucontrol for s390 */ struct kvm_s390_ucas_mapping { diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 53346bc2902a..c14adf93daec 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1549,7 +1549,7 @@ static void kvm_replace_memslot(struct kvm *kvm, } } -static int check_memory_region_flags(const struct kvm_userspace_memory_region *mem) +static int check_memory_region_flags(const struct kvm_userspace_memory_region2 *mem) { u32 valid_flags = KVM_MEM_LOG_DIRTY_PAGES; @@ -1951,7 +1951,7 @@ static bool kvm_check_memslot_overlap(struct kvm_memslots *slots, int id, * Must be called holding kvm->slots_lock for write. */ int __kvm_set_memory_region(struct kvm *kvm, - const struct kvm_userspace_memory_region *mem) + const struct kvm_userspace_memory_region2 *mem) { struct kvm_memory_slot *old, *new; struct kvm_memslots *slots; @@ -2055,7 +2055,7 @@ int __kvm_set_memory_region(struct kvm *kvm, EXPORT_SYMBOL_GPL(__kvm_set_memory_region); int kvm_set_memory_region(struct kvm *kvm, - const struct kvm_userspace_memory_region *mem) + const struct kvm_userspace_memory_region2 *mem) { int r; @@ -2067,7 +2067,7 @@ int kvm_set_memory_region(struct kvm *kvm, EXPORT_SYMBOL_GPL(kvm_set_memory_region); static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm, - struct kvm_userspace_memory_region *mem) + struct kvm_userspace_memory_region2 *mem) { if ((u16)mem->slot >= KVM_USER_MEM_SLOTS) return -EINVAL; @@ -4514,6 +4514,7 @@ static int kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) { switch (arg) { case KVM_CAP_USER_MEMORY: + case KVM_CAP_USER_MEMORY2: case KVM_CAP_DESTROY_MEMORY_REGION_WORKS: case KVM_CAP_JOIN_MEMORY_REGIONS_WORKS: case KVM_CAP_INTERNAL_ERROR_DATA: @@ -4757,6 +4758,14 @@ static int kvm_vm_ioctl_get_stats_fd(struct kvm *kvm) return fd; } +#define SANITY_CHECK_MEM_REGION_FIELD(field) \ +do { \ + BUILD_BUG_ON(offsetof(struct kvm_userspace_memory_region, field) != \ + offsetof(struct kvm_userspace_memory_region2, field)); \ + BUILD_BUG_ON(sizeof_field(struct kvm_userspace_memory_region, field) != \ + sizeof_field(struct kvm_userspace_memory_region2, field)); \ +} while (0) + static long kvm_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) { @@ -4779,15 +4788,28 @@ static long kvm_vm_ioctl(struct file *filp, r = kvm_vm_ioctl_enable_cap_generic(kvm, &cap); break; } + case KVM_SET_USER_MEMORY_REGION2: case KVM_SET_USER_MEMORY_REGION: { - struct kvm_userspace_memory_region kvm_userspace_mem; + struct kvm_userspace_memory_region2 mem; + unsigned long size; + + if (ioctl == KVM_SET_USER_MEMORY_REGION) + size = sizeof(struct kvm_userspace_memory_region); + else + size = sizeof(struct kvm_userspace_memory_region2); + + /* Ensure the common parts of the two structs are identical. */ + SANITY_CHECK_MEM_REGION_FIELD(slot); + SANITY_CHECK_MEM_REGION_FIELD(flags); + SANITY_CHECK_MEM_REGION_FIELD(guest_phys_addr); + SANITY_CHECK_MEM_REGION_FIELD(memory_size); + SANITY_CHECK_MEM_REGION_FIELD(userspace_addr); r = -EFAULT; - if (copy_from_user(&kvm_userspace_mem, argp, - sizeof(kvm_userspace_mem))) + if (copy_from_user(&mem, argp, size)) goto out; - r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem); + r = kvm_vm_ioctl_set_memory_region(kvm, &mem); break; } case KVM_GET_DIRTY_LOG: { From patchwork Tue Jul 18 23:44:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317877 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 14369C001DC for ; Tue, 18 Jul 2023 23:48:50 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2649B8D0026; Tue, 18 Jul 2023 19:48:48 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 210FF8D0012; Tue, 18 Jul 2023 19:48:48 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 03AFE8D0026; Tue, 18 Jul 2023 19:48:47 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id E979B8D0012 for ; Tue, 18 Jul 2023 19:48:47 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id C85D01C8E51 for ; Tue, 18 Jul 2023 23:48:47 +0000 (UTC) X-FDA: 81026375094.25.CC82828 Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) by imf15.hostedemail.com (Postfix) with ESMTP id E68ADA0012 for ; Tue, 18 Jul 2023 23:48:45 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=fv5PAifQ; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf15.hostedemail.com: domain of 33SS3ZAYKCDAeQMZVOSaaSXQ.OaYXUZgj-YYWhMOW.adS@flex--seanjc.bounces.google.com designates 209.85.219.201 as permitted sender) smtp.mailfrom=33SS3ZAYKCDAeQMZVOSaaSXQ.OaYXUZgj-YYWhMOW.adS@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724125; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=YutdMElGbp9P5hSkuCpmC8VJ7V3PNb+s/AjU6M3aOE8=; b=gFlXHRE0qeBdDcCG3xyFMATFJ2VRi92ONg4ttcZIFrP1d8Z1Akzt0M/U4rvYMuWrmWudzd n6KmDJa2yYWJUFmO6Zyp1vcAzgAyrqUDOX05rEBJMI4er6t4B/U1wNM5n70dIscD/Rk06Q HfpliExnw926jlxjopQ0UE1BVcwXSG4= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=fv5PAifQ; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf15.hostedemail.com: domain of 33SS3ZAYKCDAeQMZVOSaaSXQ.OaYXUZgj-YYWhMOW.adS@flex--seanjc.bounces.google.com designates 209.85.219.201 as permitted sender) smtp.mailfrom=33SS3ZAYKCDAeQMZVOSaaSXQ.OaYXUZgj-YYWhMOW.adS@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724126; a=rsa-sha256; cv=none; b=VAycRLyUtrZYdIcl9tccuj7y9ldzzYeQ6KN0bXgit7Le3rXbj3MMjeZeM7cUwlcTrt9Z27 0hrsJFnmSU+Vfrnnu/IV+VW/9WD1+47hhuJDEDfRYhvk4H7gGTVJf1Zn2AYqJvSmPRy7XW cvdanJ2bvMaC1iLijClDsxAXm0yS+/0= Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-cac213f9264so6070885276.3 for ; Tue, 18 Jul 2023 16:48:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724125; x=1692316125; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=YutdMElGbp9P5hSkuCpmC8VJ7V3PNb+s/AjU6M3aOE8=; b=fv5PAifQ+IqLg5YCZqVv/8UfhbcgYKQcYF3VY0+jp+9AW0GEauEM9c/l2th/BfOtRm CQiXDrdFVD2W7gdnkrgGNuk1FWqnXZCui5KNHEJZNKFbYGE3o6y6cS/CRv3k2n8pR5iS sMPjf4zdwa9albkzvFhGKioR2FBoJS58rCVLaVO5jIXG18PShPMZQfFotlM0oiS44ak5 wH72KK42j+tXvl9XbOo8Q688HudYyAAS7uwccxs/g6IQguY5eI+gDO5TZMYBuh3X4bOG jik8MJDjJL4Dv3zLF48fb1grV3qG4y91bzqSazr3bySPVvnzIDpkEov2LrTDdj61DR8b pWpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724125; x=1692316125; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=YutdMElGbp9P5hSkuCpmC8VJ7V3PNb+s/AjU6M3aOE8=; b=k1OuEViSek2UtJmqN/qee1pyYygyB8eh/fYGTnMgA0In4Acz7qTd6Z/1CTR7rCVSLP Qrrj4sGpHsu+EGH9Sj/+ZbUNj+Bfmq6gjZjP03K0rrGBvv56gc99fgFMIttG//UKXkb/ v2D90JddSWAbI1pIXAQq+KVW4J7axDjScfptoCA06YolFgzd9qu7mi34aX3ryLtB5Vzd VOp/6gKEm29FHzuBpRBCNAothS+/gHeGzNhalW+jFyl9p80dWL9idcwMAef8oPjNyT5T UnuFUjvoHswGWs310nXKddpNJWGgWJAFBnexOeEaPRYUHpQJH3K4LXzdosWgpxa3O72w tnhA== X-Gm-Message-State: ABy/qLaK7G0JN1xOfBk3GChiAaBlxKlicM4Qj57sILH8oI7MVRNEf4we 9lrKfdnSrTiHOSJ20WCiZuzSo3q2REc= X-Google-Smtp-Source: APBJJlEBqRkJLxPhHZfq9dzn/bDkdLKPNX43lLfClkxec0b9fruWECEDkqvu4RpyrQH11Geekj2aMuiEVrw= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:ab04:0:b0:bfe:ea69:91b4 with SMTP id u4-20020a25ab04000000b00bfeea6991b4mr11891ybi.4.1689724125035; Tue, 18 Jul 2023 16:48:45 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:50 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-8-seanjc@google.com> Subject: [RFC PATCH v11 07/29] KVM: Add KVM_EXIT_MEMORY_FAULT exit From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: E68ADA0012 X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: 8bjw5kmisgpeiraodacn79bbkbfo988j X-HE-Tag: 1689724125-170079 X-HE-Meta: U2FsdGVkX19DLdVclYqMGYQRHs171U+iOkuxStF3goO2BtxM8FUwAGUXeJqWgfFxsu08RuhqFzIAha1E0BykRMqBCuRuUdcnIJn07KxrKQKjM3GnuwqXf92whV38EHl9xi8P1Mgm4vCJYXbsQCc/+rCOFG1RuhcVuCqBkPoUm4NM3tL6xSWPouLuPB2JjSO621Kldbtpsq+uwJgq5RkKkealoEarQvaTyr0UEGX8TL+BbXtrcBrXhGqp3XlOEz2kDlEhJHRs147U/Wev2tFOWtyZoya5q4BjNjD3ZjuESOaQvs7tpv9wadvdAVm3ldWC1ipDoSTBymsZdzOQ3C3JYghFC1dS+/foNmgSYwY/QUjyXhtco+Cg/8+E6SyQtK5uNG/rwXfMxkugc7UZZR1IDDsCahNfctFenvxcZp7iEYb4y35vH47zDx5wytG0kBQ0nQf+Ay/Ql3Fl1MK1jLYhZt2PZWLFrhyEdJ6rBtpMSm80gZpycVb37cv6gCaWw1SwAzLsFuF0NAmZjt+WA87WwVwvRdgwqhRU0HFfI2qHc/6S6FBlXfJjWCpfYHbXFtLAdIP6L2uGsNYd6mrnNm32VvfPncxEBhqoCVPmmJnNpt+IRouul2mQJIbKaPkiapRuuWWKKtvHurkBiMhmqgvC6ybCgRUW3UkcUdi6YrVGBQ6GJDD/1kLxXX1rc/g0V/PxutZKbv8wTbjKgRS3d6E+jitfFlEMVkuNvHduB1g/cv432o0teDKwguvJWSAOL25Tlv26TSftfmlPr+4kusgmYmnG+vYDBnC4VGtxasp0uRAI+Qkx5dMhS93iJnLkTx0VOFuXTUDJu2BIC0JO09E2Xo4lBDzZB9cJpKl0e4KMUvTvM4bLgbsAuEfeIdOz8VV8Nkl60eh2x2PX4SjcRfzTFcFd8UrLdt0ToIA/sh79YboK0mWRrFPZXylC3L/CTIsm3ELyt97TQ7LTLgvTG3H UbQJQY/m zszmASdr+OcbBBq23gKifsrdYbUJfQ4hWYPLD6VDCikDco1US1B/FOFmx3nykE5KvrPcrMsLg36Pwykt7igWXMMMTINEROWFCzmLDzWezxsi0JGJw2HECtFGyj8g98iutkRo8yRJC34mu+uG3HvOnmqi/Sh5EzNz36STWEL6jd4GHz8vfZbc2HpZHHKgGKuWNYGqfRmq2jOi7UyXV8LIEzlF2YcF77NEVgLrwsEn64M9H2Zgdy1fEVqTcDDZJml47dqhGW7l2dq/9cF10/28F7HKQOgc/9LD4ByHOFkZZBL2ofWlNXMWW97iULtob5DbBahfNYSd9MHVjNYjjX/1DaPDXsaCmoBSVgs625yROZZyBc5AfWmBB3Av5W6vNrL2MIhn8fQAvXlpJuLe9zAsv5NlJc31SCPBBNaWbMufS5Z+xkBJ3d+2JkmAJe0SUOxDagVddaCzLPs8SKesS2JXZFeD+MU9gTEjn7L1PSCaZZFa+MFFib3roijKmOBaPmTY/t4TPYEFI6iLQcunxb84QCmi4DyYTtEYAbaOM6u1JpGEEN58/UdKsaIB/NBk2SK4Vq1yi7eIhmfyXYKqfQjDGXdvWgOnZqmWO8wEar/NEHVmf5pW2dMDHPV/dAkM9czuIyQIS5MVbYEzB+4Q5xuEhQFZst/74ikbFn3to00tWYUu8MEOHG1Oc3Sf67cLSr6uGsJG9HR0rfdQpECbD11/vWRAUBio5VwIXkxzFAhSniYNQXS3zHS58uTFD5ARLM8dkosrzQchFXGb5qlAgV3toOQv2iTHfD6sRrvrYWpuzYPoJvuwJ3bRvqy3laRcF6JRhxKRY9Zr3jG2/tIDqQHOQ/0rb9NCvWiQsKG47gbXRfZqZi/4= 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: From: Chao Peng This new KVM exit allows userspace to handle memory-related errors. It indicates an error happens in KVM at guest memory range [gpa, gpa+size). The flags includes additional information for userspace to handle the error. Currently bit 0 is defined as 'private memory' where '1' indicates error happens due to private memory access and '0' indicates error happens due to shared memory access. When private memory is enabled, this new exit will be used for KVM to exit to userspace for shared <-> private memory conversion in memory encryption usage. In such usage, typically there are two kind of memory conversions: - explicit conversion: happens when guest explicitly calls into KVM to map a range (as private or shared), KVM then exits to userspace to perform the map/unmap operations. - implicit conversion: happens in KVM page fault handler where KVM exits to userspace for an implicit conversion when the page is in a different state than requested (private or shared). Suggested-by: Sean Christopherson Co-developed-by: Yu Zhang Signed-off-by: Yu Zhang Signed-off-by: Chao Peng Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/api.rst | 22 ++++++++++++++++++++++ include/uapi/linux/kvm.h | 8 ++++++++ 2 files changed, 30 insertions(+) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index c0ddd3035462..34d4ce66e0c8 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6700,6 +6700,28 @@ array field represents return values. The userspace should update the return values of SBI call before resuming the VCPU. For more details on RISC-V SBI spec refer, https://github.com/riscv/riscv-sbi-doc. +:: + + /* KVM_EXIT_MEMORY_FAULT */ + struct { + #define KVM_MEMORY_EXIT_FLAG_PRIVATE (1ULL << 3) + __u64 flags; + __u64 gpa; + __u64 size; + } memory; + +If exit reason is KVM_EXIT_MEMORY_FAULT then it indicates that the VCPU has +encountered a memory error which is not handled by KVM kernel module and +userspace may choose to handle it. The 'flags' field indicates the memory +properties of the exit. + + - KVM_MEMORY_EXIT_FLAG_PRIVATE - indicates the memory error is caused by + private memory access when the bit is set. Otherwise the memory error is + caused by shared memory access when the bit is clear. + +'gpa' and 'size' indicate the memory range the error occurs at. The userspace +may handle the error and return to KVM to retry the previous memory access. + :: /* KVM_EXIT_NOTIFY */ diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 4d4b3de8ac55..6c6ed214b6ac 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -274,6 +274,7 @@ struct kvm_xen_exit { #define KVM_EXIT_RISCV_SBI 35 #define KVM_EXIT_RISCV_CSR 36 #define KVM_EXIT_NOTIFY 37 +#define KVM_EXIT_MEMORY_FAULT 38 /* For KVM_EXIT_INTERNAL_ERROR */ /* Emulate instruction failed. */ @@ -520,6 +521,13 @@ struct kvm_run { #define KVM_NOTIFY_CONTEXT_INVALID (1 << 0) __u32 flags; } notify; + /* KVM_EXIT_MEMORY_FAULT */ + struct { +#define KVM_MEMORY_EXIT_FLAG_PRIVATE (1ULL << 3) + __u64 flags; + __u64 gpa; + __u64 size; + } memory; /* Fix the size of the union. */ char padding[256]; }; From patchwork Tue Jul 18 23:44:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317892 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 A4201EB64DC for ; Tue, 18 Jul 2023 23:49:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CC100280015; Tue, 18 Jul 2023 19:49:18 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C210D8D0012; Tue, 18 Jul 2023 19:49:18 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A9ABA280015; Tue, 18 Jul 2023 19:49:18 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 917118D0012 for ; Tue, 18 Jul 2023 19:49:18 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 5CE5EC04DD for ; Tue, 18 Jul 2023 23:49:18 +0000 (UTC) X-FDA: 81026376396.12.0E9C1A3 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf26.hostedemail.com (Postfix) with ESMTP id 23964140026 for ; Tue, 18 Jul 2023 23:48:47 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=JRs5Fpo3; spf=pass (imf26.hostedemail.com: domain of 33yS3ZAYKCDIgSObXQUccUZS.QcaZWbil-aaYjOQY.cfU@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=33yS3ZAYKCDIgSObXQUccUZS.QcaZWbil-aaYjOQY.cfU@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724128; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=+D+iQCqRORv7rzcWPLbRAE543/4V6X4FIuACtnFQl/8=; b=II8cRgJUMaoo6XZI8ZwZ2gx2F05EMgRbTuP1ACXCsfIS2MOes/F5TLNyb+EmYhvX6Ie8Qv 50eZL8yhJvLQIxv465km4S4Qi3D0rPVT6MY8xc8h2Cu1Lpd5Im+fmgbCFCeF6vpMzUwt1z 99+GR+Xtbu9T7trfkYZhwbB0sx3qZtg= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724128; a=rsa-sha256; cv=none; b=JiU+EaLVZOXsTSMIxc9gSYv+RMncC3qCsegPYnQuF10Bf6PxGL4Kkoe7yMDmfn4Lf6Bm6I cMZOrvxCTTuLusv+ZIJf8zrShz6qm2/At3nhv0GRDuzbuUM9ljos4VZXL6vUIYAKVM+Vy7 PkFFc75nN5+WRF1WPwQVLE92FforRfs= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=JRs5Fpo3; spf=pass (imf26.hostedemail.com: domain of 33yS3ZAYKCDIgSObXQUccUZS.QcaZWbil-aaYjOQY.cfU@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=33yS3ZAYKCDIgSObXQUccUZS.QcaZWbil-aaYjOQY.cfU@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-5771e0959f7so61313657b3.3 for ; Tue, 18 Jul 2023 16:48:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724127; x=1692316127; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=+D+iQCqRORv7rzcWPLbRAE543/4V6X4FIuACtnFQl/8=; b=JRs5Fpo3x46T6+km8oIsqrcTqHJwCyFhwDJKxRNqflXIcFIqgf9uC2oOdphE/PI4hQ q+ZHf0dR+kusvjzdVzCkq/zD35iP5Zxb+dlvGE9goGmd8XiwOLVYj77MOU2OfOlPx9+u 9Hiem6JpmvN0U8CVJSCuPcmrQdousz0G63YT/XxykxzMy2ip4r/70Zp0TCQcKMs5xnkA l/n8cBxKK/mDaSz8XleSCvVJZKdzQ3/8WhrMI9uDFz6Df61r/fXaeDhYQIFE52VSaUrq P+6kUn1uX2/GCgnu+oIYsDeHDBJeN75RQVUmg8bhh1/ZbQ557lWnBIDZ5xDqATblR0Fw 7pWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724127; x=1692316127; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=+D+iQCqRORv7rzcWPLbRAE543/4V6X4FIuACtnFQl/8=; b=bjnJPcZGAXkyPJf09EByBrjJrDYDSNPxfznB+RXtou02ZlSIB3wSF4ErtpYUyqy8o3 +h8D2D+m5Zf/JFuGaa2kDjw70kvukwpv3EMRCoQtvs0iD8eYisQQkVd60SQgCj2I3jY/ 07nOcAY364krg5bcfk1moZzyt563Pk4TQ8JsvSQTsrB9bohL4EmTsRnGicW/gfNsikZm C7R9rzQH2jX6BiS6q1a+QnmRsKzLBdIR1z8nE68d83rQ8BEP+3i61OqEAr3I0vMXAk0A ZvM7o+5vMDdWbv7moodASWrdw2huv6Mk2YPtGDX0wkAFA/kWEoou4yfyk3cSKxmyaP52 EDIA== X-Gm-Message-State: ABy/qLbsDElt1qwLkuhXsiiO2/j/+130OyOGeDXhKik+ObBqPulCAEVu QXxhE/Riw103NXYg6PSDlkvzjspPxgY= X-Google-Smtp-Source: APBJJlETVbNaBw8AmzW0kBWK5D2KmbeA61BBGbrJyPjvE+8fQP3x05cGyn057MO58Fd41aEU6AtTt8Up3BM= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a81:430c:0:b0:57a:fde:f25b with SMTP id q12-20020a81430c000000b0057a0fdef25bmr179924ywa.4.1689724127162; Tue, 18 Jul 2023 16:48:47 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:51 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-9-seanjc@google.com> Subject: [RFC PATCH v11 08/29] KVM: Introduce per-page memory attributes From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: 23964140026 X-Rspam-User: X-Stat-Signature: juy9wupcos4xtsrccbx9g8o9sqbr43ta X-Rspamd-Server: rspam03 X-HE-Tag: 1689724127-665009 X-HE-Meta: U2FsdGVkX1++QigrDfYfQnSewXsvCthUTkq45gxBA4O4Xo7p4m+ihVpmHrsaWz8bULKryiNd+q4LJaGUTVaschvng+FG9RVooGK3G66AOBCjXJWbNbeIPrutBP3RNtkAaKunNOHgWB4RaK4AfMS9kbtrndmI00jJAKb+64YW+FdgSM76/QdTl0MWxNdNW0m04/ObLB47eqgBv1/51tg5U7Cyc1z/9upRtWQvMjEyKD4tyDpU84OQFhfdFYmj7S24lBusrtgAn4FjBZDKWn5hvTeNn9tXu0gVkowX3GoIUiUXV3VuMvujV0FtfvKau5xnbtc+bGH5PkNfWglw0kS7PTMxXJXyNpCX9Va6H/6i8cAMG5acLjyH8WCvfcabxbsDDwmEQznBHMxECZuXuUMX5d0qgNRW1YCSFvKBb/QI2ymZp49n/chZZkAWKcw/HVEIHynJodr7ejvM8DaknTfGG97Cr8QS7I8Y1sOxxhOxXdQHY8ESrLeqtJkTGvoKbxsqMepJJUBVM36j5KULtqY0rR8GJJ8xEDIHsj3Tq+ILO3poTKgGcUPSkbCTp7vNXvRMg+VYv7FW1NeRLAxSL61sipM+txpH18d6rdeQ9Yc3t333At55GT45MqacufHVz2mAKN5BnD48cQrsHBBCv930Zqshq0PeAMzi0Mf3GP62NJCEvWBOqT5VwQj1SZ+kS2cSIgsCmpvWX9EgN5nw+B837PgTmZkWomlhX2Y5QNZPyc45b3VNBZ/3nxKNeeidOenlOwxSDIOvl4DtADKd8pPHPAvxtHTZo2lKiacyxb2qoIu8CPb0e6nNCwSjhHcIWKozntTwe5jbjo3kohFjs+bSfF5XzGtHtHeWaFpUnWDyLFZoO62Mjze6RNYKW2lDqLOnUI4C7CF6g4IWqKJ7U/WVeDtwEKldcWdAKugtenIjF40mkUW7IpIBr5gx+c2ZWkGUJRvN85EAUo3ns8e66N/ FDnDNpN/ vNZNmPXCp3WtFzsBlnn2Y8FE7XczY/lvr0ebiaoFp2cXzRQj5DVoTYPtejbftaZ0ur8enQX+1Dw27Bdk+27ibBcT+ZZslJyvxoU5YxZhb5Rfow12vvjtRFUwAI6W0HmeeGad2+SIzm+RfqpjN4onJwmAgTauQzk4Cz3dvyrnl7tFCbqDubILbzbiLfgrWWLH4Cyd7Rz7DdsSNFDui+OJC1r3RqHfA59HwJ4L/CfZYfZLhmfcANV0DITk3jitqaxoIVwwwu+1EVHZMNg3Ph1Ot1Vj+aCKV2sOGbi0uJd4EwE1eU32Gj0p7XOSmY19zCt86yzo8eI1WYjISgla7xt0n8cHzFweYo6ZohXUFBHSm+Euh+hzuQ2voizPT7hHl8MrDSLOOJ8m3ZjD465YC1KhuL/AHBIJodJQFeMd/sT1qXp7Nh5wHTKCc7PN25owlgwzuC4y5EFbehKgC/s0Qfw5Tw+RChWOMBZ5o2GiuXJihOdm6gb1TBBmUJukuEgzNQv7bIp0pZ9fRoXUP2MeA82a+4PTz42DJrOpddAFgXrn+lOSSr1grJQPKnhppDML4L1Hz87539sMQdX//iL0qc8zHsEZaOoa2ifwFByPZhldDuXFv05NJU9OgH4gSmT2qgbHVPu7EoYam9aS8SQbBhOC7slph57DR+63mLHWjPbq7GGBAfexm2hS8hyYNVTrXsXdZZKIDFg54XJK4bUM9E+6BUxcnVMB3E0vscjc2u/WeqcM0noBC/1308qDamYd1oXZaD7fCGIkTd78Xyb4nHzIrErcHK2dkmYWtaCvGlQFubIziEqiT7gQCtgHBFt87SGPyFdD70W8g3wnLaE/54GzF87Fu7YBaaO3XrG5j 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: From: Chao Peng In confidential computing usages, whether a page is private or shared is necessary information for KVM to perform operations like page fault handling, page zapping etc. There are other potential use cases for per-page memory attributes, e.g. to make memory read-only (or no-exec, or exec-only, etc.) without having to modify memslots. Introduce two ioctls (advertised by KVM_CAP_MEMORY_ATTRIBUTES) to allow userspace to operate on the per-page memory attributes. - KVM_SET_MEMORY_ATTRIBUTES to set the per-page memory attributes to a guest memory range. - KVM_GET_SUPPORTED_MEMORY_ATTRIBUTES to return the KVM supported memory attributes. Use an xarray to store the per-page attributes internally, with a naive, not fully optimized implementation, i.e. prioritize correctness over performance for the initial implementation. Because setting memory attributes is roughly analogous to mprotect() on memory that is mapped into the guest, zap existing mappings prior to updating the memory attributes. Opportunistically provide an arch hook for the post-set path (needed to complete invalidation anyways) in anticipation of x86 needing the hook to update metadata related to determining whether or not a given gfn can be backed with various sizes of hugepages. It's possible that future usages may not require an invalidation, e.g. if KVM ends up supporting RWX protections and userspace grants _more_ protections, but again opt for simplicity and punt optimizations to if/when they are needed. Suggested-by: Sean Christopherson Link: https://lore.kernel.org/all/Y2WB48kD0J4VGynX@google.com Cc: Fuad Tabba Signed-off-by: Chao Peng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Paolo Bonzini Signed-off-by: Isaku Yamahata --- Documentation/virt/kvm/api.rst | 60 ++++++++++++ include/linux/kvm_host.h | 14 +++ include/uapi/linux/kvm.h | 14 +++ virt/kvm/Kconfig | 4 + virt/kvm/kvm_main.c | 170 +++++++++++++++++++++++++++++++++ 5 files changed, 262 insertions(+) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 34d4ce66e0c8..0ca8561775ac 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6068,6 +6068,56 @@ writes to the CNTVCT_EL0 and CNTPCT_EL0 registers using the SET_ONE_REG interface. No error will be returned, but the resulting offset will not be applied. +4.139 KVM_GET_SUPPORTED_MEMORY_ATTRIBUTES +----------------------------------------- + +:Capability: KVM_CAP_MEMORY_ATTRIBUTES +:Architectures: x86 +:Type: vm ioctl +:Parameters: u64 memory attributes bitmask(out) +:Returns: 0 on success, <0 on error + +Returns supported memory attributes bitmask. Supported memory attributes will +have the corresponding bits set in u64 memory attributes bitmask. + +The following memory attributes are defined:: + + #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) + +4.140 KVM_SET_MEMORY_ATTRIBUTES +----------------------------------------- + +:Capability: KVM_CAP_MEMORY_ATTRIBUTES +:Architectures: x86 +:Type: vm ioctl +:Parameters: struct kvm_memory_attributes(in/out) +:Returns: 0 on success, <0 on error + +Sets memory attributes for pages in a guest memory range. Parameters are +specified via the following structure:: + + struct kvm_memory_attributes { + __u64 address; + __u64 size; + __u64 attributes; + __u64 flags; + }; + +The user sets the per-page memory attributes to a guest memory range indicated +by address/size, and in return KVM adjusts address and size to reflect the +actual pages of the memory range have been successfully set to the attributes. +If the call returns 0, "address" is updated to the last successful address + 1 +and "size" is updated to the remaining address size that has not been set +successfully. The user should check the return value as well as the size to +decide if the operation succeeded for the whole range or not. The user may want +to retry the operation with the returned address/size if the previous range was +partially successful. + +Both address and size should be page aligned and the supported attributes can be +retrieved with KVM_GET_SUPPORTED_MEMORY_ATTRIBUTES. + +The "flags" field may be used for future extensions and should be set to 0s. + 5. The kvm_run structure ======================== @@ -8494,6 +8544,16 @@ block sizes is exposed in KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES as a 64-bit bitmap (each bit describing a block size). The default value is 0, to disable the eager page splitting. +8.41 KVM_CAP_MEMORY_ATTRIBUTES +------------------------------ + +:Capability: KVM_CAP_MEMORY_ATTRIBUTES +:Architectures: x86 +:Type: vm + +This capability indicates KVM supports per-page memory attributes and ioctls +KVM_GET_SUPPORTED_MEMORY_ATTRIBUTES/KVM_SET_MEMORY_ATTRIBUTES are available. + 9. Known KVM API problems ========================= diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index e9ca49d451f3..97db63da6227 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -264,6 +264,7 @@ struct kvm_gfn_range { gfn_t end; union { pte_t pte; + unsigned long attributes; u64 raw; } arg; bool may_block; @@ -809,6 +810,9 @@ struct kvm { #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER struct notifier_block pm_notifier; +#endif +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + struct xarray mem_attr_array; #endif char stats_id[KVM_STATS_NAME_SIZE]; }; @@ -2301,4 +2305,14 @@ static inline void kvm_account_pgtable_pages(void *virt, int nr) /* Max number of entries allowed for each kvm dirty ring */ #define KVM_DIRTY_RING_MAX_ENTRIES 65536 +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +static inline unsigned long kvm_get_memory_attributes(struct kvm *kvm, gfn_t gfn) +{ + return xa_to_value(xa_load(&kvm->mem_attr_array, gfn)); +} + +bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range); +#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ + #endif diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 6c6ed214b6ac..f065c57db327 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -1211,6 +1211,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE 228 #define KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES 229 #define KVM_CAP_USER_MEMORY2 230 +#define KVM_CAP_MEMORY_ATTRIBUTES 231 #ifdef KVM_CAP_IRQ_ROUTING @@ -2270,4 +2271,17 @@ struct kvm_s390_zpci_op { /* flags for kvm_s390_zpci_op->u.reg_aen.flags */ #define KVM_S390_ZPCIOP_REGAEN_HOST (1 << 0) +/* Available with KVM_CAP_MEMORY_ATTRIBUTES */ +#define KVM_GET_SUPPORTED_MEMORY_ATTRIBUTES _IOR(KVMIO, 0xd2, __u64) +#define KVM_SET_MEMORY_ATTRIBUTES _IOW(KVMIO, 0xd3, struct kvm_memory_attributes) + +struct kvm_memory_attributes { + __u64 address; + __u64 size; + __u64 attributes; + __u64 flags; +}; + +#define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) + #endif /* __LINUX_KVM_H */ diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 2fa11bd26cfc..8375bc49f97d 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -99,3 +99,7 @@ config KVM_GENERIC_HARDWARE_ENABLING config KVM_GENERIC_MMU_NOTIFIER select MMU_NOTIFIER bool + +config KVM_GENERIC_MEMORY_ATTRIBUTES + select KVM_GENERIC_MMU_NOTIFIER + bool diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index c14adf93daec..1a31bfa025b0 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -530,6 +530,7 @@ struct kvm_mmu_notifier_range { u64 end; union { pte_t pte; + unsigned long attributes; u64 raw; } arg; gfn_handler_t handler; @@ -1175,6 +1176,9 @@ static struct kvm *kvm_create_vm(unsigned long type, const char *fdname) spin_lock_init(&kvm->mn_invalidate_lock); rcuwait_init(&kvm->mn_memslots_update_rcuwait); xa_init(&kvm->vcpu_array); +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + xa_init(&kvm->mem_attr_array); +#endif INIT_LIST_HEAD(&kvm->gpc_list); spin_lock_init(&kvm->gpc_lock); @@ -1346,6 +1350,9 @@ static void kvm_destroy_vm(struct kvm *kvm) kvm_free_memslots(kvm, &kvm->__memslots[i][0]); kvm_free_memslots(kvm, &kvm->__memslots[i][1]); } +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + xa_destroy(&kvm->mem_attr_array); +#endif cleanup_srcu_struct(&kvm->irq_srcu); cleanup_srcu_struct(&kvm->srcu); kvm_arch_free_vm(kvm); @@ -2346,6 +2353,145 @@ static int kvm_vm_ioctl_clear_dirty_log(struct kvm *kvm, } #endif /* CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT */ +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +static u64 kvm_supported_mem_attributes(struct kvm *kvm) +{ + return 0; +} + +static __always_inline void kvm_handle_gfn_range(struct kvm *kvm, + struct kvm_mmu_notifier_range *range) +{ + struct kvm_gfn_range gfn_range; + struct kvm_memory_slot *slot; + struct kvm_memslots *slots; + struct kvm_memslot_iter iter; + bool locked = false; + bool ret = false; + int i; + + gfn_range.arg.raw = range->arg.raw; + gfn_range.may_block = range->may_block; + + for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + slots = __kvm_memslots(kvm, i); + + kvm_for_each_memslot_in_gfn_range(&iter, slots, range->start, range->end) { + slot = iter.slot; + gfn_range.slot = slot; + + gfn_range.start = max(range->start, slot->base_gfn); + gfn_range.end = min(range->end, slot->base_gfn + slot->npages); + if (gfn_range.start >= gfn_range.end) + continue; + + if (!locked) { + locked = true; + KVM_MMU_LOCK(kvm); + if (!IS_KVM_NULL_FN(range->on_lock)) + range->on_lock(kvm); + } + + ret |= range->handler(kvm, &gfn_range); + } + } + + if (range->flush_on_ret && ret) + kvm_flush_remote_tlbs(kvm); + + if (locked) { + KVM_MMU_UNLOCK(kvm); + if (!IS_KVM_NULL_FN(range->on_unlock)) + range->on_unlock(kvm); + } +} + +static int kvm_vm_set_mem_attributes(struct kvm *kvm, unsigned long attributes, + gfn_t start, gfn_t end) +{ + struct kvm_mmu_notifier_range unmap_range = { + .start = start, + .end = end, + .handler = kvm_mmu_unmap_gfn_range, + .on_lock = kvm_mmu_invalidate_begin, + .on_unlock = (void *)kvm_null_fn, + .flush_on_ret = true, + .may_block = true, + }; + struct kvm_mmu_notifier_range post_set_range = { + .start = start, + .end = end, + .arg.attributes = attributes, + .handler = kvm_arch_post_set_memory_attributes, + .on_lock = (void *)kvm_null_fn, + .on_unlock = kvm_mmu_invalidate_end, + .may_block = true, + }; + unsigned long i; + void *entry; + int r; + + entry = attributes ? xa_mk_value(attributes) : NULL; + + mutex_lock(&kvm->slots_lock); + + /* + * Reserve memory ahead of time to avoid having to deal with failures + * partway through setting the new attributes. + */ + for (i = start; i < end; i++) { + r = xa_reserve(&kvm->mem_attr_array, i, GFP_KERNEL_ACCOUNT); + if (r) + goto out_unlock; + } + + kvm_handle_gfn_range(kvm, &unmap_range); + + for (i = start; i < end; i++) { + r = xa_err(xa_store(&kvm->mem_attr_array, i, entry, + GFP_KERNEL_ACCOUNT)); + KVM_BUG_ON(r, kvm); + } + + kvm_handle_gfn_range(kvm, &post_set_range); + +out_unlock: + mutex_unlock(&kvm->slots_lock); + + return r; +} +static int kvm_vm_ioctl_set_mem_attributes(struct kvm *kvm, + struct kvm_memory_attributes *attrs) +{ + gfn_t start, end; + + /* flags is currently not used. */ + if (attrs->flags) + return -EINVAL; + if (attrs->attributes & ~kvm_supported_mem_attributes(kvm)) + return -EINVAL; + if (attrs->size == 0 || attrs->address + attrs->size < attrs->address) + return -EINVAL; + if (!PAGE_ALIGNED(attrs->address) || !PAGE_ALIGNED(attrs->size)) + return -EINVAL; + + start = attrs->address >> PAGE_SHIFT; + end = (attrs->address + attrs->size - 1 + PAGE_SIZE) >> PAGE_SHIFT; + + if (WARN_ON_ONCE(start == end)) + return -EINVAL; + + /* + * xarray tracks data using "unsigned long", and as a result so does + * KVM. For simplicity, supports generic attributes only on 64-bit + * architectures. + */ + BUILD_BUG_ON(sizeof(attrs->attributes) != sizeof(unsigned long)); + + return kvm_vm_set_mem_attributes(kvm, attrs->attributes, start, end); +} +#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ + struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn) { return __gfn_to_memslot(kvm_memslots(kvm), gfn); @@ -4521,6 +4667,9 @@ static int kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) #ifdef CONFIG_HAVE_KVM_MSI case KVM_CAP_SIGNAL_MSI: #endif +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + case KVM_CAP_MEMORY_ATTRIBUTES: +#endif #ifdef CONFIG_HAVE_KVM_IRQFD case KVM_CAP_IRQFD: #endif @@ -4937,6 +5086,27 @@ static long kvm_vm_ioctl(struct file *filp, break; } #endif /* CONFIG_HAVE_KVM_IRQ_ROUTING */ +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + case KVM_GET_SUPPORTED_MEMORY_ATTRIBUTES: { + u64 attrs = kvm_supported_mem_attributes(kvm); + + r = -EFAULT; + if (copy_to_user(argp, &attrs, sizeof(attrs))) + goto out; + r = 0; + break; + } + case KVM_SET_MEMORY_ATTRIBUTES: { + struct kvm_memory_attributes attrs; + + r = -EFAULT; + if (copy_from_user(&attrs, argp, sizeof(attrs))) + goto out; + + r = kvm_vm_ioctl_set_mem_attributes(kvm, &attrs); + break; + } +#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ case KVM_CREATE_DEVICE: { struct kvm_create_device cd; From patchwork Tue Jul 18 23:44:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317878 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 EEE42EB64DC for ; Tue, 18 Jul 2023 23:48:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 718EC8D0027; Tue, 18 Jul 2023 19:48:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6CB178D0012; Tue, 18 Jul 2023 19:48:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 56B058D0027; Tue, 18 Jul 2023 19:48:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 4298E8D0012 for ; Tue, 18 Jul 2023 19:48:52 -0400 (EDT) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 172804050A for ; Tue, 18 Jul 2023 23:48:52 +0000 (UTC) X-FDA: 81026375304.26.9E2B718 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf26.hostedemail.com (Postfix) with ESMTP id 366FB140005 for ; Tue, 18 Jul 2023 23:48:49 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=IZaEPyOB; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf26.hostedemail.com: domain of 34CS3ZAYKCDMhTPcYRVddVaT.RdbaXcjm-bbZkPRZ.dgV@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=34CS3ZAYKCDMhTPcYRVddVaT.RdbaXcjm-bbZkPRZ.dgV@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724130; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Fu4IZGb2U3Va9MKTtjfVBe1U+H33z+Vvz3vKzeN2toA=; b=rXZpF74d2f0tJ5nx4P1p9djsPY6CB2YY3Me0nOxfbHpfcuZkYANuriBqOJbjcQr9q0jlri t+Pu6AptG+DQMxv2L0ua2BJH72jlYAHlgTc/kezZNq+dUmiOgHMPZDi7k3v5xBZJt0yBsN Us2zGW1cCNRA4CtuCWFZi68DdtrkHHo= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=IZaEPyOB; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf26.hostedemail.com: domain of 34CS3ZAYKCDMhTPcYRVddVaT.RdbaXcjm-bbZkPRZ.dgV@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=34CS3ZAYKCDMhTPcYRVddVaT.RdbaXcjm-bbZkPRZ.dgV@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724130; a=rsa-sha256; cv=none; b=1VFbQ2YC/214UNeIu9YxW+QMoGkjyIxWAnvnn4UZ78RzMcOwDfFxmGgHf8wa3rJH7K1vST o3QcSzkYtoQ1p3ZvCrTufryZpKAGbBYQyNRpoWyDaG/R1suG0aEQoA9mbqPJlMm9C137xK +A6Y6eaQT2M90uSykcrpMPg2EFNFQmo= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b8b30f781cso32250995ad.2 for ; Tue, 18 Jul 2023 16:48:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724129; x=1692316129; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=Fu4IZGb2U3Va9MKTtjfVBe1U+H33z+Vvz3vKzeN2toA=; b=IZaEPyOB4Xi+5QmwIHD8P7bc+aaX+suafWFmyT5uwQp3NUo61kUBrlISRhIplzjVEY uIBImmDPLupPxDXzTC/50r1tCCSeNlOhOVA9fS78zyP8h2biybmVrYzbOwK26JEGKHg7 I6sJKMWknlDa2y4/RkUGMNcU33LK92gZhfmmSlvWmT3ZRUCpnDAoSRUYtWBJR6q/98qc 7IYBfRSml8lO4T0/G64blb3o3A6eL3IHfZ2JdAaLZw/yFNgP47pFoelbwcMFEWdCuDgU rwttR7vXoy9ZQPZyTuXNE5j4H6jC+h7BIC2q5luL01pI3AyzFKBb/KLl+zHlx/O6BsOV E2/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724129; x=1692316129; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Fu4IZGb2U3Va9MKTtjfVBe1U+H33z+Vvz3vKzeN2toA=; b=Tqlhg+gDUvCZjNd25pTrKWzwQGnVloAqZTuNzesjFwD9r4CAd7E8NaQCx3dDSh80/+ clCzEhO1WN4UGGddsbqNrg0QRXI1Q06aeD9lAICQL9ehgACXwBKuKQTBb/0hCySx8JUz IM3kYoPnr6WqpHH/EpoF8I2i5U63ZIuK8gx9oyB7yFgthlYiRV3hwU6Fc+tFJAGdogH0 cIkphNElrc9PvzVkOwrbgmo/mi/axQOHkm9MQuHqNDre/ktcckOBzF54oyi/iue7nY2B /b47ueo2HeLf9DSl0eMJrGgWhIiV2XO36+61QOicpgQ5l/5V0ed8pcT6TPX3whQfwcGk 0jlA== X-Gm-Message-State: ABy/qLYjn26fav7/RXyKj04Vh7h7e8KnucS0/dTMRDrRAV4uOHmZ1cP/ pKqDdAViph3J1eGBulhKCm/Xt23+cGo= X-Google-Smtp-Source: APBJJlHCRauC+c30Qnbz/xVE6cHMskqGKCbuMUu/5uTMRLvWSmi8GHs1UQtZYN/I3Q3rU07U5notqbe0Vyo= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:903:41ca:b0:1b8:a54c:61ef with SMTP id u10-20020a17090341ca00b001b8a54c61efmr8486ple.9.1689724128966; Tue, 18 Jul 2023 16:48:48 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:52 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-10-seanjc@google.com> Subject: [RFC PATCH v11 09/29] KVM: x86: Disallow hugepages when memory attributes are mixed From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspam-User: X-Stat-Signature: awe34hamoqrkdrrfz5aqoe7k31dcctq4 X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 366FB140005 X-HE-Tag: 1689724129-777707 X-HE-Meta: U2FsdGVkX1/IEVWxDbiBjHM6Issc0UWtdRYpVmue49OnWol4OWajmr0hJbfwIjJz5XnOlLvNDvDFXlUkil81gH2ifa1DO6EdAhKbTisxTzQpf+cRZX4Oe0FZT5fKSvYmBkCSRxTx3ZLlRFVuFzJ1DRZ7Wmuhip25J0ZD+vfdjhwe7AyrrdmH4tnohfnkcvyYsoFh3bR8QlNKPOVuqOSSvKrssydFLdAj2mf5Us//55Vd0o28mPy19wqe5iFdxj9UQf/bwu6hyCSKdJL6OuIaBhsnrRD4Ha8iueB7dZAUUZJMHsO+aq/vMqlMT+9OP/nIwdx7P2U3FSZQaGNVpsjOtwMTB/faOM0QPmp2C3957kTuN9T0NEGzWNmoQDwTRVXmj79hqrGLmXZpvqS+xpYBSijNda4q7Dc76DKgJhG4Z8p/5VQgsMRkuv5PEET7yYyMNUlq4DrEXyCzsqgFkFnMjR1MhHiGCm8jdY+oKkF6hc2SNL1AZhu+CDHZyWnFVd/De9JAB8946bzAKAjgnPycQBhkyqOmJ+izy7lhpVaIRmSD0YTPq1XntvAVRlbtbnUhQ75lZ1C89VjYTkQ1HmXnY7Q0pdDLsWBBviGRztEpwPW4P1IUN6uSzCydK8E/0ms/KXTv1MpbR6gNkb8Ck1MhEKN9AmsITazblFQJ5APHXmGJQfpHoVujeBv8F4SZKrzcKr2P7BY1LUMCuV3CBuGQMLP/PsCDH6bajhgHQlhSf0kD5H5H7PA1xUCXORnR0YACy+TuNLwKKfRITOmxmgoCJNjlwhod5V30BnxFGKZilq2TkZQGfnWZqLW2VfoHWSRaIb7lW6N8w+j1bW4GPe6G9cXfvg7plPfmmbP4aB9CJ+5XJmE9socgvXhjagjbcYA6z8g2lg/jfmKZGvUR5VSFUOnSaMrKx9LrqcpTZRRFQc9aqh3OVv9OVNBBGejvjVVUs62noqO5HUEZqm8Kb/K 8mgMbmuc AhhsnqGNIRLiuh+IJWnuB4T9YhkyVsBPQlk58NvyMT+cqvUIUepEJrhMGOUnDVUF40SwcKuElvmv9cwKBj8D5X0smezgaRardbmXp3Q0K1ld1l0dEGzj8WD5XvkcHmjeDVzBRw5nTZd2t+BUf/zrAOgeMOJ7CIgWeJf0vZwMgEsDbzgYxheWIwBttOdAVSOBn3rwTRdUW0v8JiHaxf+xhEXEGdYO19WNmPWk6HJwFbFJx9kbdFix5S8JGkDnCJW8toD8x7C1onW8oN74TIO1Nhdm+GbvrqE3r6OUuM7pjhKOz/0jxkOAVXwOTZKgdXo7jBXRXZpf5TI16MYjpn4bFqdaewjYxH1vAxIWVo8g5k5COCn3OxpZJNssqX4VYUdhUgQ4H1elNW9e/zGb2m1ktXpiWSHSN3zg++Ba8wSjtDviw3EQmPDAv+XTMx4frZamyJnl0ObaqRoDggJ4Q2ER7WRm1D4w/eBLrJfrO9GPPYDuQitIviYwzml6S3LFiGCd+9q66giIlgY1MAQ7qMJRYWniHiFUkS1Dvg7tHqAHzH4PAJjHNG8U0DwY5IAeJHAAUgro22Tsuo41t69vrRG7oSN2CbibgFrG/v0+xlOMv08CsMxLxmCciCnj4I4nCLq2JYrRuCRMqsQJFH3uSsk/Nn8bb5eF6tjQKBwZcC2DmdrXVcjdgszGYCe0vXhAs8S0/b9vpHgQI3hQZW/LLXYQ3mE4fVl6R+YijBIQLY/Ggz5MheLTnrhqF20KrBc+8p1GHa5FTlNP4POLWA/8qnLYnFWve1AqUOufGwFBeuAeAo502Tbw= 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: From: Chao Peng Disallow creating hugepages with mixed memory attributes, e.g. shared versus private, as mapping a hugepage in this case would allow the guest to access memory with the wrong attributes, e.g. overlaying private memory with a shared hugepage. Tracking whether or not attributes are mixed via the existing disallow_lpage field, but use the most significant bit in 'disallow_lpage' to indicate a hugepage has mixed attributes instead using the normal refcounting. Whether or not attributes are mixed is binary; either they are or they aren't. Attempting to squeeze that info into the refcount is unnecessarily complex as it would require knowing the previous state of the mixed count when updating attributes. Using a flag means KVM just needs to ensure the current status is reflected in the memslots. Signed-off-by: Chao Peng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 3 + arch/x86/kvm/mmu/mmu.c | 185 +++++++++++++++++++++++++++++++- arch/x86/kvm/x86.c | 4 + 3 files changed, 190 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index f9a927296d85..b87ff7b601fa 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1816,6 +1816,9 @@ int kvm_mmu_create(struct kvm_vcpu *vcpu); int kvm_mmu_init_vm(struct kvm *kvm); void kvm_mmu_uninit_vm(struct kvm *kvm); +void kvm_mmu_init_memslot_memory_attributes(struct kvm *kvm, + struct kvm_memory_slot *slot); + void kvm_mmu_after_set_cpuid(struct kvm_vcpu *vcpu); void kvm_mmu_reset_context(struct kvm_vcpu *vcpu); void kvm_mmu_slot_remove_write_access(struct kvm *kvm, diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index b034727c4cf9..aefe67185637 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -803,16 +803,27 @@ static struct kvm_lpage_info *lpage_info_slot(gfn_t gfn, return &slot->arch.lpage_info[level - 2][idx]; } +/* + * The most significant bit in disallow_lpage tracks whether or not memory + * attributes are mixed, i.e. not identical for all gfns at the current level. + * The lower order bits are used to refcount other cases where a hugepage is + * disallowed, e.g. if KVM has shadow a page table at the gfn. + */ +#define KVM_LPAGE_MIXED_FLAG BIT(31) + static void update_gfn_disallow_lpage_count(const struct kvm_memory_slot *slot, gfn_t gfn, int count) { struct kvm_lpage_info *linfo; - int i; + int old, i; for (i = PG_LEVEL_2M; i <= KVM_MAX_HUGEPAGE_LEVEL; ++i) { linfo = lpage_info_slot(gfn, slot, i); + + old = linfo->disallow_lpage; linfo->disallow_lpage += count; - WARN_ON(linfo->disallow_lpage < 0); + + WARN_ON_ONCE((old ^ linfo->disallow_lpage) & KVM_LPAGE_MIXED_FLAG); } } @@ -7223,3 +7234,173 @@ void kvm_mmu_pre_destroy_vm(struct kvm *kvm) if (kvm->arch.nx_huge_page_recovery_thread) kthread_stop(kvm->arch.nx_huge_page_recovery_thread); } + +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES +static bool hugepage_test_mixed(struct kvm_memory_slot *slot, gfn_t gfn, + int level) +{ + return lpage_info_slot(gfn, slot, level)->disallow_lpage & KVM_LPAGE_MIXED_FLAG; +} + +static void hugepage_clear_mixed(struct kvm_memory_slot *slot, gfn_t gfn, + int level) +{ + lpage_info_slot(gfn, slot, level)->disallow_lpage &= ~KVM_LPAGE_MIXED_FLAG; +} + +static void hugepage_set_mixed(struct kvm_memory_slot *slot, gfn_t gfn, + int level) +{ + lpage_info_slot(gfn, slot, level)->disallow_lpage |= KVM_LPAGE_MIXED_FLAG; +} + +static bool range_has_attrs(struct kvm *kvm, gfn_t start, gfn_t end, + unsigned long attrs) +{ + XA_STATE(xas, &kvm->mem_attr_array, start); + unsigned long index; + bool has_attrs; + void *entry; + + rcu_read_lock(); + + if (!attrs) { + has_attrs = !xas_find(&xas, end); + goto out; + } + + has_attrs = true; + for (index = start; index < end; index++) { + do { + entry = xas_next(&xas); + } while (xas_retry(&xas, entry)); + + if (xas.xa_index != index || xa_to_value(entry) != attrs) { + has_attrs = false; + break; + } + } + +out: + rcu_read_unlock(); + return has_attrs; +} + +static bool hugepage_has_attrs(struct kvm *kvm, struct kvm_memory_slot *slot, + gfn_t gfn, int level, unsigned long attrs) +{ + const unsigned long start = gfn; + const unsigned long end = start + KVM_PAGES_PER_HPAGE(level); + + if (level == PG_LEVEL_2M) + return range_has_attrs(kvm, start, end, attrs); + + for (gfn = start; gfn < end; gfn += KVM_PAGES_PER_HPAGE(level - 1)) { + if (hugepage_test_mixed(slot, gfn, level - 1) || + attrs != kvm_get_memory_attributes(kvm, gfn)) + return false; + } + return true; +} + +bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, + struct kvm_gfn_range *range) +{ + unsigned long attrs = range->arg.attributes; + struct kvm_memory_slot *slot = range->slot; + int level; + + lockdep_assert_held_write(&kvm->mmu_lock); + lockdep_assert_held(&kvm->slots_lock); + + /* + * KVM x86 currently only supports KVM_MEMORY_ATTRIBUTE_PRIVATE, skip + * the slot if the slot will never consume the PRIVATE attribute. + */ + if (!kvm_slot_can_be_private(slot)) + return false; + + /* + * The sequence matters here: upper levels consume the result of lower + * level's scanning. + */ + for (level = PG_LEVEL_2M; level <= KVM_MAX_HUGEPAGE_LEVEL; level++) { + gfn_t nr_pages = KVM_PAGES_PER_HPAGE(level); + gfn_t gfn = gfn_round_for_level(range->start, level); + + /* Process the head page if it straddles the range. */ + if (gfn != range->start || gfn + nr_pages > range->end) { + /* + * Skip mixed tracking if the aligned gfn isn't covered + * by the memslot, KVM can't use a hugepage due to the + * misaligned address regardless of memory attributes. + */ + if (gfn >= slot->base_gfn) { + if (hugepage_has_attrs(kvm, slot, gfn, level, attrs)) + hugepage_clear_mixed(slot, gfn, level); + else + hugepage_set_mixed(slot, gfn, level); + } + gfn += nr_pages; + } + + /* + * Pages entirely covered by the range are guaranteed to have + * only the attributes which were just set. + */ + for ( ; gfn + nr_pages <= range->end; gfn += nr_pages) + hugepage_clear_mixed(slot, gfn, level); + + /* + * Process the last tail page if it straddles the range and is + * contained by the memslot. Like the head page, KVM can't + * create a hugepage if the slot size is misaligned. + */ + if (gfn < range->end && + (gfn + nr_pages) <= (slot->base_gfn + slot->npages)) { + if (hugepage_has_attrs(kvm, slot, gfn, level, attrs)) + hugepage_clear_mixed(slot, gfn, level); + else + hugepage_set_mixed(slot, gfn, level); + } + } + return false; +} + +void kvm_mmu_init_memslot_memory_attributes(struct kvm *kvm, + struct kvm_memory_slot *slot) +{ + int level; + + if (!kvm_slot_can_be_private(slot)) + return; + + for (level = PG_LEVEL_2M; level <= KVM_MAX_HUGEPAGE_LEVEL; level++) { + /* + * Don't bother tracking mixed attributes for pages that can't + * be huge due to alignment, i.e. process only pages that are + * entirely contained by the memslot. + */ + gfn_t end = gfn_round_for_level(slot->base_gfn + slot->npages, level); + gfn_t start = gfn_round_for_level(slot->base_gfn, level); + gfn_t nr_pages = KVM_PAGES_PER_HPAGE(level); + gfn_t gfn; + + if (start < slot->base_gfn) + start += nr_pages; + + /* + * Unlike setting attributes, every potential hugepage needs to + * be manually checked as the attributes may already be mixed. + */ + for (gfn = start; gfn < end; gfn += nr_pages) { + unsigned long attrs = kvm_get_memory_attributes(kvm, gfn); + + if (hugepage_has_attrs(kvm, slot, gfn, level, attrs)) + hugepage_clear_mixed(slot, gfn, level); + else + hugepage_set_mixed(slot, gfn, level); + } + } +} +#endif diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 92e77afd3ffd..dd7cefe78815 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12570,6 +12570,10 @@ static int kvm_alloc_memslot_metadata(struct kvm *kvm, } } +#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES + kvm_mmu_init_memslot_memory_attributes(kvm, slot); +#endif + if (kvm_page_track_create_memslot(kvm, slot, npages)) goto out_free; From patchwork Tue Jul 18 23:44:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317879 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 1A829C001DC for ; Tue, 18 Jul 2023 23:48:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5E1CF8D0028; Tue, 18 Jul 2023 19:48:54 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 590F08D0012; Tue, 18 Jul 2023 19:48:54 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 459778D0028; Tue, 18 Jul 2023 19:48:54 -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 332968D0012 for ; Tue, 18 Jul 2023 19:48:54 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 05D211C8E50 for ; Tue, 18 Jul 2023 23:48:54 +0000 (UTC) X-FDA: 81026375388.11.987D299 Received: from mail-oa1-f73.google.com (mail-oa1-f73.google.com [209.85.160.73]) by imf06.hostedemail.com (Postfix) with ESMTP id 0C1F7180018 for ; Tue, 18 Jul 2023 23:48:51 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b="dy1/NFlQ"; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf06.hostedemail.com: domain of 34yS3ZAYKCDYkWSfbUYggYdW.Ugedafmp-eecnSUc.gjY@flex--seanjc.bounces.google.com designates 209.85.160.73 as permitted sender) smtp.mailfrom=34yS3ZAYKCDYkWSfbUYggYdW.Ugedafmp-eecnSUc.gjY@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724132; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=muvilKyoWvn1tarN80afquV4Wd3ZvyUZATzGD2ucPnA=; b=qWqR8CzwnTOBWjYw5n2InI5/bfuC5eBcgItFMKV3QyrrMBV2wj6k/nKb+wmmx4AAgyAiwL DcwLhzf9DZdGc6wyjz5nS9WAfHzJF5EBUbMUum2TwSUi3+v1fObylhJx/asPK/FZEWCrT5 aTuMERmNRnKKtgIuul48HArS4TKCXzU= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b="dy1/NFlQ"; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf06.hostedemail.com: domain of 34yS3ZAYKCDYkWSfbUYggYdW.Ugedafmp-eecnSUc.gjY@flex--seanjc.bounces.google.com designates 209.85.160.73 as permitted sender) smtp.mailfrom=34yS3ZAYKCDYkWSfbUYggYdW.Ugedafmp-eecnSUc.gjY@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724132; a=rsa-sha256; cv=none; b=G9biWOro50AOnScLH6d+c+jAYkl0X0Giz5DfxoPF+fsEgGTchvM+UyuKI8etYqqSvUdBFZ xwIiYbRp+Pu7xVW8yqD3J+F8opAJtzyj8REfhLXvnheLAfbm4uwSqRZCt3sNxMhyIlGikL yXwJemfCm4Yf3YKxZK/z/za5H1X5GDQ= Received: by mail-oa1-f73.google.com with SMTP id 586e51a60fabf-1b78a4797e1so9610987fac.3 for ; Tue, 18 Jul 2023 16:48:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724131; x=1692316131; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=muvilKyoWvn1tarN80afquV4Wd3ZvyUZATzGD2ucPnA=; b=dy1/NFlQGuJqswhd4jyp5/5Y2DKjXWq8ZhDnL7jyfQUkTP7A9Hvq/HvrZglV4JQg4M 0K4GnyosjYX3JEla9t9lm8LJXLHv4GUKKzg9xFm9cJWrlQ5Qmy5LmSHitAR/Xzi9H8/Y MjJIFDOPL8g3wik3LCZjllYyd45Gr2H0qgazCaqc+yiHTFw7sn+VQEAa9DzzRpRQoil4 OF2suL13dOrJbxrD1Es2a+3MSZoSnJ4hgva3/KXiELtegBBB1WkzGy/iAanliFh6iYW0 B8x8MynR4QN8rTTnTiUPKbxJnJ7ZIBs38bI6aS2sGXphM22HDrUDYnhUpurmEDIvnFzg o5tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724131; x=1692316131; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=muvilKyoWvn1tarN80afquV4Wd3ZvyUZATzGD2ucPnA=; b=Bu5HCA05lyfadXTOoV82k5ReLbafpw+LEXEs3AHxtGxotIXahA8sHbQ2/wX4gAFKK6 LLVz1b551fuzAMA8naNTlJokCzGD1nm2MKzXLU9LOuJqw7EPRHJlcdx5KmFB6dS6UaB9 +86IyAw0z2sS1IwGfBbiW6sQz/jwX597p4tTb6VwbfRczitxtY/VwYABKbMFIuHWAJHs adf6EWE3PO0fRwTH7XzrmJzBO6xbIhTvmcRLWg6nXHsao4WRgDPlxKOd7ML4SZv/To9K PbRjZBdeRTEYOTK7k7Be99uAKlhPgRdGgUq3Akun7LDb0Y3/oIsNh2BadXHVT5l36ApK oZBA== X-Gm-Message-State: ABy/qLbEioUXtUMFZjX8XfnTCIML4WEsWozO5irtKH17UvCpNA1Tgjxs nLBQDOXv/tMMSy03H9x/WnzaDX9mjRk= X-Google-Smtp-Source: APBJJlE49QI+GKjHT7/jwtmKHpb+kXt66N6K7QDVRkzJgeGH+MWu0bF/51TSJcseqrb6U54aALrx+EClwNQ= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6870:c796:b0:1b0:20bd:eef with SMTP id dy22-20020a056870c79600b001b020bd0eefmr758790oab.2.1689724131216; Tue, 18 Jul 2023 16:48:51 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:53 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-11-seanjc@google.com> Subject: [RFC PATCH v11 10/29] mm: Add AS_UNMOVABLE to mark mapping as completely unmovable From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspam-User: X-Stat-Signature: gbpdy8rfzeinogm7nyds4u9s7wtksh1g X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 0C1F7180018 X-HE-Tag: 1689724131-824829 X-HE-Meta: U2FsdGVkX19QCX0h/bVTbNfcjRiU4YwoDbJl04g+v8ZrVDboBOtIDGadYrXe2d291QQ+LxFXONpk60lmHKZUDHINBARAXUe+6+8hjj4cBJXfNDyUq/MpRbBVINgYy3JjoLbImFRKxmGNfZ/uLfuFoaHFCMbpGQoRDIRxHc4jdnc6FNA5Eh5yoGr6+LAq08+5Cdj9TbBvzhN8cdTjrwFoLNTgZ9PAEkvLsmof98rMY/XlkYS5Ano2GkdTDZeyzTyAHcnkU283paOHocHxqzh+q+U5O0uxzaUxh8MTypAi4+R5slL0wCjhRYqdQPB1n2w+3eU0IIzC7DZNCli855Za8DwpN+CyyDkSPQmCyrZXoJRQHFOrQZjnM55bF0TnW3XlkINf35YylELbj6Dlm/UJdOvBu5L6sbxN8vnLWhFNltemsYYdQJRljZBJNVAevZmo/dFjMX3QJPQTL32eQZcMv3fpGHPb0TqY9gZhGUIqclr8ZQB6zkLmf7R/oU5lnRte8U6uwkAMJz809WOpqAqgWSplPkiZlKlLuRqSXVtBXVdLv0YJYca7LJFLvvRu8em7EQa9OGJwLx/1m0pC9YL7MnwN7V0FyJpgUnsl88YxLiL40vo+kDjK5rgRZa1r2al2WokqkDvFpuW6yalAHWHcqhlldT5gbyQm7OhbTIelVjB9DsUnYZ6fydRRHMicblEXIEmFANPET2PTYAVVMSuroGnHEBe/nbFOmlH38ZUBX2zeH6YHnBh/Pmp2oxs3m6ZU5J4WJ7mJEm1pr/XgKZU47zyYUhRQDafqTcmXvZrhfrnYFKA8uI7ebb4nj4513C0P1g9IxBvPoy1b000dP4tzROisxGIgDl1YUmmB3z37PVX7uolEWIg5zn7BfZ4DQGQP1kPxl9D2ahBnn5hhkZnIz2K4qkYAMU9TuiSz8EVTB74TlIjHvZzdq+x+hklI0qPzaKB3RYeRVQ2beMM+tMn X2DTceM8 XL0te/m9ZGxpzf2pK4shPeziAHOD2+JFfXTqtlMO4ijvSSxVkXwAZNaB2MydJnA3YvcEIQGC91o6SwPJ0pSglrnlJfXjorh5zI/seWudH+vmpEU3rX5ZtWzfrPheIcvAmReoN8JB8roNY8IfcQtxzqAm5gUs21n3jg2OF1c2Dp/YqCVIPcJnPRIfTCU9WumdJQ6+ibKqRda8oFEBQ5jNdcg8yi9ryIi0jOSviyLqJKETrfzy+Ofqsmb4t0y73SdKNfISN/8ZKJpKJfGwBBybxWHnSKHj4aTbkSm/ZMavbG7NNBrj5PHmVAOcmsrA0zqRIaXvNF5YLBfOthLCx1+Dk8ivyEsP/8WCPIWYs5lnKj60m4PlJfToQ347jDKXODD+a3p8Y4S5CtJYPR82/PBBHTviBN+4TumhvsWFLT2jMcnf9MISbI8dbEhV4ItR+Qpv9+JcTTvLr5OUDkPbPszQRxWNBHzn115tqZZmqxlnm4+A7AulGGOioBXvab7IGB9VNFsd6odB9FCZuv0vi7LGX5zOzksf0kubjxbsQCUdzmcb2FIgq86GXXel9zB5ldquTlBJndyGdJQWeQS4T3wAB1SNeTxbqs1wQrW2zTLWNbcdBz+4Z+52r5zcPf9lbpJ7u/NXGFim/OA4yOK8ZwPSTOek88UVvfUbFU7T/iqytzqEZ3CV3ITTBov+AOyPBlOuNKzImrYx2VrroR/4IEhLdQEJkb2+hIR8jNVk4Q9uqaNpYypKWAM/NGoRF4qBg4T51GeYDdHnd5WZD3y7GDLHhRrSkOnt45Q1eSYZ2KT4/pRtr8Q25xVAQjlW4her5yBoMcbE8 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: Signed-off-by: Sean Christopherson --- include/linux/pagemap.h | 11 +++++++++++ mm/compaction.c | 4 ++++ mm/migrate.c | 2 ++ 3 files changed, 17 insertions(+) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 716953ee1ebd..931d2f1da7d5 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -203,6 +203,7 @@ enum mapping_flags { /* writeback related tags are not used */ AS_NO_WRITEBACK_TAGS = 5, AS_LARGE_FOLIO_SUPPORT = 6, + AS_UNMOVABLE = 7, /* The mapping cannot be moved, ever */ }; /** @@ -273,6 +274,16 @@ static inline int mapping_use_writeback_tags(struct address_space *mapping) return !test_bit(AS_NO_WRITEBACK_TAGS, &mapping->flags); } +static inline void mapping_set_unmovable(struct address_space *mapping) +{ + set_bit(AS_UNMOVABLE, &mapping->flags); +} + +static inline bool mapping_unmovable(struct address_space *mapping) +{ + return test_bit(AS_UNMOVABLE, &mapping->flags); +} + static inline gfp_t mapping_gfp_mask(struct address_space * mapping) { return mapping->gfp_mask; diff --git a/mm/compaction.c b/mm/compaction.c index dbc9f86b1934..a3d2b132df52 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -1047,6 +1047,10 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, if (!mapping && (folio_ref_count(folio) - 1) > folio_mapcount(folio)) goto isolate_fail_put; + /* The mapping truly isn't movable. */ + if (mapping && mapping_unmovable(mapping)) + goto isolate_fail_put; + /* * Only allow to migrate anonymous pages in GFP_NOFS context * because those do not depend on fs locks. diff --git a/mm/migrate.c b/mm/migrate.c index 24baad2571e3..c00a4ca86698 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -954,6 +954,8 @@ static int move_to_new_folio(struct folio *dst, struct folio *src, if (!mapping) rc = migrate_folio(mapping, dst, src, mode); + else if (mapping_unmovable(mapping)) + rc = -EOPNOTSUPP; else if (mapping->a_ops->migrate_folio) /* * Most folios have a mapping and most filesystems From patchwork Tue Jul 18 23:44:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317880 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 6FB56EB64DD for ; Tue, 18 Jul 2023 23:48:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 87A628D0029; Tue, 18 Jul 2023 19:48:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7DB468D0012; Tue, 18 Jul 2023 19:48:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6A41F8D0029; Tue, 18 Jul 2023 19:48:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 4C32E8D0012 for ; Tue, 18 Jul 2023 19:48:56 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 23F8E12022A for ; Tue, 18 Jul 2023 23:48:56 +0000 (UTC) X-FDA: 81026375472.01.CF8F23B Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf06.hostedemail.com (Postfix) with ESMTP id 3F02B180005 for ; Tue, 18 Jul 2023 23:48:53 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=oKgQFwiC; spf=pass (imf06.hostedemail.com: domain of 35SS3ZAYKCDgmYUhdWaiiafY.Wigfchor-ggepUWe.ila@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=35SS3ZAYKCDgmYUhdWaiiafY.Wigfchor-ggepUWe.ila@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724134; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=SDxWIrfosG9XJ1i6+ao4lNZmMm/71hk0CPfpAh3rles=; b=IsrdtOQgLLlzcpj23dI0GxAHYEF873X2jMQwXR9CcvYgEF9VBOpcGPcQuErKEyO3itaIVz d1xG8ZCR3lifqxhHo7HGOUz6rLkfMEJ7orcNv969XZHbjCXQ0oghnXhbGbmDJaWSoHyuSJ 1dMC++MbrGz9IFjaFj+blR6PemcZWSQ= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724134; a=rsa-sha256; cv=none; b=PDL9lmYeCIeQ4WFkyH6pYf++w/nMDMIdxbCiuF1LxMM/nWaIc/IChaFlT2diU49YSTWAqe PwZZQDulvSIGEeHOaBXKZ1Rzqq2R2Z25EoSYeJG1nPOvbJQ5fw5FmECNhr6hLc89Qv1AAL unx/dPmFTAWXpz7JgtV8a6ZAr1YFVpg= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=oKgQFwiC; spf=pass (imf06.hostedemail.com: domain of 35SS3ZAYKCDgmYUhdWaiiafY.Wigfchor-ggepUWe.ila@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=35SS3ZAYKCDgmYUhdWaiiafY.Wigfchor-ggepUWe.ila@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b89e3715acso32241965ad.3 for ; Tue, 18 Jul 2023 16:48:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724133; x=1692316133; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=SDxWIrfosG9XJ1i6+ao4lNZmMm/71hk0CPfpAh3rles=; b=oKgQFwiCrPvHzuuXJTxGw9fTJQCZKL9TyIsnHUo20k7J6vJr/dP2UuT8GyfaXNhKWl lfnwI4SNZlla+krW1fx/4HTGrmx9tbRfRVWIu3HGnyMHAJnHjaH8b3Nn7OD9lub8Upfz ScGl6hIrQNtyqOKMdvwG71E9U1LJYrTTZQq71Kwv4L3GIqczSYB1Q2ibrVYwZRMv7ks2 QNhyu3W0Ns8Grpmlyc83iZpzHpUsL+aloKwTrirYI0WDq4iN8t2n8ha5cP4AK06m8uQ9 dXuqm5q+qG2yKgB+nUEYuog82s4uX9rRPSCnrZx4hsx8m3v5+ZWIujkgaic/poWXwLCP o9Tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724133; x=1692316133; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=SDxWIrfosG9XJ1i6+ao4lNZmMm/71hk0CPfpAh3rles=; b=AVWQW28l+W9xK1/ycScGYQngO+B1m/k8yJ4u5rCXXEw6McbKyah2UVQa7567Ni7uzi jWNvYoLy6AJhuCygVwCRxO/en371cVq/xjAne+UFjIL6nr1OaGyI+gUhzj5AJQxvcbHK dcn9Uq8qqfPFO5SHeb9k0rr3rELvQL/rT3Et/JSRzEKNmDpkRx7t7Vs0wh6dOju+eTTD 885y3Y72SGP97JDy2EVfz+xuwcm+tPQTxaA92g49VHpu09EJiCYT2uMYAV0Y6HPIhUj3 pFEEi8Cq+P61V7VQ5Uc8z6nIkzYczQiwhudRLrZTennNjt9Nch2R/iYgRe74kpW2ShkV FS1g== X-Gm-Message-State: ABy/qLZWkTQTe6Qr/QA75uHMIyUXw7mkOTWeHnG6D1i2gWic0UV33YR0 ZuwTpmcQ9cVNcDRnxyOPRsdLlZdgj3c= X-Google-Smtp-Source: APBJJlFRkrJKR6wk6kjyyawD9jUVadK517ZfNP5yf1yjj9/O0JQ+6He3HEMs3LUDgHlJok/ugi+AWDRSDQU= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:c412:b0:1ba:1704:89d1 with SMTP id k18-20020a170902c41200b001ba170489d1mr21516plk.10.1689724133087; Tue, 18 Jul 2023 16:48:53 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:54 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-12-seanjc@google.com> Subject: [RFC PATCH v11 11/29] security: Export security_inode_init_security_anon() for use by KVM From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: 3F02B180005 X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: a6bpq6axe3riu1r4entdni395g5sanm1 X-HE-Tag: 1689724133-567651 X-HE-Meta: U2FsdGVkX1++1kC5uOa9MewS3549jTWXa1VBuifraMBT4VUCR53kOcYL41UivXujsQxDH8KmieUMEcIni2nbI61Dc8xaIxK4JZu28QqCxe7ukGqFfYJLnM7QNH5ADSKScTdl59X1vIzmunz4vwV5gbKm3cXBo1lVRVwjjdEXv4WJyv4ECXsgsvRSoDopdRYWssOd6Gxu2niUo6yQqY65fb3gzt5/bkIWTC0WsOzZdDxa0kCeQC6aCdhgjHpPpdMaxgAiLPW9Tknn4Q+JwW4Xdi8eQLbG/jmMFpnBVJ+xDcuGny5yz6Jh9Dz1xfRFmRQBL08u99kSOX8IDMJ6fGyBSqdbNIuUsvwF3EQeCGioblVoNCxRkY2mK0HZIf9Wag2XMxBpDWoIef6/NwngKShqljkwffrrzQsUelhhb12MgbqCIRZb0hgUi/VNzyIByH2LW/9gMFUKritkbS9s82oG49RPDcFlxUO1o7duofoj715+bLkN4YZVpVEx+WJ48+XzjKQNFNkvtFhsdPSrTOdaGhM++frLxMjLRWhrwBfKEJLjgN/ULO0JxWMlzY+UeCc55pAbKtEbmXaVDV2fI8mk6c+A0uz2j6A2A4j/szBY+u902cQcqBvuTbpcbcHLuicHqLM/KZSwr7QImTSO4clBfIPdGw38yG7Lsg2NIMynSviZP6j7imRUczRpKgqdMUDR+e2MNBnOiYryx8z2T8MQxiRyn2CF3bfTSDzj2awuOzNa7mX388zzSI8fnGZApAqVNnn22YMVRk/HbxzLJPULfRDRcIwBwkSUP0IJMcP5mqiFNAdCvnJ0B1AaX2nvgnXGMpQG/VISS5zOpVDSYxl7sTwRcTfbgCOfVB2GeG9sSmIc6w3dUEVIHX/iM1x2LE61yQkzD0Q4G9qTDhp0hxA2ggmd134B4tiqCIBjfWCHq/dH0BUjG40sBVPHE3nxH/9fwZx1rYp+dLoxhqa0mHV u3PG54UU YQRZigxiplak9SIMdMb4f/bPARCgdzt/DLTduKmYB7m2V+BL9C5q5UnQJ6Aa4oL++B/vISNdTZEMHd4UjzCAc5b9ezrGs58J+oCm7Rjw30Uo4qGZGwFV4obUg2nXHlWWm1J6Q4I5Nwnn6+egOyLB5T2J+CDnnQ3nmoieSn5jgzl1mrVQ+K2ii6KtF3Yth91/n6yZrsqZFpnv5T6YC5SP3gmXUsfCKhQfyy5QSG7RXXC1G1XWT1mRG9UPzEd+Clr8KMEDhTgAGemnipWS7xr4q6CHsshXkanRkjSEYA6POpbPoTMEuQs3WorV5kbsLC9E+U2zpoGF7N4PnGEtDnsebF4K2O0V4EvU3JNfSvU/ZvaCMbG7XxWHn+y3/KCUtA3VAaEX6rjLxvbVnrnUVmxR/Z77u5xH/Lg13qhIucFRaw2d77UiYFLMPaSYyliHkVteb7Y/YSLAA4I+A+cOJYeLYajm6l8G+yQFzqwRfnmG7IO7gfnoLzFuONKrj92Q9dpUqD0SHMaobLX5gMMrOFOtLBu27HkZzQKsxcL3hvIbZ30c47/UkcsLX9ywB9GKNEvhWE+rBilTK16UNh1n0eNLxV234E1hwxCySBi3I5SKZEKgFO9OoNLk/5CjXyjcHBkphN2ml73J8l2cSukSmhx+QAnPt08244m3bNf5ajpZ21bnVG9wEH2MuVcj6QkLisIbob9feczhtMsJIOCK6fsqGOMrpYpajPZ1JVBrLyIbl/MQ3xXdROclS1T7JAlt5okpkzkjPzOw5cbj2u1umT0UUumHvA8WAifRBIN4DOwsi56QdBlP9tVUm9/NC1NghGTLphmsfgxVmb7UWEWRfgBYYg56sZQ== 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: Signed-off-by: Sean Christopherson Acked-by: Paul Moore --- security/security.c | 1 + 1 file changed, 1 insertion(+) diff --git a/security/security.c b/security/security.c index b720424ca37d..7fc78f0f3622 100644 --- a/security/security.c +++ b/security/security.c @@ -1654,6 +1654,7 @@ int security_inode_init_security_anon(struct inode *inode, return call_int_hook(inode_init_security_anon, 0, inode, name, context_inode); } +EXPORT_SYMBOL_GPL(security_inode_init_security_anon); #ifdef CONFIG_SECURITY_PATH /** From patchwork Tue Jul 18 23:44:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317881 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 C7EB4C001E0 for ; Tue, 18 Jul 2023 23:48:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5E19B8D002A; Tue, 18 Jul 2023 19:48:59 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5434D8D0012; Tue, 18 Jul 2023 19:48:59 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3954C8D002A; Tue, 18 Jul 2023 19:48:59 -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 288798D0012 for ; Tue, 18 Jul 2023 19:48:59 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id E885BC0166 for ; Tue, 18 Jul 2023 23:48:58 +0000 (UTC) X-FDA: 81026375556.13.C88A7F0 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) by imf26.hostedemail.com (Postfix) with ESMTP id EFC47140005 for ; Tue, 18 Jul 2023 23:48:55 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b="zhy/akT4"; spf=pass (imf26.hostedemail.com: domain of 35iS3ZAYKCDknZVieXbjjbgZ.Xjhgdips-hhfqVXf.jmb@flex--seanjc.bounces.google.com designates 209.85.215.202 as permitted sender) smtp.mailfrom=35iS3ZAYKCDknZVieXbjjbgZ.Xjhgdips-hhfqVXf.jmb@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724136; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=f3ZMxHz3bMEiGy82l1TdBjwnrB3pHfAW+Q0omz0gfYw=; b=vLXn1BEpB64PkVbImcu+pKD4kOJQIz7LcuvSxmbysjYwspXdLJfcXSwQVmUZN6LJDEB73Z IHadLSphoNg6QvBFrBuTSZRyihq19fDyAjOYFKUGKYhG8+DoN40FZHAPGKR8lWR8wHgxhz qxhUuFfJYr8n3BvHvhNSb71gMFtAAko= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724136; a=rsa-sha256; cv=none; b=Ur2q9cdKGq9smFVEdq3tbvOiPqXdSt+J4FiS5Y2IoVOw89TMeGc0LKkeVJG1bE4uVHo+VO kD+oDpS5DPcrDL255OaH1oxRR8+DQmpwEiIJOOnvYdz5PZnhQbsxWlXlpOVDOd3Yu2QxDl HXT65Za9fZg20S2JAr6Q3ZwdQ5vEZRU= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b="zhy/akT4"; spf=pass (imf26.hostedemail.com: domain of 35iS3ZAYKCDknZVieXbjjbgZ.Xjhgdips-hhfqVXf.jmb@flex--seanjc.bounces.google.com designates 209.85.215.202 as permitted sender) smtp.mailfrom=35iS3ZAYKCDknZVieXbjjbgZ.Xjhgdips-hhfqVXf.jmb@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-55b2ab496ecso2843698a12.2 for ; Tue, 18 Jul 2023 16:48:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724135; x=1692316135; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=f3ZMxHz3bMEiGy82l1TdBjwnrB3pHfAW+Q0omz0gfYw=; b=zhy/akT4kfbyUvpFGWblDxiVv/JGWOIqXnPzBh1+KARzXZ0JdbGb2FpHwQHHv7fjN4 RDXsPUednXcpnVF/r1u4hdUpljVX/ERAKeE327nave00WVGTxpK46soa9jLAB9FPvT4q 8jimpKmgUX+C8gYa1RfRx79JVkYceWLWH64vhM96/MebP0lcjlofGvUPC5/UVTbwsCNC 8S6jBqAKBjc5z4xMyB65XeSr51tF9P+a0Z5/lx9y5nY/Ct9xwVriJwHE6YEvRLt9PxRx EQOHbb6ekWltGOVu4UYPtNcnhBMnzOMmP1fXbS8gEE2+WMcZBZCG0a39Y0+pwJac0BhG QRPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724135; x=1692316135; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=f3ZMxHz3bMEiGy82l1TdBjwnrB3pHfAW+Q0omz0gfYw=; b=Cnpu3w/mG47P30z6h+cKT2SboIreuZJj5d8QxTKsyg0GgpNm35/CIry5Rovy6DbSfq HV4RxYDCUyFj0ZxyNSnmr3Y6a6Vryupe05mXs2w8oIkydHr6/vNFTL6JjGRgKW9FdIeS alRzansNRmFb4i+TJkGsZnoS7qSrmUXIwMJOvWp9C7ldrpG1Mij8yS0+SCAMGArg3xTB v0xsopwlkui72LL2P2uvE9M8ufYQe1ZxrHZU9I6WFzagjCRjoz6FnKsjk1cWpa2HRz0U lUSZx5NDA642s7D1O7BPHPWKVCZeg7/UOm9wy4K0lyD0UC5Ax3jfsgrfbgRe4njkPCOg Rt2Q== X-Gm-Message-State: ABy/qLbI1z/25MIMqMRSNLQhG3Lzhj9eoDTWE081PujzJ/eNJDvv2p1I z3LdAl1i88T9cMzBBXWtfOGUhybGcnI= X-Google-Smtp-Source: APBJJlHWqYDCKk9l+6hhcyO0ycYtjkg7rAWcHEaP+HFNWvcqSq7I9U1NOWP+pyzb0Gx2BsDq432iOA7Ityg= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a63:6f8a:0:b0:557:33c6:603a with SMTP id k132-20020a636f8a000000b0055733c6603amr17649pgc.7.1689724134884; Tue, 18 Jul 2023 16:48:54 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:55 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-13-seanjc@google.com> Subject: [RFC PATCH v11 12/29] KVM: Add KVM_CREATE_GUEST_MEMFD ioctl() for guest-specific backing memory From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Stat-Signature: p3ar4ats9dbym436j3kfjsjad46337bu X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: EFC47140005 X-Rspam-User: X-HE-Tag: 1689724135-552694 X-HE-Meta: U2FsdGVkX1/p9RzVPXsErvqYF9BCG2c4NZ7hf1MtKz/UA//spoBkjOQD7rgmz50YgPfSw88uiPARdytZ/sluHZrzV5MDKkQwzYdQNL4p3OZRlM2CGDixaI+v3vBED5gpIxs7GnhC+YLFGm9c5bazSw2bqAja9JZkq8VfLhjlOgz8JIGIwSkT4B5ZlkJ1mAqgJ6mNIFMWyH+hz3uw+3xwFvWOKCNO3upMWNDCFZngv1tusuU6jm6k1VkA1j9lDB8O6S7omFRDiFJ/5zFjYKM6QGzJVLvFcp4CecNrHjCGTXxdGs+wWgKLXRRr8w+U/ElByTqOoC+iEqg7OZjBWbbvlNG45zibXqLGeQJXwDvHL4jz4wRtAJ6CdBcjWCNniMA1qHO6LLc78Pu3vHzh6ynTuPO++CKlY+nKDYjgAUHrVot9p6S2+BHqBYm/ECpGQXJGetaTW8tqAg0Jc3m2U4CnYGYA3sM8EDuI7t7KXhKNwwJY1rDO5zZq32KBxYs+JaNhW5j1dAxm3ffWcNA3BcQz0yOxcVNPZ6WAzCjd9BETkAFB1fP66cPe+TwDtWPQ8McoXncnU9zhqwOZXkz/3ylx6Od06tylQwZH3CldNn3s9tfqIyPuIXHEYifrzzlfoLhDVwX/L91jGxJ8SBhwLt7sfcnaHPvq8a8ByC9y+RZpqDmaPHI6DL1+nZ+v/ljq+ZTq5o9EyEcvrBRN9CidlS5OvDaYDuqnxJEpzVNeJi39lTT85PtS4aIdu4t5FbGgFrBQdTS2tKCliGqOHYv2gsCdOtyK6Z3TmWpB0VIQ6CIDC3jNMICPT7t3uVgDt15wAreKV5QGZ4faQYQoregIlHbKZHP293ydhJUCaLGjSAJNZmLPRIFAfDQngRdU3//GJy7x6kNOYx/dls9WSp+IZ7FFgvO7WALrVS9tC8lT61/cVZqpJqD21vgopVF2CkX4ltTXGejB54v+gFQ8dLzO7lm dGKMvsZk tOujJlqGh7O2GTP4DO9YPyFKw+L6JLYUqoInGiD2BAbraVz4jhkJCP94P5Yse0hFRoJufnBKk9+PYPYCiaS0LAybzCNUDLyGeTc37HTXFVPXP2ZaKmdRHgUAUzzO+YudXj1A3FPQevIEk/G5Y1cJbMmmo6j53faWiHA2XDhtL2F9kovZDGx4VqJez6w8Dgk4rRGReyKyVIUQFLbsKgZyNryQNbmOXzBsV6wDL2MllyAko4JZG/q1fDWGa3EJGkwan5w95rF/eAgebfK967Wf8fa8CK4FfKtH6yZSpDnI5ahPSX0jPzuvkxAPVOB44+KTZQr70UolQErG5/zKA8bFe5KMezYRqQR2eDNZqTH9Wxojser57uV8mlYZiE2UpoCATA4mPxQwI7wyyicjOXnbPF5y26dhIaDDLAUgXZLhMgPo9Zgl3b8xpDgDsgeHax6zUsNhzAqy+ZsBwpD6P1PC7grDAe3TugdU/ab5NtgB45w0jPK/LsuCCMf1wflwnmBCxoJcivvR76JGBa2Amy9usB/9bDT2297EZ4bQwZZVc9eLQeVgr3THYqc5nRF811OMEmhLYxNTVc9gLeTOsgq5nI1GNeoQ5J/LERp40HCrzGtLKW0fx0lHnIMh1/isPnSuwYTiKrzwIsQ0Srv8VPYpBCc2cCa2yTFOwQfJ8pxkqU11WOtcmJB/UrQQa707J2xJE97fujBBNXE/+J9jFwk01K+7q9G7HvCeLjDn+nF9D7F3bim8nmcszpdrcaJqx5r0N1YXJfAr+mo24JzB2XDxVsRoIfsloMn3fDDcASKM+WLQ5Z8SFpWm1RkDwdi4qsCOsmky7YDOLVKNQLshHfJwhtE2YH26M8nTdCPUjlJYOvILzdnmSfadK16a3XhDkyMvqNlW0ptsMSns/fsf/1/qvYQZV2/HUOTa4xF9H3BV6rQxNtTzwBzC2BZBcbHIXGZEVGX9eMP476Cd/8CrdpQOtzhLh9EhZ BArKU7UF 2WBSjwLcXH/FEPkXbwTNPQ== 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: TODO Cc: Fuad Tabba Cc: Vishal Annapurve Cc: Ackerley Tng Cc: Jarkko Sakkinen Cc: Maciej Szmigiero Cc: Vlastimil Babka Cc: David Hildenbrand Cc: Quentin Perret Cc: Michael Roth Cc: Wang Cc: Liam Merwick Cc: Isaku Yamahata Co-developed-by: Kirill A. Shutemov Signed-off-by: Kirill A. Shutemov Co-developed-by: Yu Zhang Signed-off-by: Yu Zhang Co-developed-by: Chao Peng Signed-off-by: Chao Peng Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Signed-off-by: Sean Christopherson Signed-off-by: Isaku Yamahata --- include/linux/kvm_host.h | 48 +++ include/uapi/linux/kvm.h | 14 +- include/uapi/linux/magic.h | 1 + virt/kvm/Kconfig | 4 + virt/kvm/Makefile.kvm | 1 + virt/kvm/guest_mem.c | 591 +++++++++++++++++++++++++++++++++++++ virt/kvm/kvm_main.c | 58 +++- virt/kvm/kvm_mm.h | 38 +++ 8 files changed, 750 insertions(+), 5 deletions(-) create mode 100644 virt/kvm/guest_mem.c diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 97db63da6227..0d1e2ee8ae7a 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -592,8 +592,20 @@ struct kvm_memory_slot { u32 flags; short id; u16 as_id; + +#ifdef CONFIG_KVM_PRIVATE_MEM + struct { + struct file __rcu *file; + pgoff_t pgoff; + } gmem; +#endif }; +static inline bool kvm_slot_can_be_private(const struct kvm_memory_slot *slot) +{ + return slot && (slot->flags & KVM_MEM_PRIVATE); +} + static inline bool kvm_slot_dirty_track_enabled(const struct kvm_memory_slot *slot) { return slot->flags & KVM_MEM_LOG_DIRTY_PAGES; @@ -688,6 +700,17 @@ static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu) } #endif +/* + * Arch code must define kvm_arch_has_private_mem if support for private memory + * is enabled. + */ +#if !defined(kvm_arch_has_private_mem) && !IS_ENABLED(CONFIG_KVM_PRIVATE_MEM) +static inline bool kvm_arch_has_private_mem(struct kvm *kvm) +{ + return false; +} +#endif + struct kvm_memslots { u64 generation; atomic_long_t last_used_slot; @@ -1380,6 +1403,7 @@ void *kvm_mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc); void kvm_mmu_invalidate_begin(struct kvm *kvm); void kvm_mmu_invalidate_range_add(struct kvm *kvm, gfn_t start, gfn_t end); void kvm_mmu_invalidate_end(struct kvm *kvm); +bool kvm_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range); long kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg); @@ -2313,6 +2337,30 @@ static inline unsigned long kvm_get_memory_attributes(struct kvm *kvm, gfn_t gfn bool kvm_arch_post_set_memory_attributes(struct kvm *kvm, struct kvm_gfn_range *range); + +static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) +{ + return IS_ENABLED(CONFIG_KVM_PRIVATE_MEM) && + kvm_get_memory_attributes(kvm, gfn) & KVM_MEMORY_ATTRIBUTE_PRIVATE; +} +#else +static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) +{ + return false; +} #endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ +#ifdef CONFIG_KVM_PRIVATE_MEM +int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, + gfn_t gfn, kvm_pfn_t *pfn, int *max_order); +#else +static inline int kvm_gmem_get_pfn(struct kvm *kvm, + struct kvm_memory_slot *slot, gfn_t gfn, + kvm_pfn_t *pfn, int *max_order) +{ + KVM_BUG_ON(1, kvm); + return -EIO; +} +#endif /* CONFIG_KVM_PRIVATE_MEM */ + #endif diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index f065c57db327..9b344fc98598 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -102,7 +102,10 @@ struct kvm_userspace_memory_region2 { __u64 guest_phys_addr; __u64 memory_size; __u64 userspace_addr; - __u64 pad[16]; + __u64 gmem_offset; + __u32 gmem_fd; + __u32 pad1; + __u64 pad2[14]; }; /* @@ -112,6 +115,7 @@ struct kvm_userspace_memory_region2 { */ #define KVM_MEM_LOG_DIRTY_PAGES (1UL << 0) #define KVM_MEM_READONLY (1UL << 1) +#define KVM_MEM_PRIVATE (1UL << 2) /* for KVM_IRQ_LINE */ struct kvm_irq_level { @@ -2284,4 +2288,12 @@ struct kvm_memory_attributes { #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) +#define KVM_CREATE_GUEST_MEMFD _IOWR(KVMIO, 0xd4, struct kvm_create_guest_memfd) + +struct kvm_create_guest_memfd { + __u64 size; + __u64 flags; + __u64 reserved[6]; +}; + #endif /* __LINUX_KVM_H */ diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h index 6325d1d0e90f..15041aa7d9ae 100644 --- a/include/uapi/linux/magic.h +++ b/include/uapi/linux/magic.h @@ -101,5 +101,6 @@ #define DMA_BUF_MAGIC 0x444d4142 /* "DMAB" */ #define DEVMEM_MAGIC 0x454d444d /* "DMEM" */ #define SECRETMEM_MAGIC 0x5345434d /* "SECM" */ +#define GUEST_MEMORY_MAGIC 0x474d454d /* "GMEM" */ #endif /* __LINUX_MAGIC_H__ */ diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 8375bc49f97d..3ee3205e0b39 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -103,3 +103,7 @@ config KVM_GENERIC_MMU_NOTIFIER config KVM_GENERIC_MEMORY_ATTRIBUTES select KVM_GENERIC_MMU_NOTIFIER bool + +config KVM_PRIVATE_MEM + select XARRAY_MULTI + bool diff --git a/virt/kvm/Makefile.kvm b/virt/kvm/Makefile.kvm index 2c27d5d0c367..a5a61bbe7f4c 100644 --- a/virt/kvm/Makefile.kvm +++ b/virt/kvm/Makefile.kvm @@ -12,3 +12,4 @@ kvm-$(CONFIG_KVM_ASYNC_PF) += $(KVM)/async_pf.o kvm-$(CONFIG_HAVE_KVM_IRQ_ROUTING) += $(KVM)/irqchip.o kvm-$(CONFIG_HAVE_KVM_DIRTY_RING) += $(KVM)/dirty_ring.o kvm-$(CONFIG_HAVE_KVM_PFNCACHE) += $(KVM)/pfncache.o +kvm-$(CONFIG_KVM_PRIVATE_MEM) += $(KVM)/guest_mem.o diff --git a/virt/kvm/guest_mem.c b/virt/kvm/guest_mem.c new file mode 100644 index 000000000000..1b705fd63fa8 --- /dev/null +++ b/virt/kvm/guest_mem.c @@ -0,0 +1,591 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include + +#include + +#include "kvm_mm.h" + +static struct vfsmount *kvm_gmem_mnt; + +struct kvm_gmem { + struct kvm *kvm; + struct xarray bindings; + struct list_head entry; +}; + +static struct folio *kvm_gmem_get_folio(struct file *file, pgoff_t index) +{ + struct folio *folio; + + /* TODO: Support huge pages. */ + folio = filemap_grab_folio(file->f_mapping, index); + if (!folio) + return NULL; + + /* + * Use the up-to-date flag to track whether or not the memory has been + * zeroed before being handed off to the guest. There is no backing + * storage for the memory, so the folio will remain up-to-date until + * it's removed. + * + * TODO: Skip clearing pages when trusted firmware will do it when + * assigning memory to the guest. + */ + if (!folio_test_uptodate(folio)) { + unsigned long nr_pages = folio_nr_pages(folio); + unsigned long i; + + for (i = 0; i < nr_pages; i++) + clear_highpage(folio_page(folio, i)); + + folio_mark_uptodate(folio); + } + + /* + * Ignore accessed, referenced, and dirty flags. The memory is + * unevictable and there is no storage to write back to. + */ + return folio; +} + +static void kvm_gmem_invalidate_begin(struct kvm_gmem *gmem, pgoff_t start, + pgoff_t end) +{ + struct kvm_memory_slot *slot; + struct kvm *kvm = gmem->kvm; + unsigned long index; + bool flush = false; + + KVM_MMU_LOCK(kvm); + + kvm_mmu_invalidate_begin(kvm); + + xa_for_each_range(&gmem->bindings, index, slot, start, end - 1) { + pgoff_t pgoff = slot->gmem.pgoff; + + struct kvm_gfn_range gfn_range = { + .start = slot->base_gfn + max(pgoff, start) - pgoff, + .end = slot->base_gfn + min(pgoff + slot->npages, end) - pgoff, + .slot = slot, + .may_block = true, + }; + + flush |= kvm_mmu_unmap_gfn_range(kvm, &gfn_range); + } + + if (flush) + kvm_flush_remote_tlbs(kvm); + + KVM_MMU_UNLOCK(kvm); +} + +static void kvm_gmem_invalidate_end(struct kvm_gmem *gmem, pgoff_t start, + pgoff_t end) +{ + struct kvm *kvm = gmem->kvm; + + KVM_MMU_LOCK(kvm); + if (xa_find(&gmem->bindings, &start, end - 1, XA_PRESENT)) + kvm_mmu_invalidate_end(kvm); + KVM_MMU_UNLOCK(kvm); +} + +static long kvm_gmem_punch_hole(struct inode *inode, loff_t offset, loff_t len) +{ + struct list_head *gmem_list = &inode->i_mapping->private_list; + pgoff_t start = offset >> PAGE_SHIFT; + pgoff_t end = (offset + len) >> PAGE_SHIFT; + struct kvm_gmem *gmem; + + /* + * Bindings must stable across invalidation to ensure the start+end + * are balanced. + */ + filemap_invalidate_lock(inode->i_mapping); + + list_for_each_entry(gmem, gmem_list, entry) + kvm_gmem_invalidate_begin(gmem, start, end); + + truncate_inode_pages_range(inode->i_mapping, offset, offset + len - 1); + + list_for_each_entry(gmem, gmem_list, entry) + kvm_gmem_invalidate_end(gmem, start, end); + + filemap_invalidate_unlock(inode->i_mapping); + + return 0; +} + +static long kvm_gmem_allocate(struct inode *inode, loff_t offset, loff_t len) +{ + struct address_space *mapping = inode->i_mapping; + pgoff_t start, index, end; + int r; + + /* Dedicated guest is immutable by default. */ + if (offset + len > i_size_read(inode)) + return -EINVAL; + + filemap_invalidate_lock_shared(mapping); + + start = offset >> PAGE_SHIFT; + end = (offset + len) >> PAGE_SHIFT; + + r = 0; + for (index = start; index < end; ) { + struct folio *folio; + + if (signal_pending(current)) { + r = -EINTR; + break; + } + + folio = kvm_gmem_get_folio(inode, index); + if (!folio) { + r = -ENOMEM; + break; + } + + index = folio_next_index(folio); + + folio_unlock(folio); + folio_put(folio); + + /* 64-bit only, wrapping the index should be impossible. */ + if (WARN_ON_ONCE(!index)) + break; + + cond_resched(); + } + + filemap_invalidate_unlock_shared(mapping); + + return r; +} + +static long kvm_gmem_fallocate(struct file *file, int mode, loff_t offset, + loff_t len) +{ + int ret; + + if (!(mode & FALLOC_FL_KEEP_SIZE)) + return -EOPNOTSUPP; + + if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) + return -EOPNOTSUPP; + + if (!PAGE_ALIGNED(offset) || !PAGE_ALIGNED(len)) + return -EINVAL; + + if (mode & FALLOC_FL_PUNCH_HOLE) + ret = kvm_gmem_punch_hole(file_inode(file), offset, len); + else + ret = kvm_gmem_allocate(file_inode(file), offset, len); + + if (!ret) + file_modified(file); + return ret; +} + +static int kvm_gmem_release(struct inode *inode, struct file *file) +{ + struct kvm_gmem *gmem = file->private_data; + struct kvm_memory_slot *slot; + struct kvm *kvm = gmem->kvm; + unsigned long index; + + filemap_invalidate_lock(inode->i_mapping); + + /* + * Prevent concurrent attempts to *unbind* a memslot. This is the last + * reference to the file and thus no new bindings can be created, but + * dereferencing the slot for existing bindings needs to be protected + * against memslot updates, specifically so that unbind doesn't race + * and free the memslot (kvm_gmem_get_file() will return NULL). + */ + mutex_lock(&kvm->slots_lock); + + xa_for_each(&gmem->bindings, index, slot) + rcu_assign_pointer(slot->gmem.file, NULL); + + synchronize_rcu(); + + /* + * All in-flight operations are gone and new bindings can be created. + * Zap all SPTEs pointed at by this file. Do not free the backing + * memory, as its lifetime is associated with the inode, not the file. + */ + kvm_gmem_invalidate_begin(gmem, 0, -1ul); + kvm_gmem_invalidate_end(gmem, 0, -1ul); + + mutex_unlock(&kvm->slots_lock); + + list_del(&gmem->entry); + + filemap_invalidate_unlock(inode->i_mapping); + + xa_destroy(&gmem->bindings); + kfree(gmem); + + kvm_put_kvm(kvm); + + return 0; +} + +static struct file *kvm_gmem_get_file(struct kvm_memory_slot *slot) +{ + struct file *file; + + rcu_read_lock(); + + file = rcu_dereference(slot->gmem.file); + if (file && !get_file_rcu(file)) + file = NULL; + + rcu_read_unlock(); + + return file; +} + +static const struct file_operations kvm_gmem_fops = { + .open = generic_file_open, + .release = kvm_gmem_release, + .fallocate = kvm_gmem_fallocate, +}; + +static int kvm_gmem_migrate_folio(struct address_space *mapping, + struct folio *dst, struct folio *src, + enum migrate_mode mode) +{ + WARN_ON_ONCE(1); + return -EINVAL; +} + +static int kvm_gmem_error_page(struct address_space *mapping, struct page *page) +{ + struct list_head *gmem_list = &mapping->private_list; + struct kvm_memory_slot *slot; + struct kvm_gmem *gmem; + unsigned long index; + pgoff_t start, end; + gfn_t gfn; + + filemap_invalidate_lock_shared(mapping); + + start = page->index; + end = start + thp_nr_pages(page); + + list_for_each_entry(gmem, gmem_list, entry) { + xa_for_each_range(&gmem->bindings, index, slot, start, end - 1) { + for (gfn = start; gfn < end; gfn++) { + if (WARN_ON_ONCE(gfn < slot->base_gfn || + gfn >= slot->base_gfn + slot->npages)) + continue; + + /* + * FIXME: Tell userspace that the *private* + * memory encountered an error. + */ + send_sig_mceerr(BUS_MCEERR_AR, + (void __user *)gfn_to_hva_memslot(slot, gfn), + PAGE_SHIFT, current); + } + } + } + + filemap_invalidate_unlock_shared(mapping); + + return 0; +} + +static const struct address_space_operations kvm_gmem_aops = { + .dirty_folio = noop_dirty_folio, +#ifdef CONFIG_MIGRATION + .migrate_folio = kvm_gmem_migrate_folio, +#endif + .error_remove_page = kvm_gmem_error_page, +}; + +static int kvm_gmem_getattr(struct mnt_idmap *idmap, + const struct path *path, struct kstat *stat, + u32 request_mask, unsigned int query_flags) +{ + struct inode *inode = path->dentry->d_inode; + + /* TODO */ + generic_fillattr(idmap, inode, stat); + return 0; +} + +static int kvm_gmem_setattr(struct mnt_idmap *idmap, struct dentry *dentry, + struct iattr *attr) +{ + /* TODO */ + return -EINVAL; +} +static const struct inode_operations kvm_gmem_iops = { + .getattr = kvm_gmem_getattr, + .setattr = kvm_gmem_setattr, +}; + +static int __kvm_gmem_create(struct kvm *kvm, loff_t size, struct vfsmount *mnt) +{ + const char *anon_name = "[kvm-gmem]"; + const struct qstr qname = QSTR_INIT(anon_name, strlen(anon_name)); + struct kvm_gmem *gmem; + struct inode *inode; + struct file *file; + int fd, err; + + inode = alloc_anon_inode(mnt->mnt_sb); + if (IS_ERR(inode)) + return PTR_ERR(inode); + + err = security_inode_init_security_anon(inode, &qname, NULL); + if (err) + goto err_inode; + + inode->i_private = (void *)(unsigned long)flags; + inode->i_op = &kvm_gmem_iops; + inode->i_mapping->a_ops = &kvm_gmem_aops; + inode->i_mode |= S_IFREG; + inode->i_size = size; + mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); + mapping_set_unevictable(inode->i_mapping); + mapping_set_unmovable(inode->i_mapping); + + fd = get_unused_fd_flags(0); + if (fd < 0) { + err = fd; + goto err_inode; + } + + file = alloc_file_pseudo(inode, mnt, "kvm-gmem", O_RDWR, &kvm_gmem_fops); + if (IS_ERR(file)) { + err = PTR_ERR(file); + goto err_fd; + } + + file->f_flags |= O_LARGEFILE; + file->f_mapping = inode->i_mapping; + + gmem = kzalloc(sizeof(*gmem), GFP_KERNEL); + if (!gmem) { + err = -ENOMEM; + goto err_file; + } + + kvm_get_kvm(kvm); + gmem->kvm = kvm; + xa_init(&gmem->bindings); + + file->private_data = gmem; + + list_add(&gmem->entry, &inode->i_mapping->private_list); + + fd_install(fd, file); + return fd; + +err_file: + fput(file); +err_fd: + put_unused_fd(fd); +err_inode: + iput(inode); + return err; +} + +static bool kvm_gmem_is_valid_size(loff_t size, u64 flags) +{ + if (size < 0 || !PAGE_ALIGNED(size)) + return false; + + return true; +} + +int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args) +{ + loff_t size = args->size; + u64 flags = args->flags; + u64 valid_flags = 0; + + if (flags & ~valid_flags) + return -EINVAL; + + if (!kvm_gmem_is_valid_size(size, flags)) + return -EINVAL; + + return __kvm_gmem_create(kvm, size, flags, kvm_gmem_mnt); +} + +int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot *slot, + unsigned int fd, loff_t offset) +{ + loff_t size = slot->npages << PAGE_SHIFT; + unsigned long start, end, flags; + struct kvm_gmem *gmem; + struct inode *inode; + struct file *file; + + BUILD_BUG_ON(sizeof(gfn_t) != sizeof(slot->gmem.pgoff)); + + file = fget(fd); + if (!file) + return -EINVAL; + + if (file->f_op != &kvm_gmem_fops) + goto err; + + gmem = file->private_data; + if (gmem->kvm != kvm) + goto err; + + inode = file_inode(file); + flags = (unsigned long)inode->i_private; + + /* + * For simplicity, require the offset into the file and the size of the + * memslot to be aligned to the largest possible page size used to back + * the file (same as the size of the file itself). + */ + if (!kvm_gmem_is_valid_size(offset, flags) || + !kvm_gmem_is_valid_size(size, flags)) + goto err; + + if (offset + size > i_size_read(inode)) + goto err; + + filemap_invalidate_lock(inode->i_mapping); + + start = offset >> PAGE_SHIFT; + end = start + slot->npages; + + if (!xa_empty(&gmem->bindings) && + xa_find(&gmem->bindings, &start, end - 1, XA_PRESENT)) { + filemap_invalidate_unlock(inode->i_mapping); + goto err; + } + + /* + * No synchronize_rcu() needed, any in-flight readers are guaranteed to + * be see either a NULL file or this new file, no need for them to go + * away. + */ + rcu_assign_pointer(slot->gmem.file, file); + slot->gmem.pgoff = start; + + xa_store_range(&gmem->bindings, start, end - 1, slot, GFP_KERNEL); + filemap_invalidate_unlock(inode->i_mapping); + + /* + * Drop the reference to the file, even on success. The file pins KVM, + * not the other way 'round. Active bindings are invalidated if the + * file is closed before memslots are destroyed. + */ + fput(file); + return 0; + +err: + fput(file); + return -EINVAL; +} + +void kvm_gmem_unbind(struct kvm_memory_slot *slot) +{ + unsigned long start = slot->gmem.pgoff; + unsigned long end = start + slot->npages; + struct kvm_gmem *gmem; + struct file *file; + + /* + * Nothing to do if the underlying file was already closed (or is being + * closed right now), kvm_gmem_release() invalidates all bindings. + */ + file = kvm_gmem_get_file(slot); + if (!file) + return; + + gmem = file->private_data; + + filemap_invalidate_lock(file->f_mapping); + xa_store_range(&gmem->bindings, start, end - 1, NULL, GFP_KERNEL); + rcu_assign_pointer(slot->gmem.file, NULL); + synchronize_rcu(); + filemap_invalidate_unlock(file->f_mapping); + + fput(file); +} + +int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, + gfn_t gfn, kvm_pfn_t *pfn, int *max_order) +{ + pgoff_t index = gfn - slot->base_gfn + slot->gmem.pgoff; + struct kvm_gmem *gmem; + struct folio *folio; + struct page *page; + struct file *file; + + file = kvm_gmem_get_file(slot); + if (!file) + return -EFAULT; + + gmem = file->private_data; + + if (WARN_ON_ONCE(xa_load(&gmem->bindings, index) != slot)) { + fput(file); + return -EIO; + } + + folio = kvm_gmem_get_folio(file_inode(file), index); + if (!folio) { + fput(file); + return -ENOMEM; + } + + page = folio_file_page(folio, index); + + *pfn = page_to_pfn(page); + *max_order = compound_order(compound_head(page)); + + folio_unlock(folio); + fput(file); + + return 0; +} +EXPORT_SYMBOL_GPL(kvm_gmem_get_pfn); + +static int kvm_gmem_init_fs_context(struct fs_context *fc) +{ + if (!init_pseudo(fc, GUEST_MEMORY_MAGIC)) + return -ENOMEM; + + return 0; +} + +static struct file_system_type kvm_gmem_fs = { + .name = "kvm_guest_memory", + .init_fs_context = kvm_gmem_init_fs_context, + .kill_sb = kill_anon_super, +}; + +int kvm_gmem_init(void) +{ + kvm_gmem_mnt = kern_mount(&kvm_gmem_fs); + if (IS_ERR(kvm_gmem_mnt)) + return PTR_ERR(kvm_gmem_mnt); + + /* For giggles. Userspace can never map this anyways. */ + kvm_gmem_mnt->mnt_flags |= MNT_NOEXEC; + + return 0; +} + +void kvm_gmem_exit(void) +{ + kern_unmount(kvm_gmem_mnt); + kvm_gmem_mnt = NULL; +} diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 1a31bfa025b0..a8686e8473a4 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -761,7 +761,7 @@ void kvm_mmu_invalidate_range_add(struct kvm *kvm, gfn_t start, gfn_t end) } } -static bool kvm_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) +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); @@ -992,6 +992,9 @@ static void kvm_destroy_dirty_bitmap(struct kvm_memory_slot *memslot) /* This does not remove the slot from struct kvm_memslots data structures */ static void kvm_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot) { + if (slot->flags & KVM_MEM_PRIVATE) + kvm_gmem_unbind(slot); + kvm_destroy_dirty_bitmap(slot); kvm_arch_free_memslot(kvm, slot); @@ -1556,10 +1559,18 @@ static void kvm_replace_memslot(struct kvm *kvm, } } -static int check_memory_region_flags(const struct kvm_userspace_memory_region2 *mem) +static int check_memory_region_flags(struct kvm *kvm, + const struct kvm_userspace_memory_region2 *mem) { u32 valid_flags = KVM_MEM_LOG_DIRTY_PAGES; + if (kvm_arch_has_private_mem(kvm)) + valid_flags |= KVM_MEM_PRIVATE; + + /* Dirty logging private memory is not currently supported. */ + if (mem->flags & KVM_MEM_PRIVATE) + valid_flags &= ~KVM_MEM_LOG_DIRTY_PAGES; + #ifdef __KVM_HAVE_READONLY_MEM valid_flags |= KVM_MEM_READONLY; #endif @@ -1968,7 +1979,7 @@ int __kvm_set_memory_region(struct kvm *kvm, int as_id, id; int r; - r = check_memory_region_flags(mem); + r = check_memory_region_flags(kvm, mem); if (r) return r; @@ -1987,6 +1998,10 @@ int __kvm_set_memory_region(struct kvm *kvm, !access_ok((void __user *)(unsigned long)mem->userspace_addr, mem->memory_size)) return -EINVAL; + if (mem->flags & KVM_MEM_PRIVATE && + (mem->gmem_offset & (PAGE_SIZE - 1) || + mem->gmem_offset + mem->memory_size < mem->gmem_offset)) + return -EINVAL; if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_MEM_SLOTS_NUM) return -EINVAL; if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr) @@ -2025,6 +2040,9 @@ int __kvm_set_memory_region(struct kvm *kvm, if ((kvm->nr_memslot_pages + npages) < kvm->nr_memslot_pages) return -EINVAL; } else { /* Modify an existing slot. */ + /* Private memslots are immutable, they can only be deleted. */ + if (mem->flags & KVM_MEM_PRIVATE) + return -EINVAL; if ((mem->userspace_addr != old->userspace_addr) || (npages != old->npages) || ((mem->flags ^ old->flags) & KVM_MEM_READONLY)) @@ -2053,10 +2071,23 @@ int __kvm_set_memory_region(struct kvm *kvm, new->npages = npages; new->flags = mem->flags; new->userspace_addr = mem->userspace_addr; + if (mem->flags & KVM_MEM_PRIVATE) { + r = kvm_gmem_bind(kvm, new, mem->gmem_fd, mem->gmem_offset); + if (r) + goto out; + } r = kvm_set_memslot(kvm, old, new, change); if (r) - kfree(new); + goto out_restricted; + + return 0; + +out_restricted: + if (mem->flags & KVM_MEM_PRIVATE) + kvm_gmem_unbind(new); +out: + kfree(new); return r; } EXPORT_SYMBOL_GPL(__kvm_set_memory_region); @@ -2356,6 +2387,8 @@ static int kvm_vm_ioctl_clear_dirty_log(struct kvm *kvm, #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES static u64 kvm_supported_mem_attributes(struct kvm *kvm) { + if (kvm_arch_has_private_mem(kvm)) + return KVM_MEMORY_ATTRIBUTE_PRIVATE; return 0; } @@ -5134,6 +5167,16 @@ static long kvm_vm_ioctl(struct file *filp, case KVM_GET_STATS_FD: r = kvm_vm_ioctl_get_stats_fd(kvm); break; + case KVM_CREATE_GUEST_MEMFD: { + struct kvm_create_guest_memfd guest_memfd; + + r = -EFAULT; + if (copy_from_user(&guest_memfd, argp, sizeof(guest_memfd))) + goto out; + + r = kvm_gmem_create(kvm, &guest_memfd); + break; + } default: r = kvm_arch_vm_ioctl(filp, ioctl, arg); } @@ -6255,12 +6298,17 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *module) if (r) goto err_async_pf; + r = kvm_gmem_init(); + if (r) + goto err_gmem; + kvm_chardev_ops.owner = module; kvm_preempt_ops.sched_in = kvm_sched_in; kvm_preempt_ops.sched_out = kvm_sched_out; kvm_init_debug(); + kvm_gmem_init(); r = kvm_vfio_ops_init(); if (WARN_ON_ONCE(r)) @@ -6281,6 +6329,8 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *module) err_register: kvm_vfio_ops_exit(); err_vfio: + kvm_gmem_exit(); +err_gmem: kvm_async_pf_deinit(); err_async_pf: kvm_irqfd_exit(); diff --git a/virt/kvm/kvm_mm.h b/virt/kvm/kvm_mm.h index 180f1a09e6ba..798f20d612bb 100644 --- a/virt/kvm/kvm_mm.h +++ b/virt/kvm/kvm_mm.h @@ -37,4 +37,42 @@ static inline void gfn_to_pfn_cache_invalidate_start(struct kvm *kvm, } #endif /* HAVE_KVM_PFNCACHE */ +#ifdef CONFIG_KVM_PRIVATE_MEM +int kvm_gmem_init(void); +void kvm_gmem_exit(void); +int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args); +int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot *slot, + unsigned int fd, loff_t offset); +void kvm_gmem_unbind(struct kvm_memory_slot *slot); +#else +static inline int kvm_gmem_init(void) +{ + return 0; +} + +static inline void kvm_gmem_exit(void) +{ + +} + +static inline int kvm_gmem_create(struct kvm *kvm, + struct kvm_create_guest_memfd *args) +{ + return -EOPNOTSUPP; +} + +static inline int kvm_gmem_bind(struct kvm *kvm, + struct kvm_memory_slot *slot, + unsigned int fd, loff_t offset) +{ + WARN_ON_ONCE(1); + return -EIO; +} + +static inline void kvm_gmem_unbind(struct kvm_memory_slot *slot) +{ + WARN_ON_ONCE(1); +} +#endif /* CONFIG_KVM_PRIVATE_MEM */ + #endif /* __KVM_MM_H__ */ From patchwork Tue Jul 18 23:44:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317882 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 35906EB64DC for ; Tue, 18 Jul 2023 23:49:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 14D9B8D002B; Tue, 18 Jul 2023 19:49:00 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1241F8D0012; Tue, 18 Jul 2023 19:49:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id EDF5C8D002B; Tue, 18 Jul 2023 19:48:59 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id DFF298D0012 for ; Tue, 18 Jul 2023 19:48:59 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id B327FA04F5 for ; Tue, 18 Jul 2023 23:48:59 +0000 (UTC) X-FDA: 81026375598.11.3CB7874 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf26.hostedemail.com (Postfix) with ESMTP id D519B140009 for ; Tue, 18 Jul 2023 23:48:57 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=vxUR1tuj; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf26.hostedemail.com: domain of 36CS3ZAYKCDspbXkgZdlldib.Zljifkru-jjhsXZh.lod@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=36CS3ZAYKCDspbXkgZdlldib.Zljifkru-jjhsXZh.lod@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724137; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=/pt3Q2tpoxQxXn1tLyyE1UR18jbz9QzeXCmKj/ev2NM=; b=F6M83UGRGbmMLIKkVUhXTf7f1tCSpkwBqOT4NfjIDCRzYqf1wJy28pmfUWuKl2Fs9VCqwU Bw+L+SKOUurjMfAGfvdN/6CMBlPFjBiLIbwBPEtRJ6RbKPx7oXn5WbfOBf+/9TdYiXbaS3 J5wAWaA0qCRHaEOlONAadW+GUz5Toi8= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=vxUR1tuj; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf26.hostedemail.com: domain of 36CS3ZAYKCDspbXkgZdlldib.Zljifkru-jjhsXZh.lod@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=36CS3ZAYKCDspbXkgZdlldib.Zljifkru-jjhsXZh.lod@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724137; a=rsa-sha256; cv=none; b=7G30T+2BDfVjdk0/EMpQ7Os+cTwYRzElBFxd56H57IQ7yfVJrKwBrzYAxBC+4pjN4d075E /VREhRwVrX2sV60AieTj5UVRHefBVw8oErU/oieB0AjlaAIqZI3zNhCnH+RqO8ZGJKdCJ2 JYSCfh64gluclmVgd3+f7hBgautak7U= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b8b2a2e720so32165645ad.3 for ; Tue, 18 Jul 2023 16:48:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724137; x=1692316137; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=/pt3Q2tpoxQxXn1tLyyE1UR18jbz9QzeXCmKj/ev2NM=; b=vxUR1tuj/vcGsaOe3o3Dg3+dBjjNSQ1vNUqJnA915YLta3qnEHtgJJmhnuBEvMSvuO PeQ54yO76QkRq4Poh7gfw5EibjHULF6szcbTO++R7xTLcTVHQgaEtb3O2GkE8TOOgrPj j+skKU6AKAL/CHeOI2fWZhtH2+GBhR8GFXcSgy+S791M68OMvBR8fw1sghKrAfPeG39D aPhvXxFMYa/vphJO2xprgh5gp8hbsuB9tPxNTIVm7fk+E06HBzO4G4hjTZ+UFpjlD7u9 AiVs2GVbO1nSDvgFw3EWZlgv0q++Q9CJ07oUOhmTcF8UoY6sdZ1aY/fD8Yp9QaPi1uiy 5yig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724137; x=1692316137; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=/pt3Q2tpoxQxXn1tLyyE1UR18jbz9QzeXCmKj/ev2NM=; b=X0gzvsdEcrAb+Brtm+mkqky0TEwTyeXUpdWFFjwnBnjGy1fTJPxfcfabCCa3w9IGiI yCDVgL5ahSFqhkpgJVGWOl+5zaYyqrOdRQBqdzE2nR4Za0StIJujZAP492Ojq7rvwl7c 2VUAQhoPM6iFVo3TSj2fDeFA5vSq1UlzlXN5n9daRdZLr9R9lHMasI2kuy7pZmrekSll Z1IFBxYYSeQgcBGPjnohGpgWJKZQumc1j92k4sNKKOVLfn4zvz5snznr/Ro9VD+Sbdis pIATxp7V+K3xbRQx+ddIC8T89bW5jFbcq8SjnabaUTMxQ06DAoghAIIuAPZFd1849UQK EeGA== X-Gm-Message-State: ABy/qLblJhM8opX42sSYUkpNnl2Cl3JNEnPwXvNAC+5VfyVmykyrggOY 8/EgfkkK76SViMUwx7oZ+txkm8BVP1g= X-Google-Smtp-Source: APBJJlFIKaKNLayUXkm9YIdNhY8NWw+bGGk4UkSeGDFPqrXqT1vlGljtzz/Lr2RncRF8zUbyrReIDSYCDDk= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ce88:b0:1ab:18eb:17c8 with SMTP id f8-20020a170902ce8800b001ab18eb17c8mr7987plg.2.1689724136690; Tue, 18 Jul 2023 16:48:56 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:56 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-14-seanjc@google.com> Subject: [RFC PATCH v11 13/29] KVM: Add transparent hugepage support for dedicated guest memory From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: D519B140009 X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: cfthm8sga9ppduee48axr9ees1hzeq6o X-HE-Tag: 1689724137-351685 X-HE-Meta: U2FsdGVkX190V6+62rXH3Q/TjpqkU0/lMit9B9LJun9q0liveygBYB7eSCFOJmKuxFIhTEvz8bLv7pvEIgsSNJigHwoPfo9e0TTn9bXKDTDjrwt0Orid5FqpVycg+rLmoc3wIuk3hVfmntnGi9k3b+Tt/allEEWBkY2KNqqM3W4YcQJOrUeHkR2c/mRIbGjAIMTrEVFvx9ARQZF8CPx2CWxJJSb1H7S1VolAFqdWXPotz/HkCrUeZbJozqdCe+b1ms+yeyV30U0qUkL+sE6bWGmCO/j0AtIojKq3rpXqbGNJuf/15+OOw95p6d0zghHYxczbjmHywLwn4pJL5dgy6boAyb5aHSCEbutXk0kOdNj7BiICul04dZ7OY0DlbwgSBHcR4EEl/uicL4gITlyRBYJsCKtWv6IvQYH2zW1+mC8auf1rz/5eRKdpsBkWO4gXwJrdZGhwObXUl9wVREan397b6ik5t0Ib4ZX8G0mRa+FlEVEIZdu45lal+c1V6hVb9WCrrnJomPC0ufyPc07tngFdfgqRlKCoPeMg3NjJD+Or3k4D9lh0hXQZ37yP0vmDgjdJbDR5YaRnROBIOFOv6UnhTECEmUr7/Rjdy1trcSvT2MxNT2IPKTQKAFGV034GDtb0jbEeiZTYF7HKWpWbv8w6Lo6k72wZVI/DoV9cKYoHW5hbZ/M004ITy6vsDeYEZWIE4InaAjnT5bT3THPL+CSyjuYFZcOIaW24jBNAQwG0LASCbOyUJG/MWBrbFiD7YBTGepQqXeih9Aruw03S/RTdyu90JuXw+7+09adDVkYvi3xFTLSNB6e9+3Idl7QkWOGPkvPcFc6cl7BBRaczQImOgGiVKFoSOURxwZvD0xKyfRfdzt9lpWjy7oiADjRKM31yk2fDbgAEPP5XyHVb246tCMKzMl9jwAFDcGOSHVtPJZ8Ooya5SqGUkLvS7GZxiCkugN8VnXW9pj/awkv PCnT0BeW TnoqNmGgF0cgchr2YtqEgVvSqI8utD6kSYJSb+vJpNxQbeNz1C8jco2WgJqF1kn7lAojBjy1QraJJkmUM5IKevnHb64dsbaHJCkOBTDFSLPwxqT6hQdm6cmjrOcgFnrYTQgyN9PMAXJ2DmTkSTVBQjll2+HCZ1q3HXx/Zqwj2+yemeak4VBacZ7ExiRvkF3g9DuuCCOhsC4dm8xYhMzB0bu+6kLPLQ8RJhg5JhLn6TmEB8eLa/HNXXb4aPE6szhPP9LlaN25E6dpsdQyxVZ98hK4QvoFBkIlAlMl/519T+bS7N33GtNJ5W4WuVVRhMFiPfuzL1S6Un5uCgjhDl6X4oRSByGExcC2/Y6W3nl1yIhP0m6gP4OIH7WOmG9tcHQZrvZvQg3TkLlMbPiirUi4LsfvCmEaJ1bWpg2Flpw/txh9ov594/B90PNbiAoyTFdxkydQnVQGshXHG9f7bjAuo3ACJtLHUryxwpXCk30pmDsLQXKhzo4OhFV1zoNdhxTg0DgbZja9zg5zHrZmuPUoL7jfsX6Pw+rvdZIYVo8QsnyGmvtzw/kZoLu8ub7LVglGVH/pflWaEROHQJiijmoITccCQCLGobZ0xXWi259Tsr+KutZrICWJXCjFn1kiuJioqbxlpiCcRefZTx47G2AnYs5UGjpf+SLY6fFJwRB53hzalHC6MoZ9xtoisDVDGOd9wwMymIrq5sNMmApnC5fDpJFtFtaR8MIC5PRgNsJm69pxiMC2ZjUklvBXCznLvXZFJ1Dgl/j3LK5qOw2jlRpuqLpGNKYCL/lBwilFC96r97dZx1vkVEisIuXk4I9/F6m2KOxmp 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: Signed-off-by: Sean Christopherson --- include/uapi/linux/kvm.h | 2 ++ virt/kvm/guest_mem.c | 52 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 9b344fc98598..17b12ee8b70e 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -2290,6 +2290,8 @@ struct kvm_memory_attributes { #define KVM_CREATE_GUEST_MEMFD _IOWR(KVMIO, 0xd4, struct kvm_create_guest_memfd) +#define KVM_GUEST_MEMFD_ALLOW_HUGEPAGE (1ULL << 0) + struct kvm_create_guest_memfd { __u64 size; __u64 flags; diff --git a/virt/kvm/guest_mem.c b/virt/kvm/guest_mem.c index 1b705fd63fa8..384671a55b41 100644 --- a/virt/kvm/guest_mem.c +++ b/virt/kvm/guest_mem.c @@ -17,15 +17,48 @@ struct kvm_gmem { struct list_head entry; }; -static struct folio *kvm_gmem_get_folio(struct file *file, pgoff_t index) +static struct folio *kvm_gmem_get_huge_folio(struct inode *inode, pgoff_t index) { +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + unsigned long huge_index = round_down(index, HPAGE_PMD_NR); + unsigned long flags = (unsigned long)inode->i_private; + struct address_space *mapping = inode->i_mapping; + gfp_t gfp = mapping_gfp_mask(mapping); struct folio *folio; - /* TODO: Support huge pages. */ - folio = filemap_grab_folio(file->f_mapping, index); + if (!(flags & KVM_GUEST_MEMFD_ALLOW_HUGEPAGE)) + return NULL; + + if (filemap_range_has_page(mapping, huge_index << PAGE_SHIFT, + (huge_index + HPAGE_PMD_NR - 1) << PAGE_SHIFT)) + return NULL; + + folio = filemap_alloc_folio(gfp, HPAGE_PMD_ORDER); if (!folio) return NULL; + if (filemap_add_folio(mapping, folio, huge_index, gfp)) { + folio_put(folio); + return NULL; + } + + return folio; +#else + return NULL; +#endif +} + +static struct folio *kvm_gmem_get_folio(struct inode *inode, pgoff_t index) +{ + struct folio *folio; + + folio = kvm_gmem_get_huge_folio(inode, index); + if (!folio) { + folio = filemap_grab_folio(inode->i_mapping, index); + if (!folio) + return NULL; + } + /* * Use the up-to-date flag to track whether or not the memory has been * zeroed before being handed off to the guest. There is no backing @@ -332,7 +365,8 @@ static const struct inode_operations kvm_gmem_iops = { .setattr = kvm_gmem_setattr, }; -static int __kvm_gmem_create(struct kvm *kvm, loff_t size, struct vfsmount *mnt) +static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags, + struct vfsmount *mnt) { const char *anon_name = "[kvm-gmem]"; const struct qstr qname = QSTR_INIT(anon_name, strlen(anon_name)); @@ -355,6 +389,7 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, struct vfsmount *mnt) inode->i_mode |= S_IFREG; inode->i_size = size; mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); + mapping_set_large_folios(inode->i_mapping); mapping_set_unevictable(inode->i_mapping); mapping_set_unmovable(inode->i_mapping); @@ -404,6 +439,12 @@ static bool kvm_gmem_is_valid_size(loff_t size, u64 flags) if (size < 0 || !PAGE_ALIGNED(size)) return false; +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + if ((flags & KVM_GUEST_MEMFD_ALLOW_HUGEPAGE) && + !IS_ALIGNED(size, HPAGE_PMD_SIZE)) + return false; +#endif + return true; } @@ -413,6 +454,9 @@ int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args) u64 flags = args->flags; u64 valid_flags = 0; + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) + valid_flags |= KVM_GUEST_MEMFD_ALLOW_HUGEPAGE; + if (flags & ~valid_flags) return -EINVAL; From patchwork Tue Jul 18 23:44:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317883 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 944D1EB64DD for ; Tue, 18 Jul 2023 23:49:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 45A898D002C; Tue, 18 Jul 2023 19:49:02 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 409D68D0012; Tue, 18 Jul 2023 19:49:02 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2841D8D002C; Tue, 18 Jul 2023 19:49:02 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 19B098D0012 for ; Tue, 18 Jul 2023 19:49:02 -0400 (EDT) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id E747DB0FE1 for ; Tue, 18 Jul 2023 23:49:01 +0000 (UTC) X-FDA: 81026375682.23.821D15F Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf12.hostedemail.com (Postfix) with ESMTP id 10C3840017 for ; Tue, 18 Jul 2023 23:48:59 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=E5XUQ5BO; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf12.hostedemail.com: domain of 36iS3ZAYKCD0rdZmibfnnfkd.bnlkhmtw-lljuZbj.nqf@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=36iS3ZAYKCD0rdZmibfnnfkd.bnlkhmtw-lljuZbj.nqf@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724140; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=yr5kPp//ycHeBe41TiVxkGxE+I0FtPuZavos26l+cCE=; b=7Ja5Hth+2Mrw9481spq3hnpL7nHKuxW2ImepoE3j9q6XHiJZ1YMij43eCKMondMP/H+gsC SXMG4EKITnWkzPbspF79F9ngHkLBHd+8qeBz9/PonI2wYDHS14FYGYDTcIcRRxuLuN27Lb kXLVqIgCE+TRiYnny5M/oqNJvHH4Fj8= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=E5XUQ5BO; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf12.hostedemail.com: domain of 36iS3ZAYKCD0rdZmibfnnfkd.bnlkhmtw-lljuZbj.nqf@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=36iS3ZAYKCD0rdZmibfnnfkd.bnlkhmtw-lljuZbj.nqf@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724140; a=rsa-sha256; cv=none; b=Hx0Z8eySBRJfH+Vt4Hy4PJ895JAc1oHrdqAJwOBQBVHrPCNlT56C8XsglrvN/FI1AM7UXe ajzzOMw2JEIYuIVYv6rgnBUVMByuMbBuXmsLxhlIPwIfXefrZJNJY6P6HB2AMD+d6ujdFr klYMEmFLkbJUizb/q0nQmDP38rTWhus= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b8a4571c1aso33127005ad.0 for ; Tue, 18 Jul 2023 16:48:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724139; x=1692316139; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=yr5kPp//ycHeBe41TiVxkGxE+I0FtPuZavos26l+cCE=; b=E5XUQ5BOUPih8BJs1OU21KMtQ0H2gaSku+U7buhnuKlRnySGwZ68OBKlxRT9sWT5mJ f8n+BR26cm0lRm1JXX78qwSra7nbrQ6sXHvLQZaZDcIFccPOjvvZmZeAzcuh7O2Q/Qjq eAJ0ZmDH3NG1CIo5jmkXJBD/J0qhHBq3KrWoOEZ65tybA//6e/m3I0cImw/wdA9FJDS3 AlGOTWITqYnobVa5ljRgBqTN9AP0pMpMc6YQF9quW057Wh43QQOVDM46RFAPH9PRZwwq CZoc5KVa79eYnqhOrpC35DVzpFIb/w5YuQeYDKyW3j9UeKVBLo58qtN5wBD28kBBLbq2 wpNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724139; x=1692316139; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=yr5kPp//ycHeBe41TiVxkGxE+I0FtPuZavos26l+cCE=; b=WjAJy8nH2nIQfwsui0qIUg0Gc0PBzXmyKuvLIOzDhyvfzNqmhqLhupx0VGepYOTq48 pWQAE5IwNAdfSdeuZn0TRsoS9Uukfn1cXSvShdj+/hkQaIv39Tw/AEAyYXRIUJgrE6r3 I2o8YQFwTI1kEnGxvQuEBT2YmtKhNOQ3c5A6U3Ntfg54DE1DBSl0Q1ODyiafd3VKZsm4 MWQ+oYipsaFqOHS3I8M3NdO+QDPRMz/WJh3V1IbdkyO33rv5jlVJFGNz6UGmdYDupfjW Xq0hj+i0EgBQjWef5VAtshpGWSkgz1hHN2zQaqL7RZmlWhsnnHLlGzmldtKcPArIbU8w ZLpw== X-Gm-Message-State: ABy/qLYZL+PH18uzaB9VcQaN0VFTkES8oDQRP2tgcPVp8HLPKrYIkUbH 3ZPjOw3BLCI8bMU3LQzapEZvAEz1vUY= X-Google-Smtp-Source: APBJJlEVWl5JDRlnPOqWQbyjGWHyKDzKVGtobf5+lC7u6yLDp0aN/2aXMEnW9jTxfL1DAcNC6lZfVqqUTaM= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ea01:b0:1b8:a56e:1dcc with SMTP id s1-20020a170902ea0100b001b8a56e1dccmr7653plg.13.1689724138849; Tue, 18 Jul 2023 16:48:58 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:57 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-15-seanjc@google.com> Subject: [RFC PATCH v11 14/29] KVM: x86/mmu: Handle page fault for private memory From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 10C3840017 X-Stat-Signature: 5q59n7ne8eib987y9w33jrwmmwko3ewe X-Rspam-User: X-HE-Tag: 1689724139-464977 X-HE-Meta: U2FsdGVkX1+aTohSyz29T+g+CDEphNlubhbtQxve6mqD9IYSsocI20jvhydpr4xqyG9OhPWC/usVbqVdau0I8JxMDGBGIwq0JzAAy2fq3/4FGOcaFoE34JLlwXLbzvKTu0dwbavK+qfO+rIH63+sWZu4AJ3FWtsWSdUIbK25BJb0KOA9iEMMpWzDQlttymWqoaHX1Ef2isVIrWWHdMeTqaisAz7ucSGM8ZxTNKpREB5F2YVh1/FJWDpP62dMvhb4qCkRLbNt/a5OcJk8kPcNU1Uw+WFMcqFb9L4Y6Oek7m482ebcpW9LqsjIYfQt5G4GV4bwrukeNKY62Ong9HT6uxnT+HeMSzvUYD7ztvBdsGNBrJMTBVZsMKFGL8ZDKsIYFNMV8PWNQ5kDTJlIiu+JFNvYc+j0Z1f5uBkun1c8WLI2MDXBrmVhAHdX4ICzoDnMOpgc/A2Yu8aCdQ8iyjiydlvvRl7bOkA78JyKQknJpnRkCxCYpgOqOk7iwvg3qCAwUdKB14UHxtSUxXrfR3tKs53rHvAmUlMuGNedzKEW4rWOyNuW53d//A2xlpNa2GNW5JZERyGIDbI0W/HRFVKT+o//+4y5hNmOgtayQYo1AWPvHtzq2e2mNSxcaE4wp1MibfqRBC9BgnwBlseeh9RQ7wSyTkWXNDNIoWvWnsVL16VhTZ9Vk4osaySpQO4dPDJgplX82QJGcBGAS8hCHvkvBS/77XCk7imDX3P+sIOMd4iutM5ojFlpp88FjeeUoLneHBe9uCOs8r5idqPCeWq3Hj9OGw5GN/N/18nA+SvqwOtP6CkZO+SzOzG+mXS1cY+Mk8+Z8HsGWzqn+TTS/Y7U/U99hU9Sl5spX2OQlEV2ZeJA+wmOjJcuL0l3WMWylR/YKRlZ9dFKuZPNbzMdfhVMIS4NncJP/GqTJ0PCaEWOHijCYkQgP0fDEd3cFAxj3UB09IfGy7n3P1Y4mnEtm8a pw3cWvYZ beEuS889IvBH9KmnMT/x+8UA+3Mc5PzUuLYrLMaKHUiYZhnR8vaWFhDBxaClLm7bBEPpSNBycU7n8P9EIjTva1Mae3E38RGPbsAITJUAhp4ac7F4wyqad3rCq96AJPfWBSm/yNleilRW8s912BAQ468S03swRjdtPKlBm+AAR0rDpluO1Xjtfl5dzU20Ba8x97JT2GXlNl1WEAtRRADFb75DzIMtOekSio9gadKGuJdE6E0RdW6Be2olm6DIQ16dvj4SEJkD+iQZfdi4a8WQV+E1icXX9KMID5yKIZQNo65rpq+DDQwSuzjbf4bdDhKxr3Z8KqqA3SPUZPPDMMWAqgVgdbJl/HjSoNnCVf0xQUBx7RWi5MAhGdquUoLJmS2SeVHmPiM+3RCK3gBJgzBJx8xuOZpavuyOX5ivPT4DLYIPrLpdTZHNal8bKsneBmrDBmURGxlPv7FAmZSG7E1QifRSAK6D+wkPZMn97j5Dc8M959EAEeaVHxpA05HolSZ37gQindOXHYbZw8dHGR02W2FYcKHwq7x+T+coNFPT0vTmBsPcUdg3wcaR3LnNxemrcXij+lNnF9KUtAeBK9Ov3jZWS+c5jazIjeOsnxfZ3vZgd6yuzom8mBV7tveZ/A+J/hfsrB1POHi7YGarAgs13+w/b1yigsqZsv21yb0kOdOy/KDC12EwyAFyYySALzPSuPdPoKv87g3Wie9Z31ncMvklHHyN8qnnIB+xmrsTe9T5i2bZk1zQlefmxIeEmEcYDO6M4bCofxC2y3VfZI1AHA34bqPfNsQtEpVA15RKMGPcYCiY= 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: From: Chao Peng A KVM_MEM_PRIVATE memslot can include both fd-based private memory and hva-based shared memory. Architecture code (like TDX code) can tell whether the on-going fault is private or not. This patch adds a 'is_private' field to kvm_page_fault to indicate this and architecture code is expected to set it. To handle page fault for such memslot, the handling logic is different depending on whether the fault is private or shared. KVM checks if 'is_private' matches the host's view of the page (maintained in mem_attr_array). - For a successful match, private pfn is obtained with restrictedmem_get_page() and shared pfn is obtained with existing get_user_pages(). - For a failed match, KVM causes a KVM_EXIT_MEMORY_FAULT exit to userspace. Userspace then can convert memory between private/shared in host's view and retry the fault. Co-developed-by: Yu Zhang Signed-off-by: Yu Zhang Signed-off-by: Chao Peng Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba Signed-off-by: Sean Christopherson Reviewed-by: Paolo Bonzini --- arch/x86/kvm/mmu/mmu.c | 82 +++++++++++++++++++++++++++++++-- arch/x86/kvm/mmu/mmu_internal.h | 3 ++ arch/x86/kvm/mmu/mmutrace.h | 1 + 3 files changed, 81 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index aefe67185637..4cf73a579ee1 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3179,9 +3179,9 @@ static int host_pfn_mapping_level(struct kvm *kvm, gfn_t gfn, return level; } -int kvm_mmu_max_mapping_level(struct kvm *kvm, - const struct kvm_memory_slot *slot, gfn_t gfn, - int max_level) +static int __kvm_mmu_max_mapping_level(struct kvm *kvm, + const struct kvm_memory_slot *slot, + gfn_t gfn, int max_level, bool is_private) { struct kvm_lpage_info *linfo; int host_level; @@ -3193,6 +3193,9 @@ int kvm_mmu_max_mapping_level(struct kvm *kvm, break; } + if (is_private) + return max_level; + if (max_level == PG_LEVEL_4K) return PG_LEVEL_4K; @@ -3200,6 +3203,16 @@ int kvm_mmu_max_mapping_level(struct kvm *kvm, return min(host_level, max_level); } +int kvm_mmu_max_mapping_level(struct kvm *kvm, + const struct kvm_memory_slot *slot, gfn_t gfn, + int max_level) +{ + bool is_private = kvm_slot_can_be_private(slot) && + kvm_mem_is_private(kvm, gfn); + + return __kvm_mmu_max_mapping_level(kvm, slot, gfn, max_level, is_private); +} + void kvm_mmu_hugepage_adjust(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault) { struct kvm_memory_slot *slot = fault->slot; @@ -3220,8 +3233,9 @@ void kvm_mmu_hugepage_adjust(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault * Enforce the iTLB multihit workaround after capturing the requested * level, which will be used to do precise, accurate accounting. */ - fault->req_level = kvm_mmu_max_mapping_level(vcpu->kvm, slot, - fault->gfn, fault->max_level); + fault->req_level = __kvm_mmu_max_mapping_level(vcpu->kvm, slot, + fault->gfn, fault->max_level, + fault->is_private); if (fault->req_level == PG_LEVEL_4K || fault->huge_page_disallowed) return; @@ -4304,6 +4318,55 @@ void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, struct kvm_async_pf *work) kvm_mmu_do_page_fault(vcpu, work->cr2_or_gpa, 0, true, NULL); } +static inline u8 kvm_max_level_for_order(int order) +{ + BUILD_BUG_ON(KVM_MAX_HUGEPAGE_LEVEL > PG_LEVEL_1G); + + MMU_WARN_ON(order != KVM_HPAGE_GFN_SHIFT(PG_LEVEL_1G) && + order != KVM_HPAGE_GFN_SHIFT(PG_LEVEL_2M) && + order != KVM_HPAGE_GFN_SHIFT(PG_LEVEL_4K)); + + if (order >= KVM_HPAGE_GFN_SHIFT(PG_LEVEL_1G)) + return PG_LEVEL_1G; + + if (order >= KVM_HPAGE_GFN_SHIFT(PG_LEVEL_2M)) + return PG_LEVEL_2M; + + return PG_LEVEL_4K; +} + +static int kvm_do_memory_fault_exit(struct kvm_vcpu *vcpu, + struct kvm_page_fault *fault) +{ + vcpu->run->exit_reason = KVM_EXIT_MEMORY_FAULT; + if (fault->is_private) + vcpu->run->memory.flags = KVM_MEMORY_EXIT_FLAG_PRIVATE; + else + vcpu->run->memory.flags = 0; + vcpu->run->memory.gpa = fault->gfn << PAGE_SHIFT; + vcpu->run->memory.size = PAGE_SIZE; + return RET_PF_USER; +} + +static int kvm_faultin_pfn_private(struct kvm_vcpu *vcpu, + struct kvm_page_fault *fault) +{ + int max_order, r; + + if (!kvm_slot_can_be_private(fault->slot)) + return kvm_do_memory_fault_exit(vcpu, fault); + + r = kvm_gmem_get_pfn(vcpu->kvm, fault->slot, fault->gfn, &fault->pfn, + &max_order); + if (r) + return r; + + fault->max_level = min(kvm_max_level_for_order(max_order), + fault->max_level); + fault->map_writable = !(fault->slot->flags & KVM_MEM_READONLY); + return RET_PF_CONTINUE; +} + static int __kvm_faultin_pfn(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault) { struct kvm_memory_slot *slot = fault->slot; @@ -4336,6 +4399,12 @@ static int __kvm_faultin_pfn(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault return RET_PF_EMULATE; } + if (fault->is_private != kvm_mem_is_private(vcpu->kvm, fault->gfn)) + return kvm_do_memory_fault_exit(vcpu, fault); + + if (fault->is_private) + return kvm_faultin_pfn_private(vcpu, fault); + async = false; fault->pfn = __gfn_to_pfn_memslot(slot, fault->gfn, false, false, &async, fault->write, &fault->map_writable, @@ -5771,6 +5840,9 @@ int noinline kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u64 err return -EIO; } + if (r == RET_PF_USER) + return 0; + if (r < 0) return r; if (r != RET_PF_EMULATE) diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h index d39af5639ce9..268b517e88cb 100644 --- a/arch/x86/kvm/mmu/mmu_internal.h +++ b/arch/x86/kvm/mmu/mmu_internal.h @@ -203,6 +203,7 @@ struct kvm_page_fault { /* Derived from mmu and global state. */ const bool is_tdp; + const bool is_private; const bool nx_huge_page_workaround_enabled; /* @@ -259,6 +260,7 @@ int kvm_tdp_page_fault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault); * RET_PF_RETRY: let CPU fault again on the address. * RET_PF_EMULATE: mmio page fault, emulate the instruction directly. * RET_PF_INVALID: the spte is invalid, let the real page fault path update it. + * RET_PF_USER: need to exit to userspace to handle this fault. * RET_PF_FIXED: The faulting entry has been fixed. * RET_PF_SPURIOUS: The faulting entry was already fixed, e.g. by another vCPU. * @@ -275,6 +277,7 @@ enum { RET_PF_RETRY, RET_PF_EMULATE, RET_PF_INVALID, + RET_PF_USER, RET_PF_FIXED, RET_PF_SPURIOUS, }; diff --git a/arch/x86/kvm/mmu/mmutrace.h b/arch/x86/kvm/mmu/mmutrace.h index ae86820cef69..2d7555381955 100644 --- a/arch/x86/kvm/mmu/mmutrace.h +++ b/arch/x86/kvm/mmu/mmutrace.h @@ -58,6 +58,7 @@ TRACE_DEFINE_ENUM(RET_PF_CONTINUE); TRACE_DEFINE_ENUM(RET_PF_RETRY); TRACE_DEFINE_ENUM(RET_PF_EMULATE); TRACE_DEFINE_ENUM(RET_PF_INVALID); +TRACE_DEFINE_ENUM(RET_PF_USER); TRACE_DEFINE_ENUM(RET_PF_FIXED); TRACE_DEFINE_ENUM(RET_PF_SPURIOUS); From patchwork Tue Jul 18 23:44:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317884 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 0D675C001DC for ; Tue, 18 Jul 2023 23:49:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D384D8D002D; Tue, 18 Jul 2023 19:49:03 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CE3CB8D0012; Tue, 18 Jul 2023 19:49:03 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B5E998D002D; Tue, 18 Jul 2023 19:49:03 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id A64C88D0012 for ; Tue, 18 Jul 2023 19:49:03 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 872FA1A04BA for ; Tue, 18 Jul 2023 23:49:03 +0000 (UTC) X-FDA: 81026375766.15.5AA8825 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf05.hostedemail.com (Postfix) with ESMTP id B55ED10000C for ; Tue, 18 Jul 2023 23:49:01 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=jr2fs44d; spf=pass (imf05.hostedemail.com: domain of 37CS3ZAYKCD8tfbokdhpphmf.dpnmjovy-nnlwbdl.psh@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=37CS3ZAYKCD8tfbokdhpphmf.dpnmjovy-nnlwbdl.psh@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724141; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=RgixHOC4KKphqTDNjO+JFitY6BYM03Mxe9+IG67pQW4=; b=YZ9e6S9NXuFECkaypm7WLGJe4fM3El5Vz+TAWWHi38m/ajdaZsuz7fJxLvJqprnSjHzZu1 kn5kRKE56yAuxSiSDD05RZb20AIODcIeO6oxEab5ylkW34j8MFVcjys3zExFiMHJxsH+ML zJhaFwDTF1QrXnvleZ6aKOqnVyoAUaI= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724141; a=rsa-sha256; cv=none; b=EZr98idLSGDqaRdDu9dPQMsz/alXnr+E3ogfmi5ndFfmo+OrXgrsqj1h2JzfKmT2Zze8NI OgkQLkSiRPFA7kKsJCyFik50LEQ32SIoUlNRnn3i/C/G07/z3l8bLzQlbVNouN2qVX70o4 rltAY6mcWXEEoPWoIAZsvk5H11QnHWE= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=jr2fs44d; spf=pass (imf05.hostedemail.com: domain of 37CS3ZAYKCD8tfbokdhpphmf.dpnmjovy-nnlwbdl.psh@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=37CS3ZAYKCD8tfbokdhpphmf.dpnmjovy-nnlwbdl.psh@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b896096287so48929975ad.0 for ; Tue, 18 Jul 2023 16:49:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724140; x=1692316140; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=RgixHOC4KKphqTDNjO+JFitY6BYM03Mxe9+IG67pQW4=; b=jr2fs44d+7BmMZPp9ybqRVhLe6DoUmnDVGGK/YxGf0Asu27qFmDOog5/7ezq8m4Ys7 LB4TAF+aUXOU9vvZC3f7sCq7Qp6i9IPbi3VCM23iiZE2lWsjgfpk1UphaC4PromgcBa9 nNuUO7C76a3+5q0Gf8ijV1dvvN0iI9MYocGBFlwlZWxo+oVA0VDDW9ZRP17wI+9kNKbR b/F5X7vtJ0QCTS7pjO0kMtxUEap2HU9N8Chl8h4VBmGvGutp4QtM3GkrHRbiuZH0RfDS Df8UlL/rj7lQEedr2TSELrHMasjkzJ51vXMKZpffeRoXHoSbQaRFODPANCOUb4yN0y8L ypGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724140; x=1692316140; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=RgixHOC4KKphqTDNjO+JFitY6BYM03Mxe9+IG67pQW4=; b=YTi8XM2pQqvY2CBg+nQYOr3sQnlGbxeay+ybrUZxmaXqiSDmQH2LfmyHs23Y7pU5bW GiY6As2n41z4HXLh+3AtLVLr9TSYir4nxdteypux9iqrUj47om456gEYEC47hJn4cau9 eCwKPYfEYpNEV6O3mw2cKcbLJmMDtoPrtAfK6svPKs2d/tHSEcgPERoQpM+QNMpXfAN4 1fHqMiZaIou2Td8aBrHAQP19jrqiGxB8Y1qVfSxuxOj2s3tXSkqz7vQ61MLuQ0fL6N6B O3N7i7N2hzUggLy1cZoHT4thWm4rvonVvrVVa+tembKkO2CVvSLL4fvVIXrhZHnwUjaZ bcfA== X-Gm-Message-State: ABy/qLZsI3AOYL9ENb1y+7RW/5k5KrWSV/UmfdblPZ4MNv6FyJUhzqQf wcEaq8dAU6hBHqqt6H6a4FDyDEbT8rI= X-Google-Smtp-Source: APBJJlGmnxKpuVWpCwuKlcGO555af6O2CzLSJLrftIAb/WXIRBmN0a0otiSNa7LmthtetMuC6YJJMcmnlto= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:d2cf:b0:1ba:a36d:f82c with SMTP id n15-20020a170902d2cf00b001baa36df82cmr7700plc.7.1689724140625; Tue, 18 Jul 2023 16:49:00 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:58 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-16-seanjc@google.com> Subject: [RFC PATCH v11 15/29] KVM: Drop superfluous __KVM_VCPU_MULTIPLE_ADDRESS_SPACE macro From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: B55ED10000C X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: e5i8174pctfe89etqriymawr9hetjkwf X-HE-Tag: 1689724141-318499 X-HE-Meta: U2FsdGVkX19OFsMg+YqaXHZq2s3zFfhWcQhqwE79tmnKQZdvPs016Vll9zmq/pRN+QWeI1idxqyNCA7tuw8InTjtZL2PPuG7+Ieb8B0cvYCD1inYqncxA4LiBLhlCzz7ZkRRam47qjy1UgD5ZAM7wm4uPZQ5Dce9CaAcbPahIyFWKOSgT8i9CJppfHIkfW4HvVaFdt+HfswjZl/CA5o+AqbINKLV0VMz4EMG0Udx25gL0kK4DoET6LfGPtxcIVssjghQZNyL/ECj6rft4swlxEKY4W7fNsluVHHERDe+4ZpqOruV1VDJwYo6GxRiNbmNm305rN76sp9IV+qJtscb6KH1Lp46lk+kl4Jz2LDpSZ/7wF6xrn3PERdpOKRhdgznGBlVWcXhN4YNqNXf9bwXaM1+yTAO9tn9dznay3JedS0qWRAqEWPGCxGcqZ3xTK2XKGdBCY+Y777CgxpwE9MXzPVbfEf+HPG7qLo22xtois33mlbnuzz7VZLBKzt721ZXeZFBlrqv920wugPP2g0kUX169/6TzctbSm2TRKnfXBEHPw+gJ4oxhNXFbbxWzpO1eFKrB9HUFO+lzC249kW5tHCqs9nBax8WPa6+SdwZycafuhfWcMg7+EKiz8+e5c43j+5n+MT7egLK6Ml2IPVBFhk2cuC9EbzjgO5A+zuqIGWC249YuqYWmrLHWoZy4ZAVFwr4bei1O8BL+xh44iSUSj7EetH8pZUpAPBUKrkA3hTBK5BxjMhPwoJyulWC4edIzUBAGX5k1px+G891ksUraJxbFpBU1ygteBHNDel5NEfptnjLDnYD7Z11h0KcMRod7ehGpHNg0ybi8V+1AHNnLbhXXjY9XIV9y1+prKesFARRHgBHuuzHbj4YhFCP+BXN8vPDPV3XXdcrOh1KxW4EBWB3q40Xp8jvVUXsjswEsbzOP9IKAXTanLcLWL+2D3X24sL86XbFg8hpoW1LdeY +WugYWBl vRoVSWqDNAERzwddS2IiRVMEEGq62HXnuvDou7bPGNmBR6AZHJJ8lrdLFO0bta/YMybLjBDS4GXkR/GwT2BVGK8oG2H+xL0Yr46F5A8HcMoLPttACcbL34nVW53GcFCAo26Ub0CIQeZI5R1dnEehZMc5Y252tepxksykqWkZ6miEdid7cNdqlTVRRnngFmpWcqdM6frahZle8cXeSufk9NmpLCUiVNL1bLv1/XGUvyvPuVgTNFoKDdgBQGAIzdQIsLVj4D6EMB4BU7D3mnxU1Jf+RLdmY+zR6AhRaro+RxzX3iKrNk+hWIitwUbzlx8Eqty3sU1zSt/rTP2GGgYdQkN6bnd7E4Xjo2+u8/zn2eQvVGLIFZTz9FU9YlkoH9vDFlnKMHVHwg/Qx0x7w08zxlumb0gVYv4A+2Yife92pEgIuURPvctB4bhP6sBtp4GQMD1NTGp/VChMY80WRP+Oh5W6Z3YKlbhod9PUV1NrFevdy94NAo45Paw85KYgv5VrZ8btlx8rLO3dtoQu9Lwiz16LIXgRnXbQspxLmhS2FjBshcpPU2OQsLZfgNG/FVgH9BYW8GnPkyysF69jgMjbKLyqPvMH4CiDwX3bS30Hv1+WmKYVhvMcf22Bx6Tf8Uk8z62lIT5DvjmbtM0aMK97cB+mo74cOBOeRAG0djvwdrYTr6z/xkguP6MAXwWFOcBmU+qhMt7tZw03TwiE160iGfea8gGBPDvFyw9I1tJ1/MVrwa4qeMO2ZET9Zezlmstr1jp6+Wt+YYkEqeJaSk3k9RXCci4Oz90f+aa3fFuP0CNJgqLDmzJllSseLDi/RM3YmWCRX 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: Signed-off-by: Sean Christopherson Reviewed-by: Paolo Bonzini --- arch/x86/include/asm/kvm_host.h | 1 - include/linux/kvm_host.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index b87ff7b601fa..7a905e033932 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2105,7 +2105,6 @@ enum { #define HF_SMM_MASK (1 << 1) #define HF_SMM_INSIDE_NMI_MASK (1 << 2) -# define __KVM_VCPU_MULTIPLE_ADDRESS_SPACE # define KVM_ADDRESS_SPACE_NUM 2 # define kvm_arch_vcpu_memslots_id(vcpu) ((vcpu)->arch.hflags & HF_SMM_MASK ? 1 : 0) # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, (role).smm) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 0d1e2ee8ae7a..5839ef44e145 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -693,7 +693,7 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm); #define KVM_MEM_SLOTS_NUM SHRT_MAX #define KVM_USER_MEM_SLOTS (KVM_MEM_SLOTS_NUM - KVM_INTERNAL_MEM_SLOTS) -#ifndef __KVM_VCPU_MULTIPLE_ADDRESS_SPACE +#if KVM_ADDRESS_SPACE_NUM == 1 static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu) { return 0; From patchwork Tue Jul 18 23:44:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317885 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 71098EB64DD for ; Tue, 18 Jul 2023 23:49:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D33FB28000E; Tue, 18 Jul 2023 19:49:05 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CE3878D0012; Tue, 18 Jul 2023 19:49:05 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BABFE28000E; Tue, 18 Jul 2023 19:49:05 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id A8F748D0012 for ; Tue, 18 Jul 2023 19:49:05 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 7AA7A1604FA for ; Tue, 18 Jul 2023 23:49:05 +0000 (UTC) X-FDA: 81026375850.05.99FB448 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) by imf27.hostedemail.com (Postfix) with ESMTP id 8D9F740016 for ; Tue, 18 Jul 2023 23:49:03 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=iplLwDRh; spf=pass (imf27.hostedemail.com: domain of 37iS3ZAYKCEEvhdqmfjrrjoh.frpolqx0-ppnydfn.ruj@flex--seanjc.bounces.google.com designates 209.85.215.201 as permitted sender) smtp.mailfrom=37iS3ZAYKCEEvhdqmfjrrjoh.frpolqx0-ppnydfn.ruj@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724143; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=neVr8HNAj5IZlomMCHXqP3DOL+mw9u7akoKbe+0W+rs=; b=dNIlsQRJLGuTPUEcuoZvIbak3QjiOOZqgymKqY1WgLjADzCfDgdm3VOnrr4A4sFJGHyJ2w 4AQHz0bLlrXFozNUyE5mIrmAy1MIj61o/wQSfRQFBf9qcPYCwRZufb/BKHL+A7+ZmzhL6C 2E9krq8IWmRX7YVBnLnl4s6N2FimWww= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724143; a=rsa-sha256; cv=none; b=OeH9MVXHsBATtQUhcMqsZRL1gZ9LvVpNwGL1xImFIhpADPR7KoatKGZxZx5hMwdHcCNpAR 1fferGq3t+v4ycoy8ccpIw2xpFYYI1ET5Pk7I3/78+wvFC7PpUuUpIQ4hCde05deRlKMfP dArJt/Lsw5fZVZZDpFY9Ox8dGH8AxZk= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=iplLwDRh; spf=pass (imf27.hostedemail.com: domain of 37iS3ZAYKCEEvhdqmfjrrjoh.frpolqx0-ppnydfn.ruj@flex--seanjc.bounces.google.com designates 209.85.215.201 as permitted sender) smtp.mailfrom=37iS3ZAYKCEEvhdqmfjrrjoh.frpolqx0-ppnydfn.ruj@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-55b523cf593so2886586a12.1 for ; Tue, 18 Jul 2023 16:49:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724142; x=1692316142; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=neVr8HNAj5IZlomMCHXqP3DOL+mw9u7akoKbe+0W+rs=; b=iplLwDRhYiuDejVY+08ejh96XGxClqhf/in2ogT0fbgAloHb2a3YzbomXz7tWXoF8L Ffk8qzrdCtXAJDPhTVgkwQ027wWBLOBth01UwTc0bSYy6b47Y+5brK3/ycVczHgwamJF +VPSc7B7BrhlmcGsrMiT+/zGRYuzD1o+I/0ETsdNvYG4HBGsmU65+h30UEFYY9mQhgY/ J9K5Gijw+RpECuVc2e7MMg9bUi07bdgESIAZZ0GwAnn4USQD/g5xo5NtlPHD8+VmV3Tn r0FCz6tXdLbVbB/QXvbLpf0oQy4Fwv9SNHugjkeZbyKs+flNZ6+npi1g2MpXZDrCWHu7 luXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724142; x=1692316142; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=neVr8HNAj5IZlomMCHXqP3DOL+mw9u7akoKbe+0W+rs=; b=F0QeWhRWnV9IbrJINjoUEUimQ/tAVp3i/ckNSqCRuWtljRSjzlE+0A8yVsutLPcyRW 0ONOLGNo3xH9DLUZsFI8V2afNmgz9FTmx4QbshsdRsIyf/p9H3Wi32yz42z9FFCH3wXh CIhJKqlcwsQ2eUhNycu6pnQgCH4FNkzGzk4QVAUHy+jc38h9vU72382SMLh5E3hz6D8G +UvPzHswTIWtmIHNXmmX3GEc0y89nurRnQlRHFyiDvyJplOM8bgxAaYnb8ThoXKFSRnC rAj3LuhFNOyQd+7cEBY+5osAZXPT9dYKp0GfeCK5H93XjaSBWhONYQ+j/lr4cKIpLcQH t93Q== X-Gm-Message-State: ABy/qLZAQQs5bcttY+q3F1oK8IHbIzEViFauZ1gejmM76LMMWAHYionL vtTwM6oobPlOrKmihDEJ0N9+kOXpcgw= X-Google-Smtp-Source: APBJJlE3zaeAmxr8KyqMkhbPu2G6jl64rE93BW/Stx8IIOAZXeXONcird8rqTaf51JHndI+NustNvDl1deI= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:903:2349:b0:1b9:de12:475 with SMTP id c9-20020a170903234900b001b9de120475mr8795plh.6.1689724142365; Tue, 18 Jul 2023 16:49:02 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:44:59 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-17-seanjc@google.com> Subject: [RFC PATCH v11 16/29] KVM: Allow arch code to track number of memslot address spaces per VM From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Stat-Signature: h113e5qpx5b6dozx118qtsmnm8aygzo1 X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 8D9F740016 X-Rspam-User: X-HE-Tag: 1689724143-706804 X-HE-Meta: U2FsdGVkX1+h9UviaOazmnW9RWDWy/rPeDf+I0DXoCQ3hL3snYzqqiZjIWeIkFhBcnqzef4Ejm/5Iq32NI4/DWYRtUd7jaW0ABDd0sIIbhzn7C83nOY+4eSrMqOAQyFvWcVSR6SSrd1OdOslyXCS7CX8QiUozq7O/IF2Eg83ItbUXY1CfzV1Br07O0BSkzCv5/DDxnkpLcAL0iMxhV8tD3sZHV9TjXS+Do8PCcuhpa3N1sHpClrYrb2pVI2zvX2oSzCMeyrQQGH0PjhEtCejlEtsuIjdfzIhuzh6gcvoaAKX+uZUV8CSewr4C/FIkIXz8Omsa6Ha7kTDWpC3LaFK+dLVqBhWFKHQj7eFMEataZ7RXQRdVAIz2geUSF8sie2e/F5gMEdv0+bM9znUi7P24GlZmVNjF9f4yetsKR/9SGRZ4B1PdcLICWgkywntPttXsg1l66d812R5MroTmX7vVIWl8IvmN1G6V6OPBOCG+T07xc7obPHj9KjzYox7Wut1gXsSCy0yL1RObIHkxVNoKJnXTPk9R++eOTP8/0opyT8RZb9Ji0vUMqvdu72Wfvy5i/ZbzCJO64kaKyJ+Shk86oKG9neUttgds7x8p3j+xgvLuxpb1SdvXUUlCK/pFrQz9P6q45I55xUrmmW0WKDnzSiVGZFcpM/aHN8zHNNzc98Lhw6YVjrgSmi56remV4RGUs67TMD8Vkw+kuhV8hb4W7nwAtgR1QyNXa2LOsmivsfv3iIt+5b5XQ986zWEx95SPXAfbHhuM778sgSXlBbRShFsf+Gg8Uoc120PMlrgq03fdwx98cT4/EuCAgmhWG0ws/d6gJaGXxb1DAn0cg1cTos4vEJKXEeXrR4PE2Xu1BpI1+mZw5RIeu/Anp5KyIwjYUM0v+0kL5djF3yJo/z+KkrRyHv0OqKzm2YZeua5BjmJ/JVgcMochmlmM7Y5Mj34dxY16Gntn5gELkqN9ML ks7WESed Sbhb4szmMoF7wDj3SDqfofnzPvnxVe/icIYOT1m6ctx6xsWitY31mkjXvCntPhFsgLDNTqb8axltHYjPPFMmdL5gl0WBKV3FZLlyl7ROysZQ0S9/fFIuxCzFjZjqx3TIKmUXcpLSt6cRormCZGgzKNl3ZetPSiB1PFDS1KnAUO3rQJe9tdE5ekho6ge7whM1F9H8wrKFVR4OOJAwTIQVb7MjAOjfDzk87cgHAUik/W4VEgQy1s5S2cZRWAUnhmKNeSZxNxKGoum6TngH6O/wHSyJZObyvpCVbAqmCsBTmg3KPzrm6xM+QevIosFNxgvdYY6FvSxxJp5vPvc1lVsYUTEvBgVs5xyAlhDfUwJhQCICmz4zUwo5zsdoX0r8uuhzXzNNHbMKWi1QbeYuJjSWGfNTnldr5dbWc8qWERVA0iSiEHic3zQznXmo8JWNTUMcoTHgNnNpkrovypqsqrqHect/1gRKlCfD1QZVRRWGilf1HzNKjDzpCo5Z5bexPRWuo07dCUM5+bq6Q9uG5tQp2wIM7ANV1U6hERpGYiui4EJ/Gs/kN8POkX60KmU690RMh6DGOqB6OK1p7q0wGkqk73jRJFIr+AZ3Wkp42Zop/Ku7GmwkCPUVXOhUSL4ra3qy5WygGnt6E1Wil0dAVwi7g+L7XV2apPl73LKxgaVNN5SF2b1kpJuGKBIXksd+C8uSeKLk1u+2DkiEfjS5C/FXSQls5hEP3kIAa5PjCmmMDbnVPgR/EcPCHpbxy1oUrJo5aMzxIsQ7iWmTWTAI= 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: Signed-off-by: Sean Christopherson --- arch/powerpc/kvm/book3s_hv.c | 2 +- arch/x86/include/asm/kvm_host.h | 8 +++++++- arch/x86/kvm/debugfs.c | 2 +- arch/x86/kvm/mmu/mmu.c | 8 ++++---- arch/x86/kvm/mmu/tdp_mmu.c | 2 +- arch/x86/kvm/x86.c | 2 +- include/linux/kvm_host.h | 17 +++++++++++------ virt/kvm/dirty_ring.c | 2 +- virt/kvm/kvm_main.c | 24 ++++++++++++------------ 9 files changed, 39 insertions(+), 28 deletions(-) diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 130bafdb1430..9b0eaa17275a 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -6084,7 +6084,7 @@ static int kvmhv_svm_off(struct kvm *kvm) } srcu_idx = srcu_read_lock(&kvm->srcu); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { struct kvm_memory_slot *memslot; struct kvm_memslots *slots = __kvm_memslots(kvm, i); int bkt; diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 7a905e033932..08b44544a330 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2105,9 +2105,15 @@ enum { #define HF_SMM_MASK (1 << 1) #define HF_SMM_INSIDE_NMI_MASK (1 << 2) -# define KVM_ADDRESS_SPACE_NUM 2 +# define KVM_MAX_NR_ADDRESS_SPACES 2 # define kvm_arch_vcpu_memslots_id(vcpu) ((vcpu)->arch.hflags & HF_SMM_MASK ? 1 : 0) # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, (role).smm) + +static inline int kvm_arch_nr_memslot_as_ids(struct kvm *kvm) +{ + return KVM_MAX_NR_ADDRESS_SPACES; +} + #else # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, 0) #endif diff --git a/arch/x86/kvm/debugfs.c b/arch/x86/kvm/debugfs.c index ee8c4c3496ed..42026b3f3ff3 100644 --- a/arch/x86/kvm/debugfs.c +++ b/arch/x86/kvm/debugfs.c @@ -111,7 +111,7 @@ static int kvm_mmu_rmaps_stat_show(struct seq_file *m, void *v) mutex_lock(&kvm->slots_lock); write_lock(&kvm->mmu_lock); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { int bkt; slots = __kvm_memslots(kvm, i); diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 4cf73a579ee1..05943ccb55a4 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3801,7 +3801,7 @@ static int mmu_first_shadow_root_alloc(struct kvm *kvm) kvm_page_track_write_tracking_enabled(kvm)) goto out_success; - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { slots = __kvm_memslots(kvm, i); kvm_for_each_memslot(slot, bkt, slots) { /* @@ -6351,7 +6351,7 @@ static bool kvm_rmap_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_e if (!kvm_memslots_have_rmaps(kvm)) return flush; - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { slots = __kvm_memslots(kvm, i); kvm_for_each_memslot_in_gfn_range(&iter, slots, gfn_start, gfn_end) { @@ -6391,7 +6391,7 @@ void kvm_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end) flush = kvm_rmap_zap_gfn_range(kvm, gfn_start, gfn_end); if (tdp_mmu_enabled) { - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) flush = kvm_tdp_mmu_zap_leafs(kvm, i, gfn_start, gfn_end, true, flush); } @@ -6855,7 +6855,7 @@ void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen) * modifier prior to checking for a wrap of the MMIO generation so * that a wrap in any address space is detected. */ - gen &= ~((u64)KVM_ADDRESS_SPACE_NUM - 1); + gen &= ~((u64)kvm_arch_nr_memslot_as_ids(kvm) - 1); /* * The very rare case: if the MMIO generation number has wrapped, diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c index 6250bd3d20c1..70052f59cfdf 100644 --- a/arch/x86/kvm/mmu/tdp_mmu.c +++ b/arch/x86/kvm/mmu/tdp_mmu.c @@ -905,7 +905,7 @@ void kvm_tdp_mmu_zap_all(struct kvm *kvm) * is being destroyed or the userspace VMM has exited. In both cases, * KVM_RUN is unreachable, i.e. no vCPUs will ever service the request. */ - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { for_each_tdp_mmu_root_yield_safe(kvm, root, i) tdp_mmu_zap_root(kvm, root, false); } diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index dd7cefe78815..463ecf70cec0 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -12419,7 +12419,7 @@ void __user * __x86_set_memory_region(struct kvm *kvm, int id, gpa_t gpa, hva = slot->userspace_addr; } - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { struct kvm_userspace_memory_region2 m; m.slot = id | (i << 16); diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 5839ef44e145..091bc89ae805 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -80,8 +80,8 @@ /* Two fragments for cross MMIO pages. */ #define KVM_MAX_MMIO_FRAGMENTS 2 -#ifndef KVM_ADDRESS_SPACE_NUM -#define KVM_ADDRESS_SPACE_NUM 1 +#ifndef KVM_MAX_NR_ADDRESS_SPACES +#define KVM_MAX_NR_ADDRESS_SPACES 1 #endif /* @@ -693,7 +693,12 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm); #define KVM_MEM_SLOTS_NUM SHRT_MAX #define KVM_USER_MEM_SLOTS (KVM_MEM_SLOTS_NUM - KVM_INTERNAL_MEM_SLOTS) -#if KVM_ADDRESS_SPACE_NUM == 1 +#if KVM_MAX_NR_ADDRESS_SPACES == 1 +static inline int kvm_arch_nr_memslot_as_ids(struct kvm *kvm) +{ + return KVM_MAX_NR_ADDRESS_SPACES; +} + static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu) { return 0; @@ -748,9 +753,9 @@ struct kvm { struct mm_struct *mm; /* userspace tied to this vm */ unsigned long nr_memslot_pages; /* The two memslot sets - active and inactive (per address space) */ - struct kvm_memslots __memslots[KVM_ADDRESS_SPACE_NUM][2]; + struct kvm_memslots __memslots[KVM_MAX_NR_ADDRESS_SPACES][2]; /* The current active memslot set for each address space */ - struct kvm_memslots __rcu *memslots[KVM_ADDRESS_SPACE_NUM]; + struct kvm_memslots __rcu *memslots[KVM_MAX_NR_ADDRESS_SPACES]; struct xarray vcpu_array; /* * Protected by slots_lock, but can be read outside if an @@ -1000,7 +1005,7 @@ void kvm_put_kvm_no_destroy(struct kvm *kvm); static inline struct kvm_memslots *__kvm_memslots(struct kvm *kvm, int as_id) { - as_id = array_index_nospec(as_id, KVM_ADDRESS_SPACE_NUM); + as_id = array_index_nospec(as_id, KVM_MAX_NR_ADDRESS_SPACES); return srcu_dereference_check(kvm->memslots[as_id], &kvm->srcu, lockdep_is_held(&kvm->slots_lock) || !refcount_read(&kvm->users_count)); diff --git a/virt/kvm/dirty_ring.c b/virt/kvm/dirty_ring.c index c1cd7dfe4a90..86d267db87bb 100644 --- a/virt/kvm/dirty_ring.c +++ b/virt/kvm/dirty_ring.c @@ -58,7 +58,7 @@ static void kvm_reset_dirty_gfn(struct kvm *kvm, u32 slot, u64 offset, u64 mask) as_id = slot >> 16; id = (u16)slot; - if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_USER_MEM_SLOTS) + if (as_id >= kvm_arch_nr_memslot_as_ids(kvm) || id >= KVM_USER_MEM_SLOTS) return; memslot = id_to_memslot(__kvm_memslots(kvm, as_id), id); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index a8686e8473a4..ee331cf8ba54 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -582,7 +582,7 @@ static __always_inline int __kvm_handle_hva_range(struct kvm *kvm, idx = srcu_read_lock(&kvm->srcu); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { struct interval_tree_node *node; slots = __kvm_memslots(kvm, i); @@ -1206,7 +1206,7 @@ static struct kvm *kvm_create_vm(unsigned long type, const char *fdname) goto out_err_no_irq_srcu; refcount_set(&kvm->users_count, 1); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { for (j = 0; j < 2; j++) { slots = &kvm->__memslots[i][j]; @@ -1349,7 +1349,7 @@ static void kvm_destroy_vm(struct kvm *kvm) #endif kvm_arch_destroy_vm(kvm); kvm_destroy_devices(kvm); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { kvm_free_memslots(kvm, &kvm->__memslots[i][0]); kvm_free_memslots(kvm, &kvm->__memslots[i][1]); } @@ -1632,7 +1632,7 @@ static void kvm_swap_active_memslots(struct kvm *kvm, int as_id) * space 0 will use generations 0, 2, 4, ... while address space 1 will * use generations 1, 3, 5, ... */ - gen += KVM_ADDRESS_SPACE_NUM; + gen += kvm_arch_nr_memslot_as_ids(kvm); kvm_arch_memslots_updated(kvm, gen); @@ -2002,7 +2002,7 @@ int __kvm_set_memory_region(struct kvm *kvm, (mem->gmem_offset & (PAGE_SIZE - 1) || mem->gmem_offset + mem->memory_size < mem->gmem_offset)) return -EINVAL; - if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_MEM_SLOTS_NUM) + if (as_id >= kvm_arch_nr_memslot_as_ids(kvm) || id >= KVM_MEM_SLOTS_NUM) return -EINVAL; if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr) return -EINVAL; @@ -2138,7 +2138,7 @@ int kvm_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log, as_id = log->slot >> 16; id = (u16)log->slot; - if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_USER_MEM_SLOTS) + if (as_id >= kvm_arch_nr_memslot_as_ids(kvm) || id >= KVM_USER_MEM_SLOTS) return -EINVAL; slots = __kvm_memslots(kvm, as_id); @@ -2200,7 +2200,7 @@ static int kvm_get_dirty_log_protect(struct kvm *kvm, struct kvm_dirty_log *log) as_id = log->slot >> 16; id = (u16)log->slot; - if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_USER_MEM_SLOTS) + if (as_id >= kvm_arch_nr_memslot_as_ids(kvm) || id >= KVM_USER_MEM_SLOTS) return -EINVAL; slots = __kvm_memslots(kvm, as_id); @@ -2312,7 +2312,7 @@ static int kvm_clear_dirty_log_protect(struct kvm *kvm, as_id = log->slot >> 16; id = (u16)log->slot; - if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_USER_MEM_SLOTS) + if (as_id >= kvm_arch_nr_memslot_as_ids(kvm) || id >= KVM_USER_MEM_SLOTS) return -EINVAL; if (log->first_page & 63) @@ -2406,7 +2406,7 @@ static __always_inline void kvm_handle_gfn_range(struct kvm *kvm, gfn_range.arg.raw = range->arg.raw; gfn_range.may_block = range->may_block; - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { slots = __kvm_memslots(kvm, i); kvm_for_each_memslot_in_gfn_range(&iter, slots, range->start, range->end) { @@ -4725,9 +4725,9 @@ static int kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) case KVM_CAP_IRQ_ROUTING: return KVM_MAX_IRQ_ROUTES; #endif -#if KVM_ADDRESS_SPACE_NUM > 1 +#if KVM_MAX_NR_ADDRESS_SPACES > 1 case KVM_CAP_MULTI_ADDRESS_SPACE: - return KVM_ADDRESS_SPACE_NUM; + return KVM_MAX_NR_ADDRESS_SPACES; #endif case KVM_CAP_NR_MEMSLOTS: return KVM_USER_MEM_SLOTS; @@ -4827,7 +4827,7 @@ bool kvm_are_all_memslots_empty(struct kvm *kvm) lockdep_assert_held(&kvm->slots_lock); - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { + for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) { if (!kvm_memslots_empty(__kvm_memslots(kvm, i))) return false; } From patchwork Tue Jul 18 23:45:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317886 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 35961C001DE for ; Tue, 18 Jul 2023 23:49:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 741C228000F; Tue, 18 Jul 2023 19:49:07 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6A5028D0012; Tue, 18 Jul 2023 19:49:07 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4F5818D002E; Tue, 18 Jul 2023 19:49:07 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 3FF6F8D0012 for ; Tue, 18 Jul 2023 19:49:07 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 0A2D51A04B5 for ; Tue, 18 Jul 2023 23:49:07 +0000 (UTC) X-FDA: 81026375934.29.5B5B8C3 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf16.hostedemail.com (Postfix) with ESMTP id 29FAB18001B for ; Tue, 18 Jul 2023 23:49:04 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=u+28Wdze; spf=pass (imf16.hostedemail.com: domain of 38CS3ZAYKCEMxjfsohlttlqj.htrqnsz2-rrp0fhp.twl@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=38CS3ZAYKCEMxjfsohlttlqj.htrqnsz2-rrp0fhp.twl@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724145; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=8TdJ1H9vY0vZ6d4Ib+S5mGLNRUVvHsylOvOW0QhRfnk=; b=xatmPVtDjRQ85ITXQYfxfyEEll157TNtLoUIH9595mD83OkoON7uAa0lsiwsIy1uS0Eaze cemBAJPhAPbTweSd048D344unuprePhJGO+ERmen6V7s8Td5wsMeoeJQII2C7ZQrw8apWz QBQaitU6PwKbpn53wH1kDEKrBWrc9wQ= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724145; a=rsa-sha256; cv=none; b=tkIY7mhDymuFjVOEtqC39ayKJro0PogQe7t+mnZzKyuOnSmBFItG7z0z9EW1jsXgtqRg9s DVyoeo7xWn35zO9YpU3F+b85ZprU4L8tCRYIpN9e9hV/0kZl00T5xWImaQTlP2P68w/OrT o69cstI2KWBwciOBC4wEu74Eg0rcAA8= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=u+28Wdze; spf=pass (imf16.hostedemail.com: domain of 38CS3ZAYKCEMxjfsohlttlqj.htrqnsz2-rrp0fhp.twl@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=38CS3ZAYKCEMxjfsohlttlqj.htrqnsz2-rrp0fhp.twl@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-57a3620f8c0so42324657b3.3 for ; Tue, 18 Jul 2023 16:49:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724144; x=1692316144; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=8TdJ1H9vY0vZ6d4Ib+S5mGLNRUVvHsylOvOW0QhRfnk=; b=u+28WdzeWc40Gm+Je1x1UFfDLSLxds49kd/6cqkzLMXf4jy+V6QtZTuGEoBKa71Rcu xg+sLXnFWp3IWF94fBSqPSjOmJbnWdsevA1ZXgY7o9A/h+kuNZYLpmc2HukjMPatPza4 bxbe/VVib5gL1I9HqShDRV4bFhCvQBMgcqIy1VFhBxpcya3h6Q52dV75EjdhVIAPxjjN wxT87kXK0wL48yMvGVPc/XWafV0cS0EPf90K+wFMc3WuKEWI3FatqxiQl8K69yyJ40KH xIklmB6W3R2L80L6WyYqIQwJ5fMxk7Q+kqHJKmDnyACB3D7Hucmc3LR/fm+aquGvOS2x x9lQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724144; x=1692316144; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=8TdJ1H9vY0vZ6d4Ib+S5mGLNRUVvHsylOvOW0QhRfnk=; b=iJjvzNCQpdYJLsbtjBG5XlR4U5uAJcSvYKPql273vsWQATONJNQ6kwRXsTd461BeUc es5otOUmhRZVDLhNf1tHTOxOed/BS8XwMNW9Q54W8pC+J2iCLcD6IRwxriRaPsSQlxJE RXEsOWIFQX8io7KHha40t91Uht3IRq3gch9DiSLLERUtGFBTywc2dJwre0selGNZnULy yl1O0gUieNxdJQbmBwp2p7JlJ84LvlCY5YYLOXYBaWEC4nhdCg1MdqcDRGOxai9YHx6f PDRkEc3+k+iB8p91UvEbZcQh8a8fSs5JKfzbFxqqbROvWEjz4gGMHPyG9y7pSjPqZEu/ /VBg== X-Gm-Message-State: ABy/qLacISog+o/tebXYwkKqjNQa0taYu4j+B0zZIEkveVcRRVJxe/F/ aFSYQUbxqo6LC8aRrMyhDCTR54lAj40= X-Google-Smtp-Source: APBJJlG8VHtP5R3fLmhww44xOijLMkdC3Pr9yKhyucdlmfeXwSJcZ8t7uie3AFyIq7NSw15x1EhqscyHcLI= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:d78b:0:b0:c4c:b107:65f9 with SMTP id o133-20020a25d78b000000b00c4cb10765f9mr12571ybg.10.1689724144344; Tue, 18 Jul 2023 16:49:04 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:00 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-18-seanjc@google.com> Subject: [RFC PATCH v11 17/29] KVM: x86: Add support for "protected VMs" that can utilize private memory From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Stat-Signature: rsgph4p5cwjg6bwesdp7z8faspspa6be X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 29FAB18001B X-Rspam-User: X-HE-Tag: 1689724144-485866 X-HE-Meta: U2FsdGVkX192qga1QM1wDYXdw2oVgsM8PDvFYeMit/zsu2oR9vxzOOTt0mQKPXXIXZd9vgeSy6LYpRrE1AEZWkiIeveWkow2IJbNSeL+IexZQR9gHtcrdQsey1HJLoDqFnljG5wz0HZg0BoCTpO1G+HADqTowsmosOqAFc/jGCtwdKELgefR9IzsMsJlRGIyclXPjD31x/sM9lup1uJpjCEiuaiub7cXJoajsQbtp6wL0oa2NbdKn3tFF0YmQA7ZDuSRi/rt1n4TVZ9gTFrbSOer2IEFTl2+ei3ZjKA7Z4NFSPON2RoTEkj+bAoTCnH2LUYZ85DH9drmwVagErR5hPWetSZfXgY4FOw30TD8QueuWUmhCGaykkSfmofBholubEY1R6s4YeR8RZGPWXV5+b2+xTnibXvGvHXQGCvb1xV46meGIQUewi4ogjC1nFPq5oPWjTh1jpIT0jbJ14fQV3bBslRc5xJZrcHRhz6i1Z4adIiXHwFd0HWPw4o1zXf0zHfFkw4KKLUHrfczhX0j6fe3qH4nFeOqYwiAnzcQ2JTHf2e1v2Pg/nSPupKfYsFTvPuaq80ZcNF6hAYOfuoyUKPJ12wO8wdQ5y8siyn9B+ZaN7eSC68ZRxgrr6N8CrjA6RZSUqCul+vGOjQLfYBR6nkybiO9ihp4/zmBnWVABmg6Z0DXi86tALHiuYexUdinYKrUQRqLCv1OysocrrQNTC8JwCMo00I2j9CfgafVqBsk9tljCtknlwjncgmbuTaYEABgzmjdatFjGuma4aRveik3uLKzRvLFVmGfRXd0MslwOxJpsDAzEHpV4eLzOfpnWbjqzucd0RpgQqmT9S3nqx6+giba9E1cJiZ8suVLXyXjEcUBw/c/hkhIQ6jIOedAOpeC6PngtngD5dSRuOjoivYrPYzL5r8qWrtw+PX4XWBfa5fER2VS09bjT+93Gk3enDQ/PqPyr2exTqyBnTP XP5JKhL0 n3NSJRsEvGo9jJikaEEu5Tq/kEk/AK5pqWQAhZ/RoVpsERv7Emxx2xkBX5/41pidPlhrRszq5HElEMSUvIij+HhZc6rmfAAena2eDtl8Bwujv+7jV0m0ZdbI0qHqweUNTMiwYV+N2OsU7av13Jn7Dd5ZM34o28N6iufPB/fkNUikHwdf8CJRRRhfJZL1cq8rmKvU2nDm49OrGZJoWvG29wrqeSyFjoTHJDMuGmsBQ4l76/IfPdxTkAWbQBERkzgDWUXcIwmeUtVCVDFGxWNSNXy11rPqgwXj9QS53EsBnYBK8DzkL1oiueeUm6u55opUDTVYHvsqP7H+oDAtatH6sRF7L8hoXbmKfwv3YYSuu2Wg01Ls0vf5Ubl3gVCIUHr3yeYyXefej1lgt7RQcYLZm2djb6138sQAT3ExmY0+lP6Xj7lLpVYau+1VrCvs459otO0XC/obtJm+byQ8sbs2Rnon5nb/btSE6l74sT48o+q0HFDykGtP2sqcS7WkdWzuH7vPenjzhXxiMxXdOf0/TB76SoK2vAVHR2ORRHzLo6B/4qikMfHq3vMvWbhcOCIad1Aa1A0Dn115ya1pI3VBbur8+uw++6EUI71FwsXS6ezwLwiQPXvYsGbRyTd0BX3zgd7dLLL8NJT/JIU0MewpPwP1aoFctaK0MvH6RB/rGueXVKPstgqv3SjdpAhZXhMDN5hYRUBp/ZhF0tgZscUpgArvP3Z4hhk9dkvk0bhlKVBkJgq/XSf7/plkI40QLaCIzns8229zNTqGRLSM= 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: Signed-off-by: Sean Christopherson --- Documentation/virt/kvm/api.rst | 32 ++++++++++++++++++++++++++++++++ arch/x86/include/asm/kvm_host.h | 15 +++++++++------ arch/x86/include/uapi/asm/kvm.h | 3 +++ arch/x86/kvm/Kconfig | 12 ++++++++++++ arch/x86/kvm/mmu/mmu_internal.h | 1 + arch/x86/kvm/x86.c | 16 +++++++++++++++- include/uapi/linux/kvm.h | 1 + virt/kvm/Kconfig | 5 +++++ 8 files changed, 78 insertions(+), 7 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 0ca8561775ac..9f7b95327c2a 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -147,10 +147,29 @@ described as 'basic' will be available. The new VM has no virtual cpus and no memory. You probably want to use 0 as machine type. +X86: +^^^^ + +Supported X86 VM types can be queried via KVM_CAP_VM_TYPES. + +S390: +^^^^^ + In order to create user controlled virtual machines on S390, check KVM_CAP_S390_UCONTROL and use the flag KVM_VM_S390_UCONTROL as privileged user (CAP_SYS_ADMIN). +MIPS: +^^^^^ + +To use hardware assisted virtualization on MIPS (VZ ASE) rather than +the default trap & emulate implementation (which changes the virtual +memory layout to fit in user mode), check KVM_CAP_MIPS_VZ and use the +flag KVM_VM_MIPS_VZ. + +ARM64: +^^^^^^ + On arm64, the physical address size for a VM (IPA Size limit) is limited to 40bits by default. The limit can be configured if the host supports the extension KVM_CAP_ARM_VM_IPA_SIZE. When supported, use @@ -8554,6 +8573,19 @@ block sizes is exposed in KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES as a This capability indicates KVM supports per-page memory attributes and ioctls KVM_GET_SUPPORTED_MEMORY_ATTRIBUTES/KVM_SET_MEMORY_ATTRIBUTES are available. +8.41 KVM_CAP_VM_TYPES +--------------------- + +:Capability: KVM_CAP_MEMORY_ATTRIBUTES +:Architectures: x86 +:Type: system ioctl + +This capability returns a bitmap of support VM types. The 1-setting of bit @n +means the VM type with value @n is supported. Possible values of @n are:: + + #define KVM_X86_DEFAULT_VM 0 + #define KVM_X86_SW_PROTECTED_VM 1 + 9. Known KVM API problems ========================= diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 08b44544a330..bbefd79b7950 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1227,6 +1227,7 @@ enum kvm_apicv_inhibit { }; struct kvm_arch { + unsigned long vm_type; unsigned long n_used_mmu_pages; unsigned long n_requested_mmu_pages; unsigned long n_max_mmu_pages; @@ -2058,6 +2059,12 @@ void kvm_mmu_new_pgd(struct kvm_vcpu *vcpu, gpa_t new_pgd); void kvm_configure_mmu(bool enable_tdp, int tdp_forced_root_level, int tdp_max_root_level, int tdp_huge_page_level); +#ifdef CONFIG_KVM_PRIVATE_MEM +#define kvm_arch_has_private_mem(kvm) ((kvm)->arch.vm_type != KVM_X86_DEFAULT_VM) +#else +#define kvm_arch_has_private_mem(kvm) false +#endif + static inline u16 kvm_read_ldt(void) { u16 ldt; @@ -2106,14 +2113,10 @@ enum { #define HF_SMM_INSIDE_NMI_MASK (1 << 2) # define KVM_MAX_NR_ADDRESS_SPACES 2 +/* SMM is currently unsupported for guests with private memory. */ +# define kvm_arch_nr_memslot_as_ids(kvm) (kvm_arch_has_private_mem(kvm) ? 1 : 2) # define kvm_arch_vcpu_memslots_id(vcpu) ((vcpu)->arch.hflags & HF_SMM_MASK ? 1 : 0) # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, (role).smm) - -static inline int kvm_arch_nr_memslot_as_ids(struct kvm *kvm) -{ - return KVM_MAX_NR_ADDRESS_SPACES; -} - #else # define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, 0) #endif diff --git a/arch/x86/include/uapi/asm/kvm.h b/arch/x86/include/uapi/asm/kvm.h index 1a6a1f987949..a448d0964fc0 100644 --- a/arch/x86/include/uapi/asm/kvm.h +++ b/arch/x86/include/uapi/asm/kvm.h @@ -562,4 +562,7 @@ struct kvm_pmu_event_filter { /* x86-specific KVM_EXIT_HYPERCALL flags. */ #define KVM_EXIT_HYPERCALL_LONG_MODE BIT(0) +#define KVM_X86_DEFAULT_VM 0 +#define KVM_X86_SW_PROTECTED_VM 1 + #endif /* _ASM_X86_KVM_H */ diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index a7eb2bdbfb18..029c76bcd1a5 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -77,6 +77,18 @@ config KVM_WERROR If in doubt, say "N". +config KVM_SW_PROTECTED_VM + bool "Enable support for KVM software-protected VMs" + depends on EXPERT + depends on X86_64 + select KVM_GENERIC_PRIVATE_MEM + help + Enable support for KVM software-protected VMs. Currently "protected" + means the VM can be backed with memory provided by + KVM_CREATE_GUEST_MEMFD. + + If unsure, say "N". + config KVM_INTEL tristate "KVM for Intel (and compatible) processors support" depends on KVM && IA32_FEAT_CTL diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h index 268b517e88cb..f1786698ae00 100644 --- a/arch/x86/kvm/mmu/mmu_internal.h +++ b/arch/x86/kvm/mmu/mmu_internal.h @@ -301,6 +301,7 @@ static inline int kvm_mmu_do_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, .max_level = KVM_MAX_HUGEPAGE_LEVEL, .req_level = PG_LEVEL_4K, .goal_level = PG_LEVEL_4K, + .is_private = kvm_mem_is_private(vcpu->kvm, cr2_or_gpa >> PAGE_SHIFT), }; int r; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 463ecf70cec0..de195ad83ec0 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4427,6 +4427,13 @@ static int kvm_ioctl_get_supported_hv_cpuid(struct kvm_vcpu *vcpu, return 0; } +static bool kvm_is_vm_type_supported(unsigned long type) +{ + return type == KVM_X86_DEFAULT_VM || + (type == KVM_X86_SW_PROTECTED_VM && + IS_ENABLED(CONFIG_KVM_SW_PROTECTED_VM) && tdp_enabled); +} + int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) { int r = 0; @@ -4617,6 +4624,11 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) case KVM_CAP_X86_NOTIFY_VMEXIT: r = kvm_caps.has_notify_vmexit; break; + case KVM_CAP_VM_TYPES: + r = BIT(KVM_X86_DEFAULT_VM); + if (kvm_is_vm_type_supported(KVM_X86_SW_PROTECTED_VM)) + r |= BIT(KVM_X86_SW_PROTECTED_VM); + break; default: break; } @@ -12274,9 +12286,11 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) int ret; unsigned long flags; - if (type) + if (!kvm_is_vm_type_supported(type)) return -EINVAL; + kvm->arch.vm_type = type; + ret = kvm_page_track_init(kvm); if (ret) goto out; diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 17b12ee8b70e..eb900344a054 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -1216,6 +1216,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES 229 #define KVM_CAP_USER_MEMORY2 230 #define KVM_CAP_MEMORY_ATTRIBUTES 231 +#define KVM_CAP_VM_TYPES 232 #ifdef KVM_CAP_IRQ_ROUTING diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 3ee3205e0b39..1a48cb530092 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -107,3 +107,8 @@ config KVM_GENERIC_MEMORY_ATTRIBUTES config KVM_PRIVATE_MEM select XARRAY_MULTI bool + +config KVM_GENERIC_PRIVATE_MEM + select KVM_GENERIC_MEMORY_ATTRIBUTES + select KVM_PRIVATE_MEM + bool From patchwork Tue Jul 18 23:45:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317887 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 38D72EB64DC for ; Tue, 18 Jul 2023 23:49:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id ACA51280010; Tue, 18 Jul 2023 19:49:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A72738D0012; Tue, 18 Jul 2023 19:49:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8EC39280010; Tue, 18 Jul 2023 19:49:09 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 75F248D0012 for ; Tue, 18 Jul 2023 19:49:09 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 52877B0DFC for ; Tue, 18 Jul 2023 23:49:09 +0000 (UTC) X-FDA: 81026376018.13.4A5967D Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) by imf21.hostedemail.com (Postfix) with ESMTP id 7CE221C0021 for ; Tue, 18 Jul 2023 23:49:07 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=S9i20yQ7; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf21.hostedemail.com: domain of 38iS3ZAYKCEUzlhuqjnvvnsl.jvtspu14-ttr2hjr.vyn@flex--seanjc.bounces.google.com designates 209.85.214.201 as permitted sender) smtp.mailfrom=38iS3ZAYKCEUzlhuqjnvvnsl.jvtspu14-ttr2hjr.vyn@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724147; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=jNVa/iQ+AVctjdypzscw/wZ/omqP7xdpmmirAsZhWLw=; b=o48UVVUhAlCkDlHE9ig79XCqeANsOi2nDm5BMI94LR6gE4tb1i9GC33afvGKEuuzuF6Am6 KUYbgMCiK51obCIFQt8/mFF7o/I/225jWdfOygVULqCGyunkt1TaNZ5ik9dZfUxwvC/9FG iHfqgsEBBIQs+BB++D/mSg7Q5kPYUTk= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=S9i20yQ7; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf21.hostedemail.com: domain of 38iS3ZAYKCEUzlhuqjnvvnsl.jvtspu14-ttr2hjr.vyn@flex--seanjc.bounces.google.com designates 209.85.214.201 as permitted sender) smtp.mailfrom=38iS3ZAYKCEUzlhuqjnvvnsl.jvtspu14-ttr2hjr.vyn@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724147; a=rsa-sha256; cv=none; b=qa6YzlbfVbZooyj3DCLqAWfn1ncH/SkdXpAvqX5VTVCl25+HCeRKy1/SJ4dXTO9JrBFC7f XSe0KaW7OBHrwm9fw6iKN7vAuExQWgJkhlozT42Lxr4FVcu1RGb8TPsWUxYsW0R1SL21Rt VPfF7AwCphTtU14mYSXdmRxCvoYggt4= Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-1b9de3e7fb1so32328035ad.1 for ; Tue, 18 Jul 2023 16:49:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724146; x=1692316146; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=jNVa/iQ+AVctjdypzscw/wZ/omqP7xdpmmirAsZhWLw=; b=S9i20yQ7jB4hVddDMJ4CkO5T1TWmd4hfWWkq8Xl9LowlAEQdj2ZBN4AmHJWPyNUeoT CkrrWKNwK4ZqQLVQM2y6BQWzimiT4YCPNLG/XY2OgxS9elbM94AeEwd6oVkZtS5CMdNQ enYmJItt+taFRfJF03P5U3tsXYvhEykGsai5MRAd/rpILORWE8Nwwq/35e1lrZlSdKCf nnux/I5fy00kI9O4nAFwoaKQfkECwHaMBer7UN6aWCOBJCp2NOyFIamjX8g6Muuevcj+ zN2G8rzvgNhVTfZL/D1gpgeoLq9Z9aveGPtzRcTPzuDzimSMVNdowxyXn99BRYpLpXYL a5VQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724146; x=1692316146; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=jNVa/iQ+AVctjdypzscw/wZ/omqP7xdpmmirAsZhWLw=; b=W2o3y2UVufv81j2XYbXQZXQkEE9PuSJh5Bv/FGxPMkvFHAgKPkFAEpv3GbRxldP8TP ZoVO/SFu1nU5rwAKv7Okf/IoDa9iFjkCEhCynIwRnjGeNvGAev3T5VTK78zicf9e50SN FqMw2UDDv8rFmjxGyZLx3UcbHhEAJCx7hkNQOALhBtfdc5QjZk40YypmDliypHOk/+4f n1cR+ZUyb2MQJFbncsaLC+lJb1DW6yCTaHFc4GAYvgmCSKZHu0nZhknc/6Llkq355CJN ivjZthE5PpF2CIxDGAXNb/JTRf/oDeYOsmYyc5Bc0y7xv6jZ9389D7ZvwdSvBrjCVf9g ihHw== X-Gm-Message-State: ABy/qLaz/Qfq4ax8pcdO6aAcmVpey9B1qM5boW7Mg6rnyybuVapJ7DKv hSj1A6m5UjdPdCJ4bJsLHHL84SWoUN0= X-Google-Smtp-Source: APBJJlG/sMr3G/sYhFjIAPMZFMzUGPYNnqDIC48VMqcoxoy+9ZQXw2cmdVjFEV6r5k/FZaKWiRT4xFOW180= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:d503:b0:1b8:8c7:31e6 with SMTP id b3-20020a170902d50300b001b808c731e6mr17710plg.1.1689724146247; Tue, 18 Jul 2023 16:49:06 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:01 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-19-seanjc@google.com> Subject: [RFC PATCH v11 18/29] KVM: selftests: Drop unused kvm_userspace_memory_region_find() helper From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: 7CE221C0021 X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: xstzz4m5aoipfgg1zjdux1r8fq8osxr7 X-HE-Tag: 1689724147-621186 X-HE-Meta: U2FsdGVkX1/WYEA6KIrW2PIHO5+XMfZ81MfaQdjHiNZsbXs8t+BhIS7+UnEiDJU/FUYWbuwRxeMUCwKkg+WBj1iq30UNKHMIR0VGhORmG1dUCl+FGllicrg6diR7xnizsgSmtWkIj/EmNx229fQdmqqFas4LGt5rJwBXUUvw6Owvxj8J1uqPLY7qb5kgiLbJrPYJVmr7lR4yVOGMlKUJC7fwP20MJY3/FPXbJdixJe9mFWI7p7XtiqhWYL5FlaFMmtaAnoat5VKK+TpNFaN6XKZPDsOpLxOudH7sRNFi1gf2kZABH68ckFQ5HRuGNOKZyTgXF86VuiW2cLQc6LwNfVsUI42CgSnFIFlsNUkFRLO/1FIs0MewCa1aN2lgT+nyQmn6csY+w8moMQSAItuXSv/E1w0tgsrv9gREL0q5brdI0Qrh5K2DykA0tGNcJsdYG7uJAsNwt6k0aj/RI8/ABzTXQKSuenZvKZxqnstlN9bsnFuljhMsQhy2s0Y2jfgyya+zxbsoY6dhZWt9pH0CXoN984lawI8WbHclv3GMh1c/nL4gTNxln0OyrZfD7P2phPbptv8oUCF2wENet/2rF2+4KDt0OoO4g/0FZeH3cJPlkgJt4eipk6ZLfWFoq4d84zN0S5DaEoOJuWGEOhsYVGXeR+XRv9zTfEM/DbU+nHx8K1ZnInQ0hpe4npv9MJChw2/gr/1BL4NKmIaEsv9w/qYJm1GOaUiSp727rlp9Mtcyb2N5g0i9EFoVUpS3Haypo3p9t8Y+7VW9d4/q2Mm1ACy1rmQsYO5xiE3Lu5Z0zWE5HFfYAz9n1wmOS10qCHak2SgEDCMXCyJJuEigz+NB75FE7BrEYBS9GzrPdkHGCoZt/4M8lBGKhfXe0xa+WpPHVxla0TP5xNoi+/He717LrKMrS+Yr/LKsGGskFURdeTRF5V5Q7c+tNJ8qo3VjPjaREevPo118T6ZmrZ4uPym nwZmuoqT Iv/d8fPXarFTh5LkR3RAK1HZkVYKcqiE1bWdD475i9Wv8Rw/myfnEixUfA/C5w9fNm+rbWE5QKSAHIbavRLO56aI9Ds0zfcFWp8Tynu/VUcken7bekD8W9vCL9M5Zbz9Ro2FTgA7uywRoIHkRPKIhr2rmywQgDavn6umVCw/A8FlW/wQvE9r7xVayZVoKThnyMR3647o1mF4DVfOWtXNxnXZ/RnW+Gqf1XwX+U5QtVMAGJkXmOQ9tyXjwEGKe68iYwml/0Kt6TjgRYrMki1DJ1vkM/XojW1P81TLUnWQQBxfKEChCLBXTG7PzvWkVSEZnXzENkn2nvcFxao6UqOkBcLy7auK3VZ3eMzBvJ1KUxu29AnwI2Bd2WvUr/LYCsFiO2hEm56uDlkIsWAmOLYK34VUreZZ8lGHNkhXGnQCR2r8aAgxJypOOEVhrwuteqDKXPo3YJ3SqOHrOC3XrAVn5BdLexwX3dAb9KKlxY14cMqAz3rPIHL7PlmtMk+kVpGDu/LHuKlmB1WhSJYC7B6ri3rwlnCdbfJDnK1IyvO6QV1DCQIryyFz45yjZ+RbTKPItbELBi7MQPLK1Ih3j1bopNdWTP/QGiVokWe37UZ5BZeXjg1kb0B2BxyZpAXyWSVgEUimlUy1751zFXYNZFMmQ91s1XkBIIMrFAuGFmxIfs0RqJykpO4lHL/ICCgupDI48IpB1dzcFPfX6YeSAlyjVA6xkBxkc3Z9/jva8pFmdmnhPB3NglQYdWPoGnWCKQPNRJHlgVgjoLlPyTkrTo+Wfe2smcaU54F1LTyiXsXhV1CEYPe9H/r8iolOMyg== 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: Drop kvm_userspace_memory_region_find(), it's unused and a terrible API (probably why it's unused). If anything outside of kvm_util.c needs to get at the memslot, userspace_mem_region_find() can be exposed to give others full access to all memory region/slot information. Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 4 --- tools/testing/selftests/kvm/lib/kvm_util.c | 29 ------------------- 2 files changed, 33 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 07732a157ccd..6aeb008dd668 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -753,10 +753,6 @@ vm_adjust_num_guest_pages(enum vm_guest_mode mode, unsigned int num_guest_pages) return n; } -struct kvm_userspace_memory_region * -kvm_userspace_memory_region_find(struct kvm_vm *vm, uint64_t start, - uint64_t end); - #define sync_global_to_guest(vm, g) ({ \ typeof(g) *_p = addr_gva2hva(vm, (vm_vaddr_t)&(g)); \ memcpy(_p, &(g), sizeof(g)); \ diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 9741a7ff6380..45d21e052db0 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -586,35 +586,6 @@ userspace_mem_region_find(struct kvm_vm *vm, uint64_t start, uint64_t end) return NULL; } -/* - * KVM Userspace Memory Region Find - * - * Input Args: - * vm - Virtual Machine - * start - Starting VM physical address - * end - Ending VM physical address, inclusive. - * - * Output Args: None - * - * Return: - * Pointer to overlapping region, NULL if no such region. - * - * Public interface to userspace_mem_region_find. Allows tests to look up - * the memslot datastructure for a given range of guest physical memory. - */ -struct kvm_userspace_memory_region * -kvm_userspace_memory_region_find(struct kvm_vm *vm, uint64_t start, - uint64_t end) -{ - struct userspace_mem_region *region; - - region = userspace_mem_region_find(vm, start, end); - if (!region) - return NULL; - - return ®ion->region; -} - __weak void vcpu_arch_free(struct kvm_vcpu *vcpu) { From patchwork Tue Jul 18 23:45:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317888 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 B1AEFC04A6A for ; Tue, 18 Jul 2023 23:49:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 128F6280011; Tue, 18 Jul 2023 19:49:12 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0D8778D0012; Tue, 18 Jul 2023 19:49:12 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E6D918D002E; Tue, 18 Jul 2023 19:49:11 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id D21948D0012 for ; Tue, 18 Jul 2023 19:49:11 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 918931404BE for ; Tue, 18 Jul 2023 23:49:11 +0000 (UTC) X-FDA: 81026376102.29.5ADF047 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf08.hostedemail.com (Postfix) with ESMTP id A4ABA160005 for ; Tue, 18 Jul 2023 23:49:09 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=QGe2TDZH; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf08.hostedemail.com: domain of 39CS3ZAYKCEc1njwslpxxpun.lxvurw36-vvt4jlt.x0p@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=39CS3ZAYKCEc1njwslpxxpun.lxvurw36-vvt4jlt.x0p@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724149; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Op8HHmnUgwupsWBaRFuhvxYPW8xnNAPNdjQWsU6sjr4=; b=k4ggnFeXpTB6kSID8R7gUVxvLhIqIRlj2LzPjW7frIPgTQBaoXcKbivNvDc8dBIg7e8N3J xdGMq2OiWGhTCsHJAQbAAKK6ji7qeH7kHbLb4sDB8vAzZq5ocE081tUwX2KjTxxjuShmEn /UJKeeMoIAoy2a0EH/P2Hh/nxMxT/Vk= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=QGe2TDZH; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf08.hostedemail.com: domain of 39CS3ZAYKCEc1njwslpxxpun.lxvurw36-vvt4jlt.x0p@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=39CS3ZAYKCEc1njwslpxxpun.lxvurw36-vvt4jlt.x0p@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724149; a=rsa-sha256; cv=none; b=PmV9D5kIoskZQ0oOu2Oaf+22kvIRhY/deX5Fv00j67WR1kp//mJN/xlWxmo+VEM6Rsu76c fcvMb2P4LvMdGx816tcWtO93I3rdnx+CmnGDDebQCd5pfgewKrartrn8qCVoK0PLig4ePS a+Xg2ejDJALgWldyj9I0CQ/fcWQpsHQ= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b8a7734734so32266005ad.2 for ; Tue, 18 Jul 2023 16:49:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724148; x=1692316148; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=Op8HHmnUgwupsWBaRFuhvxYPW8xnNAPNdjQWsU6sjr4=; b=QGe2TDZHOQa4Dl//VYNCOYShcTza/1woeu2375n0rkVScAi+cbY/3o7kv0BRcH2AMJ +c/iqHZ3q4qoWQp2d3aei0T6E53l+ZqCNd2m04n3+R0wSNZlGOK1LSjxlHNXzCcomxJY E8j4TlQATKeS/E+fNB5tnRwv8C8AcACbuwNfJJ4GFsEgr7shqPyCnrSeiwO4qSSrmzt7 efORpwkrylJDYPQpjxrM/NpVjNFpNVPE0Qd0lMQKpfpNX9QNZ2W1IrXiVTqmpPMaOQWI k1X5M4hUDGgW+QX9Vf1eWMvk3OJKrPnVnj02NJetvqw5q8wS599WGmVh+Grx/YjjjUXB v1/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724148; x=1692316148; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Op8HHmnUgwupsWBaRFuhvxYPW8xnNAPNdjQWsU6sjr4=; b=aNKzVMdAaD94Lpm3D4vWPqjJhe/dQ8FPo4uMC/d80TpbwkdxH28T9z/tll2rmK+ubi Z5dCj8uehIB39GXXRZAvSsBJnDYXIChUi+HveUClrE5M5S0TvtihmYEAczvHPGlxkDtl 8X7A3HKcr6E9jcqPbuuMpaaVWitOazw1OKNuWYjXoGf5GSmWMqiUZtq6Bhnhk0ilTkiK H9VO2dRFnaigUFwMKorTocMfJAlqH3pBZenVJV2WnD9aZwOCFgHBD1eqUXImWEXcClTb +ZNASpdOIvV02yuX/ESKqHXezZfJN/ECsmj3vKo39HIQxcUcvKfvf3Ut6XvebdRSlDGF 7zEQ== X-Gm-Message-State: ABy/qLYBzWs2aDNiyQuikfoGiRf4z1dwdaVjpk6pfHXYTDDD5JNqr6Wv 2FNi371WaxHHLsZjQmwBHkIuAH9tKBE= X-Google-Smtp-Source: APBJJlGOkej0m8Idb/suY4iXY9qip/Dep68m1+USICpK/8IAat1dD7w7AsEo2fC/HRINs5tpOYMC/rDWeUE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ec88:b0:1b9:df8f:888c with SMTP id x8-20020a170902ec8800b001b9df8f888cmr16357plg.8.1689724148112; Tue, 18 Jul 2023 16:49:08 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:02 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-20-seanjc@google.com> Subject: [RFC PATCH v11 19/29] KVM: selftests: Convert lib's mem regions to KVM_SET_USER_MEMORY_REGION2 From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspam-User: X-Stat-Signature: 1f9t1rqzhcmqqyf4ei39o9twbou9wg1o X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: A4ABA160005 X-HE-Tag: 1689724149-228100 X-HE-Meta: U2FsdGVkX18qDzmmh02wD/WxzXI1BkdorIybJq1iDVKryiaQt3FrlDyXx28baNmhfrb9QXIONKJToMvKmBEo6LztYR7PqP48jB2wZsXzTWK9IkPspHCj2tS1uMiFVpaSHQX2S4uHN2RMnK2x6OgAq4f/gopCcqb/IUZtqaB/W9rHJ9+64JuDIhR96k1TyfHEHqS5ShkyMsOSbJLkyi5ohCDj5fRMKNWGST4pZf2LFVcyLF4qgJWeId8tTyUGI6sxRX7YHkiv1VAsLxTceC9Q0aRYK5OrmrmRp1M4YQLk8gFbCUsLDWxQbkrg7ZGaWCclJfJcKlGYmsR/Yn2MByZp4nZKG2JTW0RCiYM9DGfpjBgX8qqfNlwRdfh1evhuzA+zqOED9JBfW6jE09VrHbdAxIu2gH4Obo1zdVeNj4Ro7qz/APXF2sOr7sZFjiss2Oy+Fq3aonlEve1GOtTH+Ti+Pk9fDB2EjsmiKIRWPMsEdjUhxtdF86SGVAgZBOfm/emcTWoxO8BkPcmzJ+CUgG1f3MHPwKSrWozQY8n27RsRNzWRe2Mingd/dIVEHEVppEqkFVW6b1I/pNoH9mSG/sorylw2ASvC327I5nYEQmpbCSvwGLIi4d38sHdyoQEMJFy7iN8PQBvqISqsdLylVC+VNReCn1eTxA2VtvY/tfSvKe5tsfo3f/tjYbM94UdP/zgum8yCXADWEiVnK2QiLwUhsOQ6Sq/W6GYuRrrhvQwRAS5wsryVHE+xVbwACBTBqnmBYP9S24v3/5gAar+bfMKlopMzrlk9YB1whE0Oq4f3qK5FR5s1s+aOOej4J8O3GAznTifpZl+0XtZy4vEGlIxH8+Cz2u1BVQg+ru8739jeWAnWb1dZpeDfRs3VfEGrZxsh/ST1JpvsVYGaZpvHreh/+gqtLL0+Sm/oFp0mUhOVh8hteDB1Bnujg512zyv3g0eZ5FTS7rTm3SWjCSbQiCT Yq2W/Vs3 SFgg6t4PkagWXGee3VyDuMoRdj4jc+g1KRKAHkuEPxw9FUDq613EjRTXGP1vd7XgnAndu4LXpDd4Yl+rF2Rlin7/97z1HZfXxL5E7kczqJOaW8ipJ7tVNBEbMaRYJYGqXIGrFVrNf91BKff3afyhOZaHGLmyfKRzq9oIPI6RIe8fIxToY4sfpaeijyIOQ7rzBJVZdbDh46BXd00ecNK6eX4e/Jq6XUkR12hf7aFheoQ5g5F3hRPaaQUw+gYt/BFQZvybhvu06PIN5VK+DFvnn9fVmQfgms981Uxzkq/Oaw+vx+oJyfvtLZvK6cy+6EdSt9TLWN5K63zkloBvn+26LSvVBA3ISMmjILO3Nu3kgXALJZcA/8du0iE4GM0Z6OJJZywLDPdh8kK5IcKaKtjrdegtrLh86hziTCs3sUZzFS8Klfk2ZUSsxMOKQKcdcHLnqS5qzQxEEdIwjEDVGsgrkxF6cyn4LATsI+SEIzcpU0wRdkezDEAZXiJNSnTQPEqrpzVxMrAhqoxu5MyrKwdV1F3C196DxHFLelP3uyNK46rACTq48YIzGWfoh5RicsWIz07OlSXfBSR0T5ICdbTXVTzg91SfRszF05GedrQK1Kbe/w8rPNPMgZfeY6usoKx5siEuK2r32w3aWUFdvsJZyu9srtvwNzDecV1nGMSH9g+ARnDG390Ww9yZtRtti6fACGEC8cxFwJn2miOUG/0324N7gQHAja0ZEdIj08hJTODQnDJnZxNnn/CEf0ubwFcuESOQAgPey+fiG/sF4YyUuITPGJhPQtI/jZkbHstYQN2BSKJ5uDG2m40h/9TGJjFlyRwlX 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: Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 2 +- tools/testing/selftests/kvm/lib/kvm_util.c | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 6aeb008dd668..d4a9925d6815 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -43,7 +43,7 @@ typedef uint64_t vm_paddr_t; /* Virtual Machine (Guest) physical address */ typedef uint64_t vm_vaddr_t; /* Virtual Machine (Guest) virtual address */ struct userspace_mem_region { - struct kvm_userspace_memory_region region; + struct kvm_userspace_memory_region2 region; struct sparsebit *unused_phy_pages; int fd; off_t offset; diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 45d21e052db0..c1e4de53d082 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -449,8 +449,8 @@ void kvm_vm_restart(struct kvm_vm *vmp) vm_create_irqchip(vmp); hash_for_each(vmp->regions.slot_hash, ctr, region, slot_node) { - int ret = ioctl(vmp->fd, KVM_SET_USER_MEMORY_REGION, ®ion->region); - TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n" + int ret = ioctl(vmp->fd, KVM_SET_USER_MEMORY_REGION2, ®ion->region); + TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION2 IOCTL failed,\n" " rc: %i errno: %i\n" " slot: %u flags: 0x%x\n" " guest_phys_addr: 0x%llx size: 0x%llx", @@ -653,7 +653,7 @@ static void __vm_mem_region_delete(struct kvm_vm *vm, } region->region.memory_size = 0; - vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region); + vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, ®ion->region); sparsebit_free(®ion->unused_phy_pages); ret = munmap(region->mmap_start, region->mmap_size); @@ -1010,8 +1010,8 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, region->region.guest_phys_addr = guest_paddr; region->region.memory_size = npages * vm->page_size; region->region.userspace_addr = (uintptr_t) region->host_mem; - ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region); - TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n" + ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, ®ion->region); + TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION2 IOCTL failed,\n" " rc: %i errno: %i\n" " slot: %u flags: 0x%x\n" " guest_phys_addr: 0x%lx size: 0x%lx", @@ -1093,9 +1093,9 @@ void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags) region->region.flags = flags; - ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region); + ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, ®ion->region); - TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n" + TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION2 IOCTL failed,\n" " rc: %i errno: %i slot: %u flags: 0x%x", ret, errno, slot, flags); } @@ -1123,9 +1123,9 @@ void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa) region->region.guest_phys_addr = new_gpa; - ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region); + ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, ®ion->region); - TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION failed\n" + TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION2 failed\n" "ret: %i errno: %i slot: %u new_gpa: 0x%lx", ret, errno, slot, new_gpa); } From patchwork Tue Jul 18 23:45:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317889 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 2A46DC001DC for ; Tue, 18 Jul 2023 23:49:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4F726280012; Tue, 18 Jul 2023 19:49:13 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4A5DD8D0012; Tue, 18 Jul 2023 19:49:13 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3214D280012; Tue, 18 Jul 2023 19:49:13 -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 1FF7A8D0012 for ; Tue, 18 Jul 2023 19:49:13 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id E4603A04F6 for ; Tue, 18 Jul 2023 23:49:12 +0000 (UTC) X-FDA: 81026376144.20.CD0358F Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf07.hostedemail.com (Postfix) with ESMTP id 23C3740018 for ; Tue, 18 Jul 2023 23:49:10 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=abyqbSNy; spf=pass (imf07.hostedemail.com: domain of 39iS3ZAYKCEk3plyunrzzrwp.nzxwty58-xxv6lnv.z2r@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=39iS3ZAYKCEk3plyunrzzrwp.nzxwty58-xxv6lnv.z2r@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724151; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=JFyfv7cUwdHBFE0lZxkORbobiGr29Mhkt+V0sNgVMXY=; b=WSYrLtIy2yt2bYPrc7ok0Xa4/u1Faibi4iFTiYdbNGB+Ifv3YGYGWcvA/D8Ye4CzIfCh3G e7OSmEMfP4qeu2DxGop1V/s2SYDzN5w4v0QcjMvOxJoT0Yfvs/5jwcLj+vzS3q3hvKgCaW ZQCm/zByRZxj4QH2ctq+oklqVZahsPw= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=abyqbSNy; spf=pass (imf07.hostedemail.com: domain of 39iS3ZAYKCEk3plyunrzzrwp.nzxwty58-xxv6lnv.z2r@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=39iS3ZAYKCEk3plyunrzzrwp.nzxwty58-xxv6lnv.z2r@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724151; a=rsa-sha256; cv=none; b=cP9XS1PEwqUnPlcju5bA8mwYtcWrMEwDmQP5GbblckiTFt4k62jX5HsTwcNOIM+bI3DuxK L8LMDE2hjX6mZR1FkWFgiBodSJ7lT7k6fJpaaQdPfRXuWGEfVCvJF+ZhAu5xXPx6ke7XKn 87A34xrmwmX694PsOrbfoqaZli95rPQ= Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-56ff81be091so61451997b3.0 for ; Tue, 18 Jul 2023 16:49:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724150; x=1692316150; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=JFyfv7cUwdHBFE0lZxkORbobiGr29Mhkt+V0sNgVMXY=; b=abyqbSNyZycbaxPKt18pqhXSJrOGWpP5TwZf2YgbTCjUsbLuck513ndjv+yHxwR2sk YXcAtOTCPMJ3ZCgUIBa4jnm/lq2OcsNjwC1Fj6Y07OEgH7SysP/bGP2SB4tR/ecVGcu4 fEHJP2PX+ioBvlhIrpfr71tiQHQn7HGyc1Vhipg5f5eFk5waSaRXG9UhM9FPVNp/fgfh /x7VksYEZ48UwtM7+maBDxgjLxJDpzdBH28sB/wSc3YOlVD/5LGCB8VT/iGIiYNyhqoK ufXypH8AMhELepjGdX4TlzxygisepfpxvZFIbAVdyACzx065jg7I/3gO6mWtJGLjx91v PwQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724150; x=1692316150; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=JFyfv7cUwdHBFE0lZxkORbobiGr29Mhkt+V0sNgVMXY=; b=Kq4MCbwfgetE4URbh1f8cnEF/rhheB6XSJnrSCJFCawBn+f7gALRdsTVJuzGMtN14t RcB3D1hkV+czbSQfTFnRBwtSNc6IAlhDNAVpqZQWxWLeF22i52UWsdi1pbECysBhuJ0z /ulFRTLiEBENKGddwFIMSzp78EQUzlp9mGDZrrxxMn6G6rWlS/dgKIziX0yELe5VkuBb VnMB7J2LnGpjMuLR+0QOCCruldEWErV/qpDxcrByoQQNFWlRYsHbwapuPSoM15lcrV4s pnh/t+1bkJe61C6E6LTCm6/OfMVVE4L4JA8DVxaDoi5P9nNGaCwajQRVH4iVo7UUhyqv JfKg== X-Gm-Message-State: ABy/qLYHr/2Dl9s36dgY7ZGN+kSUzhZVwKDIG8Hrk4K31bl0RyDu3C0L zicQw6NwvyzXI8cN1o+zC+dYM4R9Sdk= X-Google-Smtp-Source: APBJJlHWr1DY6cVuvCqn9XA/EKnl3Vs3TUUs4H5jlXd8CgpkU85x3MFXTOonALS9aP+w4FK1lG3HeouM/K4= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6902:1709:b0:c8d:469a:a749 with SMTP id by9-20020a056902170900b00c8d469aa749mr13714ybb.3.1689724150322; Tue, 18 Jul 2023 16:49:10 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:03 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-21-seanjc@google.com> Subject: [RFC PATCH v11 20/29] KVM: selftests: Add support for creating private memslots From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: 23C3740018 X-Rspam-User: X-Stat-Signature: ndyd8nrdrj43tjz4c9md7aqzafqa5a47 X-Rspamd-Server: rspam01 X-HE-Tag: 1689724150-296517 X-HE-Meta: U2FsdGVkX19neK73/668kD7kQ3CQVxLEMAmvUGtprlFqH30R1Jo1CkKqhjNbehWjgDjUw8jVrQ9y/LLaRD8iy4drnI90L6JmPxzQ3N64n0vmUWhp5v6yDagLouKV3RozNWq2onk+EQBA1i9IrmdLCiKatn4FxOVaODvvDXboXTwGgYlgXsXBrSV4k2zdegUN92pysaNV02PmMc2yO6M+cpFifFil2ni5iYOq8CSy0Z/heSSIVrcSu3xbesGZygf65ItBbO/+gnOBTlp0UMMZyFX4A+iZ+B+uHr0rFroiFJyrmHOIL1vVTbkNnUUwmeceZxyCKQXF1OyNmdQuKPbFDw+kjhaY2+Jn9YGrGOPjvSq0bsienwKyS+R4fnJZmvGWc2p5KGFogymrHkHCQMQkAQY3P6pCTIlkgsHIUcBxc29xU7UKSvvV0/n0Rax9FwhYdo+E9mc6msa7S56RTEDugsjTdG+zVTjoeP9FV/RZdpDGsHcMjWrSoPgxWsthxOjxq4V8G300n8L3Bp7QKwNDq0qBZc129KR0bA3exc5JW02r2LpqcqRQbtz1IBZqBMtHf6HS8q94uue5ijC/wrtE7mzzqfxqXO7ASgOC/RibGbqrt7yejm4CiJg4Zag5zI6AlLEduSnJutmWk3VBPv577ilUC2Q0DzW2xBOtefnwjZSRXCse8N4uKawl83POLb/BAs7ZzfepeVGDJTrN3bFtX5W0jMKjgGuCKIj50x5E2JdnLDNDhKSFHhxBu/SjR5EW9Hv09EDCqbcnHHptGEisaxPaSIjrsr2c79JTCuSQW4w8gEn5erdcAmN5Z+jd3g/Xtn5ARWDgkie//nzn6XE3UnLN8NWa29zd9BZDVAOslt7OPHSsojvfWg4/lD0N/Q8JoaSja+Zd8iCSLrBylSh+zglwdq11LakgFlStVhhOzL8wH4sUa0ZFrlWmt3sef7Ykt1obcFnjABR+vq8CCHk +MQYcUE3 8e5A8r0KJW8CMmZHs6w4yk9C692/XfudGFmGKN6/H7KNJPIB3xuJPRt9vwyj84LZ1lIfZTEeqKgGCWYYW+KIeEYy6Hmudur6/OEO4shrEVzoK/nf8psGJau2HVwc+KHM95wNxA7p8GXCUbxCCCJLxDQ/c0UPoc91lSutYBK/ZWnj/ng1PDa4jO4zYRsggn14filoD1RJP4csbASMlZfwpvh1Fw9vo6nwFjaJ2yufZ6YbeCaEiKl+Q9U3teyqwyeLfv8rNnAfIie5OTf5RBYu+6kzn4xpKQJrDPMPCPYqmMkZiag6XjTNX/bi1GlCgyvO74tdaGHi5BZyNpcvBKaKjLrN7RiYvyQQydDWZP168SNE/NL4DYcOIeTYuPSjK1feBeKNyPiwzUJkRlKErM0Nv45z500V2U6C3HzEVnpLe6KsAvpKxA7+yju+j4iY0DO+fXVsQqxGgVM8EZRNGVlYHhQ7nw/SbXJDj1MBcLvl13xo7YGpTas6dotcgQkJuByifwLsEQYRM6GglMRzv1hlB6rpnyonPsrDzNbZKs7opAM18+u9bawiwazFyx4pJ5hsi3ufJ0fAl163HSIAndgtfjhW9D1fqO0HloqvaABdNEj/v0wsoZ+TCt62GYfL2vAYQisADDU50i0P+SRe2J+VQlWUtPqJCiLz1UTlrXNDFsNjK1aHmhLqLTiOBhs94uWPzuzpbrm6nZ5RHatwaaqgSnucDj3gV8Jp8ypT4XR+iwZYL6dh+TT0yCm2rfzo7oVczjQnOc0Bt1IOi/ds= 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: Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 16 ++++ .../testing/selftests/kvm/include/test_util.h | 5 ++ tools/testing/selftests/kvm/lib/kvm_util.c | 85 ++++++++++++------- 3 files changed, 75 insertions(+), 31 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index d4a9925d6815..f1de6a279561 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -407,6 +407,19 @@ static inline uint64_t vm_get_stat(struct kvm_vm *vm, const char *stat_name) } void vm_create_irqchip(struct kvm_vm *vm); +static inline int vm_create_guest_memfd(struct kvm_vm *vm, uint64_t size, + uint64_t flags) +{ + struct kvm_create_guest_memfd gmem = { + .size = size, + .flags = flags, + }; + + int fd = __vm_ioctl(vm, KVM_CREATE_GUEST_MEMFD, &gmem); + + TEST_ASSERT(fd >= 0, KVM_IOCTL_ERROR(KVM_CREATE_GUEST_MEMFD, fd)); + return fd; +} void vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, uint64_t gpa, uint64_t size, void *hva); @@ -416,6 +429,9 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t guest_paddr, uint32_t slot, uint64_t npages, uint32_t flags); +void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, + uint64_t guest_paddr, uint32_t slot, uint64_t npages, + uint32_t flags, int gmem_fd, uint64_t gmem_offset); void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags); void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa); diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h index a6e9f215ce70..f3088d27f3ce 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -143,6 +143,11 @@ static inline bool backing_src_is_shared(enum vm_mem_backing_src_type t) return vm_mem_backing_src_alias(t)->flag & MAP_SHARED; } +static inline bool backing_src_can_be_huge(enum vm_mem_backing_src_type t) +{ + return t != VM_MEM_SRC_ANONYMOUS && t != VM_MEM_SRC_SHMEM; +} + /* Aligns x up to the next multiple of size. Size must be a power of 2. */ static inline uint64_t align_up(uint64_t x, uint64_t size) { diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index c1e4de53d082..b93717e62325 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -664,6 +664,8 @@ static void __vm_mem_region_delete(struct kvm_vm *vm, TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret)); close(region->fd); } + if (region->region.gmem_fd >= 0) + close(region->region.gmem_fd); free(region); } @@ -865,36 +867,15 @@ void vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, errno, strerror(errno)); } -/* - * VM Userspace Memory Region Add - * - * Input Args: - * vm - Virtual Machine - * src_type - Storage source for this region. - * NULL to use anonymous memory. - * guest_paddr - Starting guest physical address - * slot - KVM region slot - * npages - Number of physical pages - * flags - KVM memory region flags (e.g. KVM_MEM_LOG_DIRTY_PAGES) - * - * Output Args: None - * - * Return: None - * - * Allocates a memory area of the number of pages specified by npages - * and maps it to the VM specified by vm, at a starting physical address - * given by guest_paddr. The region is created with a KVM region slot - * given by slot, which must be unique and < KVM_MEM_SLOTS_NUM. The - * region is created with the flags given by flags. - */ -void vm_userspace_mem_region_add(struct kvm_vm *vm, - enum vm_mem_backing_src_type src_type, - uint64_t guest_paddr, uint32_t slot, uint64_t npages, - uint32_t flags) +/* FIXME: This thing needs to be ripped apart and rewritten. */ +void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, + uint64_t guest_paddr, uint32_t slot, uint64_t npages, + uint32_t flags, int gmem_fd, uint64_t gmem_offset) { int ret; struct userspace_mem_region *region; size_t backing_src_pagesz = get_backing_src_pagesz(src_type); + size_t mem_size = npages * vm->page_size; size_t alignment; TEST_ASSERT(vm_adjust_num_guest_pages(vm->mode, npages) == npages, @@ -947,7 +928,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, /* Allocate and initialize new mem region structure. */ region = calloc(1, sizeof(*region)); TEST_ASSERT(region != NULL, "Insufficient Memory"); - region->mmap_size = npages * vm->page_size; + region->mmap_size = mem_size; #ifdef __s390x__ /* On s390x, the host address must be aligned to 1M (due to PGSTEs) */ @@ -994,14 +975,47 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, /* As needed perform madvise */ if ((src_type == VM_MEM_SRC_ANONYMOUS || src_type == VM_MEM_SRC_ANONYMOUS_THP) && thp_configured()) { - ret = madvise(region->host_mem, npages * vm->page_size, + ret = madvise(region->host_mem, mem_size, src_type == VM_MEM_SRC_ANONYMOUS ? MADV_NOHUGEPAGE : MADV_HUGEPAGE); TEST_ASSERT(ret == 0, "madvise failed, addr: %p length: 0x%lx src_type: %s", - region->host_mem, npages * vm->page_size, + region->host_mem, mem_size, vm_mem_backing_src_alias(src_type)->name); } region->backing_src_type = src_type; + + if (flags & KVM_MEM_PRIVATE) { + if (gmem_fd < 0) { + uint32_t gmem_flags = 0; + + /* + * Allow hugepages for the guest memfd backing if the + * "normal" backing is allowed/required to be huge. + */ + if (src_type != VM_MEM_SRC_ANONYMOUS && + src_type != VM_MEM_SRC_SHMEM) + gmem_flags |= KVM_GUEST_MEMFD_ALLOW_HUGEPAGE; + + TEST_ASSERT(!gmem_offset, + "Offset must be zero when creating new guest_memfd"); + gmem_fd = vm_create_guest_memfd(vm, mem_size, gmem_flags); + } else { + /* + * Install a unique fd for each memslot so that the fd + * can be closed when the region is deleted without + * needing to track if the fd is owned by the framework + * or by the caller. + */ + gmem_fd = dup(gmem_fd); + TEST_ASSERT(gmem_fd >= 0, __KVM_SYSCALL_ERROR("dup()", gmem_fd)); + } + + region->region.gmem_fd = gmem_fd; + region->region.gmem_offset = gmem_offset; + } else { + region->region.gmem_fd = -1; + } + region->unused_phy_pages = sparsebit_alloc(); sparsebit_set_num(region->unused_phy_pages, guest_paddr >> vm->page_shift, npages); @@ -1014,9 +1028,10 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION2 IOCTL failed,\n" " rc: %i errno: %i\n" " slot: %u flags: 0x%x\n" - " guest_phys_addr: 0x%lx size: 0x%lx", + " guest_phys_addr: 0x%lx size: 0x%lx guest_memfd: %d\n", ret, errno, slot, flags, - guest_paddr, (uint64_t) region->region.memory_size); + guest_paddr, (uint64_t) region->region.memory_size, + region->region.gmem_fd); /* Add to quick lookup data structures */ vm_userspace_mem_region_gpa_insert(&vm->regions.gpa_tree, region); @@ -1037,6 +1052,14 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, } } +void vm_userspace_mem_region_add(struct kvm_vm *vm, + enum vm_mem_backing_src_type src_type, + uint64_t guest_paddr, uint32_t slot, + uint64_t npages, uint32_t flags) +{ + vm_mem_add(vm, src_type, guest_paddr, slot, npages, flags, -1, 0); +} + /* * Memslot to region * From patchwork Tue Jul 18 23:45:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317890 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 1A2E2C04A6A for ; Tue, 18 Jul 2023 23:49:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 87C96280013; Tue, 18 Jul 2023 19:49:15 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 8059E8D0012; Tue, 18 Jul 2023 19:49:15 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 67B9A280013; Tue, 18 Jul 2023 19:49:15 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 54A3B8D0012 for ; Tue, 18 Jul 2023 19:49:15 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 2C5721A042D for ; Tue, 18 Jul 2023 23:49:15 +0000 (UTC) X-FDA: 81026376270.10.A68D201 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf11.hostedemail.com (Postfix) with ESMTP id 446C740007 for ; Tue, 18 Jul 2023 23:49:13 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=2IP+YPfx; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf11.hostedemail.com: domain of 3-CS3ZAYKCEs5rn0wpt11tyr.p1zyv07A-zzx8npx.14t@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3-CS3ZAYKCEs5rn0wpt11tyr.p1zyv07A-zzx8npx.14t@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724153; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=pGQ5gVRuMnBz+jdxpSwzxuVc9EOZlP96OVaeomtmpkk=; b=5fg0nBEiP1xjsnqZr7EL/RJ7QgOP7xxqIpse6GLKeWfdufFQEx7trx5t8BsO2nbSNYGlQd Ddr6EF0xRQ2dYmIf9x21OYKtbpZBE/e1Dfi5PlAKEkM257E3jAufc3NEW68zWEwH7nTQcy vTTRYWDrFevxfLlYNO05vTtgjHTeDEE= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=2IP+YPfx; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf11.hostedemail.com: domain of 3-CS3ZAYKCEs5rn0wpt11tyr.p1zyv07A-zzx8npx.14t@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3-CS3ZAYKCEs5rn0wpt11tyr.p1zyv07A-zzx8npx.14t@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724153; a=rsa-sha256; cv=none; b=ZnIhxfjyvCwDT5HPXfSp9sn6KUVsp42dRZWZd0ObWRTcuQtT3w4DFw63Jyxx4JQh1IFXum 1Wo3534Pg9G5o/eCAm7RVwe9q8+LNnPPqydHG3tUQtO2LztjKxp/M6usqVW+98wuqe04X7 EH12zMcK3Oj52iWfNJcG20QhIGnINSI= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b8a44ee130so32272325ad.1 for ; Tue, 18 Jul 2023 16:49:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724152; x=1692316152; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=pGQ5gVRuMnBz+jdxpSwzxuVc9EOZlP96OVaeomtmpkk=; b=2IP+YPfxNvjiaW9VMbkPph4zWt8don45lFKbHWgoQYVJCSZxgSAoTrJwRk0xU3bSB/ sJB5qD3FZVt8Ze6IV9hIaNYVvM6HbxMbldM07upaECnO4CedX1dugCNr5s9x/FmwtvtO si2av9K7pfZJ/7gTkPujf/XMubSer7Qe7Hk25O62UufmOcyJqVk+8eCPNK70zpezhYfY A9rO9H29+732lNEvb2WPSKb4tVXPWyzzY8EtOEkscIvFTwv6KnE4TjP9uoIgqNV/+oaA QzM/AXzRRDUz2a5t+BshOVSOVX+X2P43Bg9zMlMkd6w4tV0d4azrL5OFMA3XvIN7BoSE 3brg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724152; x=1692316152; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=pGQ5gVRuMnBz+jdxpSwzxuVc9EOZlP96OVaeomtmpkk=; b=QvPvs75cbJnX6N0Rpin+E3SYF8XR/8n49UdtLJ4M3P+btk9bkdSutzSPNLUb5IHmSC NWyCU7LbtJn0LJQtBV4B3AaQ+/hU6YZsY/1kagNH5B3cDoYfAfik9vf9uttU1QdcudMp dK+WKAIppMl+tdQNRzii8qCVhGZHbEmPFxhzHNEW7shP2wAHiRShF/8liASEuk9lJw6G +p5NR+q8/inx7A3L6Z61xf1BoZcS833AyH0UxXODAER+nBDwCr781VONyl/UO10Ttm5e quHF1O+oAPXXlAo1n6pRfF+5vKG/k+byQ0TKR4G4UaoLrWSO6N++QHuA0k3pec3NEI6h C7AA== X-Gm-Message-State: ABy/qLbi6x10EtQve6n5oA4cyfHri/Wh3is92irNVxuyMX17+3gl2yTe UdTBXb7VJbi6RDDesABwja8Rd+gWMsc= X-Google-Smtp-Source: APBJJlGQidXExDXOvSIttpWwi+Oy77zoM8uyPE3vIg+QQ5r0vSYyBiY+n22aaCj4624S2+uneMtj6gNdfj0= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:e841:b0:1b5:2b14:5f2c with SMTP id t1-20020a170902e84100b001b52b145f2cmr6941plg.4.1689724152040; Tue, 18 Jul 2023 16:49:12 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:04 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-22-seanjc@google.com> Subject: [RFC PATCH v11 21/29] KVM: selftests: Add helpers to convert guest memory b/w private and shared From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: 446C740007 X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: pi3r7kj5jnky47edooi8fbzy7afizhik X-HE-Tag: 1689724153-147556 X-HE-Meta: U2FsdGVkX1+Ftid+Sb9aPA3L6oxUNZizMM2H4QmUVjavGYNs4miTpeazQ8t3rMfyfVAEQars3ACJYEuZ9B4QSp7hsrsHrEYPDF3HZnAB7TEQjBWcritcnqsbpaipBuYqBhhvW+dKshnQK0ZeslDzYUKu6b0SPKluKUIHZ/XGs1IEl17tODNVu9LNOqi9nLG4ab0hCPP7/ggNDYLvQM9SJ+55cSRtcO6Rg0dZ68/ZXcWPGu/ehNqmW1tAwizY3b8mOILlWq4EflxVcNAiHtp3d5Bb2lirtpNL7VZ+iNfsrIO/OOWi5Md3wRwlfBave/wrke/JuxIU/ZjGkqXCdy9YYMZTXSc90qF/krpz/t8J/2Ubt5XQAampyROSnRZkKthzO49CsnwrUufaaO45kotpKCIan2PCaAIu9D6NoS6ZBszd1HJt0NzUdRkN1ZazZ1WSiRNu22RjtaQQggPEOzgpylYR6mQeU5WhzK46zGdgsiLNpURj2Ql8NSH6tVmbEn3Zp9SpazHz7BLNf/kV7v+4KrRg9RHNEnRuFFAXZVm8ZtiKT1mfbGEud/UUhI7OW3IN5iLj5DiUvGH0hxrrz35cmy5IHn1+es95//AzVTw9T3rKXYfg8rW4MBszlDfVYh3w8Pd9Kz8VOvFnGj4eymBWWH1kEgQLfq0COLqyJlmUe//m9otruw5hHSPG5gbFLJDePuBfOzpnsd3Hp9rXC9L2Wimgsiug8o/wqfIzYPhJ/ZYvh1M0550/1nErsNWAX8s9Gp3+D5VFWkSndgUwIWYCFlVvEdiI3Fb/0J4EzZPn5HVu/GaWFrMAnRwVPP5axFyT7EOBfYx8fR4yUl3fozU7vxbKfa6e3gqLuP/uqMKG8xW6tlldJA33EDBaIYFHHa73QsUcRVZHnsvV4NNLn+THdfktZdk0zUDjEehREjokV1K/Wlmuhe7VsvbuO/+WYp1pVShmvf6jzs9y0Ef/tI6 7m6qVfBm wX6UQsBiC22EzS2AnB+ITyIiUWbmpFkiExA2GauWUg3hh57Yhz0tDnwQ4RAhzzReuXfivy20mGW4h2tEh8unLRKtidhvCaqxeplW7GJ6qNJulFOP8tTGimwl30qVBI8huomBNrAs/s4Ptx2VQ0jl3t0a/kMYjMJX6Gmu91K9Pt0RLPxZCYhRuUhws+Cn1aoROanlTw1fP2xOtxLfwU4NkZ6JEl3o1Jo9vfnOSdi6OlT5efj57c/edYy15nHt5z7x8bymlCUaO2v3DIDU+f18GipTmURfFD5HNzqcW1SSTdGqtpXTe/ZgEt3osssuEHrVsH2crv/V+NlEmZW3RteXZ/fB4cI8KXllVwBtuf6rNiHJS7yydZmWuAw5qdaN41w3yaTHayp8ThPmG7RYo2qcCadbGDpXcoL7AskAD9Ooir/dnT/raFOwC736zWnCaGZ+wEV+tVG0hipPDJQCDWJMa2Irl7r4pbGW0OPICKtR3Ml3CVPXCmmR+XsCvqT2bPW2cmW0Ep154Bw3/9gRJAPHq9GkNnuGQldjNyOXC16OU3N5gmQ0XGiicmjRDjguCJxZo96/SBTwN0439w/dvBqjEH4ZPcKXUp1rizm/eH9oEGKVeFjUF7P51ptuAmL4FU9Z1v6jtx8TvDP7E3S+DbSuBi2v4eXIjfQ1s77z5K+KQHa5Ujqj9UEwbKLHZHEsShgBH6ICgcgzPl1sr+MLat5mwmj9MBTmN78YN9w6hDq3bMR9VsyVKgBFt1Zoxh/mtzSEJ9LTaos509efBIr0= 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: From: Vishal Annapurve Signed-off-by: Vishal Annapurve Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 48 +++++++++++++++++++ tools/testing/selftests/kvm/lib/kvm_util.c | 26 ++++++++++ 2 files changed, 74 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index f1de6a279561..1819787b773b 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -312,6 +312,54 @@ static inline void vm_enable_cap(struct kvm_vm *vm, uint32_t cap, uint64_t arg0) vm_ioctl(vm, KVM_ENABLE_CAP, &enable_cap); } +static inline void vm_set_memory_attributes(struct kvm_vm *vm, uint64_t gpa, + uint64_t size, uint64_t attributes) +{ + struct kvm_memory_attributes attr = { + .attributes = attributes, + .address = gpa, + .size = size, + .flags = 0, + }; + + /* + * KVM_SET_MEMORY_ATTRIBUTES overwrites _all_ attributes. These flows + * need significant enhancements to support multiple attributes. + */ + TEST_ASSERT(!attributes || attributes == KVM_MEMORY_ATTRIBUTE_PRIVATE, + "Update me to support multiple attributes!"); + + vm_ioctl(vm, KVM_SET_MEMORY_ATTRIBUTES, &attr); +} + + +static inline void vm_mem_set_private(struct kvm_vm *vm, uint64_t gpa, + uint64_t size) +{ + vm_set_memory_attributes(vm, gpa, size, KVM_MEMORY_ATTRIBUTE_PRIVATE); +} + +static inline void vm_mem_set_shared(struct kvm_vm *vm, uint64_t gpa, + uint64_t size) +{ + vm_set_memory_attributes(vm, gpa, size, 0); +} + +void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size, + bool punch_hole); + +static inline void vm_guest_mem_punch_hole(struct kvm_vm *vm, uint64_t gpa, + uint64_t size) +{ + vm_guest_mem_fallocate(vm, gpa, size, true); +} + +static inline void vm_guest_mem_allocate(struct kvm_vm *vm, uint64_t gpa, + uint64_t size) +{ + vm_guest_mem_fallocate(vm, gpa, size, false); +} + void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size); const char *vm_guest_mode_string(uint32_t i); diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index b93717e62325..1283e24b76f1 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -1171,6 +1171,32 @@ void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot) __vm_mem_region_delete(vm, memslot2region(vm, slot), true); } +void vm_guest_mem_fallocate(struct kvm_vm *vm, uint64_t gpa, uint64_t size, + bool punch_hole) +{ + struct userspace_mem_region *region; + uint64_t end = gpa + size - 1; + off_t fd_offset; + int mode, ret; + + region = userspace_mem_region_find(vm, gpa, gpa); + TEST_ASSERT(region && region->region.flags & KVM_MEM_PRIVATE, + "Private memory region not found for GPA 0x%lx", gpa); + + TEST_ASSERT(region == userspace_mem_region_find(vm, end, end), + "fallocate() for guest_memfd must act on a single memslot"); + + fd_offset = region->region.gmem_offset + + (gpa - region->region.guest_phys_addr); + + mode = FALLOC_FL_KEEP_SIZE | (punch_hole ? FALLOC_FL_PUNCH_HOLE : 0); + + ret = fallocate(region->region.gmem_fd, mode, fd_offset, size); + TEST_ASSERT(!ret, "fallocate() failed to %s at %lx[%lu], fd = %d, mode = %x, offset = %lx\n", + punch_hole ? "punch hole" : "allocate", gpa, size, + region->region.gmem_fd, mode, fd_offset); +} + /* Returns the size of a vCPU's kvm_run structure. */ static int vcpu_mmap_sz(void) { From patchwork Tue Jul 18 23:45:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317891 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 58CFAC001DC for ; Tue, 18 Jul 2023 23:49:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 25FC7280014; Tue, 18 Jul 2023 19:49:17 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2362E8D0012; Tue, 18 Jul 2023 19:49:17 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 10064280014; Tue, 18 Jul 2023 19:49:17 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id F19638D0012 for ; Tue, 18 Jul 2023 19:49:16 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id CC7371C8E75 for ; Tue, 18 Jul 2023 23:49:16 +0000 (UTC) X-FDA: 81026376312.28.B1DB8C9 Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) by imf27.hostedemail.com (Postfix) with ESMTP id 041414000B for ; Tue, 18 Jul 2023 23:49:14 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=xEjga5Lw; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf27.hostedemail.com: domain of 3-iS3ZAYKCE07tp2yrv33v0t.r310x29C-11zAprz.36v@flex--seanjc.bounces.google.com designates 209.85.219.201 as permitted sender) smtp.mailfrom=3-iS3ZAYKCE07tp2yrv33v0t.r310x29C-11zAprz.36v@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724155; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=JHyOFUOJNrHCsG8hxo3NWWS2w8rJ24DtuKIoDCRGyag=; b=l7NWKQ64cfq4VsuYg6Y/DynO2k78JZdH7fg2rORtKRtk85glPg5409y2fWkyS87+qFk37O ype8buISjMikh5WanVRg0B8o5U+3AXnCeXo9nTSgLvOGvbgFnZ899SJf76LwU+0hPJxdhg FgSCa+6hwYjAQkORtc9Re8eYC4+IGfA= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=xEjga5Lw; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf27.hostedemail.com: domain of 3-iS3ZAYKCE07tp2yrv33v0t.r310x29C-11zAprz.36v@flex--seanjc.bounces.google.com designates 209.85.219.201 as permitted sender) smtp.mailfrom=3-iS3ZAYKCE07tp2yrv33v0t.r310x29C-11zAprz.36v@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724155; a=rsa-sha256; cv=none; b=dKsyt4xeYOZUrb3zT682kKkUqbYhKCkAw6xIl8n0q8jVY4H3Tx+CQcJl1Z6iyHmWC0w68r OoRM2yBhUJ1bQuUDmPPVf9LiqMSSwWFmLJpgVKbD+/+lO/7WOrN1i06FzWAv+4R7LkT0bv Opjz7wwAIutZWZF1O9T0CJrDT65yESI= Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-c64521ac8d6so5471096276.1 for ; Tue, 18 Jul 2023 16:49:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724154; x=1692316154; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=JHyOFUOJNrHCsG8hxo3NWWS2w8rJ24DtuKIoDCRGyag=; b=xEjga5LwPPSSdY8SIx3jyoncD3GGf3WPGooyrkM0KnahhnaL4mCb4YwQt0GO0HS22c NEcfXNGBndDk4nsku/Y91YS1hHA5MX/cUUC80CuRLM1bK9lLy4VQpDRd1Xi2xWiJI6o1 9/UCIe7gQuFQ2+gvKJ9C6ii8/xbm2jFSze0SQ3v0PRjd1NOqJPDidQ7wUtuL19wRUrTE yGaIkqqRPEKiBe0hyG7ZRrXgE8SEXgjc2KYKv831pMLCu06jrX+LffHvzIu5EPSPB+OK JqyI7fhSc4r9xeqc00aXehzDSyLGCvqUsUwXUuUYEMMNJQvdcAepZR51lMeVVKDz3MhJ Gd2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724154; x=1692316154; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=JHyOFUOJNrHCsG8hxo3NWWS2w8rJ24DtuKIoDCRGyag=; b=j2ImxIFTdV3fEMW/CFaWNqYOQqBYIweu4ie/rovPD3iRZxJZyO+ZvQKM6HpSd4q67f 3rEHqeJM8pUlZlZjPkg+upfZjdtwotnB4ctGIRRFTaSR9lLXzbvqV2taK/AzJo3tus7i jmlUDNSaiDAeuBlsPqBYf2zq5ne4ZH/wQX4tZzMnrNVg/50xoTrpIeZ2VmA4LlyfPA+c EDbayWSaXBJInGg6znLbRDvwIYtD79XDxRPamVaIlRfnM7Z0uTdG7GYj1J42OmJMMHRp qtjM/+xif2b1tM6r+7TAWL3SzgNzVmvnyUEb+AjPxGInI+OXyCOyDh/5v/GgomnvCM5c x7YA== X-Gm-Message-State: ABy/qLYSwsIhizJlNAjDaKbcBrkOVS9+JmSN86+xt/+ShHTUrfMlAQV3 hQV6R8NMySsbvfTRN3pjIHQMdLtOMEU= X-Google-Smtp-Source: APBJJlG18o++4c+4o8gvKjis+x9wRH2pDI/AJGKQKbbl3lcmVj0vggAD6gv2GfLwBQuIOlyc9qDjI+M6sT4= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:a021:0:b0:cf2:9e82:a5b5 with SMTP id x30-20020a25a021000000b00cf29e82a5b5mr7746ybh.8.1689724154115; Tue, 18 Jul 2023 16:49:14 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:05 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-23-seanjc@google.com> Subject: [RFC PATCH v11 22/29] KVM: selftests: Add helpers to do KVM_HC_MAP_GPA_RANGE hypercalls (x86) From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: 041414000B X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: cpfb1ozfeomhwtms65dheirk1t8epgka X-HE-Tag: 1689724154-406404 X-HE-Meta: U2FsdGVkX1+0ZhbfyTnG6NLMX/FkU4W1EAMllQLIxU11r9YXgJWYzCnfvfxFoAWxF3aXjJiPe8mH7vINc1iLjQ8J10WpkI3GBV4yOcWpQ+yWsg/JVIzjO0BpjszYTELYFKmkCh2U1oq2bT1YTArQKgXz6PzUS370TXVWUBt6q+9bXngD20QMYaFCUqrC1CnBU2e6HFCm+RCIJRuszQoPfTMEenFrFnWqhytjztLpUR7Qyx3mI0ncYlrfWEUYKoyYfJL4lMjvQlT+Ucuu0G+taKezlNV7r95hduh/xp2qQWT8vtFATNEonwSH+gr2NGKy+UeTbAjWyhKfzB3Xyw/dS7vv7fzys3E4BHoVDNUVvpkOgDlrwNrHyL6RGniCK4dV9l9Y3OxF7EYIzkODHq+1XE7ehVSThm9BfFt/2cYBJSMSGQngtcZuagT9yGCmcnyWF8Ae7gXKV69E8SpyCDZaGfgtRhu7NkzvveBuSM+d/DlMv9iFs2ruTklLz8TShFnt2xQb68pkmo0fjN7vfELSoF+8/9HNOsI6Sf7igOZowmJTb9LzYIy8RAHDgD9Y5+daQDVlrMwjCNY+dQr1/r+Aklgi0ySywQMzd/QviXwds4hh0eyU/1jSZzrAaMHI7XeU8o++0XIH+oWr6+uu4UHVExi8gAh2hgRFAo8NGQbFecxjLvwBSkqkox69OmJrPgJmytBmGA4Upfdd1lf0zgunP5dPopTRC6gjVQ71iS8/UgKJeem6+rNi+kqsHKomjPRM8VGfnBsReJAPqHPXGM4ZKJRtHZB+CNR8sqyouQgELSAotbe7UWVFV11JqdGXOtv8FRAC0sBgQgjeEf7nM3xVUs8Wx0bW7qtxLrqPc6BYUrtpZlaG6QwtFzzBcyhD2+mcfEaJvHjVTXuxBL5dcNh8A6CwY8zmZSsEgQ68i+TFaqkOv2fky5V44Hou2e9oMT8DS7DOKFedE23lQbg6h+s nDoxYiFx zVY0ShcHB0OhsTPnLgeQrm1trLwCzBFRnmZFVvXKe+tDBkItdhjs284977v8RZeFbpf2QVU85WS8wYXPvnxyqCPA/NcLR8scFXGIv3UFUDCG4sk8dmMoYZAF29DnIEvGtMX4cIMK7oX/Hurhn5hIXjF8ZbeT62Mwg4pg6dbz2BTcuXqFTyTJUbqVnNncRtF+ij7HnF8iJk70LGshzD9w5CHiSKGfSp4Apn/zsA/RvW/m5thXkNwQ5zJ18ToIxIPUrZwTI0HjMyDFNeqAQj31ikZTohSfdtWlNUaOTvDd27j68GQYIDgv/lVh6esxkOJao17a0xFEVYucxavRgfbSeBjgPgayCJkTYN2nvpgJctDrAGXhqsCqsnXTCBxOG9FOe/KIeiwtRRk7lIYTDO/uumq3AztHl/MKAIKYkphS+arce2JcUcU/6t7iR7193XuecFWQyeLep7i3cWkQEbAA6AQHEL5eKEqoiadGze4T4I6eo1fDrp4iNM8kIirJK84BRJjK2UlbLQob4Lr4tKJe2A8bLbrKOhLKDu0dvtFJoSxhjgvYvNn/OSsSNMQpSiWLSRgXyfRG84FDW7L5WgIUdNhtibD+nApXiOPx4fdcOMnRtY2gPtxfc0f8g4+ylgKhFsfhc8XwL4cWV0LT5xaM8ThO0YneXM2t9+2FvMHLppPdgmNkaZaxkLsahPOx9MbiAyVyAT6Mn+fQ5CQl4Ol3aOXKXiC3icEaMT9U1kER0PwLp8muaSoPY2fzKi6nPqMvZVkg5jNImnehHTkOAOaesmGsGqgXJ5xGut5QBGpj7KaD6UUMLE6MCVfocNAJGhDiGHsLCkShr4aAy4DpEZz5SBd9KCwV3XHtNYl3x 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: From: Vishal Annapurve Signed-off-by: Vishal Annapurve [sean: drop shared/private helpers (let tests specify flags)] Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/x86_64/processor.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h index aa434c8f19c5..8857143d400a 100644 --- a/tools/testing/selftests/kvm/include/x86_64/processor.h +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h @@ -15,6 +15,7 @@ #include #include +#include #include #include "../kvm_util.h" @@ -1166,6 +1167,20 @@ uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2, uint64_t __xen_hypercall(uint64_t nr, uint64_t a0, void *a1); void xen_hypercall(uint64_t nr, uint64_t a0, void *a1); +static inline uint64_t __kvm_hypercall_map_gpa_range(uint64_t gpa, + uint64_t size, uint64_t flags) +{ + return kvm_hypercall(KVM_HC_MAP_GPA_RANGE, gpa, size >> PAGE_SHIFT, flags, 0); +} + +static inline void kvm_hypercall_map_gpa_range(uint64_t gpa, uint64_t size, + uint64_t flags) +{ + uint64_t ret = __kvm_hypercall_map_gpa_range(gpa, size, flags); + + GUEST_ASSERT_1(!ret, ret); +} + void __vm_xsave_require_permission(uint64_t xfeature, const char *name); #define vm_xsave_require_permission(xfeature) \ From patchwork Tue Jul 18 23:45:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317893 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 CBA07EB64DD for ; Tue, 18 Jul 2023 23:49:32 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4A969280016; Tue, 18 Jul 2023 19:49:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 458938D0012; Tue, 18 Jul 2023 19:49:19 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2D2BC8D002E; Tue, 18 Jul 2023 19:49:19 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 187778D0012 for ; Tue, 18 Jul 2023 19:49:19 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id E16A01404B9 for ; Tue, 18 Jul 2023 23:49:18 +0000 (UTC) X-FDA: 81026376396.10.F6DEE2C Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf07.hostedemail.com (Postfix) with ESMTP id 0C47340013 for ; Tue, 18 Jul 2023 23:49:16 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=7kCME8pP; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf07.hostedemail.com: domain of 3-yS3ZAYKCE48uq3zsw44w1u.s421y3AD-220Bqs0.47w@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3-yS3ZAYKCE48uq3zsw44w1u.s421y3AD-220Bqs0.47w@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724157; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Q98IcrUH3D9bs3/KGOraZ2fk7jlneSyp5eOXwjGSzPo=; b=kvL/vr9fnD95YvugVNUAyeXyohWsbQeV3g7u/mQVQfYwKV1q1/RXYYcGAQwffYVoPyXt5+ waV4VH3g+XKwlMIwA+8PL2a9lAi+8/Eyzwd609cLQa06wff6ZBL5vY3377JSCFksN5cEPY jd6aKp5CfLX6aw/Tod3LdVMrAi8VeCM= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=7kCME8pP; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf07.hostedemail.com: domain of 3-yS3ZAYKCE48uq3zsw44w1u.s421y3AD-220Bqs0.47w@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3-yS3ZAYKCE48uq3zsw44w1u.s421y3AD-220Bqs0.47w@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724157; a=rsa-sha256; cv=none; b=wNKrxSJqa5UM/i+W3coc7eHWcYfWtUzeaAvS2wS+OinB/o3tKXfA2WX4M4YOvql1kfVL2f cZMZnxBs3gBOJH6NFecSVI/Bn9VAfflJGQP0yNCE8tFtSDpIpcIiuyffjOawhhXfqKg217 8WK2qlpmEvXZAfJ7eIsF/xdcUdprHNs= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b9de7951easo32357465ad.0 for ; Tue, 18 Jul 2023 16:49:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724156; x=1692316156; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=Q98IcrUH3D9bs3/KGOraZ2fk7jlneSyp5eOXwjGSzPo=; b=7kCME8pPCngu4gaFGpXg5a7UwFpOLrO0My4DJgf3Tu41/gplqgzLOGhIhYQhJyAw82 pOUm0o0ToYchYR+sqCJB8nr8JQwkY05K+mmvehoPNKX+xtAJe85ypqZrf7NdEBuc7dVO Loia1s+Vi2KmoQuGxm/1vLkByuS5Llxi1PwzbhcxuMWRdPNpQbFdZ1M0EUvFj2O4HykG lFhG2TpgpmRIG1QsBv9/L63IGFhxigQF4dGb407i8DsIDC4msrdSTzNotl+OShvkqjOU uJoKfxiuAmED0YbOhUTgqzr2Njgz4J6LJbFZG7TW80PXAaqsgV0K7Lq43642a6sItsfg Wm6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724156; x=1692316156; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Q98IcrUH3D9bs3/KGOraZ2fk7jlneSyp5eOXwjGSzPo=; b=DB9HBrOHotzqycpFi1J9aK5KBl/0gYga3eX3XWR2EmXTNMfWukFMs9YAZSMAnooTr1 Y/pGNhRV5jxlBLHE7R550am4QL8mT8T4++wtpRfWnuyVf4nQFpJl3ADJRDT6Bd1U7r5a AoZmnwk6eP/rXmZKw02u6/l3pHQcWlGXY0LkpFHM81XJb2po5SwfbOuHl5/tDxxCAeh6 dwMH6+Rlx4Ef0Hy6nsSc4Wfb76Xbs3O1H5wVdG1SuOigHDlpkmE4VNQwT2t0FJZz8RVf Rq1ctaYncOxPswYJlZHReUs5uiNZwtmXp9A/i5ULGzjp6QFEn6NXWlrZhiqboDDQyUmD h99Q== X-Gm-Message-State: ABy/qLbW9PAhFhAWKxHFWvgrRO/NaNQW8lfu2NzZ8TOuLHFmWFNCK04a T5olKcQcNYT/fevqLc99sYqausJpKDI= X-Google-Smtp-Source: APBJJlGNaFpMXi9SkErxKUtHkpkIjtXAaXLFttzvWMq3kzuSVkOJWJ0e7R+lluyhOtMVN8C9CK1Syvi8Yw4= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:903:22ce:b0:1b8:80c9:a98e with SMTP id y14-20020a17090322ce00b001b880c9a98emr18845plg.13.1689724155930; Tue, 18 Jul 2023 16:49:15 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:06 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-24-seanjc@google.com> Subject: [RFC PATCH v11 23/29] KVM: selftests: Introduce VM "shape" to allow tests to specify the VM type From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 0C47340013 X-Stat-Signature: 7pwqkzb8qtjm8bd1deftdi5femho87ri X-HE-Tag: 1689724156-805168 X-HE-Meta: U2FsdGVkX18IrhJZNYxb5WVvBrpyIShVhDtCFS8FuptoC5kjgnbPcgl0dpDYteZNYU5BX4OXPf6CSQiIle5ntnrFSjiQKoRuPQ3gAtYQm16nkaU2wKZmGzDkSROEz3gyQklxJzV6CK0MsoQRPVTDVkoNLUrcnULor66o6lelJOtgsCkleLkgYpxqpFZhNPKxkgbdyU/R08Mz9DgxSuuIOWqeQ8y5hSedy8GI7WMipDe/s3XeccNTtKkBcDpkpazxaBPhIFhCK4xUauIx2qoxpV+amUTMSB2rBLdRA4mR+dtR2H+FISToq/+wkhHOI5EWzoapxw7OnGLTMZbcFSqoCmOPXs2h9bKCpbtYTkd2wqcejnVyjkJ4rRaMezxdnH0hH4vy72fQSyRvzzih0ZJJkMBubuvTcjkU252O0Hvy19sG38XI2Lk7T+eA7qMw0ee8y3xUs+xyyvSlxx1/ltKIoElhNBZE+wrT0DZa71x0FdgCgYw+dq/jckIybSyz1tQP6dT2gx1hZyzyGu3vB40sQGWt21EOjTBXnDo55Znyfw0qyyeXdRU9nOtA8+o3rrZk73ad50XCWm2jHWpsREhkVPBN71SVYaAX2xSWiNWrYjLdXx9i0SFLZGz3tcJEkWKgzxY3BprIr4md7GLm4JPY3sgTpQWsYtMJsYdXNglsHdPmd+WvJxRzeLmXYLEoIlwzthEV0ybzKvVT9nefqOlHbpweZ0gPU5ofQB9nskvzq7bN559cfCMX6fS4gmB4WWe3Ix8ol9ItlUIxJIWDkhb7J8ukr1U+bcJ9NypoJLW7pvduk5/EvH5ha00V4TfQQv92BR/x3lgd1TQINRqWYJwsY9299buPaCxAW39tEdL553QvreW42DhEMYE177cFO79KQyao3vSsyFZ0dBazNKdEcyvWDCnWIXncSvoBlhQZGlRVs7f5aiwAmfLnNG7yAYdBV44vn5Gf75eKjuIGZYc d+BLhcaK OZ+TkQf9F6zvyBRw1UoFWnb/kyINda+ALdIlTxKmy1qizWzSJtOwCSpyRVoO9DMd8oR7L7083bOfn02V5n9JUeQBeabJ70HcRl6vG+IO9abGkyt4XQv1ymms4s6VGHTRAKql66bTTbGyfEL2oeitoqn+BVx47ZoenWr+zUaUecuij3raFN6Tu9LBt3JGYj0l/oT4ppLEANMIui1NF0YBuRBVqzgBB9SxVhG6gHSG3TI0E/UrPctZmC3vm7XAPp3AuLfU4Dtwo5uwtil7/ljGqvlcTpBJDedVzgZRHMng4nGiW/tusua9jI8oBKBrTz7jUuIRtdlOnpA3z6UlMksDuq9insk3Ly+raZNwRqYZpfpM/E1+DrvO6uf4UBN1iDefHspwfkH0WYT6hV9gBtQ7M4E+xuZE1UHvX7HROSj3QrqH3kGZIU4RtlV2v9LUomc9XmjdBHvzuAAWxnEPK6zlAMk5/nOkUOYl+TUsGZZD2irFWMFwpQmiSBdRfyq4ayoMHhgTTQkstldQgXuXfoet20icor4Ry09N1Kq0XG+XQO9AAnZVuX7Xr9i9dUgSzvekhFaV+KzAm3lP10xfblKB5yQcFF1ytn5TTvrsGNQAH6RO1zmsTaWdJq5yDlG/H02A1ITfsavILdRr3SzAVR/7SpEXh8CMDeuJMkI44Q5gjKc7ClXvilKClK5gGuJPZIcWzgJKS1enB0Hcr4VD0K9F7WKGf1iL2autYDY82BWMasWdUjyp48D30kKeVysZZL65fzo7ITOGM+5yqM6M= 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: Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 2 +- .../selftests/kvm/include/kvm_util_base.h | 54 +++++++++++++++---- .../selftests/kvm/kvm_page_table_test.c | 2 +- tools/testing/selftests/kvm/lib/kvm_util.c | 43 +++++++-------- tools/testing/selftests/kvm/lib/memstress.c | 3 +- .../kvm/x86_64/ucna_injection_test.c | 2 +- 6 files changed, 72 insertions(+), 34 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 936f3a8d1b83..6cbecf499767 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -699,7 +699,7 @@ static struct kvm_vm *create_vm(enum vm_guest_mode mode, struct kvm_vcpu **vcpu, pr_info("Testing guest mode: %s\n", vm_guest_mode_string(mode)); - vm = __vm_create(mode, 1, extra_mem_pages); + vm = __vm_create(VM_SHAPE(mode), 1, extra_mem_pages); log_mode_create_vm_done(vm); *vcpu = vm_vcpu_add(vm, 0, guest_code); diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 1819787b773b..856440294013 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -167,6 +167,23 @@ enum vm_guest_mode { NUM_VM_MODES, }; +struct vm_shape { + enum vm_guest_mode mode; + unsigned int type; +}; + +#define VM_TYPE_DEFAULT 0 + +#define VM_SHAPE(__mode) \ +({ \ + struct vm_shape shape = { \ + .mode = (__mode), \ + .type = VM_TYPE_DEFAULT \ + }; \ + \ + shape; \ +}) + #if defined(__aarch64__) extern enum vm_guest_mode vm_mode_default; @@ -199,6 +216,8 @@ extern enum vm_guest_mode vm_mode_default; #endif +#define VM_SHAPE_DEFAULT VM_SHAPE(VM_MODE_DEFAULT) + #define MIN_PAGE_SIZE (1U << MIN_PAGE_SHIFT) #define PTES_PER_MIN_PAGE ptes_per_page(MIN_PAGE_SIZE) @@ -754,21 +773,21 @@ vm_paddr_t vm_alloc_page_table(struct kvm_vm *vm); * __vm_create() does NOT create vCPUs, @nr_runnable_vcpus is used purely to * calculate the amount of memory needed for per-vCPU data, e.g. stacks. */ -struct kvm_vm *____vm_create(enum vm_guest_mode mode); -struct kvm_vm *__vm_create(enum vm_guest_mode mode, uint32_t nr_runnable_vcpus, +struct kvm_vm *____vm_create(struct vm_shape shape); +struct kvm_vm *__vm_create(struct vm_shape shape, uint32_t nr_runnable_vcpus, uint64_t nr_extra_pages); static inline struct kvm_vm *vm_create_barebones(void) { - return ____vm_create(VM_MODE_DEFAULT); + return ____vm_create(VM_SHAPE_DEFAULT); } static inline struct kvm_vm *vm_create(uint32_t nr_runnable_vcpus) { - return __vm_create(VM_MODE_DEFAULT, nr_runnable_vcpus, 0); + return __vm_create(VM_SHAPE_DEFAULT, nr_runnable_vcpus, 0); } -struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus, +struct kvm_vm *__vm_create_with_vcpus(struct vm_shape shape, uint32_t nr_vcpus, uint64_t extra_mem_pages, void *guest_code, struct kvm_vcpu *vcpus[]); @@ -776,17 +795,27 @@ static inline struct kvm_vm *vm_create_with_vcpus(uint32_t nr_vcpus, void *guest_code, struct kvm_vcpu *vcpus[]) { - return __vm_create_with_vcpus(VM_MODE_DEFAULT, nr_vcpus, 0, + return __vm_create_with_vcpus(VM_SHAPE_DEFAULT, nr_vcpus, 0, guest_code, vcpus); } + +struct kvm_vm *__vm_create_shape_with_one_vcpu(struct vm_shape shape, + struct kvm_vcpu **vcpu, + uint64_t extra_mem_pages, + void *guest_code); + /* * Create a VM with a single vCPU with reasonable defaults and @extra_mem_pages * additional pages of guest memory. Returns the VM and vCPU (via out param). */ -struct kvm_vm *__vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, - uint64_t extra_mem_pages, - void *guest_code); +static inline struct kvm_vm *__vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, + uint64_t extra_mem_pages, + void *guest_code) +{ + return __vm_create_shape_with_one_vcpu(VM_SHAPE_DEFAULT, vcpu, + extra_mem_pages, guest_code); +} static inline struct kvm_vm *vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, void *guest_code) @@ -794,6 +823,13 @@ static inline struct kvm_vm *vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, return __vm_create_with_one_vcpu(vcpu, 0, guest_code); } +static inline struct kvm_vm *vm_create_shape_with_one_vcpu(struct vm_shape shape, + struct kvm_vcpu **vcpu, + void *guest_code) +{ + return __vm_create_shape_with_one_vcpu(shape, vcpu, 0, guest_code); +} + struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm); void kvm_pin_this_task_to_pcpu(uint32_t pcpu); diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/testing/selftests/kvm/kvm_page_table_test.c index b3b00be1ef82..e8c2aabbca2b 100644 --- a/tools/testing/selftests/kvm/kvm_page_table_test.c +++ b/tools/testing/selftests/kvm/kvm_page_table_test.c @@ -254,7 +254,7 @@ static struct kvm_vm *pre_init_before_test(enum vm_guest_mode mode, void *arg) /* Create a VM with enough guest pages */ guest_num_pages = test_mem_size / guest_page_size; - vm = __vm_create_with_vcpus(mode, nr_vcpus, guest_num_pages, + vm = __vm_create_with_vcpus(VM_SHAPE(mode), nr_vcpus, guest_num_pages, guest_code, test_args.vcpus); /* Align down GPA of the testing memslot */ diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 1283e24b76f1..64221c320389 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -209,7 +209,7 @@ __weak void vm_vaddr_populate_bitmap(struct kvm_vm *vm) (1ULL << (vm->va_bits - 1)) >> vm->page_shift); } -struct kvm_vm *____vm_create(enum vm_guest_mode mode) +struct kvm_vm *____vm_create(struct vm_shape shape) { struct kvm_vm *vm; @@ -221,13 +221,13 @@ struct kvm_vm *____vm_create(enum vm_guest_mode mode) vm->regions.hva_tree = RB_ROOT; hash_init(vm->regions.slot_hash); - vm->mode = mode; - vm->type = 0; + vm->mode = shape.mode; + vm->type = shape.type; - vm->pa_bits = vm_guest_mode_params[mode].pa_bits; - vm->va_bits = vm_guest_mode_params[mode].va_bits; - vm->page_size = vm_guest_mode_params[mode].page_size; - vm->page_shift = vm_guest_mode_params[mode].page_shift; + vm->pa_bits = vm_guest_mode_params[vm->mode].pa_bits; + vm->va_bits = vm_guest_mode_params[vm->mode].va_bits; + vm->page_size = vm_guest_mode_params[vm->mode].page_size; + vm->page_shift = vm_guest_mode_params[vm->mode].page_shift; /* Setup mode specific traits. */ switch (vm->mode) { @@ -265,7 +265,7 @@ struct kvm_vm *____vm_create(enum vm_guest_mode mode) /* * Ignore KVM support for 5-level paging (vm->va_bits == 57), * it doesn't take effect unless a CR4.LA57 is set, which it - * isn't for this VM_MODE. + * isn't for this mode (48-bit virtual address space). */ TEST_ASSERT(vm->va_bits == 48 || vm->va_bits == 57, "Linear address width (%d bits) not supported", @@ -285,10 +285,11 @@ struct kvm_vm *____vm_create(enum vm_guest_mode mode) vm->pgtable_levels = 5; break; default: - TEST_FAIL("Unknown guest mode, mode: 0x%x", mode); + TEST_FAIL("Unknown guest mode: 0x%x", vm->mode); } #ifdef __aarch64__ + TEST_ASSERT(!vm->type, "ARM doesn't support test-provided types"); if (vm->pa_bits != 40) vm->type = KVM_VM_TYPE_ARM_IPA_SIZE(vm->pa_bits); #endif @@ -343,19 +344,19 @@ static uint64_t vm_nr_pages_required(enum vm_guest_mode mode, return vm_adjust_num_guest_pages(mode, nr_pages); } -struct kvm_vm *__vm_create(enum vm_guest_mode mode, uint32_t nr_runnable_vcpus, +struct kvm_vm *__vm_create(struct vm_shape shape, uint32_t nr_runnable_vcpus, uint64_t nr_extra_pages) { - uint64_t nr_pages = vm_nr_pages_required(mode, nr_runnable_vcpus, + uint64_t nr_pages = vm_nr_pages_required(shape.mode, nr_runnable_vcpus, nr_extra_pages); struct userspace_mem_region *slot0; struct kvm_vm *vm; int i; - pr_debug("%s: mode='%s' pages='%ld'\n", __func__, - vm_guest_mode_string(mode), nr_pages); + pr_debug("%s: mode='%s' type='%d', pages='%ld'\n", __func__, + vm_guest_mode_string(shape.mode), shape.type, nr_pages); - vm = ____vm_create(mode); + vm = ____vm_create(shape); vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, 0, 0, nr_pages, 0); for (i = 0; i < NR_MEM_REGIONS; i++) @@ -396,7 +397,7 @@ struct kvm_vm *__vm_create(enum vm_guest_mode mode, uint32_t nr_runnable_vcpus, * extra_mem_pages is only used to calculate the maximum page table size, * no real memory allocation for non-slot0 memory in this function. */ -struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus, +struct kvm_vm *__vm_create_with_vcpus(struct vm_shape shape, uint32_t nr_vcpus, uint64_t extra_mem_pages, void *guest_code, struct kvm_vcpu *vcpus[]) { @@ -405,7 +406,7 @@ struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus TEST_ASSERT(!nr_vcpus || vcpus, "Must provide vCPU array"); - vm = __vm_create(mode, nr_vcpus, extra_mem_pages); + vm = __vm_create(shape, nr_vcpus, extra_mem_pages); for (i = 0; i < nr_vcpus; ++i) vcpus[i] = vm_vcpu_add(vm, i, guest_code); @@ -413,15 +414,15 @@ struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus return vm; } -struct kvm_vm *__vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, - uint64_t extra_mem_pages, - void *guest_code) +struct kvm_vm *__vm_create_shape_with_one_vcpu(struct vm_shape shape, + struct kvm_vcpu **vcpu, + uint64_t extra_mem_pages, + void *guest_code) { struct kvm_vcpu *vcpus[1]; struct kvm_vm *vm; - vm = __vm_create_with_vcpus(VM_MODE_DEFAULT, 1, extra_mem_pages, - guest_code, vcpus); + vm = __vm_create_with_vcpus(shape, 1, extra_mem_pages, guest_code, vcpus); *vcpu = vcpus[0]; return vm; diff --git a/tools/testing/selftests/kvm/lib/memstress.c b/tools/testing/selftests/kvm/lib/memstress.c index df457452d146..d05487e5a371 100644 --- a/tools/testing/selftests/kvm/lib/memstress.c +++ b/tools/testing/selftests/kvm/lib/memstress.c @@ -168,7 +168,8 @@ struct kvm_vm *memstress_create_vm(enum vm_guest_mode mode, int nr_vcpus, * The memory is also added to memslot 0, but that's a benign side * effect as KVM allows aliasing HVAs in meslots. */ - vm = __vm_create_with_vcpus(mode, nr_vcpus, slot0_pages + guest_num_pages, + vm = __vm_create_with_vcpus(VM_SHAPE(mode), nr_vcpus, + slot0_pages + guest_num_pages, memstress_guest_code, vcpus); args->vm = vm; diff --git a/tools/testing/selftests/kvm/x86_64/ucna_injection_test.c b/tools/testing/selftests/kvm/x86_64/ucna_injection_test.c index 85f34ca7e49e..0ed32ec903d0 100644 --- a/tools/testing/selftests/kvm/x86_64/ucna_injection_test.c +++ b/tools/testing/selftests/kvm/x86_64/ucna_injection_test.c @@ -271,7 +271,7 @@ int main(int argc, char *argv[]) kvm_check_cap(KVM_CAP_MCE); - vm = __vm_create(VM_MODE_DEFAULT, 3, 0); + vm = __vm_create(VM_SHAPE_DEFAULT, 3, 0); kvm_ioctl(vm->kvm_fd, KVM_X86_GET_MCE_CAP_SUPPORTED, &supported_mcg_caps); From patchwork Tue Jul 18 23:45:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317894 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 DEB2AEB64DC for ; Tue, 18 Jul 2023 23:49:35 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 51DFA280017; Tue, 18 Jul 2023 19:49:21 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4CE658D0012; Tue, 18 Jul 2023 19:49:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 36E3C280017; Tue, 18 Jul 2023 19:49:21 -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 1EE7F8D0012 for ; Tue, 18 Jul 2023 19:49:21 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id F127CB0DFC for ; Tue, 18 Jul 2023 23:49:20 +0000 (UTC) X-FDA: 81026376480.25.BF3FAB0 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf06.hostedemail.com (Postfix) with ESMTP id EAF0A180011 for ; Tue, 18 Jul 2023 23:49:18 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=m1E5CQsR; spf=pass (imf06.hostedemail.com: domain of 3_SS3ZAYKCFAAws51uy66y3w.u64305CF-442Dsu2.69y@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3_SS3ZAYKCFAAws51uy66y3w.u64305CF-442Dsu2.69y@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724159; a=rsa-sha256; cv=none; b=z94rOK+5EQWgj/sx6zaNmmvMYc6M0by1I1DSf74ZGcFolt/GkSw1nmQEG9JPuK/pjg8wop yOPBjesVLbTQjnNPzqV3k+tLjdMXEXEyfFLEn2fcV2DxuNczteFkgI2yjCoUplEWBt2cLN Fp9ddJCiRiMI+gq0UczAn89WUAp7aWU= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=m1E5CQsR; spf=pass (imf06.hostedemail.com: domain of 3_SS3ZAYKCFAAws51uy66y3w.u64305CF-442Dsu2.69y@flex--seanjc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3_SS3ZAYKCFAAws51uy66y3w.u64305CF-442Dsu2.69y@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724159; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=AUBNLiIlxTx1F6mRQya+iPZZUvsAoMeHoSeivXTBAJs=; b=TB93ZvBbtS0OFjX7DUGoOBTu9HP6Q43mqA3Cd5C8g0UTUg019NxsVHfMilbGVcgpR6GKj3 VlY0w+eLDNHDMXq4kXTAHVw6BO5Swo7NhurYbfAghZL6P6jhdLY069tdmuZODb7QgxFQxm Ub04bBBertg0wOdQGf0a2t8IqKyqqdc= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-1b9de7951easo32357675ad.0 for ; Tue, 18 Jul 2023 16:49:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724158; x=1692316158; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=AUBNLiIlxTx1F6mRQya+iPZZUvsAoMeHoSeivXTBAJs=; b=m1E5CQsRhxPohHIaVjXNzAfw9sKja8GxErI8tb88+m9ohtM/2UTUV4KI0EStxpO4aq e3MZZP48Hes3EH+ziFJ16ESLBaMphjB9wBUbLKvQFLpYn2bcEMb9Uv2TfKXvMSlsG4ax +5bc2E2M24iRgByLib+vhoObgGZN9pfMuLHGBIbrmouSiZYtP7I+o1+DUjs0jJquORQM WZA9ZhPgQfZ0ViRdW+5zM3kLeIAxBI958QaGMn+cpDeKcYSO3MEZRWesl52iNilZN/Ay f7w1zt9jHHbnKZaxjQB9PYpmQD1oIBOzEUWtcHD4Ui+04jNinOeJzuhQDL4PbgsMw1sC a+1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724158; x=1692316158; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=AUBNLiIlxTx1F6mRQya+iPZZUvsAoMeHoSeivXTBAJs=; b=a77TBqAe5iUSY+I5qGYz73plV6XfqUg5SHMyo4oXYLY5Dn6a0b8LPsfO6AyEGcAU5j TDehEz3eBAGx44R2JzfyAdso3S1E0PeGe/CBSOmAlq3uvwiviytN4pJJMghIz1PLLPOp CUwKJmWL3VorzeLjGLHoauy4Qpx3N4p1ZKr1lcbD8ZswMmTz+DmIDY01NqzBGmdlC2FW EQVGrr2B64JT+/mW7Orqxit/AHb5DY/4khN1UDGfPY0OR0JP5qPfi+xgVQXvjkgu4cv8 amNrqVbqPTABO6UUticP6nCnLH/ObxLYD6Y1vRTNQjR8kNAObsN5Sbo83RIDjIwSTfpZ dzbA== X-Gm-Message-State: ABy/qLZT6jPi7wNyAIwr1UX3xSk7NBGL1ZNK8P3++eZkqsL/2NweYE7u Fq8JRO3y3/RU98eiAZkT254pCYseChA= X-Google-Smtp-Source: APBJJlGZj18kUtv2DZbfIQmZu2TXCF9UTMkYGVm3bO/BF1sxl/m3e0941s7v3QsOSVZsOvdKY/T33+qfBEc= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:d4c6:b0:1b1:7336:2637 with SMTP id o6-20020a170902d4c600b001b173362637mr16836plg.11.1689724157723; Tue, 18 Jul 2023 16:49:17 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:07 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-25-seanjc@google.com> Subject: [RFC PATCH v11 24/29] KVM: selftests: Add GUEST_SYNC[1-6] macros for synchronizing more data From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: EAF0A180011 X-Stat-Signature: sohypofjsktr1dshzjrcjumxrt98g7rb X-Rspam-User: X-HE-Tag: 1689724158-680300 X-HE-Meta: U2FsdGVkX1/4hY5sZtQZLD87Qul8KViCDUOr/lzOQ0XW0UFFZdaaNp90uPkgSbfN02z4PzP/3Lj8morsvKRmi3Dii/RWapcikamM+0541tKtIz/HHWvtOQFDGmqa8XDElOeZ4HPu2KsXOypp57Os0c8kJaydhDo3YSB34LQ3Ix7q+ltkNidN2nPZ2cywwOCpZIi3Cw5UDeH7ECZ+KJtD5kZnmACyt+61I4Sb9hTtQ5TRkk31E5002dwCTl22rDoWKW8/PAvkDm6okvve5ZxL/eoRsmM57+SHYBWkZ9YlOYS0VeeCC+f+fuwkLWBjmlnS4z/p3SU6vsnZm0CZHnDvKMl7U+2Ifwd5GcGsfm0zQSPPcEckxNfBrwLHSgVSRPfvBk5b1HjOIhDVF5kfqA+913htPbZcdYab3M7sCWpw8uM+YIPNHthd+aC1mOIdSA2ir9F2L6hYItHrau5BEKLq6nmBreaH/QmfIB3Wwm5FLhUx0FO7M2qgT+I/3D41xXj8n319+lBLmAAyDN7lTUkFFR4JCtrBpJ6RB95grdvIwVg95DA5nID1lMyMhNVaPlTCsLvYYDcFqe/xy9u5QgN8QZK7d8JniOaNuKidnJdf5RUBwJFDKg9HJLV4RSvn9ipu/FjkTAQuZXCAiZsVzr+oCqkUqC7lhUNQsXqmSE5zOWnO99Ez/fcfp/WsQsKxUkda4N9KPVmGTnsZQQYvxjSQZz/0oxfvBdpcpkZmsshb6TB6mLvFX+NZhyIuo6Mj3gKa7A3/zZ1PuOKdG2WagCT5wC2pdSxx/KnmGp8UrsI6PO17ng9oDWaPPrH6cvLhtQ+UYCLSqGTbcvkGaiAy4X49zHM6dSUVKwaruOM/zDC4F1Iucs2xQVLcSbOerMhnmIaJsrcMFudqt+NTOwF3U1Cxx7+360zu7NBtE/WFxGJZQj3cOEvmMZXNsi3eRoAEgVEAQutep9c69g1ksf2gNAC 0RRSpzR8 tcM1sL0UjFUXwK/lIAg1dxZZXWEEPV26v4qwonrVJUcPgV2QtdZHzSp4gBI6Uhes4p9ff+Gx84ZM58H4wXL/jE9J0hxANoZWbFMv9ZiD5pTfZD/osr2U2yn+GF3RJZVCYY0MpRliO0Az30Y1boK86w6mmOGPjLEN2hcFlxDZOkDM7/N6bYR+bKyisjieJl0gIFlERm66Y+5aoItUkXIug70krzflGdAnXIjHasdqHtepR1Rovww00XgLpZV/XgFL/j+UmtdCacwukpFdzU90xzOoNdT4a7qoaNfd7zUGVJh/ERz4LHiaDn2QIbeZANcFzZNKES+GVaMu5uHW1vViX0OSMmQ9L4mg64Ub0OnBu8VghNaWntYaZ8fm1XIRA8ZEQU80VT6IQ/qt2bP7ksPnY88TZLyYqVulbGcJwKSJlKpIsQVyZGvi2wy0s9Hltzr5j3yvTYscmqzEqAwmXnfm2vSS/O5vx+PdBmaZ6k8AfQWLKlr3+bSwTQwhxhzkwD0CLZj3xADvjqhMjlO4d3Og9ajmSSfdDcxSLco1Vz5JplbMgu2SFwZD+RD5ditBt3gahSULjFT4kXLzLTq1VTB0R/OH0G1Zlg4M1eP8biQD7pzbTrgikFQqDSaRmn1L+LE5CI+sXu1Iwt12gIqZ8Ac25yYwjcYlszUpH7LBT7Khg//b7Xj9DjXCURa1CNMEkIQyMyjAjn+QqVWvGrzqJTrAD+GcsMuehBunUTVdmQvc6XTVNFdHOllCEg020PYO/3DuGHPUbZZPfreljY+Qcr8KrwpcKs6upchkZ8Q+rFHOEN08Dtm/+Hvz6jP45gw== 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: Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/ucall_common.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/selftests/kvm/include/ucall_common.h index 1a6aaef5ccae..8087c877fd58 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -46,6 +46,18 @@ void ucall_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa); #define GUEST_SYNC_ARGS(stage, arg1, arg2, arg3, arg4) \ ucall(UCALL_SYNC, 6, "hello", stage, arg1, arg2, arg3, arg4) #define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) + +#define GUEST_SYNC1(arg0) ucall(UCALL_SYNC, 1, arg0) +#define GUEST_SYNC2(arg0, arg1) ucall(UCALL_SYNC, 2, arg0, arg1) +#define GUEST_SYNC3(arg0, arg1, arg2) \ + ucall(UCALL_SYNC, 3, arg0, arg1, arg2) +#define GUEST_SYNC4(arg0, arg1, arg2, arg3) \ + ucall(UCALL_SYNC, 4, arg0, arg1, arg2, arg3) +#define GUEST_SYNC5(arg0, arg1, arg2, arg3, arg4) \ + ucall(UCALL_SYNC, 5, arg0, arg1, arg2, arg3, arg4) +#define GUEST_SYNC6(arg0, arg1, arg2, arg3, arg4, arg5) \ + ucall(UCALL_SYNC, 6, arg0, arg1, arg2, arg3, arg4, arg5) + #define GUEST_DONE() ucall(UCALL_DONE, 0) enum guest_assert_builtin_args { From patchwork Tue Jul 18 23:45:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317895 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 5E3AEC001DC for ; Tue, 18 Jul 2023 23:49:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 062B0280018; Tue, 18 Jul 2023 19:49:23 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 013628D0012; Tue, 18 Jul 2023 19:49:22 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DCE848D002E; Tue, 18 Jul 2023 19:49:22 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id C24568D0012 for ; Tue, 18 Jul 2023 19:49:22 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 9311F40502 for ; Tue, 18 Jul 2023 23:49:22 +0000 (UTC) X-FDA: 81026376564.17.0FBEB77 Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) by imf06.hostedemail.com (Postfix) with ESMTP id 92AC1180018 for ; Tue, 18 Jul 2023 23:49:20 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=KtJGydbu; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf06.hostedemail.com: domain of 3_yS3ZAYKCFICyu73w08805y.w86527EH-664Fuw4.8B0@flex--seanjc.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=3_yS3ZAYKCFICyu73w08805y.w86527EH-664Fuw4.8B0@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724160; a=rsa-sha256; cv=none; b=s+Sm2QFiHS2ZBmj26ElNRbdSXfRP4+AtE/m+An7X6dRXBS78AoQZonHhtTwGCtcbs2hUDs 9r32FMu7f7UvZBLDYNABM6ZQl4i38o8rXVulHhN4kFEEPASf8mqMni3VhCFGKDWJXm7IOM nP0YASQCVIcnr1tz/Wi2fUBBx4vfcwA= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=KtJGydbu; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf06.hostedemail.com: domain of 3_yS3ZAYKCFICyu73w08805y.w86527EH-664Fuw4.8B0@flex--seanjc.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=3_yS3ZAYKCFICyu73w08805y.w86527EH-664Fuw4.8B0@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724160; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=8jGloLcQRqDJd4bG/+docoOJ7NtGfJVSr5WkEp3/r5Q=; b=cJ3vHuyOU+FkqQzuJtATXngPWs7VWW7iWbsNB8C3SDYXaI8dLcbzESVHxwFebgFvfZnOTy NvgvHlsAi1XKRJvZEEGHh807h0GdYmWFsyGukTYghrZ/+HUppRtFXFtzgG1T5rI/yqsL5N 1a2UUa/67CUEWOZjtudSBLUu3Si1v2g= Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-c647150c254so388263276.1 for ; Tue, 18 Jul 2023 16:49:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724159; x=1692316159; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=8jGloLcQRqDJd4bG/+docoOJ7NtGfJVSr5WkEp3/r5Q=; b=KtJGydbuprz9TEKiXSzt30hwmcKkKrIoU0Ew7nvPQobIitdGdQc5qUhte8t9pH6LKq WPPHL2Qh1OXRBnqeOG+rJ3daiTeYWOELS6cuYJG0cpGNJeL/0mvgeC8vHDO/DuKKuXNC 624jU9Q47swBkGhrHJimYDGHFYM+CFq8Kt8QbiKvScWeCy8vAUcgG0qXT355OkzndjaN 9SvgnAnvGsqMRPUIVcOti+3E2CHotBVVLWk5EkXXei+c8TutgR7NvwCGuLtGE1QG//sw fprKupkumGv9tX7leRApqzZUcstS20HEyz+eA9Onk1X9pIP7R+COEO7F9NsUW++2G9tB qBRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724159; x=1692316159; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=8jGloLcQRqDJd4bG/+docoOJ7NtGfJVSr5WkEp3/r5Q=; b=DuQJ1PzoZgM9rfx/5TJOhormCvGjeLCbtUzt1hHpXdHeocQbWkkzF+wae250QpN2dQ dLd0TcOAONyE6knOkibJHosGwif1oR1L+fjVLp9M8sdErjkMJcvCVVml354VigfmFqt8 hEq7zLO2ix20tU0C8uWRuOW7QJ7GuvhC6lGRw7Mzlmuo6OrlukM3NW2EC7bJS/5RzDdf 1H/Fj0bZbVMHzT1dVFlpyVZ7/wGzkk0qpq3Wr8oESpVZfu+louSSyfud5W1TfTE4vboD mmEjJAbSKuaaIH7aYEWtUYyKwNzVqXFxdAyuWGWMmhYizib1kBBye5GMO7JuzHuBBTPv uFtQ== X-Gm-Message-State: ABy/qLYhUeMH5ZZSGEarv3EeMCjqJ5xirgpdjyLEperDW5lIedF+vlbw S0ESHhcGcLDBct+KtBIkOqq5sZOxut4= X-Google-Smtp-Source: APBJJlHGitz6Wd7KiMp3rjwiDgkH0uvETgsTRqYunJjHL/RNuzVeMP0RmTCJO7TCo/NiSJBWRd5P7qkTVXM= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:7687:0:b0:cb3:865d:f403 with SMTP id r129-20020a257687000000b00cb3865df403mr13870ybc.1.1689724159714; Tue, 18 Jul 2023 16:49:19 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:08 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-26-seanjc@google.com> Subject: [RFC PATCH v11 25/29] KVM: selftests: Add x86-only selftest for private memory conversions From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 92AC1180018 X-Stat-Signature: 76fxyp5uw18gybronrt67crm5eqjqg51 X-HE-Tag: 1689724160-416887 X-HE-Meta: U2FsdGVkX198yFcUO4GSQthIO1q2nQNg3bHPyKP4xReHwe+07JxolR1rKgUjGUFUmw3xzditSlGIrbnNCIj3LCa+JMuo+MiCH0Rq5kv+d8D3GGD6hfJ+FwDKHXjGMUj3lA4mnf3JkU2ourdWXi33b2/btUnYcHwTm6RF2cUcCun7N7MKWA7JUHC6j3LJcwgSZAF6vU8O2TxYfakiQsuW59173i9mIdAXMJyu8zi/W06cf3g+hk3KuwXR1CZxn+j3ZabaOXBjTIw2Hx+fxv2wtglf+kBnkmW7VX/NADL3CHlUJQuBQZf7TVGyQ8ceGGkvTlb52gm6Fkex8InM8ze1viVQjMEk9UAzfvTD1Xtj9/L2coreANKmxtUps6UBcQN05vTkb6+QPnHsCGSS717jwbKrbMlpgLo1ytI8DOsbV7MFP7euwlzVdhnPPK5pvatN42XRx2b5Kw2Lsdrq92WmNysIUxAC8t2aBVkB74x+1rqPFF330Cn8AT2R2cQNF7pQQQzgx/fO2qH0sunKE4GKYjA5Pg3PUus46nxuZxnrohRfS2iQPbD/cEGMKZ3KmLG4NrnttgHuQsucrxbcXUQj+zNNXYS+gjKFenboss2SkZ4mUbJG2Sx3YlnwSp777HoV54t2luL2m3GLLz8XuNJzTC+DLBQCEBIQX/yrZzYAiwVqJ77EsqyUiK9lHt3GDl0d+l4tvoWS65VQBMBts9wLK8adEGDIl9vMHpokAHGu0u+pKp7jsbw91ivOx9l8yYW+eMG7nOum6AhdlpZZ26MtiUsWWCWdZf9d4dZfQ2X33XmLPe5+HYkQkL2tk8NFWBN7L/jKWHl9FmzZqLSq7FyQuLH+jm+JVEWut84DncEgD8eZoydD3MIEUWOFEQQnrAA8Wg84tkrU7SpViqarpljMdB2d8nz0WV29Yp2jZJkJh6EZ9rlwmSrwpSMlrzrUhdjYCGgZSvkDffbV511GwAp seBlsLxg tLtiC7ao4pGvHg+SEdmIFDL9ZNIQ/YV5hjXMTBI/Mm1KXAyr3UH8ePzx6BjnIboWXOwoeG7vnj0iyD6MkUrP22j3fw6xQ30zj+0puF2dU+ps2K43en8VV5MtCzoo3BR+7ZvatsuzMXxuFLEqGse61jYntaa3DS9PhfhPsGGhUpM63eOlYQ08p1trwO0pUeFYDK0xJXGRlp5SehfS1nK5Oajdk++ISrJL32D6gmSABn+9ydl5TmfhN7rZg+KXlDuWHenPdSosG0tyNwTlOZDFozOi21mG3slyfJNRNKC30477exdSdTbgkCYmK82wMRe1zglZB4Od1lnw1CKQEpLlBPlv5Wfu7GL5+++u7jqrse2F6hNGZ+Hxbna8IObIF6OLFoGNc5mPmtqaKZXZb6v6errD9RDuar5Zsk0bLp/duzPOEbb3Rf8JdETrpQ+The4iK2YQDTLseAk+5IyDyEYTdG27jOej649E6UQZOLDa42gGaEIZwDxxcNFTVu65V5CoHAXln+ZqIPauIf829Oc4CGssLnKu85ZWjgNjXK2XUuqtbp4TcD7fsIpRx24djHvsav9ILv7yAg7U7lTrbqUuRjMYRIFLY/xTrCQKWaJIpQJ2DVrSSJXy70/hXTex3Ap5az6qiit0eT9FgOIY2aHfTxYPqNgrRJhOzXLAlZY2kgXkjRh5VcFrTZe/EybIz4bdW6gl3Um7a1FowHUdd5e1+sqxUg7FjOrKwZ2tQTNtMkG0jrJpgY2oaBgZ2fAXnLt0Zg0iwJmzLReEwMPc= 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: From: Vishal Annapurve Add a selftest to exercise implicit/explicit conversion functionality within KVM and verify: - Shared memory is visible to host userspace - Private memory is not visible to host userspace - Host userspace and guest can communicate over shared memory - Data in shared backing is preserved across conversions (test's host userspace doesn't free the data) - Private memory is bound to the lifetime of the VM TODO: rewrite this to allow backing a single region of guest memory with multiple memslots for _all_ backing types and shapes, i.e. make the code for using a single backing fd across multiple memslots apply to regular memory as well. Signed-off-by: Vishal Annapurve Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile | 1 + .../kvm/x86_64/private_mem_conversions_test.c | 408 ++++++++++++++++++ 2 files changed, 409 insertions(+) create mode 100644 tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index c692cc86e7da..fdc7dff8d6ae 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -80,6 +80,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/monitor_mwait_test TEST_GEN_PROGS_x86_64 += x86_64/nested_exceptions_test TEST_GEN_PROGS_x86_64 += x86_64/platform_info_test TEST_GEN_PROGS_x86_64 += x86_64/pmu_event_filter_test +TEST_GEN_PROGS_x86_64 += x86_64/private_mem_conversions_test TEST_GEN_PROGS_x86_64 += x86_64/set_boot_cpu_id TEST_GEN_PROGS_x86_64 += x86_64/set_sregs_test TEST_GEN_PROGS_x86_64 += x86_64/smaller_maxphyaddr_emulation_test diff --git a/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c new file mode 100644 index 000000000000..40ec5f9cc256 --- /dev/null +++ b/tools/testing/selftests/kvm/x86_64/private_mem_conversions_test.c @@ -0,0 +1,408 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2022, Google LLC. + */ +#define _GNU_SOURCE /* for program_invocation_short_name */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#define BASE_DATA_SLOT 10 +#define BASE_DATA_GPA ((uint64_t)(1ull << 32)) +#define PER_CPU_DATA_SIZE ((uint64_t)(SZ_2M + PAGE_SIZE)) + +/* Horrific macro so that the line info is captured accurately :-( */ +#define memcmp_g(gpa, pattern, size) \ +do { \ + uint8_t *mem = (uint8_t *)gpa; \ + size_t i; \ + \ + for (i = 0; i < size; i++) \ + GUEST_ASSERT_4(mem[i] == pattern, \ + gpa, i, mem[i], pattern); \ +} while (0) + +static void memcmp_h(uint8_t *mem, uint8_t pattern, size_t size) +{ + size_t i; + + for (i = 0; i < size; i++) + TEST_ASSERT(mem[i] == pattern, + "Expected 0x%x at offset %lu, got 0x%x", + pattern, i, mem[i]); +} + +/* + * Run memory conversion tests with explicit conversion: + * Execute KVM hypercall to map/unmap gpa range which will cause userspace exit + * to back/unback private memory. Subsequent accesses by guest to the gpa range + * will not cause exit to userspace. + * + * Test memory conversion scenarios with following steps: + * 1) Access private memory using private access and verify that memory contents + * are not visible to userspace. + * 2) Convert memory to shared using explicit conversions and ensure that + * userspace is able to access the shared regions. + * 3) Convert memory back to private using explicit conversions and ensure that + * userspace is again not able to access converted private regions. + */ + +#define GUEST_STAGE(o, s) { .offset = o, .size = s } + +enum ucall_syncs { + SYNC_SHARED, + SYNC_PRIVATE, +}; + +static void guest_sync_shared(uint64_t gpa, uint64_t size, + uint8_t current_pattern, uint8_t new_pattern) +{ + GUEST_SYNC5(SYNC_SHARED, gpa, size, current_pattern, new_pattern); +} + +static void guest_sync_private(uint64_t gpa, uint64_t size, uint8_t pattern) +{ + GUEST_SYNC4(SYNC_PRIVATE, gpa, size, pattern); +} + +/* Arbitrary values, KVM doesn't care about the attribute flags. */ +#define MAP_GPA_SHARED BIT(0) +#define MAP_GPA_DO_FALLOCATE BIT(1) + +static void guest_map_mem(uint64_t gpa, uint64_t size, bool map_shared, + bool do_fallocate) +{ + uint64_t flags = 0; + + if (map_shared) + flags |= MAP_GPA_SHARED; + if (do_fallocate) + flags |= MAP_GPA_DO_FALLOCATE; + kvm_hypercall_map_gpa_range(gpa, size, flags); +} + +static void guest_map_shared(uint64_t gpa, uint64_t size, bool do_fallocate) +{ + guest_map_mem(gpa, size, true, do_fallocate); +} + +static void guest_map_private(uint64_t gpa, uint64_t size, bool do_fallocate) +{ + guest_map_mem(gpa, size, false, do_fallocate); +} + +static void guest_run_test(uint64_t base_gpa, bool do_fallocate) +{ + struct { + uint64_t offset; + uint64_t size; + uint8_t pattern; + } stages[] = { + GUEST_STAGE(0, PAGE_SIZE), + GUEST_STAGE(0, SZ_2M), + GUEST_STAGE(PAGE_SIZE, PAGE_SIZE), + GUEST_STAGE(PAGE_SIZE, SZ_2M), + GUEST_STAGE(SZ_2M, PAGE_SIZE), + }; + const uint8_t init_p = 0xcc; + uint64_t j; + int i; + + /* Memory should be shared by default. */ + memset((void *)base_gpa, ~init_p, PER_CPU_DATA_SIZE); + guest_sync_shared(base_gpa, PER_CPU_DATA_SIZE, (uint8_t)~init_p, init_p); + memcmp_g(base_gpa, init_p, PER_CPU_DATA_SIZE); + + for (i = 0; i < ARRAY_SIZE(stages); i++) { + uint64_t gpa = base_gpa + stages[i].offset; + uint64_t size = stages[i].size; + uint8_t p1 = 0x11; + uint8_t p2 = 0x22; + uint8_t p3 = 0x33; + uint8_t p4 = 0x44; + + /* + * Set the test region to pattern one to differentiate it from + * the data range as a whole (contains the initial pattern). + */ + memset((void *)gpa, p1, size); + + /* + * Convert to private, set and verify the private data, and + * then verify that the rest of the data (map shared) still + * holds the initial pattern, and that the host always sees the + * shared memory (initial pattern). Unlike shared memory, + * punching a hole in private memory is destructive, i.e. + * previous values aren't guaranteed to be preserved. + */ + guest_map_private(gpa, size, do_fallocate); + + if (size > PAGE_SIZE) { + memset((void *)gpa, p2, PAGE_SIZE); + goto skip; + } + + memset((void *)gpa, p2, size); + guest_sync_private(gpa, size, p1); + + /* + * Verify that the private memory was set to pattern two, and + * that shared memory still holds the initial pattern. + */ + memcmp_g(gpa, p2, size); + if (gpa > base_gpa) + memcmp_g(base_gpa, init_p, gpa - base_gpa); + if (gpa + size < base_gpa + PER_CPU_DATA_SIZE) + memcmp_g(gpa + size, init_p, + (base_gpa + PER_CPU_DATA_SIZE) - (gpa + size)); + + /* + * Convert odd-number page frames back to shared to verify KVM + * also correctly handles holes in private ranges. + */ + for (j = 0; j < size; j += PAGE_SIZE) { + if ((j >> PAGE_SHIFT) & 1) { + guest_map_shared(gpa + j, PAGE_SIZE, do_fallocate); + guest_sync_shared(gpa + j, PAGE_SIZE, p1, p3); + + memcmp_g(gpa + j, p3, PAGE_SIZE); + } else { + guest_sync_private(gpa + j, PAGE_SIZE, p1); + } + } + +skip: + /* + * Convert the entire region back to shared, explicitly write + * pattern three to fill in the even-number frames before + * asking the host to verify (and write pattern four). + */ + guest_map_shared(gpa, size, do_fallocate); + memset((void *)gpa, p3, size); + guest_sync_shared(gpa, size, p3, p4); + memcmp_g(gpa, p4, size); + + /* Reset the shared memory back to the initial pattern. */ + memset((void *)gpa, init_p, size); + + /* + * Free (via PUNCH_HOLE) *all* private memory so that the next + * iteration starts from a clean slate, e.g. with respect to + * whether or not there are pages/folios in guest_mem. + */ + guest_map_shared(base_gpa, PER_CPU_DATA_SIZE, true); + } +} + +static void guest_code(uint64_t base_gpa) +{ + /* + * Run everything twice, with and without doing fallocate() on the + * guest_memfd backing when converting between shared and private. + */ + guest_run_test(base_gpa, false); + guest_run_test(base_gpa, true); + GUEST_DONE(); +} + +static void handle_exit_hypercall(struct kvm_vcpu *vcpu) +{ + struct kvm_run *run = vcpu->run; + uint64_t gpa = run->hypercall.args[0]; + uint64_t size = run->hypercall.args[1] * PAGE_SIZE; + bool map_shared = run->hypercall.args[2] & MAP_GPA_SHARED; + bool do_fallocate = run->hypercall.args[2] & MAP_GPA_DO_FALLOCATE; + struct kvm_vm *vm = vcpu->vm; + + TEST_ASSERT(run->hypercall.nr == KVM_HC_MAP_GPA_RANGE, + "Wanted MAP_GPA_RANGE (%u), got '%llu'", + KVM_HC_MAP_GPA_RANGE, run->hypercall.nr); + + if (do_fallocate) + vm_guest_mem_fallocate(vm, gpa, size, map_shared); + + vm_set_memory_attributes(vm, gpa, size, + map_shared ? 0 : KVM_MEMORY_ATTRIBUTE_PRIVATE); + run->hypercall.ret = 0; +} + +static bool run_vcpus; + +static void *__test_mem_conversions(void *__vcpu) +{ + struct kvm_vcpu *vcpu = __vcpu; + struct kvm_run *run = vcpu->run; + struct kvm_vm *vm = vcpu->vm; + struct ucall uc; + + while (!READ_ONCE(run_vcpus)) + ; + + for ( ;; ) { + vcpu_run(vcpu); + + if (run->exit_reason == KVM_EXIT_HYPERCALL) { + handle_exit_hypercall(vcpu); + continue; + } + + TEST_ASSERT(run->exit_reason == KVM_EXIT_IO, + "Wanted KVM_EXIT_IO, got exit reason: %u (%s)", + run->exit_reason, exit_reason_str(run->exit_reason)); + + switch (get_ucall(vcpu, &uc)) { + case UCALL_ABORT: + REPORT_GUEST_ASSERT_4(uc, "%lx %lx %lx %lx"); + case UCALL_SYNC: { + uint8_t *hva = addr_gpa2hva(vm, uc.args[1]); + uint64_t size = uc.args[2]; + + TEST_ASSERT(uc.args[0] == SYNC_SHARED || + uc.args[0] == SYNC_PRIVATE, + "Unknown sync command '%ld'", uc.args[0]); + + /* In all cases, the host should observe the shared data. */ + memcmp_h(hva, uc.args[3], size); + + /* For shared, write the new pattern to guest memory. */ + if (uc.args[0] == SYNC_SHARED) + memset(hva, uc.args[4], size); + break; + } + case UCALL_DONE: + return NULL; + default: + TEST_FAIL("Unknown ucall 0x%lx.", uc.cmd); + } + } +} + +static void test_mem_conversions(enum vm_mem_backing_src_type src_type, uint32_t nr_vcpus, + uint32_t nr_memslots) +{ + /* + * Allocate enough memory so that each vCPU's chunk of memory can be + * naturally aligned with respect to the size of the backing store. + */ + const size_t size = align_up(PER_CPU_DATA_SIZE, get_backing_src_pagesz(src_type)); + const size_t memfd_size = size * nr_vcpus; + struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; + pthread_t threads[KVM_MAX_VCPUS]; + uint64_t gmem_flags; + struct kvm_vm *vm; + int memfd, i, r; + + const struct vm_shape shape = { + .mode = VM_MODE_DEFAULT, + .type = KVM_X86_SW_PROTECTED_VM, + }; + + vm = __vm_create_with_vcpus(shape, nr_vcpus, 0, guest_code, vcpus); + + vm_enable_cap(vm, KVM_CAP_EXIT_HYPERCALL, (1 << KVM_HC_MAP_GPA_RANGE)); + + if (backing_src_can_be_huge(src_type)) + gmem_flags = KVM_GUEST_MEMFD_ALLOW_HUGEPAGE; + else + gmem_flags = 0; + memfd = vm_create_guest_memfd(vm, memfd_size, gmem_flags); + + for (i = 0; i < nr_memslots; i++) + vm_mem_add(vm, src_type, BASE_DATA_GPA + size * i, + BASE_DATA_SLOT + i, size / vm->page_size, + KVM_MEM_PRIVATE, memfd, size * i); + + for (i = 0; i < nr_vcpus; i++) { + uint64_t gpa = BASE_DATA_GPA + i * size; + + vcpu_args_set(vcpus[i], 1, gpa); + + virt_map(vm, gpa, gpa, size / vm->page_size); + + pthread_create(&threads[i], NULL, __test_mem_conversions, vcpus[i]); + } + + WRITE_ONCE(run_vcpus, true); + + for (i = 0; i < nr_vcpus; i++) + pthread_join(threads[i], NULL); + + kvm_vm_free(vm); + + /* + * Allocate and free memory from the guest_memfd after closing the VM + * fd. The guest_memfd is gifted a reference to its owning VM, i.e. + * should prevent the VM from being fully destroyed until the last + * reference to the guest_memfd is also put. + */ + r = fallocate(memfd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, 0, memfd_size); + TEST_ASSERT(!r, __KVM_SYSCALL_ERROR("fallocate()", r)); + + r = fallocate(memfd, FALLOC_FL_KEEP_SIZE, 0, memfd_size); + TEST_ASSERT(!r, __KVM_SYSCALL_ERROR("fallocate()", r)); +} + +static void usage(const char *cmd) +{ + puts(""); + printf("usage: %s [-h] [-m] [-s mem_type] [-n nr_vcpus]\n", cmd); + puts(""); + backing_src_help("-s"); + puts(""); + puts(" -n: specify the number of vcpus (default: 1)"); + puts(""); + puts(" -m: use multiple memslots (default: 1)"); + puts(""); +} + +int main(int argc, char *argv[]) +{ + enum vm_mem_backing_src_type src_type = DEFAULT_VM_MEM_SRC; + bool use_multiple_memslots = false; + uint32_t nr_vcpus = 1; + uint32_t nr_memslots; + int opt; + + TEST_REQUIRE(kvm_has_cap(KVM_CAP_EXIT_HYPERCALL)); + TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM)); + + while ((opt = getopt(argc, argv, "hms:n:")) != -1) { + switch (opt) { + case 's': + src_type = parse_backing_src_type(optarg); + break; + case 'n': + nr_vcpus = atoi_positive("nr_vcpus", optarg); + break; + case 'm': + use_multiple_memslots = true; + break; + case 'h': + default: + usage(argv[0]); + exit(0); + } + } + + nr_memslots = use_multiple_memslots ? nr_vcpus : 1; + + test_mem_conversions(src_type, nr_vcpus, nr_memslots); + + return 0; +} From patchwork Tue Jul 18 23:45:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317896 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 D3A8DEB64DD for ; Tue, 18 Jul 2023 23:49:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C7101280019; Tue, 18 Jul 2023 19:49:24 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BF91E8D0012; Tue, 18 Jul 2023 19:49:24 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A7341280019; Tue, 18 Jul 2023 19:49:24 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 90F638D0012 for ; Tue, 18 Jul 2023 19:49:24 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 6788F1404BE for ; Tue, 18 Jul 2023 23:49:24 +0000 (UTC) X-FDA: 81026376648.09.AAE8C6D Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf04.hostedemail.com (Postfix) with ESMTP id 818D040012 for ; Tue, 18 Jul 2023 23:49:22 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=YRRA1+3r; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf04.hostedemail.com: domain of 3ASW3ZAYKCFQE0w95y2AA270.yA8749GJ-886Hwy6.AD2@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3ASW3ZAYKCFQE0w95y2AA270.yA8749GJ-886Hwy6.AD2@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724162; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=v06h+ALMtOOYf7fX/Ew5y3Hfc7UGMHCjlt3bjyKHsv0=; b=uqud1SMXeQ/9xoZ3XjrIlzPORlRSUdpy+YxqU0Q9thmhHNlFWBUx66EJZ1GUd1zFNZk0JY acofIjYqK3GGKEujhFbKEe/XObXldSi0r8ZUq4Dsnpz8D0WsZxQttEFWH90mZr2Co7+28i zWoLlznO8wKM2fiXTBYa/KdfgB+EXnM= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=YRRA1+3r; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf04.hostedemail.com: domain of 3ASW3ZAYKCFQE0w95y2AA270.yA8749GJ-886Hwy6.AD2@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3ASW3ZAYKCFQE0w95y2AA270.yA8749GJ-886Hwy6.AD2@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724162; a=rsa-sha256; cv=none; b=ZEbveLFso2uJZU4hFbKo31OXada0oRgLWhHguZ6JSlAQnk0iNcPLfXf4O0nueEqDsxCdYv oc/k+v5bux9/FCLcjTteU0NKtEc32bbWA5Oyb55an3wAcwW8EXdAv+xzsiu+HiWG8/W/el wW9Eh9gj9cNuQrQCF4L/dH+mghjlqds= Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-573cacf4804so55413267b3.1 for ; Tue, 18 Jul 2023 16:49:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724161; x=1692316161; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=v06h+ALMtOOYf7fX/Ew5y3Hfc7UGMHCjlt3bjyKHsv0=; b=YRRA1+3rdyppDplfs3XH3aJvhxtsAMd7YC9o1tjP/IyjupywaQyvKq+rps81DQn6n1 IfT/9T8MBfb/05cpg+uFjPqU9WMKZxQ9fzOPBnRI+m2vIHPLSV2s/3KQGxo5DIXUHwOZ GdmSnQGPnvE14OEYqjCx4Fm+ABerxK8mDpsKlW+8NItJ+M4Kcnqzj3n4Y+k+3R/C1UBu wvL5E8Pm7bjCuwRxFwoKwRUML3nMWrNZ+3vwOtoXEZiYJEJR64OEqgs5nwKpwCN2Ct+r TXr64pWKwZcTWMIuNy53NUZP6UdwEiJkjqYQFxPcJ5UQJleLQ7qGIFzyDTx8Cn3NQNJC aywg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724161; x=1692316161; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=v06h+ALMtOOYf7fX/Ew5y3Hfc7UGMHCjlt3bjyKHsv0=; b=Z9xDbG1Og24GrybadQAjsEM97LfXOkM3wV2C2esUhNjsko7ABsbT9yocRfrMviZI58 Hqt1mdhRXJX0mwL7M0q9ZsoDZG+HgYq7tpiglooVrT17yG1NelfVQ8t+7G78WeajJdFg rxs9BrQY85BBZiUPgmp1VhEj8pPKbUeaAzhlQ9kSeyQIl7S0nL3NJWXfzEpy1fv2tcct W+Hj4ZnJ26Cs2IAbGHa+L12t33/W7Ci/LYT3R8Xe7Uqaz+3NjR4EhfHQqNrrq2gby11p XI5qD1lEeN22uWyBIyJm45T48HwALXeOwdqERJjYI2MVyZL1aVhRDpLP78j8N9aCij8N hVrA== X-Gm-Message-State: ABy/qLawtjFyDpdt8F7tj+5Jv5k1dzFq3/OD3BJHX7/ZIi+ikHuj6OO3 95LmKl1tZm4VnNuet5kXh2XJjX+g/TA= X-Google-Smtp-Source: APBJJlHpdLxbHGSEDlhfQMIka8AkYqbvfykkp39Gd8+LzOAP/g6chkA545wiuNlxw+N3wiN86qnMnz3hgbE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a81:b306:0:b0:56c:fce1:7d8d with SMTP id r6-20020a81b306000000b0056cfce17d8dmr185110ywh.6.1689724161668; Tue, 18 Jul 2023 16:49:21 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:09 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-27-seanjc@google.com> Subject: [RFC PATCH v11 26/29] KVM: selftests: Add KVM_SET_USER_MEMORY_REGION2 helper From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: 818D040012 X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: m7j7wraxkekfcubhcw1haee4cpd6wsci X-HE-Tag: 1689724162-665150 X-HE-Meta: U2FsdGVkX1+W+HlM9Y6IkMDykWHz/njlf6jWerqtMWksphkPt6B1ZnMSb/Olkxi9F9jovxMUyi2mqZdiCHcUg9W1MbiQ8HB0KG1rUIQPlkQ/K7/fqrP2Z4L7kc/x0BJ3hX0+fhsOhd2kWhpVlNOAv8cYYCObUZjl06+/xRtKyD8r/1/tKW7tClhcxlwmWSD6yV2ywPB757W1OhqlYvrXKfUG0Rh4QK3Xj4NhNpTjMw1ohqXzu9rCahvzIB2vbafiZkkSwpZTopK/4Twz3QeKwRTHiglhuL//g4diOjRSRzxCJHbpDDoxG/jcRrXl6hHzajKA5ZsneZ0hxPnIHiyLQ5XfZL4Nyu9QlCi6IIgGTc6URBkdYv8a3z/DgzDym2kE3Uf0YQ1UaQeEobAD8tMrFMZOpFt5fh2JhpG7yy+kvyDDQ1mkOg4NHeh24CtX0Z0ybpX1b08wkONA39NNLesI4W4SX6vi4noU/4ETP4tURmVa/iec6DtbK/HWWaFSDol2P8Gk7hQH8sTtLnV/ZQH7LYRZG4BHJEj/1ypulxTh1N8Lzy4Brcs00IeFHIfcOFiSYXtBstvs6nWHa3x323hVkItT9fsFAh475UKpOx9NQCkMLMsEUhdZ0x5OYCYb9iEpsFBPVjW/L0sSMFRCTqEzeTBmBUGXzq9NhZ+K7mLGhFHud1lhjwKucu/CiXUkzGN61I8/A9BDhQ5uxF0+KR1fDEIB0darf2ag7wOpGydgubmctewDFYaS6woB4NGUJ3u+O+kM5YncCtc4jJcfC0sh2sa5tJCnr/LoI6xg4YP/Dk12iOQZ0ShTIFMl52qLS1Ys96SNLyc0FMqgvF5wN0ASxGrDQ4tefXlixfjtbfprwcy9oz6igmGkVfaXe/7wJAoFqt3Uwb9eFF7AJWVIvLDBHBhmYPImIF04QTghtIiYkFtAj+wIjz1rykWm6XkPKWZFIv1OGqF/pUf1s1JUmQ1 IImDMAsT OmrGoRXJPSNpBTZSwcp0ftPKqGeLhKNK1qEVUMtSnrmhJ/PK72RiiyRExP3DQvgBVxazrXsxuezvk22DSl2AKmQLTTV1kqu/RseddhMI7aMO8pGlzSXB2v2aueGKbAw4uEcMnlK/QERi+U2QUdUDC+OwC7IHZjO/Pu6whTt8MigezEyknjxZ7HnuolBTLJdVNzT2bUrBWEyPHb3QNaPV7PunbNo1d7olw0+2HLe4FqEC1MmHM0LuZRIbReznrdJfn276a355Ty8bG8K8SHWCwAEYwc/uTHi9QwYy/5d9EadA8C9X5RHsVjyUQ3bFIea/VhQ6uF9GjVisoz8DfZmVl9V9+jOAFr2In7wiEj8uSHVcQSKxD5R27VatxW5aTRxxJO6/UoEliHGjgDqNDoPdAiVcEU2BiKgBirhJwVQbm4FFvLq8WSgLAjmeYxqiikpiueAMBY/CTDiRKqJzkn9B8jnvLR6AAKSThvLTtFbm2My74DZMpfd5BNNTOckHbNVhLsyNBfYfPxUG2yi7yAlMyIlRkz6Gw62/dTInwkHSehn+xu4mtkFLLcRN93ZgY05dAu0GxjwK7+LsjY4VI54g4R7arK0SpAPaWs5oj+WYEKP31K/QZZYw4s7WDneSFl0QFKizxhL7/r9e1wc8quzflBg/LoQrD8DRq6cnKccXhnNv23XKB/EVZtvds7i9JWTNYpdzhOQnFAUKkyYMXifZhqPDVhwDJMyTTpRe7EFmq91Akizcrv1I3qqibaU/RBQ3+JPdX5XcFfa+jN37kOftFecUT7y5KlWNQHqQLKyv9JEmYvvLfsInW/MW3hqUDDee6OEWh4cme4q9eoJkkwYHpQuStGg== 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: From: Chao Peng Provide a raw version as well as an assert-success version to reduce the amount of boilerplate code need for basic usage. Signed-off-by: Chao Peng Signed-off-by: Ackerley Tng --- .../selftests/kvm/include/kvm_util_base.h | 7 +++++ tools/testing/selftests/kvm/lib/kvm_util.c | 29 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 856440294013..334df27a6f43 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -492,6 +492,13 @@ void vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, uint64_t gpa, uint64_t size, void *hva); int __vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, uint64_t gpa, uint64_t size, void *hva); +void vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, + uint32_t flags, uint64_t gpa, uint64_t size, + void *hva, uint32_t gmem_fd, uint64_t gmem_offset); +int __vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, + uint32_t flags, uint64_t gpa, uint64_t size, + void *hva, uint32_t gmem_fd, uint64_t gmem_offset); + void vm_userspace_mem_region_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t guest_paddr, uint32_t slot, uint64_t npages, diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 64221c320389..f7b8b5eb3e8f 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -868,6 +868,35 @@ void vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags, errno, strerror(errno)); } +int __vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, + uint32_t flags, uint64_t gpa, uint64_t size, + void *hva, uint32_t gmem_fd, uint64_t gmem_offset) +{ + struct kvm_userspace_memory_region2 region = { + .slot = slot, + .flags = flags, + .guest_phys_addr = gpa, + .memory_size = size, + .userspace_addr = (uintptr_t)hva, + .gmem_fd = gmem_fd, + .gmem_offset = gmem_offset, + }; + + return ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION2, ®ion); +} + +void vm_set_user_memory_region2(struct kvm_vm *vm, uint32_t slot, + uint32_t flags, uint64_t gpa, uint64_t size, + void *hva, uint32_t gmem_fd, uint64_t gmem_offset) +{ + int ret = __vm_set_user_memory_region2(vm, slot, flags, gpa, size, hva, + gmem_fd, gmem_offset); + + TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION2 failed, errno = %d (%s)", + errno, strerror(errno)); +} + + /* FIXME: This thing needs to be ripped apart and rewritten. */ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, uint64_t guest_paddr, uint32_t slot, uint64_t npages, From patchwork Tue Jul 18 23:45:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317897 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 A10D0C001DC for ; Tue, 18 Jul 2023 23:49:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id EE17328001A; Tue, 18 Jul 2023 19:49:27 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E91538D0012; Tue, 18 Jul 2023 19:49:27 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D0B0F28001A; Tue, 18 Jul 2023 19:49:27 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id C0A5A8D0012 for ; Tue, 18 Jul 2023 19:49:27 -0400 (EDT) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 9CCF480521 for ; Tue, 18 Jul 2023 23:49:27 +0000 (UTC) X-FDA: 81026376774.26.DF8246A Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) by imf07.hostedemail.com (Postfix) with ESMTP id C061840019 for ; Tue, 18 Jul 2023 23:49:24 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=EcELT5Gq; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf07.hostedemail.com: domain of 3AyW3ZAYKCFYG2yB704CC492.0CA96BIL-AA8Jy08.CF4@flex--seanjc.bounces.google.com designates 209.85.214.201 as permitted sender) smtp.mailfrom=3AyW3ZAYKCFYG2yB704CC492.0CA96BIL-AA8Jy08.CF4@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724164; a=rsa-sha256; cv=none; b=A29eab9FbOWTAupxP4pEBiFV6IUX3GPT8eIsnOn1ObxMSMquwrXXof+f0j2+gNgkZ4w4QT pd4jTjyRCBue5fO0BN979xlcHE8KsY5Ozs/UJ39gDDDpTLeFRmc5xbOL74jG0fSghmgC1P segew4I9mljDfw9bOBv7mivZPh+VyYw= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=EcELT5Gq; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf07.hostedemail.com: domain of 3AyW3ZAYKCFYG2yB704CC492.0CA96BIL-AA8Jy08.CF4@flex--seanjc.bounces.google.com designates 209.85.214.201 as permitted sender) smtp.mailfrom=3AyW3ZAYKCFYG2yB704CC492.0CA96BIL-AA8Jy08.CF4@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724164; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=rKvKKloUVvRbyK7Yz9l+FaUDBRsuXKkZHJmkKN7bi2Y=; b=yg6XgsHGajzt6RNZSIhlv5rEQ+40btLx+TzNaquNgIUNyYabLUIlfHQEemSMw99Z2TrDg+ y2NQxqAZn+pVRbx3VkYfzfZtAlYQubGPM+NeEJ74tQY2LMDGstxa98IXlGbSBS7GQ3yPNB SNV2nesdIwV/0eMGAvXDlMihpHdtGbo= Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-1b888bdacbcso33058695ad.2 for ; Tue, 18 Jul 2023 16:49:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724163; x=1692316163; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=rKvKKloUVvRbyK7Yz9l+FaUDBRsuXKkZHJmkKN7bi2Y=; b=EcELT5GqQbnbtfycTUnPewJaz2g/HV9AKkO3JNwzTK5uuMisxIn1WXx7YTmbjsQ+XX SDXAGUMBTiOn2FUH3qvEgk9rfsh+jdvFnBl1T8a1rL9ik/6x/Jikv7649Is1PpM4BQ17 UtlDaSpo7OWPyOfIwkwyTxKFboN5htIa080od6JiwJUwpVFyOuq3uvwYJALuMoIA26MB r8Co4xPfs/9EJrO92UTiJyXzb+Jvnd6fmIjfIYKkVG9a/mBtJLUwQ6N3rJdy7g4z22zt Ygw1MQq7binRXHRVL1uS1Skbzt/nZzsALBROODqMohefttmXusLD/6T0/f1hYzjMb7FW vGvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724163; x=1692316163; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=rKvKKloUVvRbyK7Yz9l+FaUDBRsuXKkZHJmkKN7bi2Y=; b=dyTtfFM5lQ1O/HxrqEdVnPPzjSQ7lW7LBnAo6m3oR5QulM2tQFNm5TzDy6kbBPaVGB MdqSK8hiiqxdbqnCKW0qBLAZHne9wS5uMWf+lrh4rsIxfzIP/CrznCSW4qB+St4uCUPL hdJOMOnbEddyaXrI4EsYNQA9+8ZSS3Lo9j+4IyZjRQcj9FNxplkobl4qyFevS4VlW/zy +U3xguUCQwcDctj9D+AVVE2zPA1KRKdzAz4NY6mkE9bkVMu1UqFfJYgF8WkoDOpgEfoL /NRWZ+JhOUTrTeUj8StCdp9QW9czZklUddnrYD/uclDf23cOgb2X+8alAWlSQuGTsF0C k1Yw== X-Gm-Message-State: ABy/qLZ6UWCwxvz2fnHtky6vPkaTYsfq60GjSZvrcK0dI1WIQuTl0E4S kub6OGjkM2kMUBFG7TFymTX6+25/lN0= X-Google-Smtp-Source: APBJJlFbJO/Hk1I/Rl2qqMZ4yuUcIy3+1AWTLJTDX9bCulv0CF4luI/t69zZ9PixxI+uL49XmU3+g1rdNDk= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a17:902:ec8c:b0:1b8:95fc:d0f with SMTP id x12-20020a170902ec8c00b001b895fc0d0fmr7824plg.7.1689724163589; Tue, 18 Jul 2023 16:49:23 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:10 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-28-seanjc@google.com> Subject: [RFC PATCH v11 27/29] KVM: selftests: Expand set_memory_region_test to validate guest_memfd() From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: C061840019 X-Stat-Signature: yjxodjk89zsoq6bz8i77n74wpkb3afjs X-HE-Tag: 1689724164-503390 X-HE-Meta: U2FsdGVkX18L3gLMHj3lHYlB5XBovBZ2XsjB6FDyjRVgBmeI69Hkuk0BeG/67IhAILSmWPI7X6mVRCLn9b5ASd5iSPGZLIktkTViNYWxlKo3t3no6OLIBIx+k9OKrgNr47opCHtOmvKTbCh0bst5n+SGlW+yveRs1PTrJANUeeA+S3ioPHpW3Gv+QY9UFa1ynblTcIdhlA43qjm0/2KpmCAcfPsUGlDuowTByP8K2wSiEdddcImABKLP0VzHgmVKbEsN5Q1yZnAt0b6InV2RC8JzzqZ5fftGBdl/m88xZaGzHJu7QOFkSSCQmbWrui2ReKA78d1YpGU/stLKe0pmvWLdZx3iDtdXnuN5zL/0EN4PKazjk1ZKOrOb+xcg2SnFMSILAMKrdp92p3fck/FnZyhVM7va6ZhCXKrMEXEOMcmMea1llzNqLYi++G9dNYRw0xUqBNqGqeHvx2o8LpCUpqi0QLLI/Suwk3IdyugstrZDm4EzioUocYMQ6q4KH9jHRdor47EB8JePkYeiB3PqMM5hI0fdyKXquJ2BraB+6OWTQQW9SCDD0XC+l1BQYrwXhB0liL/jZc9jv62zxVYqRbYQCkea7AvXorbNtOm7lDxXCN5pro0o6MEBERhWvsV6x6OhnNKjbjleoAXXd9ChAblaLlPmWUAVFSIQhfyeLdip8kZo1AJL2TNMyqvWm/BNEaOe2lMLaenIC3RAtpalITeXtIKFX5RvHQrwcJKgGmzR+tNCuWOse+HEo65r/mtJ62bL8p81NPPLs0djH3937d2q7RPaavgVeTa+LiEkxveMb27iCVZanK0qdPoFN5rTYqjOidvTNHd+zcEVApfIHwLMNNTlWMwo7PfKWmWDyMxsC4bmzfdQT2F24rxp4A7lt2oZjHVR3JaBQbCKmvjU+Z+JMa39EarEhbC5GvS5GOwPtuB9uqoDV+DC1yIlYMKCASNVgms2WfhNODDn7l2 /c/AZ4pV RluMDyXQ/c0x3C62MP9Vnc8rqt/3oeWe5aZ4+R8BGPgwicn5GppBC/ZxFcAT+nTrLvJO9xs4OhV6FdB6YUAgdWQoPYwC961BQ47y7lTFiQO5Nso0GBp9QRIIufCfn0o0L51sLkSQe0e7pcxEAhEOpfeLvf1D/F/ljYmCHipyOvXEHjVUY0Unwf6rb7+xSwl+Tl7lXuEYqJxIYSm4Ck51sGUkhct29Bmj7PeucTJBODOKwoynFUO3omLjkprErCffDzYF9vIAD0Pw1AxuYG3Oz29O8u2mt1UxU03VpgsP9zmRF1s5j8645V+Sh8TVE0vEu8omi47vaDcEG90oRRJ+rAzrnNi7/0EMsi7htGrSwTxnsxnXRP+t864iVCFmLdA2oa5/MXuhvDo7sRgBv8yEngnsUoYj/CIstGQfAbLrQmy8ZCFu8GX9wI7CxL3MfzUD1o3ymbYFzsXF/dMKaSbrH6rMoI//zUbXUH/Ye7sA8++pXManGjpgAIn+DJHoLM6N3A/jKbsjotNagead49I/i32Cg88bLGyvYAlVHMx31PyFa0gDCNi7Gt+Ozw9ACZsLT7s8wrdOWXlQ3SpfiKnq1yO3q0PKPVYVJGMweDff/ylzva6P8yybQgbLzfcnu6r4cWt8NRez2rA0d+8AlAoSOv7VgmoY6YVuyYRLzGa46OlBIJORVWAlzcr4MOCxguHfQROmJCO4X4x6ffmakViWN9LrbNk+EMSuc7E2xxZYPF4JxktwUoFnwlYuJkgfBscbY/GFceU/0HwXhiFYNGzolAzxX4i1+a3uEr8ZWUwApwW8ZtFcfs6nJo+S3eQSXW0ZxJ9b6q4JkiX3sOH4wzkCiSOFg/g== 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: From: Chao Peng Expand set_memory_region_test to exercise various positive and negative testcases for private memory. - Non-guest_memfd() file descriptor for private memory - guest_memfd() from different VM - Overlapping bindings - Unaligned bindings Signed-off-by: Chao Peng Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng [sean: trim the testcases to remove duplicate coverage] Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_util_base.h | 10 ++ .../selftests/kvm/set_memory_region_test.c | 99 +++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 334df27a6f43..39b38c75b99c 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -789,6 +789,16 @@ static inline struct kvm_vm *vm_create_barebones(void) return ____vm_create(VM_SHAPE_DEFAULT); } +static inline struct kvm_vm *vm_create_barebones_protected_vm(void) +{ + const struct vm_shape shape = { + .mode = VM_MODE_DEFAULT, + .type = KVM_X86_SW_PROTECTED_VM, + }; + + return ____vm_create(shape); +} + static inline struct kvm_vm *vm_create(uint32_t nr_runnable_vcpus) { return __vm_create(VM_SHAPE_DEFAULT, nr_runnable_vcpus, 0); diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c index a849ce23ca97..ca2ca6947376 100644 --- a/tools/testing/selftests/kvm/set_memory_region_test.c +++ b/tools/testing/selftests/kvm/set_memory_region_test.c @@ -382,6 +382,98 @@ static void test_add_max_memory_regions(void) kvm_vm_free(vm); } + +static void test_invalid_guest_memfd(struct kvm_vm *vm, int memfd, + size_t offset, const char *msg) +{ + int r = __vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE, + 0, memfd, offset); + TEST_ASSERT(r == -1 && errno == EINVAL, "%s", msg); +} + +static void test_add_private_memory_region(void) +{ + struct kvm_vm *vm, *vm2; + int memfd, i; + + pr_info("Testing ADD of KVM_MEM_PRIVATE memory regions\n"); + + vm = vm_create_barebones_protected_vm(); + + test_invalid_guest_memfd(vm, vm->kvm_fd, 0, "KVM fd should fail"); + test_invalid_guest_memfd(vm, vm->fd, 0, "VM's fd should fail"); + + memfd = kvm_memfd_alloc(MEM_REGION_SIZE, false); + test_invalid_guest_memfd(vm, vm->fd, 0, "Regular memfd() should fail"); + close(memfd); + + vm2 = vm_create_barebones_protected_vm(); + memfd = vm_create_guest_memfd(vm2, MEM_REGION_SIZE, 0); + test_invalid_guest_memfd(vm, memfd, 0, "Other VM's guest_memfd() should fail"); + + vm_set_user_memory_region2(vm2, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); + close(memfd); + kvm_vm_free(vm2); + + memfd = vm_create_guest_memfd(vm, MEM_REGION_SIZE, 0); + for (i = 1; i < PAGE_SIZE; i++) + test_invalid_guest_memfd(vm, memfd, i, "Unaligned offset should fail"); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); + close(memfd); + + kvm_vm_free(vm); +} + +static void test_add_overlapping_private_memory_regions(void) +{ + struct kvm_vm *vm; + int memfd; + int r; + + pr_info("Testing ADD of overlapping KVM_MEM_PRIVATE memory regions\n"); + + vm = vm_create_barebones_protected_vm(); + + memfd = vm_create_guest_memfd(vm, MEM_REGION_SIZE * 4, 0); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, MEM_REGION_SIZE * 2, 0, memfd, 0); + + vm_set_user_memory_region2(vm, MEM_REGION_SLOT + 1, KVM_MEM_PRIVATE, + MEM_REGION_GPA * 2, MEM_REGION_SIZE * 2, + 0, memfd, MEM_REGION_SIZE * 2); + + /* + * Delete the first memslot, and then attempt to recreate it except + * with a "bad" offset that results in overlap in the guest_memfd(). + */ + vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA, 0, NULL, -1, 0); + + /* Overlap the front half of the other slot. */ + r = __vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA * 2 - MEM_REGION_SIZE, + MEM_REGION_SIZE * 2, + 0, memfd, 0); + TEST_ASSERT(r == -1 && errno == EEXIST, "%s", + "Overlapping guest_memfd() bindings should fail with EEXIST"); + + /* And now the back half of the other slot. */ + r = __vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_PRIVATE, + MEM_REGION_GPA * 2 + MEM_REGION_SIZE, + MEM_REGION_SIZE * 2, + 0, memfd, 0); + TEST_ASSERT(r == -1 && errno == EEXIST, "%s", + "Overlapping guest_memfd() bindings should fail with EEXIST"); + + close(memfd); + kvm_vm_free(vm); +} + int main(int argc, char *argv[]) { #ifdef __x86_64__ @@ -398,6 +490,13 @@ int main(int argc, char *argv[]) test_add_max_memory_regions(); + if (kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM)) { + test_add_private_memory_region(); + test_add_overlapping_private_memory_regions(); + } else { + pr_info("Skipping tests for KVM_MEM_PRIVATE memory regions\n"); + } + #ifdef __x86_64__ if (argc > 1) loops = atoi_positive("Number of iterations", argv[1]); From patchwork Tue Jul 18 23:45:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317898 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 11657EB64DC for ; Tue, 18 Jul 2023 23:49:46 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B883D28001B; Tue, 18 Jul 2023 19:49:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B0EB98D0012; Tue, 18 Jul 2023 19:49:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 93AE58D002E; Tue, 18 Jul 2023 19:49:28 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 84EE28D0012 for ; Tue, 18 Jul 2023 19:49:28 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 603831404AD for ; Tue, 18 Jul 2023 23:49:28 +0000 (UTC) X-FDA: 81026376816.10.F7DC88B Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf24.hostedemail.com (Postfix) with ESMTP id 7A660180011 for ; Tue, 18 Jul 2023 23:49:26 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=GviMnBBw; spf=pass (imf24.hostedemail.com: domain of 3BSW3ZAYKCFgI40D926EE6B4.2ECB8DKN-CCAL02A.EH6@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3BSW3ZAYKCFgI40D926EE6B4.2ECB8DKN-CCAL02A.EH6@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724166; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ZGXSnNz9o61Nw72V9XtLKU+I8mKv7z4NMyFHcn8MEno=; b=QIv0qdYK78/aaC56aafSrmOjGWqCRr/B89G7vhw9VtlkalymHddzEyvWFOP8bVGrSwPyJd +79OfsqLlmCqSW0eOGKnFv5cP2ZstBT9CB8gZrmGyhm2Gqn86AbkI6FDJ5seRRq9HecJ+G 2kSrLbrszcLb6zwB2HUiRCHhS/wwdAM= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724166; a=rsa-sha256; cv=none; b=OvEQL+JupcghHC60ast1JLPCoo7T88PR/E8DHtxDm6znnfITLtkBwSPAYDHdnJXBfknU0F 5a9Notnr1Al4XkbmtePdUJmeORQpSl34JXRhJU3y47N6PxD+RJn/m7SUP0AqRzWeT4o9OC TJOfXuzk0UpypPMu1EABfh6dpA6wNOI= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=GviMnBBw; spf=pass (imf24.hostedemail.com: domain of 3BSW3ZAYKCFgI40D926EE6B4.2ECB8DKN-CCAL02A.EH6@flex--seanjc.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3BSW3ZAYKCFgI40D926EE6B4.2ECB8DKN-CCAL02A.EH6@flex--seanjc.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-573d70da2afso55309837b3.2 for ; Tue, 18 Jul 2023 16:49:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724165; x=1692316165; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=ZGXSnNz9o61Nw72V9XtLKU+I8mKv7z4NMyFHcn8MEno=; b=GviMnBBwU8oJFlQ10qq8pyNxF7L9mJcuxalCPWoh/bF9ok9oEX2NUjJa9KKrHhYi87 XvlFcjanaIMk8EerhhIcwP5vtcQhJw/XsBuHfBW7ujLq/QBtekbPZhEy0L3zssjX4Os4 HCkDWaXzBMGWrEbehtYy6wCVBKkJl3f6UoLTxyqF6qjG/S5GIRtbBPwaqMWsXI2EE2Ex NTvB3XEVI69qVZ02zJuKcraIox6wsBhFnvj0wE9fUxuTn7iTtsBzcdr5PGVMvlBBbZgO uGQ5KBwtnA8Asre36kaUD4NkR+B+Hy37JeEBxvmqP4a9xALjBPGXbUZlkCkQaErZ6C1E xXtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724165; x=1692316165; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ZGXSnNz9o61Nw72V9XtLKU+I8mKv7z4NMyFHcn8MEno=; b=RvSNW2/pyofyiI1wltNTtzKjB2YYoJa717PGGX5Jueg2/Gid2OFK7aB6Hy1IvXm16X 9pA3S+NTguJi3QGGj4vfz7x5Gox1mdx/QYTIgvqv2MQuyS1lOmM5vywGQi1rkTVDvAzJ /BhnAAzzPuUIyQIJOITgijZjKQKrOYDIfs/qV68vraQDpJYoSlS89q61wVEFA1Y2hUtT DRHLGbU/M6Sdz3Yw+yp5hTd0bIs1KtbD+MP3f7XGmskIJII5QGSTq0SjOftLmGTPKczM gb/ZOHZFXUop1BWtY6fHgZqbycyxpBPq9PlaTlqGOi77LOZKtJgjCekQ5LbKKvBX/GIQ Td1Q== X-Gm-Message-State: ABy/qLYj6yHIj16w7rMSIAWH7SmgP0v1twlKoQatwW7YhZL6d6Nn+sps lS+wRfrn6uOp2ZAcmxZ/FQjfJI6jfFg= X-Google-Smtp-Source: APBJJlGDd5tbMIE4K9RYtlnEKXGejfF7CjNXrlXhKKgJKz78WoWlRr188h2THM+j/ruWPDM9LNr5r2ORq68= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:378a:0:b0:c6e:269e:953a with SMTP id e132-20020a25378a000000b00c6e269e953amr12921yba.3.1689724165651; Tue, 18 Jul 2023 16:49:25 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:11 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-29-seanjc@google.com> Subject: [RFC PATCH v11 28/29] KVM: selftests: Add basic selftest for guest_memfd() From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Stat-Signature: 6ci77qad5prs89o6a1bbzkpptktmxdcg X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 7A660180011 X-Rspam-User: X-HE-Tag: 1689724166-470998 X-HE-Meta: U2FsdGVkX18bNh8a02QIPKZV55MwYQj9wHSTIvU2EY9ECKmnwZUPzZCr2vQ4oI537e8N8fv4hqIu0ovsya3XZ73VoWZ+8HeWnYTVvILGql7DFWq58Qme6NVPozh7ZW6YC8vwSkmnecKnxbOrgK7hqhGW7E2ZuuwzCHFD97jiKMh5lmHTsRjhiw3smaEp1S58Cm/b6FMsYyenYofAipHtm5pcXZcz1KMtBKG3bsqbMt8VZ0s4piP4Fo1G6T+qqai2YafXeBPkVeugPWaKmheWWBJRbKNuslGq84jQFtvfmyXIYDbvdpB46x0RBemaaa047p2XlqQtDoFYIGEzQJCj4598VGp0LZ0TWuhexJSMQ/ETz8dT+u1hHJb9DzOhdqXuPDQLaq2fpZSoFKGFOgx9Vl0hKlmH67PJ+uJy7W7o8M40FJLysUPNqT6eUoPVckR/1VcR97HnH9eaJw6ySKWkkkPNCapFwZSXo56EYp8VmGXS9rtVOXtbRDEvL9MHiWLU40G83shDjuxUdSW8QH0GwK5flc75jZLhgUT2iNxPpGo2yP5d3ysuvz6J9a6XOOovxKBFcckGxRFS5f/HIJR45qgjx+P698Vfgj/99mXLeYDpdk6/2FbxMWl9ixuX1sR367hHar6Y/HBs3DHGEQefnWk9Q4rFxNQe7h4H/TuBXPegAITKsyhqmMkFzbclp3B0utae+rw/vpA5HXoxZW1fblGnKzs9RIV/tWisqkFH1HBntTdON1uoSXPfYKMnMV6QH6nxI6/PqwLWn3i4DwouML3aO7Dr1fyjIy9vbJTjT9eEb4mnm8Ye+83IU3MHZT6wlZsVTBQT46lRUz17d9NT9qAc9vTpqze5lFOzUgwM+i8BssQDahzzH8NGIsYDNqn+ozpYe85g8otEzdVdVlpDMCi62Dfl8V/CYH8ulg8k8ht8saC3Kdtwus+WjpnGzEhM+/MOCH7tpRXPfpqTbtd GRFMUM9H C1mRUi1xUaqU65uzCfUllps+k+MaVewcZ2uqNHhTp4ECKzxPJ6wJhADTzQhksf1/loO/s1nLRXcl/AGxodyKQKpRXcRMJzYhHkPzrMXI1dkR7QOgYuBp+n5V5/d2f3H9U3EodVUFGPviGq6DOCe+PuG3jn8cfGGvStuu8jfm/yVNHX4T5CBeukgtiSq2iRxzKkZ4lLceqrZXMkDaR26lJ0ETyY4ddAzs2ZfKXlL2cWQBHu+9TnY5WR4xSgzphZvkT373ecqs1mnJ/yew1pfxSPkhZMuQyVNjUz9kKX8utAlXoz3kPzdl4wTbHodeZKiOrgm8RTbdIZ8YBuyg+FA5/t97Fdh0rUb+LpzOpUZn9MIJwCIwBwudLv3J0DItI4quZ9AEND6af3IcKmX+y6Ol/a5737LQ15lxXlMiznqql1t664OnP+PIZQDpFCSOKj38YRJhLZ7G9oJ8e7DQTU/Wn23J3wmvuNN5xJXpafJz+YKzBQSI7ANfdsoyjYudQD4kFb6q4uc4JaivD1hmYcWXdNGaYemKNdkt/OY6Y7GNdDuvO0E7tffhz02i7IN7d3pr8k9SzhRZGpTPbNmB+jEzl9E6gqS6VDq+6FW4919x6zhjuNxUAqEKrDtXtxrM7VGmmeA1o6EYRsfFwvkTrCLJZUTrnaYMS6WsFhfPEpSPOGaCW494ZYWLQ45zc7lMbXmIFd5znKOVFKGAW4C74mIZ7VZbp/njKyA8Mt+BYPDRwMWGzdImV72SkFWO/wdSgBxt8QOlMjxbC6nYoqvva20vGrT/L2TCxoE8GhsyQV32E3HMCO2MmMLbWyhPY3AbMe+r5eTUP2P5CaTvma/SrPiK736RhoQ== 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: Add a selftest to verify the basic functionality of guest_memfd(): + file descriptor created with the guest_memfd() ioctl does not allow read/write/mmap operations + file size and block size as returned from fstat are as expected + fallocate on the fd checks that offset/length on fallocate(FALLOC_FL_PUNCH_HOLE) should be page aligned Signed-off-by: Chao Peng Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile | 1 + .../testing/selftests/kvm/guest_memfd_test.c | 114 ++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 tools/testing/selftests/kvm/guest_memfd_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index fdc7dff8d6ae..18c43336ede3 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -123,6 +123,7 @@ TEST_GEN_PROGS_x86_64 += access_tracking_perf_test TEST_GEN_PROGS_x86_64 += demand_paging_test TEST_GEN_PROGS_x86_64 += dirty_log_test TEST_GEN_PROGS_x86_64 += dirty_log_perf_test +TEST_GEN_PROGS_x86_64 += guest_memfd_test TEST_GEN_PROGS_x86_64 += hardware_disable_test TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus TEST_GEN_PROGS_x86_64 += kvm_page_table_test diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c new file mode 100644 index 000000000000..d698f9fde987 --- /dev/null +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright Intel Corporation, 2023 + * + * Author: Chao Peng + */ + +#define _GNU_SOURCE +#include "test_util.h" +#include "kvm_util_base.h" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +static void test_file_read_write(int fd) +{ + char buf[64]; + + TEST_ASSERT(read(fd, buf, sizeof(buf)) < 0, + "read on a guest_mem fd should fail"); + TEST_ASSERT(write(fd, buf, sizeof(buf)) < 0, + "write on a guest_mem fd should fail"); + TEST_ASSERT(pread(fd, buf, sizeof(buf), 0) < 0, + "pread on a guest_mem fd should fail"); + TEST_ASSERT(pwrite(fd, buf, sizeof(buf), 0) < 0, + "pwrite on a guest_mem fd should fail"); +} + +static void test_mmap(int fd, size_t page_size) +{ + char *mem; + + mem = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + ASSERT_EQ(mem, MAP_FAILED); +} + +static void test_file_size(int fd, size_t page_size, size_t total_size) +{ + struct stat sb; + int ret; + + ret = fstat(fd, &sb); + TEST_ASSERT(!ret, "fstat should succeed"); + ASSERT_EQ(sb.st_size, total_size); + ASSERT_EQ(sb.st_blksize, page_size); +} + +static void test_fallocate(int fd, size_t page_size, size_t total_size) +{ + int ret; + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, total_size); + TEST_ASSERT(!ret, "fallocate with aligned offset and size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + page_size - 1, page_size); + TEST_ASSERT(ret, "fallocate with unaligned offset should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, total_size, page_size); + TEST_ASSERT(ret, "fallocate beginning at total_size should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, total_size + page_size, page_size); + TEST_ASSERT(ret, "fallocate beginning at total_size should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + total_size, page_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) at total_size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + total_size + page_size, page_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) after total_size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + page_size, page_size - 1); + TEST_ASSERT(ret, "fallocate with unaligned size should fail"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + page_size, page_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) with aligned offset and size should succeed"); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE, page_size, page_size); + TEST_ASSERT(!ret, "fallocate to restore punched hole should succeed"); +} + + +int main(int argc, char *argv[]) +{ + size_t page_size; + size_t total_size; + int fd; + struct kvm_vm *vm; + + page_size = getpagesize(); + total_size = page_size * 4; + + vm = vm_create_barebones(); + + fd = vm_create_guest_memfd(vm, total_size, 0); + + test_file_read_write(fd); + test_mmap(fd, page_size); + test_file_size(fd, page_size, total_size); + test_fallocate(fd, page_size, total_size); + + close(fd); +} From patchwork Tue Jul 18 23:45:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13317899 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 DD0AEEB64DC for ; Tue, 18 Jul 2023 23:49:48 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 175A528001C; Tue, 18 Jul 2023 19:49:31 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 124768D0012; Tue, 18 Jul 2023 19:49:31 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F078B28001C; Tue, 18 Jul 2023 19:49:30 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id E0AB98D0012 for ; Tue, 18 Jul 2023 19:49:30 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id BBD2380527 for ; Tue, 18 Jul 2023 23:49:30 +0000 (UTC) X-FDA: 81026376900.27.8B3E2D3 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) by imf25.hostedemail.com (Postfix) with ESMTP id C95CFA001B for ; Tue, 18 Jul 2023 23:49:28 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=iijdn5XD; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf25.hostedemail.com: domain of 3ByW3ZAYKCFoK62FB48GG8D6.4GEDAFMP-EECN24C.GJ8@flex--seanjc.bounces.google.com designates 209.85.215.201 as permitted sender) smtp.mailfrom=3ByW3ZAYKCFoK62FB48GG8D6.4GEDAFMP-EECN24C.GJ8@flex--seanjc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689724168; h=from:from:sender:reply-to: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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=SY4++Pw7jN82rDNqoaD2dHTLrQhm/Cpf9xmKrcaKe3Q=; b=p18d/89pM78XJnJ1DgkbiG/WPiDRvq2jWjMOfazS3f46kzPElIEN3ld8yHn6pdlMDr0v8p 0LslxhZ3LcaYrSNz+7/o2qbXRnqkcX5i42ATnTasD+qXoiykg741SjCDvBU1s/5RriAiiP zsmHjdtry2rcEHRlEXur/rb5Wg7JdAU= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=iijdn5XD; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf25.hostedemail.com: domain of 3ByW3ZAYKCFoK62FB48GG8D6.4GEDAFMP-EECN24C.GJ8@flex--seanjc.bounces.google.com designates 209.85.215.201 as permitted sender) smtp.mailfrom=3ByW3ZAYKCFoK62FB48GG8D6.4GEDAFMP-EECN24C.GJ8@flex--seanjc.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689724168; a=rsa-sha256; cv=none; b=VdY4+oePxRv7vSRN9nAhViJbZFC7uru3ljq3eFxBQLKBScPfJO40Rvtc7v7laC/oouQgZm krjJyXIirmvKenv6dynV4Xc0TXEmGD7PsqRBzPEG4mBdZBYuIa+ujQ5pL8dNW50mLqLUnX 0EXrwP+dSkG640fm0dVT5YNlGW/bSP8= Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-553d076dce5so2806408a12.3 for ; Tue, 18 Jul 2023 16:49:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689724167; x=1692316167; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=SY4++Pw7jN82rDNqoaD2dHTLrQhm/Cpf9xmKrcaKe3Q=; b=iijdn5XDnjegnaaZfYZHmIdkKvvbAR+aFZwPs8fwv123kJVz2p2h/9oBWkdPqyaRsS tYPXzs8KW5tlit8ApBuNWuWVjoEh89xnSIsgu/Whq88891SPn+gBWtiDPpY3l3dMc6wN ZjIh27i9FIC2CgcS+8BUw/DTO5qbR+xqgce5EIjbVioflun88hYQpcoeohA5Q62CdacX bkVvUE31SkOaTSOFjNAxW/3riwskjxgdetH4j8mMZ5lGin7O2rYWfZ3WzOi8k2zslRid eo6zcZxWKCaMvtsfl3KXqqEZuMntBe3POabIgGzEM7GnbE1ZCGONcRiVjXe/yh+0wR7u lHoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689724167; x=1692316167; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=SY4++Pw7jN82rDNqoaD2dHTLrQhm/Cpf9xmKrcaKe3Q=; b=FUXSvGRrF8Qkdn5KJGPU0+b0CUYPIt0D/UVkPy+Xcaj1VDLnG0tv8EhxHeJuCiCGTq LRxUhHTvxNbz8lFgf7mBj4bYbOcOXMPuytYBpbSFH4QKEP1BbYtrSgp6BGsK/SmBc4Hn jsVRHZeL/Xlz4cZMmuLbPxQ4UhEM6nFWRYTU/sBeKTPjc/HFkzSwPYfV5O24RIifEX8u Qgnu+DAlwUml6e4aeXffZjIYBwflf+/9clpH5Vr3o7E+fZcIKV8G5yqNvsYR/P3DUxKs mQSKw5vtSPsCSEc1mdQqMot+5jZ7rxhUOLTseO6VwfVlqs6c7RDAVRlCLZhdGsu6SQbq YO7A== X-Gm-Message-State: ABy/qLaxIfKcn/Wp4QJXU6CEqlbhB4xMYM29Mv2PKBOk3OPH5fjosYxF /9tQ80OWxXYlVFuU5T9n5ZKV1lKzfuc= X-Google-Smtp-Source: APBJJlGpCneoSQTZl+h8R9VWDYL/V/WxbKXYmZJOD4TnVpMy34jgsMpJIAUA/D5Xqm41I27LXxp2p+nHZ10= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a63:7112:0:b0:534:6929:8ff5 with SMTP id m18-20020a637112000000b0053469298ff5mr109745pgc.10.1689724167553; Tue, 18 Jul 2023 16:49:27 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 18 Jul 2023 16:45:12 -0700 In-Reply-To: <20230718234512.1690985-1-seanjc@google.com> Mime-Version: 1.0 References: <20230718234512.1690985-1-seanjc@google.com> X-Mailer: git-send-email 2.41.0.255.g8b1d071c50-goog Message-ID: <20230718234512.1690985-30-seanjc@google.com> Subject: [RFC PATCH v11 29/29] KVM: selftests: Test KVM exit behavior for private memory/access From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Huacai Chen , Michael Ellerman , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Sean Christopherson , "Matthew Wilcox (Oracle)" , Andrew Morton , Paul Moore , James Morris , "Serge E. Hallyn" 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, Chao Peng , Fuad Tabba , Jarkko Sakkinen , Yu Zhang , Vishal Annapurve , Ackerley Tng , Maciej Szmigiero , Vlastimil Babka , David Hildenbrand , Quentin Perret , Michael Roth , Wang , Liam Merwick , Isaku Yamahata , "Kirill A . Shutemov" X-Rspamd-Queue-Id: C95CFA001B X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: n3qoe5fwnhjwq9znhmtp5nazyu9mhrk9 X-HE-Tag: 1689724168-355523 X-HE-Meta: U2FsdGVkX19pCvBz8CBsbyzjR48J/kttkuDEgkiRUCCUXpSn6L+/OJy0F6nC0LPBkFZHADc0D98ul4YkH538VYDmdlBbM98De8t88Eu4cxIXH181H20BXQ79gcqg5ILHqDlH15OAcVHO53G9h/rdRDnLoUB6poKwLZUQc2+Z7ZG5JWxGtx4PpOw3jHm13G6J1Pk4PmxOyuT/d8DGcIXObkEVY1qpfGVXqG03cebcdcDuIsnRDPGADIdhAALBqluqHoRYhn9aGunAk2fVzh963qMLcMK1TDQCaBUvlRFzgE1rPxhfeL/nJqM4Y/t+avj321ospjjOx2nxa9Nuoh4oDDDA33SLqHSZi0HchST7NWsxBXmyDa/sXSqPoIvojLHOZHU9DrIuuVwqW+lyWxo5VMIXi3V8rXHs2OGhcDQhyly0oDB4SFziFKbopMR4gK1IMiCldkIFI5fn5kS7VXZx+S3e9/CPEqRAYhBprTIrJ15l0z4WDAwPOfmG06dVQNXMNtD/tNq0nGy5q73puT7YLbatDyXzOTU1mOFbjP1Ja5ILRaXq718Np4AtScySSyZ83yAHeNki2v8Eu0QYt3Y9ql4t6Ks5pvGfMfjEVXHUmlr/eSi8W3akpa4v70kLZbrcpJD6j6YCo4AOQ9w3FU0MYcHxqPAU10VjKjAu0BtQbzlIfN+2XHfg22yNCnDNL9y4y607xZkzYGnwl3QhpHapZrKA7Wp3bwabd0WzEsOQFa6LsOrziJOOUrzmqF69e/Ina4aht4g0iMJrb8yJzrGaLJG8ziQ1+GhOhlxYfi6gOhZWQP0PpP11gIE/LZwGtxE+TBTVu4vYxIOY+eR6/7m5XPDH8736bnybRidsA61I9PYeEXRBU/IBBn0KtJ32ErNoEg4TpHj85vM3mWFH1wnLDfVl1NOk5ki8fqiex8op4p0ae4HKGVoHNkTCZ72MbruRRMpgfJ6UW9Q9EQhesdA OaN2bHkB G+d3bcLX02WSp+idOHZj3ZXog12jktVXOBxx00aiU3hQzLgEfanhKnC9GejZm23D3isfZ0XrhNYZzZSG+0ImKYXCOi8I/XuzOEKEHlFYay5+ztLZhjkvR9ppencYie5ifhqobG6TH+eAPqkJgDvZq/bxaCzvDgObsaRzvjCfd19Ef1CjgCBohMWM2xru3HdwXBjjHK/408f/FYu4uLaXpJ2mP/INV/PgYeUmi2Z3kpcqPLdKR3wJPs/eTKccBnHs5q/+06bRltGeTnkECzxm1HiFC78qvvE99lPjvGaLdY22LYSeVt+mIdnMoyMWLI5hK9uik54wYEtLKqXpGz/+qTBX6v46jTTFoGnob/GhwsdmOoeSG+gysJRXPgcLQ42JVW9xw7H60c5UWuYLv3roLk9kYWEJXkW6FbpVFxpz1c6ApEWxJnzw1L6TRv70wdZFj0X/tpG8zFuF4WoDKueRj8s+S++gOg27btkRze0Gtj8m1aMXL2jkMlAMcca2+N+n/aOvRlkfHDREnflSz1SGMYKfF6NQJlllc4ei3nWN4qe7YePurxJAgP2i7Xo00D1R5AaaqTyKCdifpH0JCYDUyCQDObs+6Oo80u1oMB9mGy6ZnRbcsOuR/2se7kJup3Cyp/CTxno/c8mBJCdNtVSIf0Dwi9qMTjlvDi4vFdE7I4HyAbag1nKGrnsekmTlM5766dFXgNppJLIicCYBSvPVqYq9Iz+9WuEiwO36lRckW3dXEUSaGKjwnw57KwhgsJ41SIVbM8d/GvrWUacnhk8YvHKVCl/tLKTsW4P5UQhjSx5eK7/6nzRkxHJNlxw== 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: From: Ackerley Tng "Testing private access when memslot gets deleted" tests the behavior of KVM when a private memslot gets deleted while the VM is using the private memslot. When KVM looks up the deleted (slot = NULL) memslot, KVM should exit to userspace with KVM_EXIT_MEMORY_FAULT. In the second test, upon a private access to non-private memslot, KVM should also exit to userspace with KVM_EXIT_MEMORY_FAULT. sean: These testcases belong in set_memory_region_test.c, they're private variants on existing testscases and aren't as robust, e.g. don't ensure the vCPU is actually running and accessing memory when converting and deleting. Signed-off-by: Ackerley Tng Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/Makefile | 1 + .../kvm/x86_64/private_mem_kvm_exits_test.c | 115 ++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index 18c43336ede3..cb9450022302 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -81,6 +81,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/nested_exceptions_test TEST_GEN_PROGS_x86_64 += x86_64/platform_info_test TEST_GEN_PROGS_x86_64 += x86_64/pmu_event_filter_test TEST_GEN_PROGS_x86_64 += x86_64/private_mem_conversions_test +TEST_GEN_PROGS_x86_64 += x86_64/private_mem_kvm_exits_test TEST_GEN_PROGS_x86_64 += x86_64/set_boot_cpu_id TEST_GEN_PROGS_x86_64 += x86_64/set_sregs_test TEST_GEN_PROGS_x86_64 += x86_64/smaller_maxphyaddr_emulation_test diff --git a/tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c b/tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c new file mode 100644 index 000000000000..8daaa08c0d90 --- /dev/null +++ b/tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2022, Google LLC. + */ +#include +#include +#include + +#include "kvm_util.h" +#include "processor.h" +#include "test_util.h" + +/* Arbitrarily selected to avoid overlaps with anything else */ +#define EXITS_TEST_GVA 0xc0000000 +#define EXITS_TEST_GPA EXITS_TEST_GVA +#define EXITS_TEST_NPAGES 1 +#define EXITS_TEST_SIZE (EXITS_TEST_NPAGES * PAGE_SIZE) +#define EXITS_TEST_SLOT 10 + +static uint64_t guest_repeatedly_read(void) +{ + volatile uint64_t value; + + while (true) + value = *((uint64_t *) EXITS_TEST_GVA); + + return value; +} + +static uint32_t run_vcpu_get_exit_reason(struct kvm_vcpu *vcpu) +{ + vcpu_run(vcpu); + + return vcpu->run->exit_reason; +} + +const struct vm_shape protected_vm_shape = { + .mode = VM_MODE_DEFAULT, + .type = KVM_X86_SW_PROTECTED_VM, +}; + +static void test_private_access_memslot_deleted(void) +{ + struct kvm_vm *vm; + struct kvm_vcpu *vcpu; + pthread_t vm_thread; + void *thread_return; + uint32_t exit_reason; + + vm = vm_create_shape_with_one_vcpu(protected_vm_shape, &vcpu, + guest_repeatedly_read); + + vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, + EXITS_TEST_GPA, EXITS_TEST_SLOT, + EXITS_TEST_NPAGES, + KVM_MEM_PRIVATE); + + virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); + + /* Request to access page privately */ + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); + + pthread_create(&vm_thread, NULL, + (void *(*)(void *))run_vcpu_get_exit_reason, + (void *)vcpu); + + vm_mem_region_delete(vm, EXITS_TEST_SLOT); + + pthread_join(vm_thread, &thread_return); + exit_reason = (uint32_t)(uint64_t)thread_return; + + ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); + ASSERT_EQ(vcpu->run->memory.flags, KVM_MEMORY_EXIT_FLAG_PRIVATE); + ASSERT_EQ(vcpu->run->memory.gpa, EXITS_TEST_GPA); + ASSERT_EQ(vcpu->run->memory.size, EXITS_TEST_SIZE); + + kvm_vm_free(vm); +} + +static void test_private_access_memslot_not_private(void) +{ + struct kvm_vm *vm; + struct kvm_vcpu *vcpu; + uint32_t exit_reason; + + vm = vm_create_shape_with_one_vcpu(protected_vm_shape, &vcpu, + guest_repeatedly_read); + + /* Add a non-private memslot (flags = 0) */ + vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, + EXITS_TEST_GPA, EXITS_TEST_SLOT, + EXITS_TEST_NPAGES, 0); + + virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); + + /* Request to access page privately */ + vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); + + exit_reason = run_vcpu_get_exit_reason(vcpu); + + ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); + ASSERT_EQ(vcpu->run->memory.flags, KVM_MEMORY_EXIT_FLAG_PRIVATE); + ASSERT_EQ(vcpu->run->memory.gpa, EXITS_TEST_GPA); + ASSERT_EQ(vcpu->run->memory.size, EXITS_TEST_SIZE); + + kvm_vm_free(vm); +} + +int main(int argc, char *argv[]) +{ + TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM)); + + test_private_access_memslot_deleted(); + test_private_access_memslot_not_private(); +}