LoongArch: KVM: Select huge page only if secondary mmu supports it
commit 2f56f9ea4dc3 ("LoongArch: KVM: Select huge page only if secondary mmu supports it") Conflict: none Backport-reason: Synchronize upstream linux loongarch kvm patch to support loongarch virtualization. Checkpatch: no, to be consistent with upstream commit. Currently page level selection about secondary mmu depends on memory slot and page level about host mmu. There will be problems if page level of secondary mmu is zero already. Huge page cannot be selected if there is normal page mapped in secondary mmu already, since it is not supported to merge normal pages into huge pages now. So page level selection should depend on the following three conditions. 1. Memslot is aligned for huge page and vm is not migrating. 2. Page level of host mmu is also huge page. 3. Page level of secondary mmu is suituable for huge page. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn> Signed-off-by: Xianglai Li <lixianglai@loongson.cn>
This commit is contained in:
parent
c51efd2855
commit
dde72983e1
|
@ -890,10 +890,20 @@ retry:
|
|||
|
||||
/* Disable dirty logging on HugePages */
|
||||
level = 0;
|
||||
if (!fault_supports_huge_mapping(memslot, hva, write)) {
|
||||
level = 0;
|
||||
} else {
|
||||
if (fault_supports_huge_mapping(memslot, hva, write)) {
|
||||
/* Check page level about host mmu*/
|
||||
level = host_pfn_mapping_level(kvm, gfn, memslot);
|
||||
if (level == 1) {
|
||||
/*
|
||||
* Check page level about secondary mmu
|
||||
* Disable hugepage if it is normal page on
|
||||
* secondary mmu already
|
||||
*/
|
||||
ptep = kvm_populate_gpa(kvm, NULL, gpa, 0);
|
||||
if (ptep && !kvm_pte_huge(*ptep))
|
||||
level = 0;
|
||||
}
|
||||
|
||||
if (level == 1) {
|
||||
gfn = gfn & ~(PTRS_PER_PTE - 1);
|
||||
pfn = pfn & ~(PTRS_PER_PTE - 1);
|
||||
|
|
|
@ -1403,7 +1403,6 @@ static int _kvm_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
|||
|
||||
/* Control guest page CCA attribute */
|
||||
change_csr_gcfg(CSR_GCFG_MATC_MASK, CSR_GCFG_MATC_ROOT);
|
||||
kvm_make_request(KVM_REQ_RECORD_STEAL, vcpu);
|
||||
|
||||
/* Restore hardware PMU CSRs */
|
||||
kvm_restore_pmu(vcpu);
|
||||
|
|
Loading…
Reference in New Issue