[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH V4] xen/gnttab: Store frame GFN in struct page_info on Arm
On 03.12.2021 21:33, Oleksandr Tyshchenko wrote: > --- a/xen/arch/arm/mm.c > +++ b/xen/arch/arm/mm.c > @@ -1382,8 +1382,10 @@ void share_xen_page_with_guest(struct page_info *page, > struct domain *d, > spin_lock(&d->page_alloc_lock); > > /* The incremented type count pins as writable or read-only. */ > - page->u.inuse.type_info = > - (flags == SHARE_ro ? PGT_none : PGT_writable_page) | 1; > + page->u.inuse.type_info &= ~(PGT_type_mask | PGT_count_mask); > + page->u.inuse.type_info |= (flags == SHARE_ro ? PGT_none > + : PGT_writable_page) | > + MASK_INSR(1, PGT_count_mask); It's certainly up to the Arm maintainers to judge, but I would have deemed it better (less risky going forward) if PGT_count_mask continued to use the bottom bits. (I guess I may have said so before.) > @@ -1487,7 +1489,23 @@ int xenmem_add_to_physmap_one( > } > > /* Map at new location. */ > - rc = guest_physmap_add_entry(d, gfn, mfn, 0, t); > + if ( !p2m_is_ram(t) || !is_xen_heap_mfn(mfn) ) > + rc = guest_physmap_add_entry(d, gfn, mfn, 0, t); > + else > + { > + struct p2m_domain *p2m = p2m_get_hostp2m(d); > + > + p2m_write_lock(p2m); > + if ( gfn_eq(page_get_xenheap_gfn(mfn_to_page(mfn)), INVALID_GFN) ) > + { > + rc = p2m_set_entry(p2m, gfn, 1, mfn, t, p2m->default_access); > + if ( !rc ) > + page_set_xenheap_gfn(mfn_to_page(mfn), gfn); > + } > + else > + rc = -EBUSY; May I suggest to avoid failing here when page_get_xenheap_gfn(mfn_to_page(mfn)) matches the passed in GFN? > @@ -2169,6 +2170,9 @@ void *alloc_xenheap_pages(unsigned int order, unsigned > int memflags) > if ( unlikely(pg == NULL) ) > return NULL; > > + for ( i = 0; i < (1u << order); i++ ) > + arch_alloc_xenheap_page(&pg[i]); > + > memguard_unguard_range(page_to_virt(pg), 1 << (order + PAGE_SHIFT)); I think this and ... > @@ -2177,14 +2181,22 @@ void *alloc_xenheap_pages(unsigned int order, > unsigned int memflags) > > void free_xenheap_pages(void *v, unsigned int order) > { > + struct page_info *pg; > + unsigned int i; > + > ASSERT(!in_irq()); > > if ( v == NULL ) > return; > > + pg = virt_to_page(v); > + > memguard_guard_range(v, 1 << (order + PAGE_SHIFT)); ... this really want to (logically) move into the new arch hooks. That'll effectively mean to simply drop the Arm stubs afaict (and I notice there's some dead code there on x86, which I guess I'll make a patch to clean up). But first of all this suggests that you want to call the hooks with base page and order, putting the loops there. > @@ -166,6 +173,32 @@ extern unsigned long xenheap_base_pdx; > > #define maddr_get_owner(ma) (page_get_owner(maddr_to_page((ma)))) > > +static inline gfn_t page_get_xenheap_gfn(struct page_info *p) const please wherever possible. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |