Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_page.c
| Show First 20 Lines • Show All 5,226 Lines • ▼ Show 20 Lines | if (ahead-- > 0) { | ||||
| if (!vm_page_tryacquire(m, allocflags)) { | if (!vm_page_tryacquire(m, allocflags)) { | ||||
| if (vm_page_grab_sleep(object, m, pindex + i, | if (vm_page_grab_sleep(object, m, pindex + i, | ||||
| "grbmaw", allocflags, true)) { | "grbmaw", allocflags, true)) { | ||||
| pctrie_iter_reset(&pages); | pctrie_iter_reset(&pages); | ||||
| goto retrylookup; | goto retrylookup; | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| if (vm_page_none_valid(m) && | |||||
| (allocflags & VM_ALLOC_ZERO) != 0) { | |||||
alc: Just as a matter style, for consistency, could you swap the order of the tests… | |||||
| pmap_zero_page(m); | |||||
| vm_page_valid(m); | |||||
| } | |||||
| } else { | } else { | ||||
| if ((allocflags & VM_ALLOC_NOCREAT) != 0) | if ((allocflags & VM_ALLOC_NOCREAT) != 0) | ||||
| break; | break; | ||||
| m = vm_page_alloc_iter(object, pindex + i, | m = vm_page_alloc_iter(object, pindex + i, | ||||
| pflags | VM_ALLOC_COUNT(count - i), &pages); | pflags | VM_ALLOC_COUNT(count - i), &pages); | ||||
| /* pages was reset if alloc_iter lost the lock. */ | /* pages was reset if alloc_iter lost the lock. */ | ||||
| if (m == NULL) { | if (m == NULL) { | ||||
| if ((allocflags & (VM_ALLOC_NOWAIT | | if ((allocflags & (VM_ALLOC_NOWAIT | | ||||
| VM_ALLOC_WAITFAIL)) != 0) | VM_ALLOC_WAITFAIL)) != 0) | ||||
| break; | break; | ||||
| goto retrylookup; | goto retrylookup; | ||||
| } | } | ||||
| ma[i] = m; | ma[i] = m; | ||||
| } | if ((allocflags & VM_ALLOC_ZERO) != 0) { | ||||
| if (vm_page_none_valid(m) && | |||||
| (allocflags & VM_ALLOC_ZERO) != 0) { | |||||
| if ((m->flags & PG_ZERO) == 0) | if ((m->flags & PG_ZERO) == 0) | ||||
| pmap_zero_page(m); | pmap_zero_page(m); | ||||
| vm_page_valid(m); | vm_page_valid(m); | ||||
| } | } | ||||
| } | |||||
| vm_page_grab_release(m, allocflags); | vm_page_grab_release(m, allocflags); | ||||
| } | } | ||||
| return (i); | return (i); | ||||
| } | } | ||||
| /* | /* | ||||
| * Unlocked variant of vm_page_grab_pages(). This accepts the same flags | * Unlocked variant of vm_page_grab_pages(). This accepts the same flags | ||||
| * and will fall back to the locked variant to handle allocation. | * and will fall back to the locked variant to handle allocation. | ||||
| Show All 20 Lines | num_fetched = vm_radix_lookup_range_unlocked(&object->rtree, pindex, | ||||
| ma, count); | ma, count); | ||||
| for (i = 0; i < num_fetched; i++, pindex++) { | for (i = 0; i < num_fetched; i++, pindex++) { | ||||
| m = vm_page_acquire_unlocked(object, pindex, ma[i], flags); | m = vm_page_acquire_unlocked(object, pindex, ma[i], flags); | ||||
| if (m == PAGE_NOT_ACQUIRED) | if (m == PAGE_NOT_ACQUIRED) | ||||
| return (i); | return (i); | ||||
| if (m == NULL) | if (m == NULL) | ||||
| break; | break; | ||||
| if ((flags & VM_ALLOC_ZERO) != 0 && vm_page_none_valid(m)) { | if ((flags & VM_ALLOC_ZERO) != 0 && vm_page_none_valid(m)) { | ||||
| if ((m->flags & PG_ZERO) == 0) | |||||
| pmap_zero_page(m); | pmap_zero_page(m); | ||||
| vm_page_valid(m); | vm_page_valid(m); | ||||
| } | } | ||||
| /* m will still be wired or busy according to flags. */ | /* m will still be wired or busy according to flags. */ | ||||
| vm_page_grab_release(m, allocflags); | vm_page_grab_release(m, allocflags); | ||||
| /* vm_page_acquire_unlocked() may not return ma[i]. */ | /* vm_page_acquire_unlocked() may not return ma[i]. */ | ||||
| ma[i] = m; | ma[i] = m; | ||||
| } | } | ||||
| if (i == count || (allocflags & VM_ALLOC_NOCREAT) != 0) | if (i == count || (allocflags & VM_ALLOC_NOCREAT) != 0) | ||||
| ▲ Show 20 Lines • Show All 647 Lines • Show Last 20 Lines | |||||
Just as a matter style, for consistency, could you swap the order of the tests (vm_page_none_valid(m), (allocflags & VM_ALLOC_ZERO) != 0) either here or in vm_page_grab_pages_unlocked().