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 45BB5C677C4 for ; Wed, 11 Jun 2025 13:34:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4057D6B00AB; Wed, 11 Jun 2025 09:34:05 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3902A6B00AC; Wed, 11 Jun 2025 09:34:05 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2A5096B00AD; Wed, 11 Jun 2025 09:34:05 -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 0B7F46B00AB for ; Wed, 11 Jun 2025 09:34:05 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id B0FC9BE26F for ; Wed, 11 Jun 2025 13:34:04 +0000 (UTC) X-FDA: 83543213208.25.BE99926 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) by imf05.hostedemail.com (Postfix) with ESMTP id CCC6310000A for ; Wed, 11 Jun 2025 13:34:02 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=xGcVo2LM; spf=pass (imf05.hostedemail.com: domain of 3yYVJaAUKCEQzghhgmuumrk.iusrot03-ssq1giq.uxm@flex--tabba.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3yYVJaAUKCEQzghhgmuumrk.iusrot03-ssq1giq.uxm@flex--tabba.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=1749648842; 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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=29LxTesP+esrl3s+kJyR+R34EjmdYlvjhl4IkCQVBdM=; b=HP0BsQA1h02qGsKPujOrRo8vaYm3o+PIOrfEsitO4ybbDSV8nR1HASQKV74mftcflyURV7 6mmfscHss9iGDx0hlTblNTpjKnB4i/B+q5gIVE0ARWgqOwur7niGVzCZQLBFhU4r0gO1bi bs5IvmfPQumVxFtPT2lIkFTbSNPqEqk= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749648842; a=rsa-sha256; cv=none; b=Qc8iCsQW7gGVj60ugrG4bsheGCozVym6pzV63TNTe8ANO6fmcwzYwSonYyds6u5X/gbR+c 8KPHzrV7dSSEMIT5hFkm32thXV8LYapuGqqISG3nmiYjyfirtHGo5aXogjSZiWKepLeit1 uf50vrJfPqbpVoQ9luEeCZz4H2gQDfs= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=xGcVo2LM; spf=pass (imf05.hostedemail.com: domain of 3yYVJaAUKCEQzghhgmuumrk.iusrot03-ssq1giq.uxm@flex--tabba.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3yYVJaAUKCEQzghhgmuumrk.iusrot03-ssq1giq.uxm@flex--tabba.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-450d57a0641so49651385e9.3 for ; Wed, 11 Jun 2025 06:34:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749648841; x=1750253641; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=29LxTesP+esrl3s+kJyR+R34EjmdYlvjhl4IkCQVBdM=; b=xGcVo2LM7edPyRcpmoIEqcEA5WaHaXQXGkz+DBAuiB8BOJyJIsmfkubxx6JEMP+o6S XCCVp5YSex1uzt9r2DXw2Zmhn4H9pbM2hBG6lc0H0QO7T9uKS9WzM9J45FVWQeEI4IdJ B3Rqetv5X+WOefk76AuBP1Cj3O1vePbOeUUXTNbEaGNLZp/cIjBDYUKrQnjsj1gjSa4b tE+kfM6zFGUy2d68vRcMCLoogV+8oSfrrD89ErPL9e/1gbSVh75SPh79zAxIc/iU8GAG QmYOPpSLxulxih3+hd0ZFQeSUwp5UipDGWNZSsgvIz4Ykg/CnD+1AUVXFedKqq9okAj7 odbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749648841; x=1750253641; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=29LxTesP+esrl3s+kJyR+R34EjmdYlvjhl4IkCQVBdM=; b=dYoV5XucUVSiy0NjkAGN9R1PQB/mJAwLLM+FspooXy2xJf0S2r9krcR855ngJqvCZP Msv6nTKdfewZx6yveYmodxgSvIi+YbL42Xeuw9pQ8nIMtfmxI9eQVQOnCf54ZOvFE3zf PFYccBOJmyCTV45aHhxXJqcjadZVRXfCNX3s9gZuZr9JcffnEKi/vgtQ5YMLp/wknyNj VK93ykgwfxXFk0csyC4iJguXJ94hpTxW2VnlnS3bh88YabS4kXKe4agdQehVx/gWuPrC 4jHTud66KcIbegvRyroW9im8ruCgivVq77nzrUkvAR0FIb/TSWW7BMEOH2/FP9ecX3YC VE+Q== X-Forwarded-Encrypted: i=1; AJvYcCVCzqWh0/mBS+t723maZZTyZRRzq+TRUCxq48iUYAgai33XHpXW6Ona+FQpx++jwNEWdLTGfG/Z9g==@kvack.org X-Gm-Message-State: AOJu0YwagPoh7dxDLgECrELtMNFv5JUCQWD1INmdbYLJ3NZBFVUs1dBf sOncw32nyEWaJSaH4LjcwTHo5rTTKdNbO67N4aZe5u9RpYG1sSFd2yYjb+jF9A2VQVgZw44cTk4 neA== X-Google-Smtp-Source: AGHT+IHGBYLvYqL0QA4258S7dEzkQ3lLJOuhLe7Oixu/fDL5tnHuJueVLFJw+pESXsx9Yw1BzHfTKh4YYA== X-Received: from wmrm7.prod.google.com ([2002:a05:600c:37c7:b0:451:f443:5948]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:1a8f:b0:3a4:cfbf:519b with SMTP id ffacd0b85a97d-3a558a31311mr2924191f8f.44.1749648841359; Wed, 11 Jun 2025 06:34:01 -0700 (PDT) Date: Wed, 11 Jun 2025 14:33:26 +0100 In-Reply-To: <20250611133330.1514028-1-tabba@google.com> Mime-Version: 1.0 References: <20250611133330.1514028-1-tabba@google.com> X-Mailer: git-send-email 2.50.0.rc0.642.g800a2b2222-goog Message-ID: <20250611133330.1514028-15-tabba@google.com> Subject: [PATCH v12 14/18] KVM: arm64: Handle guest_memfd-backed guest page faults From: Fuad Tabba To: kvm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-mm@kvack.org, kvmarm@lists.linux.dev Cc: 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, jthoughton@google.com, peterx@redhat.com, pankaj.gupta@amd.com, ira.weiny@intel.com, tabba@google.com Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: CCC6310000A X-Stat-Signature: zepwj5wjieypspnxwbdah3agdsiso5bt X-HE-Tag: 1749648842-196081 X-HE-Meta: U2FsdGVkX1+n02kRmtSVbJPqC4eU5CiQi6wVWMrpaxsZ0hxut4aK/G8jqOHX5srMTmb6tNx88RrLAMhHhA7DTcHxJZy9ARRt9aCHHJSKp8fkpUuM+BmOv9w7bQDNPBMRgmPtZgrbI0UkkrtTeBGwMmB7j5obYysF3ZLmVEl65rDKanptT87t77UXRlvwQZBicbEQdf84ae0BPvm7ntCHoW2RcdXTOs94MyKPGjo27BKron2Ja4yURwQ/n2xqu9r5vnG63Q6DIvACpD2tOydz9dkV74INrbCykXv6B4vIntbGLaIGoQg9jOQYSVXQSwisX0m9v73kvQAAjVYrC9AwPMfDUkv+5ENRJ3JWZG012IlF2y9AhYpBqxF15/m47o80c5HuT15fGv2a1PjrOfJIKS7krol2eVVndA8icnsbJ2Ktl9V8aabtuuLxDuRMzobhwi3JP0J+WyhYaDag2LonDAgzCOFPfkiI75ZpkPzvfp3L7e3IaLzkoPnIJw9BwhM8R/d5CVuxnFNTfy2zBT/6N6U9xfIoUyW0+nuEQ9mCKeVqUg8xi2lA1YzSTYVUtoByXTHla0t4XfDYpfpnVyuouCFgol/cDzSZTLFkxD1ye6Yl2ziZwwKuGL7GSrrFiAWiQhKP3fwOt93pFno4y/Wn/D3eUNn8ukVIWppt2ZlTNgEUsd7aAP/o/OI17Boy0aBwSBBtfUibelIqy2FJFMM+ZN/A5NLvr07+8dQLrBKgdDC6rVEx95mrKvgFR/TtWiW2DFSGgb8/0VVCIabbbClYuz/hZjWvo5JtoxfK5wzhfDl7iaQuwqKSnxEvmJRMcQLElqeTzh5tuVir1ddxQ9yeaHIqQOVQQza/6t/ho/U/ChkvTTNjd//gpEy0q8p8cVwYKURD+7h0NzqI/yvK50MB/5zPQdETi/BhXutWO4htIRd6I6Ga0KB4h8P/Biimxagbs6VdfDIX1sx7WYU1yPJ D0iDtlo6 nFky5MX4CE/OBIuH6wIH5FkZ/K/HZ17gfan8TTLrUQUHeahg7yg5vZAgJWT8k8qqOw8bmRxzK5INaT4lswoTWI5LUDAl7OjQo3mZJliUdzunOk7aAwRh4/OW33o0dRdSH4luZ7/VtcIlqwP50NlCtH73Iy5oxylP3C0PoedXlrcCqyM8WiXCG58TfDVjt9+3yUrJOfrtFAZE1Szeh9KP4bwYhOvm5QMGLM0FY+FeoP2duFe7pVvepcQpqoarIaE7BZ91foWcH3igOHQa56BJhy+yI3uT9sxEUDqtgaFz9DQItukR9brpTOFPkUnvvCVseyVgZsE9sdbusJWW2AVsFRfBfXEQsHHaa2/A9fm9rosHHuvrKwKzIsNSBbmIxl/SlFZyiXqM51UyxRC22aJoxuxRmoMb8RPFu+CKL2cWLIHARA5gmxnZOM2/3i7PE3pS2g0Czj1xJx8xhW8+1mmjDdCTpg9qSOGHLaTZ1E35aM/ruzXEX09OsfH2JTmX9O8komJhJm8ARzEoXZvMDjXjD1jZ+iJdl3j1vdGGKTjqutVEZJVmYRy/Dut0cOJoh+RgC4QkIXjq4hL4Ke9dmehgzlJ3OQ7JAUgI7JeOZ1xb8+S1J4UonhuBM/cSU2UsxeTaKA+uTKeX9HW4d+lqf9fhAiZ+Vd6Rxqe1jja7/xrHOM3HWJTc= 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: 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 --- 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_s2_trans *nested, *prot |= 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 = KVM_PGTABLE_WALK_MEMABORT_FLAGS; + enum kvm_pgtable_prot prot = KVM_PGTABLE_PROT_R; + struct kvm_pgtable *pgt = vcpu->arch.hw_mmu->pgt; + struct page *page; + struct kvm *kvm = vcpu->kvm; + void *memcache; + kvm_pfn_t pfn; + gfn_t gfn; + int ret; + + ret = prepare_mmu_memcache(vcpu, true, &memcache); + if (ret) + return ret; + + if (nested) + gfn = kvm_s2_trans_output(nested) >> PAGE_SHIFT; + else + gfn = fault_ipa >> PAGE_SHIFT; + + write_fault = kvm_is_write_fault(vcpu); + exec_fault = 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 = 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, false); + return ret; + } + + writable = !(memslot->flags & KVM_MEM_READONLY); + + if (nested) + adjust_nested_fault_perms(nested, &prot, &writable); + + if (writable) + prot |= KVM_PGTABLE_PROT_W; + + if (exec_fault || + (cpus_have_final_cap(ARM64_HAS_CACHE_DIC) && + (!nested || kvm_s2_trans_executable(nested)))) + prot |= KVM_PGTABLE_PROT_X; + + kvm_fault_lock(kvm); + ret = KVM_PGT_FN(kvm_pgtable_stage2_map)(pgt, fault_ipa, PAGE_SIZE, + __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 != -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, phys_addr_t fault_ipa, enum kvm_pgtable_prot prot = KVM_PGTABLE_PROT_R; struct kvm_pgtable *pgt; struct page *page; - enum kvm_pgtable_walk_flags flags = KVM_PGTABLE_WALK_HANDLE_FAULT | KVM_PGTABLE_WALK_SHARED; + enum kvm_pgtable_walk_flags flags = KVM_PGTABLE_WALK_MEMABORT_FLAGS; if (fault_is_perm) fault_granule = kvm_vcpu_trap_get_perm_fault_granule(vcpu); @@ -1963,8 +2035,12 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu) goto out_unlock; } - ret = user_mem_abort(vcpu, fault_ipa, nested, memslot, hva, - esr_fsc_is_permission_fault(esr)); + if (kvm_slot_has_gmem(memslot)) + ret = gmem_abort(vcpu, fault_ipa, nested, memslot, + esr_fsc_is_permission_fault(esr)); + else + ret = user_mem_abort(vcpu, fault_ipa, nested, memslot, hva, + esr_fsc_is_permission_fault(esr)); if (ret == 0) ret = 1; out: -- 2.50.0.rc0.642.g800a2b2222-goog