From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj2-f7.google.com (mail-pj2-f7.google.com [74.125.227.135]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CDA7E3BED08 for ; Wed, 29 Jul 2026 07:08:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.135 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785308886; cv=none; b=d8BcohXxOmFSBQCNsv/UQeb6iAHczsW53E7CgvvyVP9HvO8vnrP1yQO7m+mUd24KAO4u0TcqLqpPKM+FPUQ2hPaLx6MRSXCqwuRTqTc3OtPT3AQd8Q24E2cCMZNbY1dWfqOPeMF+6cwpvZ1HWo4c6K0PCCnbMWZo1qaDA0/MT3U= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785308886; c=relaxed/simple; bh=SsdaLCBhfc9q+NwsQ9Mq9LtNazpr/xt1goUIO6J1tz8=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=u9Fvua9OViDBUxvsBCk+pGMAUHauoQ40GGLIsGjV9d+zFj0T9PI/O/h/PF+pR0L1SF0up33cFTOV8S9DptE2CXYVXTRfvWOPuYbhH2d4uAnzvxZVgSewn61HXr/9vvMONF88w5+lCcTXK51nGQMbTHx7hjoRv4qCntctpXu44vA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=awkirnrd; arc=none smtp.client-ip=74.125.227.135 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="awkirnrd" Received: by mail-pj2-f7.google.com with SMTP id 98e67ed59e1d1-38dcd98e5easo346502a91.0 for ; Wed, 29 Jul 2026 00:08:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785308884; x=1785913684; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=X3JdpARdvO6SntweUzlxloeUTF3+X8KQZf2BNPxyxhE=; b=awkirnrdijVR7kwF9FdRXg2zfdU9NsRkjwJpLwxqhHsFdjObWIIIrogBQ+H0cczfKw NbQsr0q5EcZCXp4UQ/4vpxv6cQ+b+eASaRh6KXLCkmanrKtShAVoF/l3MWn4iupn9mnA aLBQwO4A9a0fybo2TPZiHS5gCc8rDbQQcSX6Dtm1SvUUXBSTKRmMAYytJKRrWhDRpZNG 2vyDNyMwfbu/gQhswwzAVBcGw2u5Fwk0b4NsPy50urUdjVWp/4iKHIuO0h+tVwhQY0zv 7e8jxEnU2au9IL84T7aXkhScQrj95N30fsC34Mwv184hb8qVf4jvIp5vZuQuhwRQBZUN Czpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785308884; x=1785913684; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=X3JdpARdvO6SntweUzlxloeUTF3+X8KQZf2BNPxyxhE=; b=sUFteSrMjKF+0omo9wdvpjI4TU4LUT8N3U4OW4+BT6oOmlty1Yz5LWG+uHvf5WOtUz oI0MqMkyaY6RzKij2q+1RuuD8rzvABH4EA3AlycFI9R46akxbSeut2mUD/1t/2g+tACK dQEooLLXA3gldDAgc4cqH4wXxVif/4meWK6++mF7kQ1imVFQvaP0d5fyVWGRe7Rqy6Uw 2WtvmI1F+n4V1PwNGUjPzUfgquNqBf1f69bwMVC2Ir39IjoyhHTaAxwR9F1+nVADi+Fy 6CTGzpfYa+olaWcsbOY0J+khVhctspDC1pJ/WG299HLwmcMCfjPdn9PlhigB7NGleoNS jrHg== X-Forwarded-Encrypted: i=1; AHgh+Ro/yQEvgxDsgY/jWhdg2N5KLobnRxtiFWDXqEWfRNtGjh3J1+7EbBavkke44c16Ete88tH7YGb6d0JVNag=@vger.kernel.org X-Gm-Message-State: AOJu0YxbGJQs/WfrKr7vanJb+bMnwkzY9yVadITIYdc+/R1qiTrl1PHr Qrt0+/Q/NyEIL9QoNzDV9vN3V9sgIUV1oIYXJ2j6czFTgUVSIjCq1XeF X-Gm-Gg: AR+sD13dBd+h3hXf5F9Ll565b4XHPaTbetf+LpLpvKGu55J38U4oNMwWZ5tTAP//Hsr 6RVma9URbTOu4ZbzUIST2vVP+uDaycURVkz20TlfheaTAZd7b29MgZuWCa1F7NOp39suzVR3TJV 1LRKTB5Ik5NyH9nEMhIqK0KgXHYMPRQNto6Ibl6q3NQi37hhTlC84sqVC4p+OIhsn2EJrZYCo+M JMhYDRXSmT+pD+KWNxb+UTVjIxvS2/2+SDs+UmnJzOl4Pla5wPj0CdRFyc4GaSPNeeHBfS1DOJ5 zzekV1COhIbKpBu8BLvsWN6FKohfrO6tXxHU+VfKMpHAMDwi+qQYhZBGndMMXAIQDx042C7R2rR 14VDxr/cBmzo47DJW/+blly1RA5F75bx3kMvgzOUkoVhzDDnvOJsU/WoRgKFhhRFODp/zeRjC1h nOsWu0T5B3A2Ex8wT6d+hmHHhWPdkV8moIhzRwPmTEBt63OXsbSTWuMuP+BFLvcCOt9mZSVATI8 Nc= X-Received: by 2002:a17:90b:3c12:b0:381:9028:5945 with SMTP id 98e67ed59e1d1-38f6a44b7a8mr6072575a91.14.1785308884161; Wed, 29 Jul 2026 00:08:04 -0700 (PDT) Received: from q-System-Product-Name ([129.227.183.200]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f7f292af9sm873721a91.11.2026.07.29.00.08.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jul 2026 00:08:03 -0700 (PDT) From: "Bingyu.Xian" To: Anup Patel Cc: Atish Patra , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Quan Zhou , Bingyu Xian Subject: [RFC PATCH] RISC-V: KVM: Add minimal guest_memfd support Date: Wed, 29 Jul 2026 15:07:56 +0800 Message-ID: <20260729070756.730312-1-shanbeeyoo@gmail.com> X-Mailer: git-send-email 2.54.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Add minimal guest_memfd support for RISC-V KVM, following the same pattern as x86 and arm64. 1. Select KVM_GUEST_MEMFD in Kconfig 2. In kvm_riscv_mmu_map(), check kvm_slot_has_gmem() early, before taking mmap_read_lock(). For gmem memslots, resolve the PFN via kvm_gmem_get_pfn(), then acquire kvm->mmu_lock and jump to G-stage mapping, bypassing vma_lookup()/__kvm_faultin_pfn(). The gmem PFN is resolved before mmap_read_lock() so the mmu_lock taken for the mapping is never held while waiting for mmap_lock, which would deadlock against mmu_notifier invalidation (mmu_lock -> mmap_lock). 3. Skip kvm_release_faultin_page() for gmem pages; their lifetime is managed by the gmem inode and invalidation notifiers. Verified: defconfig + CONFIG_KVM_GUEST_MEMFD=y compiles cleanly. Assisted-by: YuanSheng: deepseek-v4-pro Co-developed-by: Quan Zhou Signed-off-by: Quan Zhou Signed-off-by: Bingyu Xian --- arch/riscv/kvm/Kconfig | 1 + arch/riscv/kvm/mmu.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/arch/riscv/kvm/Kconfig b/arch/riscv/kvm/Kconfig index ec2cee0a39e0..77121100579f 100644 --- a/arch/riscv/kvm/Kconfig +++ b/arch/riscv/kvm/Kconfig @@ -29,6 +29,7 @@ config KVM select KVM_GENERIC_DIRTYLOG_READ_PROTECT select KVM_GENERIC_HARDWARE_ENABLING select KVM_MMIO + select KVM_GUEST_MEMFD select VIRT_XFER_TO_GUEST_WORK select SCHED_INFO select GUEST_PERF_EVENTS if PERF_EVENTS diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c index d2a06a54be17..a9d61d0366e2 100644 --- a/arch/riscv/kvm/mmu.c +++ b/arch/riscv/kvm/mmu.c @@ -557,6 +557,19 @@ int kvm_riscv_mmu_map(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot, /* Setup initial state of output mapping */ memset(out_map, 0, sizeof(*out_map)); + if (kvm_slot_has_gmem(memslot)) { + int max_order; + + ret = kvm_gmem_get_pfn(kvm, memslot, gfn, &hfn, &page, &max_order); + if (ret) + return ret; + + vma_pagesize = PAGE_SIZE; + writable = true; + write_lock(&kvm->mmu_lock); + goto map_gstage; + } + if (is_write && logging && kvm_riscv_mmu_dirty_log_write_fault_fast(kvm, memslot, gpa, out_map)) return 0; @@ -643,6 +656,7 @@ int kvm_riscv_mmu_map(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot, if (!logging && !is_hugetlb && vma_pagesize == PAGE_SIZE) vma_pagesize = transparent_hugepage_adjust(kvm, memslot, hva, &hfn, &gpa); +map_gstage: if (writable) { mark_page_dirty_in_slot(kvm, memslot, gfn); ret = kvm_riscv_gstage_map_page(&gstage, pcache, gpa, hfn << PAGE_SHIFT, @@ -658,7 +672,8 @@ int kvm_riscv_mmu_map(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot, kvm_err("Failed to map in G-stage\n"); out_unlock: - kvm_release_faultin_page(kvm, page, ret, writable); + if (!kvm_slot_has_gmem(memslot)) + kvm_release_faultin_page(kvm, page, ret, writable); write_unlock(&kvm->mmu_lock); return ret; } -- 2.54.0