From: "Bingyu.Xian" <shanbeeyoo@gmail.com>
To: Anup Patel <anup@brainfault.org>
Cc: Atish Patra <atish.patra@linux.dev>,
Paul Walmsley <pjw@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Alexandre Ghiti <alex@ghiti.fr>,
kvm@vger.kernel.org, kvm-riscv@lists.infradead.org,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
Quan Zhou <zhouquan@iscas.ac.cn>,
Bingyu Xian <shanbeeyoo@gmail.com>
Subject: [PATCH] RISC-V: KVM: Fix spurious -EEXIST and clean up gstage fault path types
Date: Wed, 29 Jul 2026 15:07:49 +0800 [thread overview]
Message-ID: <20260729070749.730218-1-shanbeeyoo@gmail.com> (raw)
Two small fixes to the RISC-V G-stage page fault path, both suggested
during review of the in-progress KVM Userfault port.
1. Treat -EEXIST from kvm_riscv_gstage_map_page() as a quiet success.
When a concurrent vCPU installs the same G-stage mapping while we
are waiting for mmu_lock, gstage_map_page() returns -EEXIST. This
is not an error -- the page is correctly mapped and the faulting
vCPU can simply retry the guest instruction -- but KVM was treating
it as one: printing "Failed to map in G-stage" to dmesg and
propagating -EEXIST all the way to userspace.
Align RISC-V with x86 and arm64, which already swallow -EEXIST in
their respective fault handlers. This also lets
kvm_release_faultin_page() drop its "ret && ret != -EEXIST" special
case: with ret normalized to 0 the regular release path is correct.
2. Clean up fault path types.
- vma_pageshift: short -> unsigned int. Bit widths and shift counts
conventionally use unsigned int in the kernel.
- fault_addr: unsigned long -> gpa_t. RV32 with Sv32x4 has 34-bit
guest physical addresses that would be truncated when stored in a
32-bit unsigned long; gpa_t is u64 on RV32 and holds the full
address. No functional change on RV64.
These type changes are in preparation for sharing a common
struct kvm_page_fault across architectures, as requested during
review.
No functional change on RV64 beyond silencing the spurious -EEXIST.
These are independent fixes with no dependencies; they can be merged
on their own. The KVM_MEM_USERFAULT port that motivated them will be
sent separately as an RFC once the generic userfault series lands.
Fixes: 9d05c1fee837 ("RISC-V: KVM: Implement stage2 page table programming")
Assisted-by: YuanSheng: deepseek-v4-pro
Co-developed-by: Quan Zhou <zhouquan@iscas.ac.cn>
Signed-off-by: Quan Zhou <zhouquan@iscas.ac.cn>
Signed-off-by: Bingyu Xian <shanbeeyoo@gmail.com>
---
arch/riscv/kvm/mmu.c | 8 +++++---
arch/riscv/kvm/vcpu_exit.c | 3 ++-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c
index 8a0aa5e0e216..d2a06a54be17 100644
--- a/arch/riscv/kvm/mmu.c
+++ b/arch/riscv/kvm/mmu.c
@@ -541,7 +541,7 @@ int kvm_riscv_mmu_map(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot,
kvm_pfn_t hfn;
bool is_hugetlb;
bool writable;
- short vma_pageshift;
+ unsigned int vma_pageshift;
gfn_t gfn = gpa >> PAGE_SHIFT;
struct vm_area_struct *vma;
struct kvm *kvm = vcpu->kvm;
@@ -652,11 +652,13 @@ int kvm_riscv_mmu_map(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot,
vma_pagesize, true, true, out_map);
}
- if (ret)
+ if (ret == -EEXIST)
+ ret = 0;
+ else if (ret)
kvm_err("Failed to map in G-stage\n");
out_unlock:
- kvm_release_faultin_page(kvm, page, ret && ret != -EEXIST, writable);
+ kvm_release_faultin_page(kvm, page, ret, writable);
write_unlock(&kvm->mmu_lock);
return ret;
}
diff --git a/arch/riscv/kvm/vcpu_exit.c b/arch/riscv/kvm/vcpu_exit.c
index 6c8530b9f29e..76cceecee5ab 100644
--- a/arch/riscv/kvm/vcpu_exit.c
+++ b/arch/riscv/kvm/vcpu_exit.c
@@ -17,7 +17,8 @@ static int gstage_page_fault(struct kvm_vcpu *vcpu, struct kvm_run *run,
{
struct kvm_gstage_mapping host_map;
struct kvm_memory_slot *memslot;
- unsigned long hva, fault_addr;
+ unsigned long hva;
+ gpa_t fault_addr;
bool writable;
gfn_t gfn;
int ret;
--
2.54.0
--
kvm-riscv mailing list
kvm-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kvm-riscv
WARNING: multiple messages have this Message-ID (diff)
From: "Bingyu.Xian" <shanbeeyoo@gmail.com>
To: Anup Patel <anup@brainfault.org>
Cc: Atish Patra <atish.patra@linux.dev>,
Paul Walmsley <pjw@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Alexandre Ghiti <alex@ghiti.fr>,
kvm@vger.kernel.org, kvm-riscv@lists.infradead.org,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
Quan Zhou <zhouquan@iscas.ac.cn>,
Bingyu Xian <shanbeeyoo@gmail.com>
Subject: [PATCH] RISC-V: KVM: Fix spurious -EEXIST and clean up gstage fault path types
Date: Wed, 29 Jul 2026 15:07:49 +0800 [thread overview]
Message-ID: <20260729070749.730218-1-shanbeeyoo@gmail.com> (raw)
Two small fixes to the RISC-V G-stage page fault path, both suggested
during review of the in-progress KVM Userfault port.
1. Treat -EEXIST from kvm_riscv_gstage_map_page() as a quiet success.
When a concurrent vCPU installs the same G-stage mapping while we
are waiting for mmu_lock, gstage_map_page() returns -EEXIST. This
is not an error -- the page is correctly mapped and the faulting
vCPU can simply retry the guest instruction -- but KVM was treating
it as one: printing "Failed to map in G-stage" to dmesg and
propagating -EEXIST all the way to userspace.
Align RISC-V with x86 and arm64, which already swallow -EEXIST in
their respective fault handlers. This also lets
kvm_release_faultin_page() drop its "ret && ret != -EEXIST" special
case: with ret normalized to 0 the regular release path is correct.
2. Clean up fault path types.
- vma_pageshift: short -> unsigned int. Bit widths and shift counts
conventionally use unsigned int in the kernel.
- fault_addr: unsigned long -> gpa_t. RV32 with Sv32x4 has 34-bit
guest physical addresses that would be truncated when stored in a
32-bit unsigned long; gpa_t is u64 on RV32 and holds the full
address. No functional change on RV64.
These type changes are in preparation for sharing a common
struct kvm_page_fault across architectures, as requested during
review.
No functional change on RV64 beyond silencing the spurious -EEXIST.
These are independent fixes with no dependencies; they can be merged
on their own. The KVM_MEM_USERFAULT port that motivated them will be
sent separately as an RFC once the generic userfault series lands.
Fixes: 9d05c1fee837 ("RISC-V: KVM: Implement stage2 page table programming")
Assisted-by: YuanSheng: deepseek-v4-pro
Co-developed-by: Quan Zhou <zhouquan@iscas.ac.cn>
Signed-off-by: Quan Zhou <zhouquan@iscas.ac.cn>
Signed-off-by: Bingyu Xian <shanbeeyoo@gmail.com>
---
arch/riscv/kvm/mmu.c | 8 +++++---
arch/riscv/kvm/vcpu_exit.c | 3 ++-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c
index 8a0aa5e0e216..d2a06a54be17 100644
--- a/arch/riscv/kvm/mmu.c
+++ b/arch/riscv/kvm/mmu.c
@@ -541,7 +541,7 @@ int kvm_riscv_mmu_map(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot,
kvm_pfn_t hfn;
bool is_hugetlb;
bool writable;
- short vma_pageshift;
+ unsigned int vma_pageshift;
gfn_t gfn = gpa >> PAGE_SHIFT;
struct vm_area_struct *vma;
struct kvm *kvm = vcpu->kvm;
@@ -652,11 +652,13 @@ int kvm_riscv_mmu_map(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot,
vma_pagesize, true, true, out_map);
}
- if (ret)
+ if (ret == -EEXIST)
+ ret = 0;
+ else if (ret)
kvm_err("Failed to map in G-stage\n");
out_unlock:
- kvm_release_faultin_page(kvm, page, ret && ret != -EEXIST, writable);
+ kvm_release_faultin_page(kvm, page, ret, writable);
write_unlock(&kvm->mmu_lock);
return ret;
}
diff --git a/arch/riscv/kvm/vcpu_exit.c b/arch/riscv/kvm/vcpu_exit.c
index 6c8530b9f29e..76cceecee5ab 100644
--- a/arch/riscv/kvm/vcpu_exit.c
+++ b/arch/riscv/kvm/vcpu_exit.c
@@ -17,7 +17,8 @@ static int gstage_page_fault(struct kvm_vcpu *vcpu, struct kvm_run *run,
{
struct kvm_gstage_mapping host_map;
struct kvm_memory_slot *memslot;
- unsigned long hva, fault_addr;
+ unsigned long hva;
+ gpa_t fault_addr;
bool writable;
gfn_t gfn;
int ret;
--
2.54.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: "Bingyu.Xian" <shanbeeyoo@gmail.com>
To: Anup Patel <anup@brainfault.org>
Cc: Atish Patra <atish.patra@linux.dev>,
Paul Walmsley <pjw@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Alexandre Ghiti <alex@ghiti.fr>,
kvm@vger.kernel.org, kvm-riscv@lists.infradead.org,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
Quan Zhou <zhouquan@iscas.ac.cn>,
Bingyu Xian <shanbeeyoo@gmail.com>
Subject: [PATCH] RISC-V: KVM: Fix spurious -EEXIST and clean up gstage fault path types
Date: Wed, 29 Jul 2026 15:07:49 +0800 [thread overview]
Message-ID: <20260729070749.730218-1-shanbeeyoo@gmail.com> (raw)
Two small fixes to the RISC-V G-stage page fault path, both suggested
during review of the in-progress KVM Userfault port.
1. Treat -EEXIST from kvm_riscv_gstage_map_page() as a quiet success.
When a concurrent vCPU installs the same G-stage mapping while we
are waiting for mmu_lock, gstage_map_page() returns -EEXIST. This
is not an error -- the page is correctly mapped and the faulting
vCPU can simply retry the guest instruction -- but KVM was treating
it as one: printing "Failed to map in G-stage" to dmesg and
propagating -EEXIST all the way to userspace.
Align RISC-V with x86 and arm64, which already swallow -EEXIST in
their respective fault handlers. This also lets
kvm_release_faultin_page() drop its "ret && ret != -EEXIST" special
case: with ret normalized to 0 the regular release path is correct.
2. Clean up fault path types.
- vma_pageshift: short -> unsigned int. Bit widths and shift counts
conventionally use unsigned int in the kernel.
- fault_addr: unsigned long -> gpa_t. RV32 with Sv32x4 has 34-bit
guest physical addresses that would be truncated when stored in a
32-bit unsigned long; gpa_t is u64 on RV32 and holds the full
address. No functional change on RV64.
These type changes are in preparation for sharing a common
struct kvm_page_fault across architectures, as requested during
review.
No functional change on RV64 beyond silencing the spurious -EEXIST.
These are independent fixes with no dependencies; they can be merged
on their own. The KVM_MEM_USERFAULT port that motivated them will be
sent separately as an RFC once the generic userfault series lands.
Fixes: 9d05c1fee837 ("RISC-V: KVM: Implement stage2 page table programming")
Assisted-by: YuanSheng: deepseek-v4-pro
Co-developed-by: Quan Zhou <zhouquan@iscas.ac.cn>
Signed-off-by: Quan Zhou <zhouquan@iscas.ac.cn>
Signed-off-by: Bingyu Xian <shanbeeyoo@gmail.com>
---
arch/riscv/kvm/mmu.c | 8 +++++---
arch/riscv/kvm/vcpu_exit.c | 3 ++-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c
index 8a0aa5e0e216..d2a06a54be17 100644
--- a/arch/riscv/kvm/mmu.c
+++ b/arch/riscv/kvm/mmu.c
@@ -541,7 +541,7 @@ int kvm_riscv_mmu_map(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot,
kvm_pfn_t hfn;
bool is_hugetlb;
bool writable;
- short vma_pageshift;
+ unsigned int vma_pageshift;
gfn_t gfn = gpa >> PAGE_SHIFT;
struct vm_area_struct *vma;
struct kvm *kvm = vcpu->kvm;
@@ -652,11 +652,13 @@ int kvm_riscv_mmu_map(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot,
vma_pagesize, true, true, out_map);
}
- if (ret)
+ if (ret == -EEXIST)
+ ret = 0;
+ else if (ret)
kvm_err("Failed to map in G-stage\n");
out_unlock:
- kvm_release_faultin_page(kvm, page, ret && ret != -EEXIST, writable);
+ kvm_release_faultin_page(kvm, page, ret, writable);
write_unlock(&kvm->mmu_lock);
return ret;
}
diff --git a/arch/riscv/kvm/vcpu_exit.c b/arch/riscv/kvm/vcpu_exit.c
index 6c8530b9f29e..76cceecee5ab 100644
--- a/arch/riscv/kvm/vcpu_exit.c
+++ b/arch/riscv/kvm/vcpu_exit.c
@@ -17,7 +17,8 @@ static int gstage_page_fault(struct kvm_vcpu *vcpu, struct kvm_run *run,
{
struct kvm_gstage_mapping host_map;
struct kvm_memory_slot *memslot;
- unsigned long hva, fault_addr;
+ unsigned long hva;
+ gpa_t fault_addr;
bool writable;
gfn_t gfn;
int ret;
--
2.54.0
next reply other threads:[~2026-07-29 7:07 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-29 7:07 Bingyu.Xian [this message]
2026-07-29 7:07 ` [PATCH] RISC-V: KVM: Fix spurious -EEXIST and clean up gstage fault path types Bingyu.Xian
2026-07-29 7:07 ` Bingyu.Xian
2026-07-29 7:17 ` sashiko-bot
2026-07-29 7:52 ` [PATCH v2] " Bingyu.Xian
2026-07-29 7:52 ` Bingyu.Xian
2026-07-29 7:52 ` Bingyu.Xian
2026-07-29 8:03 ` sashiko-bot
2026-07-29 12:07 ` [PATCH v3 0/3] RISC-V: KVM: G-stage fault path fix and cleanup Bingyu.Xian
2026-07-29 12:07 ` Bingyu.Xian
2026-07-29 12:07 ` Bingyu.Xian
2026-07-29 12:07 ` [PATCH v3 1/3] RISC-V: KVM: Treat -EEXIST from G-stage map as success Bingyu.Xian
2026-07-29 12:07 ` Bingyu.Xian
2026-07-29 12:07 ` Bingyu.Xian
2026-07-29 16:06 ` Anup Patel
2026-07-29 16:06 ` Anup Patel
2026-07-29 16:06 ` Anup Patel
2026-07-29 12:07 ` [PATCH v3 2/3] RISC-V: KVM: Use unsigned int for vma_pageshift Bingyu.Xian
2026-07-29 12:07 ` Bingyu.Xian
2026-07-29 12:07 ` Bingyu.Xian
2026-07-29 12:07 ` [PATCH v3 3/3] RISC-V: KVM: Widen G-stage fault address to gpa_t Bingyu.Xian
2026-07-29 12:07 ` Bingyu.Xian
2026-07-29 12:07 ` Bingyu.Xian
2026-07-29 8:05 ` [PATCH] RISC-V: KVM: Fix spurious -EEXIST and clean up gstage fault path types Anup Patel
2026-07-29 8:05 ` Anup Patel
2026-07-29 8:05 ` Anup Patel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260729070749.730218-1-shanbeeyoo@gmail.com \
--to=shanbeeyoo@gmail.com \
--cc=alex@ghiti.fr \
--cc=anup@brainfault.org \
--cc=aou@eecs.berkeley.edu \
--cc=atish.patra@linux.dev \
--cc=kvm-riscv@lists.infradead.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=palmer@dabbelt.com \
--cc=pjw@kernel.org \
--cc=zhouquan@iscas.ac.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.