[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 14/18] arm/altp2m: Add HVMOP_altp2m_set_mem_access.
Hi Julien, On 07/06/2016 07:08 PM, Julien Grall wrote: > Hi, > > On 04/07/16 12:45, Sergej Proskurin wrote: >> --- a/xen/arch/arm/p2m.c >> +++ b/xen/arch/arm/p2m.c >> @@ -2085,6 +2085,159 @@ bool_t p2m_mem_access_check(paddr_t gpa, >> vaddr_t gla, const struct npfec npfec) > > [...] > >> +static inline >> +int p2m_set_altp2m_mem_access(struct domain *d, struct p2m_domain >> *hp2m, >> + struct p2m_domain *ap2m, p2m_access_t a, >> + gfn_t gfn) >> +{ >> + p2m_type_t p2mt; >> + xenmem_access_t xma_old; >> + paddr_t gpa = pfn_to_paddr(gfn_x(gfn)); >> + paddr_t maddr, mask = 0; >> + unsigned int level; >> + unsigned long mattr; >> + int rc; >> + >> + static const p2m_access_t memaccess[] = { >> +#define ACCESS(ac) [XENMEM_access_##ac] = p2m_access_##ac >> + ACCESS(n), >> + ACCESS(r), >> + ACCESS(w), >> + ACCESS(rw), >> + ACCESS(x), >> + ACCESS(rx), >> + ACCESS(wx), >> + ACCESS(rwx), >> + ACCESS(rx2rw), >> + ACCESS(n2rwx), >> +#undef ACCESS >> + }; >> + >> + /* Check if entry is part of the altp2m view. */ >> + spin_lock(&ap2m->lock); >> + maddr = __p2m_lookup(ap2m, gpa, &p2mt); >> + spin_unlock(&ap2m->lock); >> + >> + /* Check host p2m if no valid entry in ap2m. */ >> + if ( maddr == INVALID_PADDR ) >> + { >> + /* Check if entry is part of the host p2m view. */ >> + spin_lock(&hp2m->lock); >> + maddr = __p2m_lookup(hp2m, gpa, &p2mt); >> + if ( maddr == INVALID_PADDR || p2mt != p2m_ram_rw ) >> + goto out; >> + >> + rc = __p2m_get_mem_access(hp2m, gfn, &xma_old); >> + if ( rc ) >> + goto out; >> + >> + rc = p2m_get_gfn_level_and_attr(hp2m, gpa, &level, &mattr); >> + if ( rc ) >> + goto out; >> + spin_unlock(&hp2m->lock); >> + >> + mask = level_masks[level]; >> + >> + /* If this is a superpage, copy that first. */ >> + if ( level != 3 ) >> + { >> + rc = apply_p2m_changes(d, ap2m, INSERT, >> + gpa & mask, >> + (gpa + level_sizes[level]) & mask, >> + maddr & mask, mattr, 0, p2mt, >> + memaccess[xma_old]); >> + if ( rc < 0 ) >> + goto out; >> + } >> + } >> + else >> + { >> + spin_lock(&ap2m->lock); >> + rc = p2m_get_gfn_level_and_attr(ap2m, gpa, &level, &mattr); >> + spin_unlock(&ap2m->lock); >> + if ( rc ) >> + goto out; >> + } >> + >> + /* Set mem access attributes - currently supporting only one >> (4K) page. */ >> + mask = level_masks[3]; >> + return apply_p2m_changes(d, ap2m, INSERT, >> + gpa & mask, >> + (gpa + level_sizes[level]) & mask, >> + maddr & mask, mattr, 0, p2mt, a); >> + >> +out: >> + if ( spin_is_locked(&hp2m->lock) ) >> + spin_unlock(&hp2m->lock); > > I have not spotted this before. spin_is_locked does not ensure that > the lock was taken by this CPU. So you may unlock for another CPU. > Thank you. I will consider this in the next patch. Cheers, ~Sergej _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |