Changeset View
Changeset View
Standalone View
Standalone View
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_unwire_noq(ma[0]); | if (vm_page_unwire_noq(ma[0])) | ||||
vm_page_free(ma[0]); | vm_page_deactivate_noreuse(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) { | ||||
vm_page_unwire_noq(ma[0]); | for (i = 0; i < initial_pagein; i++) { | ||||
for (i = 0; i < initial_pagein; i++) | if (i > 0 || vm_page_unwire_noq(ma[i])) | ||||
vm_page_free(ma[i]); | vm_page_deactivate_noreuse(ma[i]); | ||||
} | |||||
markj: Obviously this should be `ma[0]`, I did not commit the typo fix before uploading. | |||||
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); | ||||
▲ Show 20 Lines • Show All 799 Lines • Show Last 20 Lines |
Obviously this should be ma[0], I did not commit the typo fix before uploading.