diff options
| author | Alan Cox <alc@FreeBSD.org> | 2011-11-04 04:41:58 +0000 |
|---|---|---|
| committer | Alan Cox <alc@FreeBSD.org> | 2011-11-04 04:41:58 +0000 |
| commit | 2614c5c47c52aec94eb4990ba8ca5cc3ed43292a (patch) | |
| tree | 875d300ec2939748834cf525568fe0f4c41417d0 /sys | |
| parent | cd06ae5c1b5f15d66736bd0e22c98ba985afa84c (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/vm/vm_contig.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/sys/vm/vm_contig.c b/sys/vm/vm_contig.c index 81fe6a5c8f9c..50f95a506090 100644 --- a/sys/vm/vm_contig.c +++ b/sys/vm/vm_contig.c @@ -258,8 +258,8 @@ kmem_alloc_attr(vm_map_t map, vm_size_t size, int flags, vm_paddr_t low, retry: m = vm_phys_alloc_contig(1, low, high, PAGE_SIZE, 0); if (m == NULL) { + VM_OBJECT_UNLOCK(object); if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { - VM_OBJECT_UNLOCK(object); vm_map_unlock(map); vm_contig_grow_cache(tries, low, high); vm_map_lock(map); @@ -267,13 +267,12 @@ retry: tries++; goto retry; } - while (i != 0) { - i -= PAGE_SIZE; - m = vm_page_lookup(object, OFF_TO_IDX(offset + - i)); - vm_page_free(m); - } - VM_OBJECT_UNLOCK(object); + /* + * Since the pages that were allocated by any previous + * iterations of this loop are not busy, they can be + * freed by vm_object_page_remove(), which is called + * by vm_map_delete(). + */ vm_map_delete(map, addr, addr + size); vm_map_unlock(map); return (0); |
