From d0a83a83bf3fbd894a97dfdd77dee4e0cf887d10 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sat, 17 May 2008 19:32:48 +0000 Subject: [PATCH] In order to map device memory using superpages, mmap(2) must find a superpage-aligned virtual address for the mapping. Revision 1.65 implemented an overly simplistic and generally ineffectual method for finding a superpage-aligned virtual address. Specifically, it rounds the virtual address corresponding to the end of the data segment up to the next superpage-aligned virtual address. If this virtual address is unallocated, then the device will be mapped using superpages. Unfortunately, in modern times, where applications like the X server dynamically load much of their code, this virtual address is already allocated. In such cases, mmap(2) simply uses the first available virtual address, which is not necessarily superpage aligned. This revision changes mmap(2) to use a more robust method, specifically, the VMFS_ALIGNED_SPACE option that is now implemented by vm_map_find(). --- sys/vm/vm_mmap.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index d5b6e3c90e0..ca86cf97f2e 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -1456,15 +1456,13 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot, maxprot |= VM_PROT_EXECUTE; #endif - if (fitit) - *addr = pmap_addr_hint(object, *addr, size); - if (flags & MAP_STACK) rv = vm_map_stack(map, *addr, size, prot, maxprot, docow | MAP_STACK_GROWS_DOWN); else if (fitit) - rv = vm_map_find(map, object, foff, addr, size, TRUE, - prot, maxprot, docow); + rv = vm_map_find(map, object, foff, addr, size, + object != NULL && object->type == OBJT_DEVICE ? + VMFS_ALIGNED_SPACE : VMFS_ANY_SPACE, prot, maxprot, docow); else rv = vm_map_fixed(map, object, foff, *addr, size, prot, maxprot, docow);