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 ---