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.