From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 88224C61CE8 for ; Thu, 12 Jun 2025 17:34:27 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 07AC36B0093; Thu, 12 Jun 2025 13:34:27 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 02AB26B0095; Thu, 12 Jun 2025 13:34:26 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E5C8E6B0096; Thu, 12 Jun 2025 13:34:26 -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 C61086B0093 for ; Thu, 12 Jun 2025 13:34:26 -0400 (EDT) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 5F1B5121C48 for ; Thu, 12 Jun 2025 17:34:26 +0000 (UTC) X-FDA: 83547447732.23.DA8D24B Received: from mail-yb1-f170.google.com (mail-yb1-f170.google.com [209.85.219.170]) by imf06.hostedemail.com (Postfix) with ESMTP id 728E7180009 for ; Thu, 12 Jun 2025 17:34:24 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b="aCHHWai/"; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf06.hostedemail.com: domain of jthoughton@google.com designates 209.85.219.170 as permitted sender) smtp.mailfrom=jthoughton@google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1749749664; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ZrafqKRYjLIYlVlnQCbScViLttcaCCEtpwvofjO7Z3g=; b=XsmGeh8gKwuw8wbe3sq+Jib0t63lptYa0ZEaUWLtwLicGItwK487o+v8ceNXnSWVtPvcpT M1QOiyP5jSBb1aqczjbdADPir0LuMLELdCcJIP8v3N9lv/hkecQXU089tCX4jrKF6xqKMn wM3SZA6bAvCZ4rWe4y5p7kI+y75EYrI= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b="aCHHWai/"; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf06.hostedemail.com: domain of jthoughton@google.com designates 209.85.219.170 as permitted sender) smtp.mailfrom=jthoughton@google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749749664; a=rsa-sha256; cv=none; b=AQ1m3z2/TmrVw/M3495zAI8OEEhbGLqKVgXTeMqXVNt4C76ueTVcL82JBsJ6CM8tO53YXv gIeoXcrkTfkY+a//q9Gl0wgmyrE6LrFhSbSc6JNDJf8A/oebVXk4iWweEOHK8IuScUSOyZ q1Pw+a2/njErX/IAljkJEe/coLD1Dug= Received: by mail-yb1-f170.google.com with SMTP id 3f1490d57ef6-e7311e66a8eso1197275276.2 for ; Thu, 12 Jun 2025 10:34:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749749663; x=1750354463; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=ZrafqKRYjLIYlVlnQCbScViLttcaCCEtpwvofjO7Z3g=; b=aCHHWai/sPLra4THdoy+2NU/5F/IesiarKPNmaLN+W7wGA9mPn0wHwosFO9OtndD2X b7ZLDa02pWx1rIWpRXmr8BABsYtz637yA3xZmXP0ROWOjFURkQJMqq2+pKROAC1OCCOQ JJ/67fMr4gyFonSgva5YXV2gtElgnMFpcCEkcuYHezNHr9OeM9Vb5r+QWfnMmNJzURSG Av6QMzfwyNEIAvOjgkz8iKFo5KFSb2A3sNVi+t9dfd8SeQl0Fe9rVao9t00RIrv8ryVL 5ShveTiD7efZX5vCaMgpLvQ3HXf8Zu0GSdUA79hgHSigRxNTYgmlhZUPo2QHFRb9r7ik v86Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749749663; x=1750354463; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZrafqKRYjLIYlVlnQCbScViLttcaCCEtpwvofjO7Z3g=; b=geaGf4LixJiFT678j06GieNYqzQ2mRKiOr0a7vPi+uReZ9XpLh/svJLnNyeVfxwLLm f0ObToHiqwjKY4eSJZuignAK4si1oZ1LBi4RuTi5362EartbTWTmplOrzpT8G+DAzh8p 09ijFd2524wR1ghmjhn/LgZ17YzkKijLT0eO5ej7DYTPvh1nN/uO9m7X73ZJ5DlEtWni 2xrgtuALEIX6zZ/QquO4iP8Nc3jyt+meSpqcYeEdq4gmWHNrC3iSA/m92zR8U4aypSXo w86q8dfcOJqnCEOXj7cHRcDOm28K2shSbF0SNUxHN5wy8bqLMA/2ja0LMUSNozkj6r0z Iejw== X-Forwarded-Encrypted: i=1; AJvYcCXr2ED8ygI30CrD3Kbr13iS31gXua3qgbEyB+sLxvYBdzMo1b5A4eVd62+6IasI2VyIhnrZsXnIag==@kvack.org X-Gm-Message-State: AOJu0YzjDDtrqN/yhbQl1Mm+2rrp9rJ7qOvyd3ZjEagjfQ/FD2LCxK0C EJd8Fp5DOoYl6yNmjaWWt0W5qZRkqOf7/45ENzHV1KNYr5D3kpRBjT/1pGfwc8tfWmLODysaVg5 NK6+k9oSL/EWSWI8GySy+KEqJV/OAI8PdN3r5pbff X-Gm-Gg: ASbGncuu9KKwIVdaU6EOIUXnaZ/V24tyRxhmEEKu+Xh8Bv3bOBqoFFc1uiRVRjpJOEv R5zfrmFll3vXL+5YuonwiQ1O5mxX46uyfN5STke7HB01TwUfweOgdxxyJr4MBiustPDmt3ChVZb 0oneQvvrTiMkym6VzgJSfushh3Ddy0wuEtEDltGBrXEToYMy5/2FZl34fXh1B5a12Utac90ZTU9 Q== X-Google-Smtp-Source: AGHT+IHNPVWH/wdAnpO1y45I/cUg3DbI1iBJvNgZPDWKkOk4cJBH+ECPTzUrI9HlwvktnMn+hMUL/g6xVT13xGjgqFM= X-Received: by 2002:a05:6902:844:b0:e81:20c5:cd04 with SMTP id 3f1490d57ef6-e821aa1bd6cmr629551276.46.1749749663065; Thu, 12 Jun 2025 10:34:23 -0700 (PDT) MIME-Version: 1.0 References: <20250611133330.1514028-1-tabba@google.com> <20250611133330.1514028-15-tabba@google.com> In-Reply-To: <20250611133330.1514028-15-tabba@google.com> From: James Houghton Date: Thu, 12 Jun 2025 10:33:46 -0700 X-Gm-Features: AX0GCFuVfQClbw8rWB8Zsoe-K68LX2FzWt7lzfa3ax3n8aK0kznpkuCU2qIdi7Q Message-ID: Subject: Re: [PATCH v12 14/18] KVM: arm64: Handle guest_memfd-backed guest page faults To: Fuad Tabba Cc: kvm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-mm@kvack.org, kvmarm@lists.linux.dev, pbonzini@redhat.com, chenhuacai@kernel.org, mpe@ellerman.id.au, anup@brainfault.org, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, seanjc@google.com, viro@zeniv.linux.org.uk, brauner@kernel.org, willy@infradead.org, akpm@linux-foundation.org, xiaoyao.li@intel.com, yilun.xu@intel.com, chao.p.peng@linux.intel.com, jarkko@kernel.org, amoorthy@google.com, dmatlack@google.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, peterx@redhat.com, pankaj.gupta@amd.com, ira.weiny@intel.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 728E7180009 X-Stat-Signature: ckddc3zdmd3pgz3b5s4pjty49q57sjye X-Rspam-User: X-HE-Tag: 1749749664-21884 X-HE-Meta: U2FsdGVkX18Rog2u4eDYGF3DoRy9Et4bAtUMtuzTlTiu2fF7MwRXnjos3nNckQ5lklwuOh3FJWDHcOypgAXDwzdnIL8/Brnsa7M3foVh6KbkPNzaoMb+iiy41MxusF5F7B5+9sKKWVQSBuvnDILnnxt7Yu7arZfwVgapEgn7rEY7tFl4JH4G2jF39rqJ9UsqgVvW3LGWBlck7gmN3H0qd6wmIPG2uelXPdVJb6MNCdsRvnGHQOOaP2YUakb00pW4euOZuRpf0HOZ7FHM5r9fWmRVf1wPKaZo47GLmVscsgp3dTqv7Wi+69t/604NIJPYhRlP6QGzb9OsMs7TZEj6ng6I/EmYfo5yxWpQKvILy0qv08W8Wn/K6wL3NR9Wd+GqLBNR8spJgx//ySXXXVl/Xrq1FKh6OgzfB1qPDD5OCl+Z/Fk1GxVUrK9K23iKwSMTyludN5eBP+1YgZQTw67BXUkqaaFAv2mBSDaWVFuA+90O3OaWwbVknt5jFix6AZqVymv8knDGjuXSKVDK4SARjjt0PSnrvYa/nZ6DqNXPFZ9+pyIMxCi+eJ9LqFRD497G7A3eoITzWciP9nQ5t1Uidl6rBqmUrD4H1RuoUigbwXwg0jJXfGTNsKkSzfZzfco7+k7K7slpezWIbo4Vf7Uydrie+3CVvuq7GF1fIPN1gnFqUxkok5FYOpyF1EkGlKLoM4tOLkTXSJqMC1Z3HylGHMKMYGktA4uzGeOG1EpVLEfvF52hEX4gakEQu7yvF21AZhSB+Smq19YmzVe7NWSsEE0akY2nF9bBUPq0Jum3YmiTHqqt/w06aUr58bifY9ALl2TL7lGEjvvU2hbcJIC9Vw+zOn2KTfC1A9A6IMDwfxjrP2co1cJLtZ3ZMflmzAhS8YFJ8K0qyJ8cZZmtYexNPe6Ma0Gaz3VK1GIkTyKEqosG7fBCBghUcrGuzxpsMK44Up4Ol12utNDPrzGBYeC A0fH9aiS 6UduSitvS9kbmAobLpVwNM51393EiYMA4jlA3HESP8D1WHyu420hZF+wlv0Fk4oLqHBZ5t6Mz9//eSaN703mXlBHMOdd3jekdcgnJET5SN18sVqtyfMJCEjVSu/qMQUmLOKQ9PrlSZw4ep2Jsc1BCrmS389BD0JxayVtJpQDkyJSoQWn1ZBhCfkR0/QqtyeWYwU6F6nrNLTILvgT3NlHU5LiDEVnlwksQdsg7ahdi43gP8oaVD+sEwpKbTK9G731jzb9mO+bKC3GMlDR6JKNzAYVSJgA+C3JgDVFAqWa/D2uZqDiR2BZtwMBVakSOPHDzSiP9c++NlJCVYkSQx9Q5UoZSCVwO5vdWmAURckHg26AOBcY= 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: List-Subscribe: List-Unsubscribe: On Wed, Jun 11, 2025 at 6:34=E2=80=AFAM Fuad Tabba wrote= : > > Add arm64 support for handling guest page faults on guest_memfd backed > memslots. Until guest_memfd supports huge pages, the fault granule is > restricted to PAGE_SIZE. > > Reviewed-by: Gavin Shan > Signed-off-by: Fuad Tabba Thanks Fuad! Hopefully Oliver and/or Marc can take a look at these Arm patches soon. :) Feel free to add: Reviewed-by: James Houghton > --- > arch/arm64/kvm/mmu.c | 82 ++++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 79 insertions(+), 3 deletions(-) > > diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c > index 58662e0ef13e..71f8b53683e7 100644 > --- a/arch/arm64/kvm/mmu.c > +++ b/arch/arm64/kvm/mmu.c > @@ -1512,6 +1512,78 @@ static void adjust_nested_fault_perms(struct kvm_s= 2_trans *nested, > *prot |=3D kvm_encode_nested_level(nested); > } > > +#define KVM_PGTABLE_WALK_MEMABORT_FLAGS (KVM_PGTABLE_WALK_HANDLE_FAULT |= KVM_PGTABLE_WALK_SHARED) > + > +static int gmem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, > + struct kvm_s2_trans *nested, > + struct kvm_memory_slot *memslot, bool is_perm) > +{ > + bool write_fault, exec_fault, writable; > + enum kvm_pgtable_walk_flags flags =3D KVM_PGTABLE_WALK_MEMABORT_F= LAGS; > + enum kvm_pgtable_prot prot =3D KVM_PGTABLE_PROT_R; > + struct kvm_pgtable *pgt =3D vcpu->arch.hw_mmu->pgt; > + struct page *page; > + struct kvm *kvm =3D vcpu->kvm; > + void *memcache; > + kvm_pfn_t pfn; > + gfn_t gfn; > + int ret; > + > + ret =3D prepare_mmu_memcache(vcpu, true, &memcache); > + if (ret) > + return ret; > + > + if (nested) > + gfn =3D kvm_s2_trans_output(nested) >> PAGE_SHIFT; > + else > + gfn =3D fault_ipa >> PAGE_SHIFT; > + > + write_fault =3D kvm_is_write_fault(vcpu); > + exec_fault =3D kvm_vcpu_trap_is_exec_fault(vcpu); > + > + if (write_fault && exec_fault) { > + kvm_err("Simultaneous write and execution fault\n"); > + return -EFAULT; > + } > + > + if (is_perm && !write_fault && !exec_fault) { > + kvm_err("Unexpected L2 read permission error\n"); > + return -EFAULT; > + } > + > + ret =3D kvm_gmem_get_pfn(kvm, memslot, gfn, &pfn, &page, NULL); > + if (ret) { > + kvm_prepare_memory_fault_exit(vcpu, fault_ipa, PAGE_SIZE, > + write_fault, exec_fault, fa= lse); > + return ret; > + } > + > + writable =3D !(memslot->flags & KVM_MEM_READONLY); > + > + if (nested) > + adjust_nested_fault_perms(nested, &prot, &writable); > + > + if (writable) > + prot |=3D KVM_PGTABLE_PROT_W; > + > + if (exec_fault || > + (cpus_have_final_cap(ARM64_HAS_CACHE_DIC) && > + (!nested || kvm_s2_trans_executable(nested)))) > + prot |=3D KVM_PGTABLE_PROT_X; > + > + kvm_fault_lock(kvm); > + ret =3D KVM_PGT_FN(kvm_pgtable_stage2_map)(pgt, fault_ipa, PAGE_S= IZE, > + __pfn_to_phys(pfn), prot= , > + memcache, flags); > + kvm_release_faultin_page(kvm, page, !!ret, writable); > + kvm_fault_unlock(kvm); > + > + if (writable && !ret) > + mark_page_dirty_in_slot(kvm, memslot, gfn); > + > + return ret !=3D -EAGAIN ? ret : 0; > +} > + > static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, > struct kvm_s2_trans *nested, > struct kvm_memory_slot *memslot, unsigned long = hva, > @@ -1536,7 +1608,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, ph= ys_addr_t fault_ipa, > enum kvm_pgtable_prot prot =3D KVM_PGTABLE_PROT_R; > struct kvm_pgtable *pgt; > struct page *page; > - enum kvm_pgtable_walk_flags flags =3D KVM_PGTABLE_WALK_HANDLE_FAU= LT | KVM_PGTABLE_WALK_SHARED; > + enum kvm_pgtable_walk_flags flags =3D KVM_PGTABLE_WALK_MEMABORT_F= LAGS; > > if (fault_is_perm) > fault_granule =3D kvm_vcpu_trap_get_perm_fault_granule(vc= pu); > @@ -1963,8 +2035,12 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu) > goto out_unlock; > } > > - ret =3D user_mem_abort(vcpu, fault_ipa, nested, memslot, hva, > - esr_fsc_is_permission_fault(esr)); > + if (kvm_slot_has_gmem(memslot)) > + ret =3D gmem_abort(vcpu, fault_ipa, nested, memslot, > + esr_fsc_is_permission_fault(esr)); > + else > + ret =3D user_mem_abort(vcpu, fault_ipa, nested, memslot, = hva, > + esr_fsc_is_permission_fault(esr)); > if (ret =3D=3D 0) > ret =3D 1; > out: > -- > 2.50.0.rc0.642.g800a2b2222-goog >