vm_fault.c (d3f8534e99e2b2846a882e617648b2abc17406dd) | vm_fault.c (70183daa808078fd9737f8b76ef66b14e01c2756) |
---|---|
1/*- 2 * SPDX-License-Identifier: (BSD-4-Clause AND MIT-CMU) 3 * 4 * Copyright (c) 1991, 1993 5 * The Regents of the University of California. All rights reserved. 6 * Copyright (c) 1994 John S. Dyson 7 * All rights reserved. 8 * Copyright (c) 1994 David Greenman --- 366 unchanged lines hidden (view full) --- 375 vm_page_xunbusy(m); 376 } 377} 378 379static int 380vm_fault_populate(struct faultstate *fs, vm_prot_t prot, int fault_type, 381 int fault_flags, boolean_t wired, vm_page_t *m_hold) 382{ | 1/*- 2 * SPDX-License-Identifier: (BSD-4-Clause AND MIT-CMU) 3 * 4 * Copyright (c) 1991, 1993 5 * The Regents of the University of California. All rights reserved. 6 * Copyright (c) 1994 John S. Dyson 7 * All rights reserved. 8 * Copyright (c) 1994 David Greenman --- 366 unchanged lines hidden (view full) --- 375 vm_page_xunbusy(m); 376 } 377} 378 379static int 380vm_fault_populate(struct faultstate *fs, vm_prot_t prot, int fault_type, 381 int fault_flags, boolean_t wired, vm_page_t *m_hold) 382{ |
383 struct mtx *m_mtx; 384 vm_offset_t vaddr; |
|
383 vm_page_t m; 384 vm_pindex_t map_first, map_last, pager_first, pager_last, pidx; | 385 vm_page_t m; 386 vm_pindex_t map_first, map_last, pager_first, pager_last, pidx; |
385 int rv; | 387 int i, npages, psind, rv; |
386 387 MPASS(fs->object == fs->first_object); 388 VM_OBJECT_ASSERT_WLOCKED(fs->first_object); 389 MPASS(fs->first_object->paging_in_progress > 0); 390 MPASS(fs->first_object->backing_object == NULL); 391 MPASS(fs->lookup_still_valid); 392 393 pager_first = OFF_TO_IDX(fs->entry->offset); --- 56 unchanged lines hidden (view full) --- 450 } 451 map_last = map_first + atop(fs->entry->end - fs->entry->start) - 1; 452 if (map_last < pager_last) { 453 vm_fault_populate_cleanup(fs->first_object, map_last + 1, 454 pager_last); 455 pager_last = map_last; 456 } 457 for (pidx = pager_first, m = vm_page_lookup(fs->first_object, pidx); | 388 389 MPASS(fs->object == fs->first_object); 390 VM_OBJECT_ASSERT_WLOCKED(fs->first_object); 391 MPASS(fs->first_object->paging_in_progress > 0); 392 MPASS(fs->first_object->backing_object == NULL); 393 MPASS(fs->lookup_still_valid); 394 395 pager_first = OFF_TO_IDX(fs->entry->offset); --- 56 unchanged lines hidden (view full) --- 452 } 453 map_last = map_first + atop(fs->entry->end - fs->entry->start) - 1; 454 if (map_last < pager_last) { 455 vm_fault_populate_cleanup(fs->first_object, map_last + 1, 456 pager_last); 457 pager_last = map_last; 458 } 459 for (pidx = pager_first, m = vm_page_lookup(fs->first_object, pidx); |
458 pidx <= pager_last; pidx++, m = vm_page_next(m)) { 459 vm_fault_populate_check_page(m); 460 vm_fault_dirty(fs->entry, m, prot, fault_type, fault_flags, 461 true); | 460 pidx <= pager_last; 461 pidx += npages, m = vm_page_next(&m[npages - 1])) { 462 vaddr = fs->entry->start + IDX_TO_OFF(pidx) - fs->entry->offset; 463#if defined(__amd64__) 464 psind = m->psind; 465 if (psind > 0 && ((vaddr & (pagesizes[psind] - 1)) != 0 || 466 pidx + OFF_TO_IDX(pagesizes[psind]) - 1 > pager_last || 467 !pmap_ps_enabled(fs->map->pmap))) 468 psind = 0; 469#else 470 psind = 0; 471#endif 472 npages = atop(pagesizes[psind]); 473 for (i = 0; i < npages; i++) { 474 vm_fault_populate_check_page(&m[i]); 475 vm_fault_dirty(fs->entry, &m[i], prot, fault_type, 476 fault_flags, true); 477 } |
462 VM_OBJECT_WUNLOCK(fs->first_object); | 478 VM_OBJECT_WUNLOCK(fs->first_object); |
463 pmap_enter(fs->map->pmap, fs->entry->start + IDX_TO_OFF(pidx) - 464 fs->entry->offset, m, prot, fault_type | (wired ? 465 PMAP_ENTER_WIRED : 0), 0); | 479 pmap_enter(fs->map->pmap, vaddr, m, prot, fault_type | (wired ? 480 PMAP_ENTER_WIRED : 0), psind); |
466 VM_OBJECT_WLOCK(fs->first_object); | 481 VM_OBJECT_WLOCK(fs->first_object); |
467 if (pidx == fs->first_pindex) 468 vm_fault_fill_hold(m_hold, m); 469 vm_page_lock(m); 470 if ((fault_flags & VM_FAULT_WIRE) != 0) { 471 KASSERT(wired, ("VM_FAULT_WIRE && !wired")); 472 vm_page_wire(m); 473 } else { 474 vm_page_activate(m); | 482 m_mtx = NULL; 483 for (i = 0; i < npages; i++) { 484 vm_page_change_lock(&m[i], &m_mtx); 485 if ((fault_flags & VM_FAULT_WIRE) != 0) { 486 KASSERT(wired, ("VM_FAULT_WIRE && !wired")); 487 vm_page_wire(&m[i]); 488 } else 489 vm_page_activate(&m[i]); 490 if (m_hold != NULL && m[i].pindex == fs->first_pindex) { 491 *m_hold = &m[i]; 492 vm_page_hold(&m[i]); 493 } 494 vm_page_xunbusy(&m[i]); |
475 } | 495 } |
476 vm_page_unlock(m); 477 vm_page_xunbusy(m); | 496 if (m_mtx != NULL) 497 mtx_unlock(m_mtx); |
478 } 479 curthread->td_ru.ru_majflt++; 480 return (KERN_SUCCESS); 481} 482 483/* 484 * vm_fault: 485 * --- 1292 unchanged lines hidden --- | 498 } 499 curthread->td_ru.ru_majflt++; 500 return (KERN_SUCCESS); 501} 502 503/* 504 * vm_fault: 505 * --- 1292 unchanged lines hidden --- |