[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 13/22] xen/arm: p2m: Introduce p2m_{read, write}_{, un}lock helpers
Some functions in the p2m code do not require to modify the P2M code. Document it by introducing separate helpers to lock the p2m. This patch does not change the lock. This will be done in a subsequent patch. Signed-off-by: Julien Grall <julien.grall@xxxxxxx> --- xen/arch/arm/p2m.c | 49 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index 4c279dc..d74c249 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -47,11 +47,36 @@ static bool_t p2m_mapping(lpae_t pte) return p2m_valid(pte) && !pte.p2m.table; } +static inline void p2m_write_lock(struct p2m_domain *p2m) +{ + spin_lock(&p2m->lock); +} + +static inline void p2m_write_unlock(struct p2m_domain *p2m) +{ + spin_unlock(&p2m->lock); +} + +static inline void p2m_read_lock(struct p2m_domain *p2m) +{ + spin_lock(&p2m->lock); +} + +static inline void p2m_read_unlock(struct p2m_domain *p2m) +{ + spin_unlock(&p2m->lock); +} + +static inline int p2m_is_locked(struct p2m_domain *p2m) +{ + return spin_is_locked(&p2m->lock); +} + void p2m_dump_info(struct domain *d) { struct p2m_domain *p2m = &d->arch.p2m; - spin_lock(&p2m->lock); + p2m_read_lock(p2m); printk("p2m mappings for domain %d (vmid %d):\n", d->domain_id, p2m->vmid); BUG_ON(p2m->stats.mappings[0] || p2m->stats.shattered[0]); @@ -60,7 +85,7 @@ void p2m_dump_info(struct domain *d) printk(" 2M mappings: %ld (shattered %ld)\n", p2m->stats.mappings[2], p2m->stats.shattered[2]); printk(" 4K mappings: %ld\n", p2m->stats.mappings[3]); - spin_unlock(&p2m->lock); + p2m_read_unlock(p2m); } void memory_type_changed(struct domain *d) @@ -166,7 +191,7 @@ static mfn_t __p2m_lookup(struct domain *d, gfn_t gfn, p2m_type_t *t) p2m_type_t _t; unsigned int level, root_table; - ASSERT(spin_is_locked(&p2m->lock)); + ASSERT(p2m_is_locked(p2m)); BUILD_BUG_ON(THIRD_MASK != PAGE_MASK); /* Allow t to be NULL */ @@ -233,9 +258,9 @@ mfn_t p2m_lookup(struct domain *d, gfn_t gfn, p2m_type_t *t) mfn_t ret; struct p2m_domain *p2m = &d->arch.p2m; - spin_lock(&p2m->lock); + p2m_read_lock(p2m); ret = __p2m_lookup(d, gfn, t); - spin_unlock(&p2m->lock); + p2m_read_unlock(p2m); return ret; } @@ -476,7 +501,7 @@ static int __p2m_get_mem_access(struct domain *d, gfn_t gfn, #undef ACCESS }; - ASSERT(spin_is_locked(&p2m->lock)); + ASSERT(p2m_is_locked(p2m)); /* If no setting was ever set, just return rwx. */ if ( !p2m->mem_access_enabled ) @@ -945,7 +970,7 @@ static int apply_p2m_changes(struct domain *d, */ flush_pt = iommu_enabled && !iommu_has_feature(d, IOMMU_FEAT_COHERENT_WALK); - spin_lock(&p2m->lock); + p2m_write_lock(p2m); /* Static mapping. P2M_ROOT_PAGES > 1 are handled below */ if ( P2M_ROOT_PAGES == 1 ) @@ -1149,7 +1174,7 @@ out: unmap_domain_page(mappings[level]); } - spin_unlock(&p2m->lock); + p2m_write_unlock(p2m); if ( rc < 0 && ( op == INSERT ) && addr != start_gpaddr ) @@ -1530,7 +1555,7 @@ struct page_info *get_page_from_gva(struct vcpu *v, vaddr_t va, if ( v != current ) return NULL; - spin_lock(&p2m->lock); + p2m_read_lock(p2m); rc = gvirt_to_maddr(va, &maddr, flags); @@ -1550,7 +1575,7 @@ err: if ( !page && p2m->mem_access_enabled ) page = p2m_mem_access_check_and_get_page(va, flags); - spin_unlock(&p2m->lock); + p2m_read_unlock(p2m); return page; } @@ -1824,9 +1849,9 @@ int p2m_get_mem_access(struct domain *d, gfn_t gfn, int ret; struct p2m_domain *p2m = p2m_get_hostp2m(d); - spin_lock(&p2m->lock); + p2m_read_lock(p2m); ret = __p2m_get_mem_access(d, gfn, access); - spin_unlock(&p2m->lock); + p2m_read_unlock(p2m); return ret; } -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |