diff options
| author | Wang Yechao <wang.yechao255@zte.com.cn> | 2026-07-31 17:38:28 +0800 |
|---|---|---|
| committer | Anup Patel <anup@brainfault.org> | 2026-08-01 13:58:33 +0530 |
| commit | ed64ae4e44abc2e7d92cf25be94f008a25aab0a2 (patch) | |
| tree | 182c046cb931fc06bc2a33d0a181f9e5b6796fe2 | |
| parent | c1bc73280fb28f024442e1aa9725b6858bafc37b (diff) | |
| download | linux-next-ed64ae4e44abc2e7d92cf25be94f008a25aab0a2.tar.gz linux-next-ed64ae4e44abc2e7d92cf25be94f008a25aab0a2.zip | |
RISC-V: KVM: Introduce make_xfence_request_nodata for FENCE.I requests
FENCE.I does not need hfence data, but it currently goes through the
generic make_xfence_request() path with NULL data, incurring unnecessary
per-VCPU checks.
Split out a separate make_xfence_request_nodata() function to handle
FENCE.I directly, and move the data validity check to the top of the
generic function to avoid redundant checks.
Signed-off-by: Wang Yechao <wang.yechao255@zte.com.cn>
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20260731093833.1551341-3-wang.yechao255@zte.com.cn
Signed-off-by: Anup Patel <anup@brainfault.org>
| -rw-r--r-- | arch/riscv/kvm/tlb.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/arch/riscv/kvm/tlb.c b/arch/riscv/kvm/tlb.c index c54522decaa6..fd445e9fa3f9 100644 --- a/arch/riscv/kvm/tlb.c +++ b/arch/riscv/kvm/tlb.c @@ -325,6 +325,29 @@ void kvm_riscv_hfence_process(struct kvm_vcpu *vcpu) } } +static void make_xfence_request_nodata(struct kvm *kvm, unsigned long hbase, + unsigned long hmask, unsigned int req) +{ + unsigned long i; + struct kvm_vcpu *vcpu; + DECLARE_BITMAP(vcpu_mask, KVM_MAX_VCPUS); + + bitmap_zero(vcpu_mask, KVM_MAX_VCPUS); + kvm_for_each_vcpu(i, vcpu, kvm) { + if (hbase != -1UL) { + if (vcpu->vcpu_id < hbase || + vcpu->vcpu_id >= hbase + BITS_PER_LONG) + continue; + if (!(hmask & (1UL << (vcpu->vcpu_id - hbase)))) + continue; + } + + bitmap_set(vcpu_mask, i, 1); + } + + kvm_make_vcpus_request_mask(kvm, req, vcpu_mask); +} + static void make_xfence_request(struct kvm *kvm, unsigned long hbase, unsigned long hmask, unsigned int req, unsigned int fallback_req, @@ -335,6 +358,9 @@ static void make_xfence_request(struct kvm *kvm, DECLARE_BITMAP(req_vcpu_mask, KVM_MAX_VCPUS); DECLARE_BITMAP(fallback_req_vcpu_mask, KVM_MAX_VCPUS); + if (!data || !data->type) + return; + bitmap_zero(req_vcpu_mask, KVM_MAX_VCPUS); bitmap_zero(fallback_req_vcpu_mask, KVM_MAX_VCPUS); kvm_for_each_vcpu(i, vcpu, kvm) { @@ -346,11 +372,6 @@ static void make_xfence_request(struct kvm *kvm, continue; } - if (!data || !data->type) { - bitmap_set(req_vcpu_mask, i, 1); - continue; - } - /* * Enqueue hfence data to VCPU hfence queue. If we don't * have space in the VCPU hfence queue then fallback to @@ -369,8 +390,7 @@ static void make_xfence_request(struct kvm *kvm, void kvm_riscv_fence_i(struct kvm *kvm, unsigned long hbase, unsigned long hmask) { - make_xfence_request(kvm, hbase, hmask, KVM_REQ_FENCE_I, - KVM_REQ_FENCE_I, NULL); + make_xfence_request_nodata(kvm, hbase, hmask, KVM_REQ_FENCE_I); } void kvm_riscv_hfence_gvma_vmid_gpa(struct kvm *kvm, |
