Revert "ANDROID: KVM: arm64: pkvm: Ensure that TLBs and I-cache are private to each vcpu"
This reverts commit 92a6dd3865.
Reason for revert: Suspected cause of hyp panic when running suite/user/pkvm_test
Bug: 232390891
Change-Id: Ie644c5484d8f1dde9630b9510a80988446ebbcdd
Signed-off-by: Will Deacon <willdeacon@google.com>
This commit is contained in:
@@ -225,11 +225,6 @@ static int index_to_shadow_handle(int index)
|
|||||||
|
|
||||||
extern unsigned long hyp_nr_cpus;
|
extern unsigned long hyp_nr_cpus;
|
||||||
|
|
||||||
/*
|
|
||||||
* Track the vcpu most recently loaded on each physical CPU.
|
|
||||||
*/
|
|
||||||
static DEFINE_PER_CPU(struct kvm_vcpu *, last_loaded_vcpu);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Spinlock for protecting the shadow table related state.
|
* Spinlock for protecting the shadow table related state.
|
||||||
* Protects writes to shadow_table, num_shadow_entries, and next_shadow_alloc,
|
* Protects writes to shadow_table, num_shadow_entries, and next_shadow_alloc,
|
||||||
@@ -272,7 +267,6 @@ struct kvm_vcpu *get_shadow_vcpu(int shadow_handle, unsigned int vcpu_idx)
|
|||||||
{
|
{
|
||||||
struct kvm_vcpu *vcpu = NULL;
|
struct kvm_vcpu *vcpu = NULL;
|
||||||
struct kvm_shadow_vm *vm;
|
struct kvm_shadow_vm *vm;
|
||||||
bool flush_context = false;
|
|
||||||
|
|
||||||
hyp_spin_lock(&shadow_lock);
|
hyp_spin_lock(&shadow_lock);
|
||||||
vm = find_shadow_by_handle(shadow_handle);
|
vm = find_shadow_by_handle(shadow_handle);
|
||||||
@@ -285,28 +279,12 @@ struct kvm_vcpu *get_shadow_vcpu(int shadow_handle, unsigned int vcpu_idx)
|
|||||||
vcpu = NULL;
|
vcpu = NULL;
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Guarantee that both TLBs and I-cache are private to each vcpu.
|
|
||||||
* The check below is conservative and could lead to over-invalidation,
|
|
||||||
* because there is no need to nuke the contexts if the vcpu belongs to
|
|
||||||
* a different vm.
|
|
||||||
*/
|
|
||||||
if (vcpu != __this_cpu_read(last_loaded_vcpu)) {
|
|
||||||
flush_context = true;
|
|
||||||
__this_cpu_write(last_loaded_vcpu, vcpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
vcpu->arch.pkvm.loaded_on_cpu = true;
|
vcpu->arch.pkvm.loaded_on_cpu = true;
|
||||||
|
|
||||||
hyp_page_ref_inc(hyp_virt_to_page(vm));
|
hyp_page_ref_inc(hyp_virt_to_page(vm));
|
||||||
unlock:
|
unlock:
|
||||||
hyp_spin_unlock(&shadow_lock);
|
hyp_spin_unlock(&shadow_lock);
|
||||||
|
|
||||||
/* No need for the lock while flushing the context. */
|
|
||||||
if (flush_context)
|
|
||||||
__kvm_flush_cpu_context(vcpu->arch.hw_mmu);
|
|
||||||
|
|
||||||
return vcpu;
|
return vcpu;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -718,7 +696,6 @@ int __pkvm_teardown_shadow(int shadow_handle)
|
|||||||
u64 pfn;
|
u64 pfn;
|
||||||
u64 nr_pages;
|
u64 nr_pages;
|
||||||
void *addr;
|
void *addr;
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Lookup then remove entry from the shadow table. */
|
/* Lookup then remove entry from the shadow table. */
|
||||||
hyp_spin_lock(&shadow_lock);
|
hyp_spin_lock(&shadow_lock);
|
||||||
@@ -733,19 +710,6 @@ int __pkvm_teardown_shadow(int shadow_handle)
|
|||||||
goto err_unlock;
|
goto err_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Clear the tracking for last_loaded_vcpu for all cpus for this vm in
|
|
||||||
* case the same addresses for those vcpus are reused for future vms.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < hyp_nr_cpus; i++) {
|
|
||||||
struct kvm_vcpu **last_loaded_vcpu_ptr =
|
|
||||||
per_cpu_ptr(&last_loaded_vcpu, i);
|
|
||||||
struct kvm_vcpu *vcpu = *last_loaded_vcpu_ptr;
|
|
||||||
|
|
||||||
if (vcpu && vcpu->arch.pkvm.shadow_handle == shadow_handle)
|
|
||||||
*last_loaded_vcpu_ptr = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ensure the VMID is clean before it can be reallocated */
|
/* Ensure the VMID is clean before it can be reallocated */
|
||||||
__kvm_tlb_flush_vmid(&vm->arch.mmu);
|
__kvm_tlb_flush_vmid(&vm->arch.mmu);
|
||||||
remove_shadow_table(shadow_handle);
|
remove_shadow_table(shadow_handle);
|
||||||
|
|||||||
Reference in New Issue
Block a user