diff options
-rw-r--r-- | sys/mips/mips/pmap.c | 18 | ||||
-rw-r--r-- | sys/vm/vm_contig.c | 21 | ||||
-rw-r--r-- | sys/vm/vm_pageout.h | 1 |
3 files changed, 24 insertions, 16 deletions
diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c index 778f808..ef8c975 100644 --- a/sys/mips/mips/pmap.c +++ b/sys/mips/mips/pmap.c @@ -967,19 +967,23 @@ pmap_ptpgzone_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) { vm_page_t m; vm_paddr_t paddr; + int tries; KASSERT(bytes == PAGE_SIZE, ("pmap_ptpgzone_allocf: invalid allocation size %d", bytes)); *flags = UMA_SLAB_PRIV; - for (;;) { - m = vm_phys_alloc_contig(1, 0, MIPS_KSEG0_LARGEST_PHYS, - PAGE_SIZE, PAGE_SIZE); - if (m != NULL) - break; - if ((wait & M_WAITOK) == 0) + tries = 0; +retry: + m = vm_phys_alloc_contig(1, 0, MIPS_KSEG0_LARGEST_PHYS, + PAGE_SIZE, PAGE_SIZE); + if (m == NULL) { + if (tries < ((wait & M_NOWAIT) != 0 ? 1 : 3)) { + vm_contig_grow_cache(tries, 0, MIPS_KSEG0_LARGEST_PHYS); + tries++; + goto retry; + } else return (NULL); - VM_WAIT; } paddr = VM_PAGE_TO_PHYS(m); diff --git a/sys/vm/vm_contig.c b/sys/vm/vm_contig.c index 025031e..b9e0579 100644 --- a/sys/vm/vm_contig.c +++ b/sys/vm/vm_contig.c @@ -87,8 +87,6 @@ __FBSDID("$FreeBSD$"); #include <vm/vm_phys.h> #include <vm/vm_extern.h> -static void vm_contig_grow_cache(int tries); - static int vm_contig_launder_page(vm_page_t m, vm_page_t *next) { @@ -157,9 +155,10 @@ vm_contig_launder_page(vm_page_t m, vm_page_t *next) } static int -vm_contig_launder(int queue) +vm_contig_launder(int queue, vm_paddr_t low, vm_paddr_t high) { vm_page_t m, next; + vm_paddr_t pa; int error; TAILQ_FOREACH_SAFE(m, &vm_page_queues[queue].pl, pageq, next) { @@ -168,6 +167,10 @@ vm_contig_launder(int queue) if ((m->flags & PG_MARKER) != 0) continue; + pa = VM_PAGE_TO_PHYS(m); + if (pa < low || pa + PAGE_SIZE > high) + continue; + if (!vm_pageout_page_lock(m, &next)) { vm_page_unlock(m); continue; @@ -203,8 +206,8 @@ vm_page_release_contig(vm_page_t m, vm_pindex_t count) /* * Increase the number of cached pages. */ -static void -vm_contig_grow_cache(int tries) +void +vm_contig_grow_cache(int tries, vm_paddr_t low, vm_paddr_t high) { int actl, actmax, inactl, inactmax; @@ -214,11 +217,11 @@ vm_contig_grow_cache(int tries) actl = 0; actmax = tries < 2 ? 0 : cnt.v_active_count; again: - if (inactl < inactmax && vm_contig_launder(PQ_INACTIVE)) { + if (inactl < inactmax && vm_contig_launder(PQ_INACTIVE, low, high)) { inactl++; goto again; } - if (actl < actmax && vm_contig_launder(PQ_ACTIVE)) { + if (actl < actmax && vm_contig_launder(PQ_ACTIVE, low, high)) { actl++; goto again; } @@ -261,7 +264,7 @@ retry: if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { VM_OBJECT_UNLOCK(object); vm_map_unlock(map); - vm_contig_grow_cache(tries); + vm_contig_grow_cache(tries, low, high); vm_map_lock(map); VM_OBJECT_LOCK(object); goto retry; @@ -368,7 +371,7 @@ retry: pages = vm_phys_alloc_contig(npgs, low, high, alignment, boundary); if (pages == NULL) { if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { - vm_contig_grow_cache(tries); + vm_contig_grow_cache(tries, low, high); tries++; goto retry; } diff --git a/sys/vm/vm_pageout.h b/sys/vm/vm_pageout.h index 4759dd7..4857c3e 100644 --- a/sys/vm/vm_pageout.h +++ b/sys/vm/vm_pageout.h @@ -105,5 +105,6 @@ boolean_t vm_pageout_fallback_object_lock(vm_page_t, vm_page_t *); int vm_pageout_flush(vm_page_t *, int, int); void vm_pageout_oom(int shortage); boolean_t vm_pageout_page_lock(vm_page_t, vm_page_t *); +void vm_contig_grow_cache(int, vm_paddr_t, vm_paddr_t); #endif #endif /* _VM_VM_PAGEOUT_H_ */ |