[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 1/4] xen: introduce a helper to allocate non-contiguous memory
>>> On 08.05.15 at 16:34, <roger.pau@xxxxxxxxxx> wrote: > --- a/xen/common/vmap.c > +++ b/xen/common/vmap.c > @@ -146,7 +146,7 @@ static unsigned int vm_index(const void *va) > test_bit(idx, vm_bitmap) ? idx : 0; > } > > -static unsigned int vm_size(const void *va) > +unsigned int vm_size(const void *va) I was hoping you would avoid this. I really think vmalloc() and vfree() should go into vmap.c. They certainly don't belong into ... > --- a/xen/common/xmalloc_tlsf.c > +++ b/xen/common/xmalloc_tlsf.c ... here. > +void *vmalloc(unsigned long size) > +{ > + unsigned long *mfn; > + unsigned long pages, i; > + struct page_info *pg; > + void *va = NULL; > + > + ASSERT(!in_irq()); I don't think you explicitly need this here - the xzalloc_array() below will catch that case, and the function here doesn't itself depend on that. > + if ( size == 0 ) > + return ZERO_BLOCK_PTR; If you really wanted this, vfree() would need to cope. But I think it's better to simply ASSERT(size) here. > + pages = DIV_ROUND_UP(size, PAGE_SIZE); I think this would better use PFN_UP(). > + mfn = xzalloc_array(unsigned long, pages); > + if ( mfn == NULL ) > + return NULL; > + > + for ( i = 0; i < pages; i++ ) > + { > + pg = alloc_domheap_pages(NULL, 1, 0); > + if ( pg == NULL ) > + goto error; > + mfn[i] = page_to_mfn(pg); > + } > + > + va = vmap(mfn, pages); > + if ( va == NULL ) > + goto error; > + > + xfree(mfn); > + return va; > + > + error: > + vunmap(va); I don't think vunmap() copes with NULL passed into it. But I also don't see why you call it in the first place - no path leads here with va != NULL. > +void vfree(void *va) > +{ > + unsigned int i, pages = vm_size(va); > + > + if ( pages == 0 ) > + return; This then shouldn't be needed either (or become an ASSERT()). > --- a/xen/include/xen/xmalloc.h > +++ b/xen/include/xen/xmalloc.h > @@ -30,6 +30,10 @@ extern void xfree(void *); > extern void *_xmalloc(unsigned long size, unsigned long align); > extern void *_xzalloc(unsigned long size, unsigned long align); > > +void *vmalloc(unsigned long size); > +void *vzalloc(unsigned long size); > +void vfree(void *va); And consequently this is the wrong place then too. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |