diff options
author | alc <alc@FreeBSD.org> | 2007-05-05 19:50:28 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2007-05-05 19:50:28 +0000 |
commit | b34f6f7ab1b2b31d561cfbfbc0b43a23c6d93a3e (patch) | |
tree | 7aa0cbd313dfa6ace4e0a35a84679f7d3492a165 /sys/vm | |
parent | 5326cfc8d7152339e4530123781c6ad0d0a22261 (diff) | |
download | FreeBSD-src-b34f6f7ab1b2b31d561cfbfbc0b43a23c6d93a3e.zip FreeBSD-src-b34f6f7ab1b2b31d561cfbfbc0b43a23c6d93a3e.tar.gz |
Define every architecture as either VM_PHYSSEG_DENSE or
VM_PHYSSEG_SPARSE depending on whether the physical address space is
densely or sparsely populated with memory. The effect of this
definition is to determine which of two implementations of
vm_page_array and PHYS_TO_VM_PAGE() is used. The legacy
implementation is obtained by defining VM_PHYSSEG_DENSE, and a new
implementation that trades off time for space is obtained by defining
VM_PHYSSEG_SPARSE. For now, all architectures except for ia64 and
sparc64 define VM_PHYSSEG_DENSE. Defining VM_PHYSSEG_SPARSE on ia64
allows the entirety of my Itanium 2's memory to be used. Previously,
only the first 1 GB could be used. Defining VM_PHYSSEG_SPARSE on
sparc64 allows USIIIi-based systems to boot without crashing.
This change is a combination of Nathan Whitehorn's patch and my own
work in perforce.
Discussed with: kmacy, marius, Nathan Whitehorn
PR: 112194
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_page.c | 8 | ||||
-rw-r--r-- | sys/vm/vm_page.h | 22 |
2 files changed, 28 insertions, 2 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index e97eca9..d4f8148 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -298,7 +298,15 @@ vm_page_startup(vm_offset_t vaddr) * page). */ first_page = low_water / PAGE_SIZE; +#ifdef VM_PHYSSEG_SPARSE + page_range = 0; + for (i = 0; phys_avail[i + 1] != 0; i += 2) + page_range += atop(phys_avail[i + 1] - phys_avail[i]); +#elif defined(VM_PHYSSEG_DENSE) page_range = high_water / PAGE_SIZE - first_page; +#else +#error "Either VM_PHYSSEG_DENSE or VM_PHYSSEG_SPARSE must be defined." +#endif npages = (total - (page_range * sizeof(struct vm_page)) - (end - new_end)) / PAGE_SIZE; end = new_end; diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h index 1b75f38..0b1803f 100644 --- a/sys/vm/vm_page.h +++ b/sys/vm/vm_page.h @@ -240,6 +240,9 @@ extern struct pq_coloring page_queue_coloring; #define ACT_MAX 64 #ifdef _KERNEL + +#include <vm/vm_param.h> + /* * Each pageable resident page falls into one of four lists: * @@ -275,8 +278,23 @@ extern long first_page; /* first physical page number */ #define VM_PAGE_TO_PHYS(entry) ((entry)->phys_addr) -#define PHYS_TO_VM_PAGE(pa) \ - (&vm_page_array[atop(pa) - first_page ]) +static __inline vm_page_t PHYS_TO_VM_PAGE(vm_paddr_t pa); + +static __inline vm_page_t +PHYS_TO_VM_PAGE(vm_paddr_t pa) +{ +#ifdef VM_PHYSSEG_SPARSE + int i, j = 0; + + for (i = 0; phys_avail[i + 1] <= pa || phys_avail[i] > pa; i += 2) + j += atop(phys_avail[i + 1] - phys_avail[i]); + return (&vm_page_array[j + atop(pa - phys_avail[i])]); +#elif defined(VM_PHYSSEG_DENSE) + return (&vm_page_array[atop(pa) - first_page]); +#else +#error "Either VM_PHYSSEG_DENSE or VM_PHYSSEG_SPARSE must be defined." +#endif +} extern struct mtx vm_page_queue_mtx; #define vm_page_lock_queues() mtx_lock(&vm_page_queue_mtx) |