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?
> 
> 
> 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