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"