Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/linuxkpi/common/src/linux_page.c
Show First 20 Lines • Show All 216 Lines • ▼ Show 20 Lines | __get_user_pages_fast(unsigned long start, int nr_pages, int write, | ||||
if (nr_pages == 0 || in_interrupt()) | if (nr_pages == 0 || in_interrupt()) | ||||
return (0); | return (0); | ||||
MPASS(pages != NULL); | MPASS(pages != NULL); | ||||
va = start; | va = start; | ||||
map = &curthread->td_proc->p_vmspace->vm_map; | map = &curthread->td_proc->p_vmspace->vm_map; | ||||
end = start + (((size_t)nr_pages) << PAGE_SHIFT); | end = start + (((size_t)nr_pages) << PAGE_SHIFT); | ||||
if (start < vm_map_min(map) || end > vm_map_max(map)) | if (!vm_map_check_range(map, start, end)) | ||||
return (-EINVAL); | return (-EINVAL); | ||||
prot = write ? (VM_PROT_READ | VM_PROT_WRITE) : VM_PROT_READ; | prot = write ? (VM_PROT_READ | VM_PROT_WRITE) : VM_PROT_READ; | ||||
for (count = 0, mp = pages, va = start; va < end; | for (count = 0, mp = pages, va = start; va < end; | ||||
mp++, va += PAGE_SIZE, count++) { | mp++, va += PAGE_SIZE, count++) { | ||||
*mp = pmap_extract_and_hold(map->pmap, va, prot); | *mp = pmap_extract_and_hold(map->pmap, va, prot); | ||||
if (*mp == NULL) | if (*mp == NULL) | ||||
break; | break; | ||||
▲ Show 20 Lines • Show All 45 Lines • Show Last 20 Lines |