static void unmap_puds(struct kvm *kvm, pgd_t *pgd, phys_addr_t addr, phys_addr_t end) { phys_addr_t next, start_addr = addr; pud_t *pud, *start_pud; start_pud = pud = pud_offset(pgd, addr); do { next = kvm_pud_addr_end(addr, end); if (!pud_none(*pud)) { if (pud_huge(*pud)) { pud_t old_pud = *pud; pud_clear(pud); kvm_tlb_flush_vmid_ipa(kvm, addr); kvm_flush_dcache_pud(old_pud); put_page(virt_to_page(pud)); } else { unmap_pmds(kvm, pud, addr, next); } } } while (pud++, addr = next, addr != end); if (kvm_pud_table_empty(kvm, start_pud)) clear_pgd_entry(kvm, pgd, start_addr); }
static void unmap_puds(struct kvm *kvm, pgd_t *pgd, phys_addr_t addr, phys_addr_t end) { phys_addr_t next, start_addr = addr; pud_t *pud, *start_pud; start_pud = pud = pud_offset(pgd, addr); do { next = kvm_pud_addr_end(addr, end); if (!pud_none(*pud)) { unmap_pmds(kvm, pud, addr, next); } } while (pud++, addr = next, addr != end); if (kvm_pud_table_empty(start_pud)) clear_pgd_entry(kvm, pgd, start_addr); }