From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: Re: [PATCH v5 1/4] xen: introduce a helper to allocate non-contiguous memory Date: Fri, 08 May 2015 16:08:59 +0100 Message-ID: <554CEDAB0200007800078650@mail.emea.novell.com> References: <1431095651-25935-1-git-send-email-roger.pau@citrix.com> <1431095651-25935-2-git-send-email-roger.pau@citrix.com> <554CCD1D.9040309@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Yqjte-0006fg-FE for xen-devel@lists.xenproject.org; Fri, 08 May 2015 15:09:02 +0000 In-Reply-To: <554CCD1D.9040309@citrix.com> Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Andrew Cooper , Roger Pau Monne , xen-devel@lists.xenproject.org Cc: Tim Deegan , Stefano Stabellini , Ian Campbell List-Id: xen-devel@lists.xenproject.org >>> On 08.05.15 at 16:50, wrote: > On 08/05/15 15:34, Roger Pau Monne wrote: >> + >> +void *vmalloc(unsigned long size) >> +{ >> + unsigned long *mfn; >> + unsigned long pages, i; >> + struct page_info *pg; >> + void *va = NULL; >> + >> + ASSERT(!in_irq()); >> + >> + if ( size == 0 ) >> + return ZERO_BLOCK_PTR; >> + >> + pages = DIV_ROUND_UP(size, PAGE_SIZE); >> + mfn = xzalloc_array(unsigned long, pages); > > This can avoid the zeroing if... > >> + 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); >> + for ( i = 0; i < pages; i++ ) >> + if ( mfn[i] != 0 ) >> + free_domheap_pages(mfn_to_page(mfn[i]), 1); > > this loop turns into > > while ( i ) > free_domheap_pages(mfn_to_page(mfn[--i], 1); or (preferably imo) while ( i-- ) free_domheap_pages(mfn_to_page(mfn[i], 1); Jan