Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/kern_exec.c
Show First 20 Lines • Show All 975 Lines • ▼ Show 20 Lines | |||||
#if VM_NRESERVLEVEL > 0 | #if VM_NRESERVLEVEL > 0 | ||||
vm_object_color(object, 0); | vm_object_color(object, 0); | ||||
#endif | #endif | ||||
ma[0] = vm_page_grab(object, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | | ma[0] = vm_page_grab(object, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY | | ||||
VM_ALLOC_WIRED); | VM_ALLOC_WIRED); | ||||
if (ma[0]->valid != VM_PAGE_BITS_ALL) { | if (ma[0]->valid != VM_PAGE_BITS_ALL) { | ||||
vm_page_xbusy(ma[0]); | vm_page_xbusy(ma[0]); | ||||
if (!vm_pager_has_page(object, 0, NULL, &after)) { | if (!vm_pager_has_page(object, 0, NULL, &after)) { | ||||
vm_page_lock(ma[0]); | |||||
vm_page_unwire_noq(ma[0]); | vm_page_unwire_noq(ma[0]); | ||||
vm_page_free(ma[0]); | vm_page_free(ma[0]); | ||||
vm_page_unlock(ma[0]); | |||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
return (EIO); | return (EIO); | ||||
} | } | ||||
initial_pagein = min(after, VM_INITIAL_PAGEIN); | initial_pagein = min(after, VM_INITIAL_PAGEIN); | ||||
KASSERT(initial_pagein <= object->size, | KASSERT(initial_pagein <= object->size, | ||||
("%s: initial_pagein %d object->size %ju", | ("%s: initial_pagein %d object->size %ju", | ||||
__func__, initial_pagein, (uintmax_t )object->size)); | __func__, initial_pagein, (uintmax_t )object->size)); | ||||
for (i = 1; i < initial_pagein; i++) { | for (i = 1; i < initial_pagein; i++) { | ||||
if ((ma[i] = vm_page_next(ma[i - 1])) != NULL) { | if ((ma[i] = vm_page_next(ma[i - 1])) != NULL) { | ||||
if (ma[i]->valid) | if (ma[i]->valid) | ||||
break; | break; | ||||
if (!vm_page_tryxbusy(ma[i])) | if (!vm_page_tryxbusy(ma[i])) | ||||
break; | break; | ||||
} else { | } else { | ||||
ma[i] = vm_page_alloc(object, i, | ma[i] = vm_page_alloc(object, i, | ||||
VM_ALLOC_NORMAL); | VM_ALLOC_NORMAL); | ||||
if (ma[i] == NULL) | if (ma[i] == NULL) | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
initial_pagein = i; | initial_pagein = i; | ||||
rv = vm_pager_get_pages(object, ma, initial_pagein, NULL, NULL); | rv = vm_pager_get_pages(object, ma, initial_pagein, NULL, NULL); | ||||
if (rv != VM_PAGER_OK) { | if (rv != VM_PAGER_OK) { | ||||
for (i = 0; i < initial_pagein; i++) { | vm_page_unwire_noq(ma[0]); | ||||
vm_page_lock(ma[i]); | for (i = 0; i < initial_pagein; i++) | ||||
if (i == 0) | |||||
vm_page_unwire_noq(ma[i]); | |||||
vm_page_free(ma[i]); | vm_page_free(ma[i]); | ||||
vm_page_unlock(ma[i]); | |||||
} | |||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
return (EIO); | return (EIO); | ||||
} | } | ||||
vm_page_xunbusy(ma[0]); | vm_page_xunbusy(ma[0]); | ||||
for (i = 1; i < initial_pagein; i++) | for (i = 1; i < initial_pagein; i++) | ||||
vm_page_readahead_finish(ma[i]); | vm_page_readahead_finish(ma[i]); | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
imgp->firstpage = sf_buf_alloc(ma[0], 0); | imgp->firstpage = sf_buf_alloc(ma[0], 0); | ||||
imgp->image_header = (char *)sf_buf_kva(imgp->firstpage); | imgp->image_header = (char *)sf_buf_kva(imgp->firstpage); | ||||
return (0); | return (0); | ||||
} | } | ||||
void | void | ||||
exec_unmap_first_page(struct image_params *imgp) | exec_unmap_first_page(struct image_params *imgp) | ||||
{ | { | ||||
vm_page_t m; | vm_page_t m; | ||||
if (imgp->firstpage != NULL) { | if (imgp->firstpage != NULL) { | ||||
m = sf_buf_page(imgp->firstpage); | m = sf_buf_page(imgp->firstpage); | ||||
sf_buf_free(imgp->firstpage); | sf_buf_free(imgp->firstpage); | ||||
imgp->firstpage = NULL; | imgp->firstpage = NULL; | ||||
vm_page_lock(m); | |||||
vm_page_unwire(m, PQ_ACTIVE); | vm_page_unwire(m, PQ_ACTIVE); | ||||
vm_page_unlock(m); | |||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* Destroy old address space, and allocate a new stack. | * Destroy old address space, and allocate a new stack. | ||||
* The new stack is only sgrowsiz large because it is grown | * The new stack is only sgrowsiz large because it is grown | ||||
* automatically on a page fault. | * automatically on a page fault. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 774 Lines • Show Last 20 Lines |