[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 30/38] arm/p2m: Add altp2m_propagate_change
This commit introduces the function "altp2m_propagate_change" that is responsible to propagate changes applied to the host's p2m to a specific or even all altp2m views. In this way, Xen can in-/decrease the guest's physmem at run-time without leaving the altp2m views with stalled/invalid entries. Signed-off-by: Sergej Proskurin <proskurin@xxxxxxxxxxxxx> --- Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: Julien Grall <julien.grall@xxxxxxx> --- v3: Cosmetic fixes. Changed the locking mechanism to "p2m_write_lock" inside the function "altp2m_reset". Removed TLB flushing and resetting of the max_mapped_gfn lowest_mapped_gfn fields within the function "altp2m_reset". These operations are performed in the function "p2m_flush_table". Protected altp2m_active(d) check in "altp2m_propagate_change". The function "altp2m_propagate_change" now decides whether an entry needs to be dropped out of the altp2m view only if the smfn value equals INVALID_MFN. Extended the function "altp2m_propagate_change" so that it returns an int value to the caller. Also, the function "apply_p2m_changes" checks the return value and fails the entire operation on error. Moved the funtion "modify_altp2m_range" out of this commit. --- xen/arch/arm/altp2m.c | 74 ++++++++++++++++++++++++++++++++++++++++++++ xen/arch/arm/p2m.c | 4 +++ xen/include/asm-arm/altp2m.h | 8 +++++ 3 files changed, 86 insertions(+) diff --git a/xen/arch/arm/altp2m.c b/xen/arch/arm/altp2m.c index 03b8ce5..b10711e 100644 --- a/xen/arch/arm/altp2m.c +++ b/xen/arch/arm/altp2m.c @@ -133,6 +133,80 @@ out: return rc; } +static inline void altp2m_reset(struct p2m_domain *p2m) +{ + p2m_write_lock(p2m); + p2m_flush_table(p2m); + p2m_write_unlock(p2m); +} + +int altp2m_propagate_change(struct domain *d, + gfn_t sgfn, + unsigned int page_order, + mfn_t smfn, + p2m_type_t p2mt, + p2m_access_t p2ma) +{ + int rc = 0; + unsigned int i; + unsigned int reset_count = 0; + unsigned int last_reset_idx = ~0; + struct p2m_domain *p2m; + mfn_t m; + + altp2m_lock(d); + + if ( !altp2m_active(d) ) + goto out; + + for ( i = 0; i < MAX_ALTP2M; i++ ) + { + if ( d->arch.altp2m_p2m[i] == NULL ) + continue; + + p2m = d->arch.altp2m_p2m[i]; + + /* + * Get the altp2m mapping. If the smfn has not been dropped, a valid + * altp2m mapping needs to be changed/modified accordingly. + */ + m = p2m_lookup_attr(p2m, sgfn, NULL, NULL, NULL); + + /* Check for a dropped page that may impact this altp2m. */ + if ( mfn_eq(smfn, INVALID_MFN) && + (gfn_x(sgfn) >= gfn_x(p2m->lowest_mapped_gfn)) && + (gfn_x(sgfn) <= gfn_x(p2m->max_mapped_gfn)) ) + { + if ( !reset_count++ ) + { + altp2m_reset(p2m); + last_reset_idx = i; + } + else + { + /* At least 2 altp2m's impacted, so reset everything. */ + for ( i = 0; i < MAX_ALTP2M; i++ ) + { + if ( i == last_reset_idx || + d->arch.altp2m_p2m[i] == NULL ) + continue; + + p2m = d->arch.altp2m_p2m[i]; + altp2m_reset(p2m); + } + goto out; + } + } + else if ( !mfn_eq(m, INVALID_MFN) ) + rc = modify_altp2m_entry(p2m, sgfn, smfn, p2mt, p2ma, page_order); + } + +out: + altp2m_unlock(d); + + return rc; +} + static void altp2m_vcpu_reset(struct vcpu *v) { struct altp2mvcpu *av = &altp2m_vcpu(v); diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index 8dee02187..dea3038 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -1033,6 +1033,10 @@ static int __p2m_set_entry(struct p2m_domain *p2m, rc = 0; + /* Update all affected altp2m views if necessary. */ + if ( p2m_is_hostp2m(p2m) ) + rc = altp2m_propagate_change(p2m->domain, sgfn, page_order, smfn, t, a); + out: unmap_domain_page(table); diff --git a/xen/include/asm-arm/altp2m.h b/xen/include/asm-arm/altp2m.h index 3e4c36d..7f385d9 100644 --- a/xen/include/asm-arm/altp2m.h +++ b/xen/include/asm-arm/altp2m.h @@ -83,4 +83,12 @@ int altp2m_set_mem_access(struct domain *d, p2m_access_t a, gfn_t gfn); +/* Propagates changes made to hostp2m to affected altp2m views. */ +int altp2m_propagate_change(struct domain *d, + gfn_t sgfn, + unsigned int page_order, + mfn_t smfn, + p2m_type_t p2mt, + p2m_access_t p2ma); + #endif /* __ASM_ARM_ALTP2M_H */ -- 2.9.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |