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>
This commit is contained in:
Wang Yechao 2026-07-31 17:38:28 +08:00 committed by Anup Patel
parent c1bc73280f
commit ed64ae4e44

View File

@ -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,