[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/4] xen/arm: implement page reference and grant table functions needed by grant_table.c
On Thu, 12 Jul 2012, Tim Deegan wrote: > At 12:05 +0100 on 04 Jul (1341403532), Stefano Stabellini wrote: > > The implementation is strongly "inspired" by their x86 counterparts, > > except that we assume paging_mode_external and paging_mode_translate. > > > > TODO: read_only mappings and gnttab_mark_dirty. > > Do we actually need these refcounts on ARM? Or was it just the > typecount we thought we could do without? Nope, we need them for the grant_table. > > +struct domain *page_get_owner_and_reference(struct page_info *page) > > +{ > > + unsigned long x, y = page->count_info; > > + > > + do { > > + x = y; > > + /* > > + * Count == 0: Page is not allocated, so we cannot take a > > reference. > > + * Count == -1: Reference count would wrap, which is invalid. > > + * Count == -2: Remaining unused ref is reserved for > > get_page_light(). > > + */ > > + if ( unlikely(((x + 2) & PGC_count_mask) <= 2) ) > > + return NULL; > > + } > > + while ( (y = cmpxchg(&page->count_info, x, x + 1)) != x ); > > get_page_light() is an x86-ism, so we don't need to leave room for it here. I'll remove it > > +void gnttab_clear_flag(unsigned long nr, uint16_t *addr) > > +{ > > + /* > > + * Note that this cannot be clear_bit(), as the access must be > > + * confined to the specified 2 bytes. > > + */ > > + uint16_t mask = ~(1 << nr), old; > > + > > + do { > > + old = *addr; > > A hard tab has snuck in here. I'll fix > > + } while (cmpxchg(addr, old, old & mask) != old); > > This could be done more efficiently with the underlying LRREXH/STREXH > instructions but maybe not worth it? Is this on any hot paths? It is called whem mapping/unmapping grant references, I don't think it counts as hot path. > > +} > > + > > +void gnttab_mark_dirty(struct domain *d, unsigned long l) > > +{ > > + /* XXX: mark dirty */ > > +} > > + > > +int create_grant_host_mapping(unsigned long addr, unsigned long frame, > > + unsigned int flags, unsigned int cache_flags) > > +{ > > + int rc; > > + > > + if ( cache_flags || (flags & ~GNTMAP_readonly) != GNTMAP_host_map ) > > + return GNTST_general_error; > > + > > + /* XXX: read only mappings > > + if ( flags & GNTMAP_readonly ) > > + p2mt = p2m_grant_map_ro; > > + else > > + p2mt = p2m_grant_map_rw; > > + */ > > + rc = guest_physmap_add_page(current->domain, > > + addr >> PAGE_SHIFT, frame, 0); > > I'm a little worried about taking this in, in case we never get round to > making the read-only grants read-only. Could we get away with making > that an error case or are they needed right now? Good idea, I'll return an error. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |