diff options
Diffstat (limited to 'arch/x86/kvm/mmu.c')
-rw-r--r-- | arch/x86/kvm/mmu.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 741373e8ca77..19a8906bcaa2 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/hugetlb.h> | 31 | #include <linux/hugetlb.h> |
32 | #include <linux/compiler.h> | 32 | #include <linux/compiler.h> |
33 | #include <linux/srcu.h> | 33 | #include <linux/srcu.h> |
34 | #include <linux/slab.h> | ||
34 | 35 | ||
35 | #include <asm/page.h> | 36 | #include <asm/page.h> |
36 | #include <asm/cmpxchg.h> | 37 | #include <asm/cmpxchg.h> |
@@ -1489,8 +1490,8 @@ static int mmu_zap_unsync_children(struct kvm *kvm, | |||
1489 | for_each_sp(pages, sp, parents, i) { | 1490 | for_each_sp(pages, sp, parents, i) { |
1490 | kvm_mmu_zap_page(kvm, sp); | 1491 | kvm_mmu_zap_page(kvm, sp); |
1491 | mmu_pages_clear_parents(&parents); | 1492 | mmu_pages_clear_parents(&parents); |
1493 | zapped++; | ||
1492 | } | 1494 | } |
1493 | zapped += pages.nr; | ||
1494 | kvm_mmu_pages_init(parent, &parents, &pages); | 1495 | kvm_mmu_pages_init(parent, &parents, &pages); |
1495 | } | 1496 | } |
1496 | 1497 | ||
@@ -1541,14 +1542,16 @@ void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages) | |||
1541 | */ | 1542 | */ |
1542 | 1543 | ||
1543 | if (used_pages > kvm_nr_mmu_pages) { | 1544 | if (used_pages > kvm_nr_mmu_pages) { |
1544 | while (used_pages > kvm_nr_mmu_pages) { | 1545 | while (used_pages > kvm_nr_mmu_pages && |
1546 | !list_empty(&kvm->arch.active_mmu_pages)) { | ||
1545 | struct kvm_mmu_page *page; | 1547 | struct kvm_mmu_page *page; |
1546 | 1548 | ||
1547 | page = container_of(kvm->arch.active_mmu_pages.prev, | 1549 | page = container_of(kvm->arch.active_mmu_pages.prev, |
1548 | struct kvm_mmu_page, link); | 1550 | struct kvm_mmu_page, link); |
1549 | kvm_mmu_zap_page(kvm, page); | 1551 | used_pages -= kvm_mmu_zap_page(kvm, page); |
1550 | used_pages--; | 1552 | used_pages--; |
1551 | } | 1553 | } |
1554 | kvm_nr_mmu_pages = used_pages; | ||
1552 | kvm->arch.n_free_mmu_pages = 0; | 1555 | kvm->arch.n_free_mmu_pages = 0; |
1553 | } | 1556 | } |
1554 | else | 1557 | else |
@@ -1595,7 +1598,8 @@ static void mmu_unshadow(struct kvm *kvm, gfn_t gfn) | |||
1595 | && !sp->role.invalid) { | 1598 | && !sp->role.invalid) { |
1596 | pgprintk("%s: zap %lx %x\n", | 1599 | pgprintk("%s: zap %lx %x\n", |
1597 | __func__, gfn, sp->role.word); | 1600 | __func__, gfn, sp->role.word); |
1598 | kvm_mmu_zap_page(kvm, sp); | 1601 | if (kvm_mmu_zap_page(kvm, sp)) |
1602 | nn = bucket->first; | ||
1599 | } | 1603 | } |
1600 | } | 1604 | } |
1601 | } | 1605 | } |