diff options
author | Avi Kivity <avi@qumranet.com> | 2007-01-05 19:36:47 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2007-01-06 02:55:25 -0500 |
commit | ebeace8609205bf5e1b96fe325b7dea148042232 (patch) | |
tree | 863991639d7df2a4aa5fd8b20b6b3a28c2cc2cda /drivers/kvm/paging_tmpl.h | |
parent | cc4529efc7b730b596d9c7d5a917c00a357e92aa (diff) |
[PATCH] KVM: MMU: oom handling
When beginning to process a page fault, make sure we have enough shadow pages
available to service the fault. If not, free some pages.
Signed-off-by: Avi Kivity <avi@qumranet.com>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/kvm/paging_tmpl.h')
-rw-r--r-- | drivers/kvm/paging_tmpl.h | 15 |
1 files changed, 2 insertions, 13 deletions
diff --git a/drivers/kvm/paging_tmpl.h b/drivers/kvm/paging_tmpl.h index cf4b74cc75b5..03c474aaedde 100644 --- a/drivers/kvm/paging_tmpl.h +++ b/drivers/kvm/paging_tmpl.h | |||
@@ -246,8 +246,6 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | |||
246 | } | 246 | } |
247 | shadow_page = kvm_mmu_get_page(vcpu, table_gfn, addr, level-1, | 247 | shadow_page = kvm_mmu_get_page(vcpu, table_gfn, addr, level-1, |
248 | metaphysical, shadow_ent); | 248 | metaphysical, shadow_ent); |
249 | if (!shadow_page) | ||
250 | return ERR_PTR(-ENOMEM); | ||
251 | shadow_addr = shadow_page->page_hpa; | 249 | shadow_addr = shadow_page->page_hpa; |
252 | shadow_pte = shadow_addr | PT_PRESENT_MASK | PT_ACCESSED_MASK | 250 | shadow_pte = shadow_addr | PT_PRESENT_MASK | PT_ACCESSED_MASK |
253 | | PT_WRITABLE_MASK | PT_USER_MASK; | 251 | | PT_WRITABLE_MASK | PT_USER_MASK; |
@@ -347,17 +345,8 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, | |||
347 | /* | 345 | /* |
348 | * Look up the shadow pte for the faulting address. | 346 | * Look up the shadow pte for the faulting address. |
349 | */ | 347 | */ |
350 | for (;;) { | 348 | FNAME(walk_addr)(&walker, vcpu, addr); |
351 | FNAME(walk_addr)(&walker, vcpu, addr); | 349 | shadow_pte = FNAME(fetch)(vcpu, addr, &walker); |
352 | shadow_pte = FNAME(fetch)(vcpu, addr, &walker); | ||
353 | if (IS_ERR(shadow_pte)) { /* must be -ENOMEM */ | ||
354 | printk("%s: oom\n", __FUNCTION__); | ||
355 | nonpaging_flush(vcpu); | ||
356 | FNAME(release_walker)(&walker); | ||
357 | continue; | ||
358 | } | ||
359 | break; | ||
360 | } | ||
361 | 350 | ||
362 | /* | 351 | /* |
363 | * The page is not mapped by the guest. Let the guest handle it. | 352 | * The page is not mapped by the guest. Let the guest handle it. |