On Thu, Jun 23, 2011 at 07:04:48PM +0100, Owain Ainsworth wrote:
> How about this now? 
> 
> On Tue, May 31, 2011 at 12:05:04AM +0100, Owain Ainsworth wrote:
> > These functions used to be big and complicated, now they are glorified
> > wrappers around pmemrange and don't really need their own file.
> > Discussed with ariane@ a while ago.
> > 
> > ok?

OK.

> > diff --git conf/files conf/files
> > index 02da860..017e5f9 100644
> > --- conf/files
> > +++ conf/files
> > @@ -1007,7 +1007,6 @@ file uvm/uvm_object.c
> >  file uvm/uvm_page.c
> >  file uvm/uvm_pager.c
> >  file uvm/uvm_pdaemon.c
> > -file uvm/uvm_pglist.c
> >  file uvm/uvm_pmemrange.c
> >  file uvm/uvm_stat.c
> >  file uvm/uvm_swap.c
> > diff --git uvm/uvm_page.c uvm/uvm_page.c
> > index 10ef7d1..ed8e6d4 100644
> > --- uvm/uvm_page.c
> > +++ uvm/uvm_page.c
> > @@ -806,6 +806,81 @@ uvm_pagealloc_pg(struct vm_page *pg, struct uvm_object 
> > *obj, voff_t off,
> >  }
> >  
> >  /*
> > + * uvm_pglistalloc: allocate a list of pages
> > + *
> > + * => allocated pages are placed at the tail of rlist.  rlist is
> > + *    assumed to be properly initialized by caller.
> > + * => returns 0 on success or errno on failure
> > + * => doesn't take into account clean non-busy pages on inactive list
> > + * that could be used(?)
> > + * => params:
> > + * size            the size of the allocation, rounded to page size.
> > + * low             the low address of the allowed allocation range.
> > + * high            the high address of the allowed allocation range.
> > + * alignment       memory must be aligned to this power-of-two boundary.
> > + * boundary        no segment in the allocation may cross this 
> > + *                 power-of-two boundary (relative to zero).
> > + * => flags:
> > + * UVM_PLA_NOWAIT  fail if allocation fails
> > + * UVM_PLA_WAITOK  wait for memory to become avail
> > + * UVM_PLA_ZERO    return zeroed memory
> > + */
> > +int
> > +uvm_pglistalloc(psize_t size, paddr_t low, paddr_t high, paddr_t alignment,
> > +    paddr_t boundary, struct pglist *rlist, int nsegs, int flags)
> > +{
> > +   UVMHIST_FUNC("uvm_pglistalloc"); UVMHIST_CALLED(pghist);
> > +
> > +   KASSERT((alignment & (alignment - 1)) == 0);
> > +   KASSERT((boundary & (boundary - 1)) == 0);
> > +   KASSERT(!(flags & UVM_PLA_WAITOK) ^ !(flags & UVM_PLA_NOWAIT));
> > +
> > +   if (size == 0)
> > +           return (EINVAL);
> > +
> > +   if ((high & PAGE_MASK) != PAGE_MASK) {
> > +           printf("uvm_pglistalloc: Upper boundary 0x%lx "
> > +               "not on pagemask.\n", (unsigned long)high);
> > +   }
> > +
> > +   /*
> > +    * Our allocations are always page granularity, so our alignment
> > +    * must be, too.
> > +    */
> > +   if (alignment < PAGE_SIZE)
> > +           alignment = PAGE_SIZE;
> > +
> > +   low = atop(roundup(low, alignment));
> > +   /*
> > +    * high + 1 may result in overflow, in which case high becomes 0x0,
> > +    * which is the 'don't care' value.
> > +    * The only requirement in that case is that low is also 0x0, or the
> > +    * low<high assert will fail.
> > +    */
> > +   high = atop(high + 1);
> > +   size = atop(round_page(size));
> > +   alignment = atop(alignment);
> > +   if (boundary < PAGE_SIZE && boundary != 0)
> > +           boundary = PAGE_SIZE;
> > +   boundary = atop(boundary);
> > +
> > +   return uvm_pmr_getpages(size, low, high, alignment, boundary, nsegs,
> > +       flags, rlist);
> > +}
> > +
> > +/*
> > + * uvm_pglistfree: free a list of pages
> > + *
> > + * => pages should already be unmapped
> > + */
> > +void
> > +uvm_pglistfree(struct pglist *list)
> > +{
> > +   UVMHIST_FUNC("uvm_pglistfree"); UVMHIST_CALLED(pghist);
> > +   uvm_pmr_freepageq(list);
> > +}
> > +
> > +/*
> >   * interface used by the buffer cache to allocate a buffer at a time.
> >   * The pages are allocated wired in DMA accessible memory
> >   */
> > diff --git uvm/uvm_pglist.c uvm/uvm_pglist.c
> > deleted file mode 100644
> > index d29fb14..0000000
> > --- uvm/uvm_pglist.c
> > +++ /dev/null
> > @@ -1,136 +0,0 @@
> > -/* $OpenBSD$       */
> > -/* $NetBSD: uvm_pglist.c,v 1.13 2001/02/18 21:19:08 chs Exp $      */
> > -
> > -/*-
> > - * Copyright (c) 1997 The NetBSD Foundation, Inc.
> > - * All rights reserved.
> > - *  
> > - * This code is derived from software contributed to The NetBSD Foundation
> > - * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
> > - * NASA Ames Research Center.  
> > - *
> > - * Redistribution and use in source and binary forms, with or without
> > - * modification, are permitted provided that the following conditions
> > - * are met:
> > - * 1. Redistributions of source code must retain the above copyright
> > - *    notice, this list of conditions and the following disclaimer.
> > - * 2. Redistributions in binary form must reproduce the above copyright 
> > - *    notice, this list of conditions and the following disclaimer in the
> > - *    documentation and/or other materials provided with the distribution.
> > - *      
> > - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 
> > CONTRIBUTORS
> > - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
> > LIMITED
> > - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
> > PARTICULAR
> > - * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR 
> > CONTRIBUTORS
> > - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> > - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> > - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> > - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> > - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> > - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
> > THE
> > - * POSSIBILITY OF SUCH DAMAGE.
> > - */
> > -
> > -/*
> > - * uvm_pglist.c: pglist functions
> > - */
> > -
> > -#include <sys/param.h>
> > -#include <sys/systm.h>
> > -#include <sys/malloc.h>
> > -#include <sys/proc.h>
> > -
> > -#include <uvm/uvm.h>
> > -
> > -#ifdef VM_PAGE_ALLOC_MEMORY_STATS
> > -#define    STAT_INCR(v)    (v)++
> > -#define    STAT_DECR(v)    do { \
> > -           if ((v) == 0) \
> > -                   printf("%s:%d -- Already 0!\n", __FILE__, __LINE__); \
> > -           else \
> > -                   (v)--; \
> > -   } while (0)
> > -u_long     uvm_pglistalloc_npages;
> > -#else
> > -#define    STAT_INCR(v)
> > -#define    STAT_DECR(v)
> > -#endif
> > -
> > -/*
> > - * uvm_pglistalloc: allocate a list of pages
> > - *
> > - * => allocated pages are placed at the tail of rlist.  rlist is
> > - *    assumed to be properly initialized by caller.
> > - * => returns 0 on success or errno on failure
> > - * => XXX: implementation allocates only a single segment, also
> > - * might be able to better advantage of vm_physeg[].
> > - * => doesn't take into account clean non-busy pages on inactive list
> > - * that could be used(?)
> > - * => params:
> > - * size            the size of the allocation, rounded to page size.
> > - * low             the low address of the allowed allocation range.
> > - * high            the high address of the allowed allocation range.
> > - * alignment       memory must be aligned to this power-of-two boundary.
> > - * boundary        no segment in the allocation may cross this 
> > - *                 power-of-two boundary (relative to zero).
> > - * => flags:
> > - * UVM_PLA_NOWAIT  fail if allocation fails
> > - * UVM_PLA_WAITOK  wait for memory to become avail
> > - * UVM_PLA_ZERO    return zeroed memory
> > - */
> > -
> > -int
> > -uvm_pglistalloc(psize_t size, paddr_t low, paddr_t high, paddr_t alignment,
> > -    paddr_t boundary, struct pglist *rlist, int nsegs, int flags)
> > -{
> > -   UVMHIST_FUNC("uvm_pglistalloc"); UVMHIST_CALLED(pghist);
> > -
> > -   KASSERT((alignment & (alignment - 1)) == 0);
> > -   KASSERT((boundary & (boundary - 1)) == 0);
> > -   KASSERT(!(flags & UVM_PLA_WAITOK) ^ !(flags & UVM_PLA_NOWAIT));
> > -
> > -   if (size == 0)
> > -           return (EINVAL);
> > -
> > -   if ((high & PAGE_MASK) != PAGE_MASK) {
> > -           printf("uvm_pglistalloc: Upper boundary 0x%lx "
> > -               "not on pagemask.\n", (unsigned long)high);
> > -   }
> > -
> > -   /*
> > -    * Our allocations are always page granularity, so our alignment
> > -    * must be, too.
> > -    */
> > -   if (alignment < PAGE_SIZE)
> > -           alignment = PAGE_SIZE;
> > -
> > -   low = atop(roundup(low, alignment));
> > -   /*
> > -    * high + 1 may result in overflow, in which case high becomes 0x0,
> > -    * which is the 'don't care' value.
> > -    * The only requirement in that case is that low is also 0x0, or the
> > -    * low<high assert will fail.
> > -    */
> > -   high = atop(high + 1);
> > -   size = atop(round_page(size));
> > -   alignment = atop(alignment);
> > -   if (boundary < PAGE_SIZE && boundary != 0)
> > -           boundary = PAGE_SIZE;
> > -   boundary = atop(boundary);
> > -
> > -   return uvm_pmr_getpages(size, low, high, alignment, boundary, nsegs,
> > -       flags, rlist);
> > -}
> > -
> > -/*
> > - * uvm_pglistfree: free a list of pages
> > - *
> > - * => pages should already be unmapped
> > - */
> > -
> > -void
> > -uvm_pglistfree(struct pglist *list)
> > -{
> > -   UVMHIST_FUNC("uvm_pglistfree"); UVMHIST_CALLED(pghist);
> > -   uvm_pmr_freepageq(list);
> > -}
> > -- 
> > 1.7.5
> > 
> > 
> > -- 
> > Westheimer's Discovery:
> >     A couple of months in the laboratory can frequently save a
> >     couple of hours in the library.
> 
> -- 
> Furbling, v.:
>       Having to wander through a maze of ropes at an airport or bank
>       even when you are the only person in line.
>               -- Rich Hall, "Sniglets"

Reply via email to