[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v1] x86/mm: Make change_type_range return error
At this moment change_type_range() prints a warning in case end > host_max_pfn. While this is unlikely to happen the function should return a error and propagate it to the caller, hap_track_dirty_vram() This patch makes change_type_range() return -EINVAL or 0 if all is ok. Signed-off-by: Alexandru Isaila <aisaila@xxxxxxxxxxxxxxx> --- xen/arch/x86/mm/hap/hap.c | 12 ++++++++---- xen/arch/x86/mm/p2m.c | 32 ++++++++++++++++++++------------ xen/include/asm-x86/p2m.h | 6 +++--- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c index 412a442b6a..b113c3154b 100644 --- a/xen/arch/x86/mm/hap/hap.c +++ b/xen/arch/x86/mm/hap/hap.c @@ -108,15 +108,19 @@ int hap_track_dirty_vram(struct domain *d, paging_unlock(d); if ( oend > ostart ) - p2m_change_type_range(d, ostart, oend, - p2m_ram_logdirty, p2m_ram_rw); + rc = p2m_change_type_range(d, ostart, oend, + p2m_ram_logdirty, p2m_ram_rw); + if ( rc ) + goto out; /* * Switch vram to log dirty mode, either by setting l1e entries of * P2M table to be read-only, or via hardware-assisted log-dirty. */ - p2m_change_type_range(d, begin_pfn, begin_pfn + nr, - p2m_ram_rw, p2m_ram_logdirty); + rc = p2m_change_type_range(d, begin_pfn, begin_pfn + nr, + p2m_ram_rw, p2m_ram_logdirty); + if ( rc ) + goto out; flush_tlb_mask(d->dirty_cpumask); diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index 9e81a30cc4..27697d5a77 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -1028,7 +1028,7 @@ int p2m_change_type_one(struct domain *d, unsigned long gfn_l, } /* Modify the p2m type of [start, end_exclusive) from ot to nt. */ -static void change_type_range(struct p2m_domain *p2m, +static int change_type_range(struct p2m_domain *p2m, unsigned long start, unsigned long end_exclusive, p2m_type_t ot, p2m_type_t nt) { @@ -1053,15 +1053,11 @@ static void change_type_range(struct p2m_domain *p2m, * This should be revisited later, but for now post a warning. */ if ( unlikely(end > host_max_pfn) ) - { - printk(XENLOG_G_WARNING "Dom%d logdirty rangeset clipped to max_mapped_pfn\n", - d->domain_id); - end = invalidate_end = host_max_pfn; - } + return -EINVAL; /* If the requested range is out of scope, return doing nothing. */ if ( start > end ) - return; + return 0; if ( p2m_is_altp2m(p2m) ) invalidate_end = min(invalidate_end, max_pfn); @@ -1115,13 +1111,16 @@ static void change_type_range(struct p2m_domain *p2m, rc, d->domain_id); domain_crash(d); } + + return 0; } -void p2m_change_type_range(struct domain *d, - unsigned long start, unsigned long end, - p2m_type_t ot, p2m_type_t nt) +int p2m_change_type_range(struct domain *d, + unsigned long start, unsigned long end, + p2m_type_t ot, p2m_type_t nt) { struct p2m_domain *hostp2m = p2m_get_hostp2m(d); + int rc = 0; ASSERT(ot != nt); ASSERT(p2m_is_changeable(ot) && p2m_is_changeable(nt)); @@ -1129,7 +1128,10 @@ void p2m_change_type_range(struct domain *d, p2m_lock(hostp2m); hostp2m->defer_nested_flush = 1; - change_type_range(hostp2m, start, end, ot, nt); + rc = change_type_range(hostp2m, start, end, ot, nt); + + if ( rc ) + goto out; #ifdef CONFIG_HVM if ( unlikely(altp2m_active(d)) ) @@ -1142,8 +1144,11 @@ void p2m_change_type_range(struct domain *d, struct p2m_domain *altp2m = d->arch.altp2m_p2m[i]; p2m_lock(altp2m); - change_type_range(altp2m, start, end, ot, nt); + rc = change_type_range(altp2m, start, end, ot, nt); p2m_unlock(altp2m); + + if ( rc ) + goto out; } } #endif @@ -1151,7 +1156,10 @@ void p2m_change_type_range(struct domain *d, if ( nestedhvm_enabled(d) ) p2m_flush_nestedp2m(d); +out: p2m_unlock(hostp2m); + + return rc; } /* diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h index 2801a8ccca..a118812025 100644 --- a/xen/include/asm-x86/p2m.h +++ b/xen/include/asm-x86/p2m.h @@ -613,9 +613,9 @@ void p2m_change_entry_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt); /* Change types across a range of p2m entries (start ... end-1) */ -void p2m_change_type_range(struct domain *d, - unsigned long start, unsigned long end, - p2m_type_t ot, p2m_type_t nt); +int p2m_change_type_range(struct domain *d, + unsigned long start, unsigned long end, + p2m_type_t ot, p2m_type_t nt); /* Compare-exchange the type of a single p2m entry */ int p2m_change_type_one(struct domain *d, unsigned long gfn, -- 2.17.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |