[PATCH v3 2/2] RISC-V: KVM: Introduce make_xfence_request_nodata for FENCE.I requests

Anup Patel anup at brainfault.org
Sat Aug 1 01:35:18 PDT 2026


On Fri, Jul 31, 2026 at 3:12 PM Wang Yechao <wang.yechao255 at zte.com.cn> wrote:
>
> 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 at zte.com.cn>

LGTM.

Reviewed-by: Anup Patel <anup at brainfault.org>

Thanks,
Anup

> ---
>  arch/riscv/kvm/tlb.c | 34 +++++++++++++++++++++++++++-------
>  1 file changed, 27 insertions(+), 7 deletions(-)
>
> diff --git a/arch/riscv/kvm/tlb.c b/arch/riscv/kvm/tlb.c
> index c54522decaa64..fd445e9fa3f94 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,
> --
> 2.39.3
>



More information about the kvm-riscv mailing list