@@ -251,6 +251,12 @@ void kvm_riscv_hfence_process(struct kvm_vcpu *vcpu)
251251 kvm_riscv_local_hfence_gvma_vmid_gpa (d .vmid , d .addr ,
252252 d .size , d .order );
253253 break ;
254+ case KVM_RISCV_HFENCE_GVMA_VMID_ALL :
255+ if (kvm_riscv_nacl_available ())
256+ nacl_hfence_gvma_vmid_all (nacl_shmem (), d .vmid );
257+ else
258+ kvm_riscv_local_hfence_gvma_vmid_all (d .vmid );
259+ break ;
254260 case KVM_RISCV_HFENCE_VVMA_ASID_GVA :
255261 kvm_riscv_vcpu_pmu_incr_fw (vcpu , SBI_PMU_FW_HFENCE_VVMA_ASID_RCVD );
256262 if (kvm_riscv_nacl_available ())
@@ -276,6 +282,13 @@ void kvm_riscv_hfence_process(struct kvm_vcpu *vcpu)
276282 kvm_riscv_local_hfence_vvma_gva (d .vmid , d .addr ,
277283 d .size , d .order );
278284 break ;
285+ case KVM_RISCV_HFENCE_VVMA_ALL :
286+ kvm_riscv_vcpu_pmu_incr_fw (vcpu , SBI_PMU_FW_HFENCE_VVMA_RCVD );
287+ if (kvm_riscv_nacl_available ())
288+ nacl_hfence_vvma_all (nacl_shmem (), d .vmid );
289+ else
290+ kvm_riscv_local_hfence_vvma_all (d .vmid );
291+ break ;
279292 default :
280293 break ;
281294 }
@@ -328,14 +341,13 @@ void kvm_riscv_fence_i(struct kvm *kvm,
328341void kvm_riscv_hfence_gvma_vmid_gpa (struct kvm * kvm ,
329342 unsigned long hbase , unsigned long hmask ,
330343 gpa_t gpa , gpa_t gpsz ,
331- unsigned long order )
344+ unsigned long order , unsigned long vmid )
332345{
333- struct kvm_vmid * v = & kvm -> arch .vmid ;
334346 struct kvm_riscv_hfence data ;
335347
336348 data .type = KVM_RISCV_HFENCE_GVMA_VMID_GPA ;
337349 data .asid = 0 ;
338- data .vmid = READ_ONCE ( v -> vmid ) ;
350+ data .vmid = vmid ;
339351 data .addr = gpa ;
340352 data .size = gpsz ;
341353 data .order = order ;
@@ -344,23 +356,28 @@ void kvm_riscv_hfence_gvma_vmid_gpa(struct kvm *kvm,
344356}
345357
346358void kvm_riscv_hfence_gvma_vmid_all (struct kvm * kvm ,
347- unsigned long hbase , unsigned long hmask )
359+ unsigned long hbase , unsigned long hmask ,
360+ unsigned long vmid )
348361{
349- make_xfence_request (kvm , hbase , hmask , KVM_REQ_TLB_FLUSH ,
350- KVM_REQ_TLB_FLUSH , NULL );
362+ struct kvm_riscv_hfence data = {0 };
363+
364+ data .type = KVM_RISCV_HFENCE_GVMA_VMID_ALL ;
365+ data .vmid = vmid ;
366+ make_xfence_request (kvm , hbase , hmask , KVM_REQ_HFENCE ,
367+ KVM_REQ_TLB_FLUSH , & data );
351368}
352369
353370void kvm_riscv_hfence_vvma_asid_gva (struct kvm * kvm ,
354371 unsigned long hbase , unsigned long hmask ,
355372 unsigned long gva , unsigned long gvsz ,
356- unsigned long order , unsigned long asid )
373+ unsigned long order , unsigned long asid ,
374+ unsigned long vmid )
357375{
358- struct kvm_vmid * v = & kvm -> arch .vmid ;
359376 struct kvm_riscv_hfence data ;
360377
361378 data .type = KVM_RISCV_HFENCE_VVMA_ASID_GVA ;
362379 data .asid = asid ;
363- data .vmid = READ_ONCE ( v -> vmid ) ;
380+ data .vmid = vmid ;
364381 data .addr = gva ;
365382 data .size = gvsz ;
366383 data .order = order ;
@@ -370,30 +387,27 @@ void kvm_riscv_hfence_vvma_asid_gva(struct kvm *kvm,
370387
371388void kvm_riscv_hfence_vvma_asid_all (struct kvm * kvm ,
372389 unsigned long hbase , unsigned long hmask ,
373- unsigned long asid )
390+ unsigned long asid , unsigned long vmid )
374391{
375- struct kvm_vmid * v = & kvm -> arch .vmid ;
376- struct kvm_riscv_hfence data ;
392+ struct kvm_riscv_hfence data = {0 };
377393
378394 data .type = KVM_RISCV_HFENCE_VVMA_ASID_ALL ;
379395 data .asid = asid ;
380- data .vmid = READ_ONCE (v -> vmid );
381- data .addr = data .size = data .order = 0 ;
396+ data .vmid = vmid ;
382397 make_xfence_request (kvm , hbase , hmask , KVM_REQ_HFENCE ,
383398 KVM_REQ_HFENCE_VVMA_ALL , & data );
384399}
385400
386401void kvm_riscv_hfence_vvma_gva (struct kvm * kvm ,
387402 unsigned long hbase , unsigned long hmask ,
388403 unsigned long gva , unsigned long gvsz ,
389- unsigned long order )
404+ unsigned long order , unsigned long vmid )
390405{
391- struct kvm_vmid * v = & kvm -> arch .vmid ;
392406 struct kvm_riscv_hfence data ;
393407
394408 data .type = KVM_RISCV_HFENCE_VVMA_GVA ;
395409 data .asid = 0 ;
396- data .vmid = READ_ONCE ( v -> vmid ) ;
410+ data .vmid = vmid ;
397411 data .addr = gva ;
398412 data .size = gvsz ;
399413 data .order = order ;
@@ -402,16 +416,21 @@ void kvm_riscv_hfence_vvma_gva(struct kvm *kvm,
402416}
403417
404418void kvm_riscv_hfence_vvma_all (struct kvm * kvm ,
405- unsigned long hbase , unsigned long hmask )
419+ unsigned long hbase , unsigned long hmask ,
420+ unsigned long vmid )
406421{
407- make_xfence_request (kvm , hbase , hmask , KVM_REQ_HFENCE_VVMA_ALL ,
408- KVM_REQ_HFENCE_VVMA_ALL , NULL );
422+ struct kvm_riscv_hfence data = {0 };
423+
424+ data .type = KVM_RISCV_HFENCE_VVMA_ALL ;
425+ data .vmid = vmid ;
426+ make_xfence_request (kvm , hbase , hmask , KVM_REQ_HFENCE ,
427+ KVM_REQ_HFENCE_VVMA_ALL , & data );
409428}
410429
411430int kvm_arch_flush_remote_tlbs_range (struct kvm * kvm , gfn_t gfn , u64 nr_pages )
412431{
413432 kvm_riscv_hfence_gvma_vmid_gpa (kvm , -1UL , 0 ,
414433 gfn << PAGE_SHIFT , nr_pages << PAGE_SHIFT ,
415- PAGE_SHIFT );
434+ PAGE_SHIFT , READ_ONCE ( kvm -> arch . vmid . vmid ) );
416435 return 0 ;
417436}
0 commit comments