aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Deegan <tim@xen.org>2013-03-07 12:49:52 +0000
committerTim Deegan <tim@xen.org>2013-03-14 10:33:46 +0000
commit97724f16028522c07f8251d94b6cca4552391fe4 (patch)
tree4a95f7340092ee79ee8921fa18d4d54a071c2264
parente8c211d80c9d80d4eef09c5d1121f7ef17b61f73 (diff)
downloadxen-97724f16028522c07f8251d94b6cca4552391fe4.tar.gz
xen-97724f16028522c07f8251d94b6cca4552391fe4.tar.bz2
xen-97724f16028522c07f8251d94b6cca4552391fe4.zip
x86/mm: warn if we ever run out of shadow/hap pool for p2m/lgd ops.
Even if the error propagates up through the p2m ops to the caller, it'll look like ENOMEM, which won't be obviously a shadow-pool problem. Warn on the console, once per domain. Reported-by: Jan Beulich <jbeulich@suse.com> Signed-off-by: Tim Deegan <tim@xen.org> Acked-by: Jan Beulich <jbeulich@suse.com>
-rw-r--r--xen/arch/x86/mm/hap/hap.c6
-rw-r--r--xen/arch/x86/mm/shadow/common.c8
-rw-r--r--xen/include/asm-x86/domain.h2
3 files changed, 15 insertions, 1 deletions
diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c
index 055833d349..bff05d97a3 100644
--- a/xen/arch/x86/mm/hap/hap.c
+++ b/xen/arch/x86/mm/hap/hap.c
@@ -258,6 +258,12 @@ static struct page_info *hap_alloc_p2m_page(struct domain *d)
page_set_owner(pg, d);
pg->count_info |= 1;
}
+ else if ( !d->arch.paging.p2m_alloc_failed )
+ {
+ d->arch.paging.p2m_alloc_failed = 1;
+ dprintk(XENLOG_ERR, "d%i failed to allocate from HAP pool",
+ d->domain_id);
+ }
paging_unlock(d);
return pg;
diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c
index 691776c8ab..4b576ac063 100644
--- a/xen/arch/x86/mm/shadow/common.c
+++ b/xen/arch/x86/mm/shadow/common.c
@@ -1591,10 +1591,16 @@ shadow_alloc_p2m_page(struct domain *d)
if ( d->arch.paging.shadow.total_pages
< shadow_min_acceptable_pages(d) + 1 )
{
+ if ( !d->arch.paging.p2m_alloc_failed )
+ {
+ d->arch.paging.p2m_alloc_failed = 1;
+ dprintk(XENLOG_ERR, "d%i failed to allocate from shadow pool",
+ d->domain_id);
+ }
paging_unlock(d);
return NULL;
}
-
+
shadow_prealloc(d, SH_type_p2m_table, 1);
pg = mfn_to_page(shadow_alloc(d, SH_type_p2m_table, 0));
d->arch.paging.shadow.p2m_pages++;
diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h
index fd9fa0f231..6f9744a58f 100644
--- a/xen/include/asm-x86/domain.h
+++ b/xen/include/asm-x86/domain.h
@@ -190,6 +190,8 @@ struct paging_domain {
* (used by p2m and log-dirty code for their tries) */
struct page_info * (*alloc_page)(struct domain *d);
void (*free_page)(struct domain *d, struct page_info *pg);
+ /* Has that pool ever run out of memory? */
+ bool_t p2m_alloc_failed;
};
struct paging_vcpu {