vm_page.c (7847e04111f2c2b06b36f6d19a46d78814d7836d) vm_page.c (21f01f45847344239c364e6d6c5100e87731fd6c)
1/*-
2 * SPDX-License-Identifier: (BSD-3-Clause AND MIT-CMU)
3 *
4 * Copyright (c) 1991 Regents of the University of California.
5 * All rights reserved.
6 * Copyright (c) 1998 Matthew Dillon. All Rights Reserved.
7 *
8 * This code is derived from software contributed to Berkeley by

--- 2613 unchanged lines hidden (view full) ---

2622 KASSERT(m_new->oflags == VPO_UNMANAGED,
2623 ("page %p is managed", m_new));
2624 m_new->oflags = m->oflags & VPO_NOSYNC;
2625 pmap_copy_page(m, m_new);
2626 m_new->valid = m->valid;
2627 m_new->dirty = m->dirty;
2628 m->flags &= ~PG_ZERO;
2629 vm_page_xbusy(m);
1/*-
2 * SPDX-License-Identifier: (BSD-3-Clause AND MIT-CMU)
3 *
4 * Copyright (c) 1991 Regents of the University of California.
5 * All rights reserved.
6 * Copyright (c) 1998 Matthew Dillon. All Rights Reserved.
7 *
8 * This code is derived from software contributed to Berkeley by

--- 2613 unchanged lines hidden (view full) ---

2622 KASSERT(m_new->oflags == VPO_UNMANAGED,
2623 ("page %p is managed", m_new));
2624 m_new->oflags = m->oflags & VPO_NOSYNC;
2625 pmap_copy_page(m, m_new);
2626 m_new->valid = m->valid;
2627 m_new->dirty = m->dirty;
2628 m->flags &= ~PG_ZERO;
2629 vm_page_xbusy(m);
2630 vm_page_remque(m);
2630 vm_page_dequeue(m);
2631 vm_page_replace_checked(m_new, object,
2632 m->pindex, m);
2633 if (vm_page_free_prep(m))
2634 SLIST_INSERT_HEAD(&free, m,
2635 plinks.s.ss);
2636
2637 /*
2638 * The new page must be deactivated
2639 * before the object is unlocked.
2640 */
2641 vm_page_change_lock(m_new, &m_mtx);
2642 vm_page_deactivate(m_new);
2643 } else {
2644 m->flags &= ~PG_ZERO;
2631 vm_page_replace_checked(m_new, object,
2632 m->pindex, m);
2633 if (vm_page_free_prep(m))
2634 SLIST_INSERT_HEAD(&free, m,
2635 plinks.s.ss);
2636
2637 /*
2638 * The new page must be deactivated
2639 * before the object is unlocked.
2640 */
2641 vm_page_change_lock(m_new, &m_mtx);
2642 vm_page_deactivate(m_new);
2643 } else {
2644 m->flags &= ~PG_ZERO;
2645 vm_page_remque(m);
2645 vm_page_dequeue(m);
2646 vm_page_remove(m);
2647 if (vm_page_free_prep(m))
2648 SLIST_INSERT_HEAD(&free, m,
2649 plinks.s.ss);
2650 KASSERT(m->dirty == 0,
2651 ("page %p is dirty", m));
2652 }
2653 } else

--- 745 unchanged lines hidden (view full) ---

3399
3400 if ((queue = vm_page_queue(m)) == PQ_ACTIVE || m->wire_count > 0 ||
3401 (m->oflags & VPO_UNMANAGED) != 0) {
3402 if (queue == PQ_ACTIVE && m->act_count < ACT_INIT)
3403 m->act_count = ACT_INIT;
3404 return;
3405 }
3406
2646 vm_page_remove(m);
2647 if (vm_page_free_prep(m))
2648 SLIST_INSERT_HEAD(&free, m,
2649 plinks.s.ss);
2650 KASSERT(m->dirty == 0,
2651 ("page %p is dirty", m));
2652 }
2653 } else

--- 745 unchanged lines hidden (view full) ---

3399
3400 if ((queue = vm_page_queue(m)) == PQ_ACTIVE || m->wire_count > 0 ||
3401 (m->oflags & VPO_UNMANAGED) != 0) {
3402 if (queue == PQ_ACTIVE && m->act_count < ACT_INIT)
3403 m->act_count = ACT_INIT;
3404 return;
3405 }
3406
3407 vm_page_remque(m);
3407 vm_page_dequeue(m);
3408 if (m->act_count < ACT_INIT)
3409 m->act_count = ACT_INIT;
3410 vm_page_enqueue(m, PQ_ACTIVE);
3411}
3412
3413/*
3414 * vm_page_free_prep:
3415 *

--- 255 unchanged lines hidden (view full) ---

3671{
3672
3673 vm_page_assert_locked(m);
3674
3675 if (m->wire_count > 0 || (m->oflags & VPO_UNMANAGED) != 0)
3676 return;
3677
3678 if (!vm_page_inactive(m)) {
3408 if (m->act_count < ACT_INIT)
3409 m->act_count = ACT_INIT;
3410 vm_page_enqueue(m, PQ_ACTIVE);
3411}
3412
3413/*
3414 * vm_page_free_prep:
3415 *

--- 255 unchanged lines hidden (view full) ---

3671{
3672
3673 vm_page_assert_locked(m);
3674
3675 if (m->wire_count > 0 || (m->oflags & VPO_UNMANAGED) != 0)
3676 return;
3677
3678 if (!vm_page_inactive(m)) {
3679 vm_page_remque(m);
3679 vm_page_dequeue(m);
3680 vm_page_enqueue(m, PQ_INACTIVE);
3681 } else
3682 vm_page_requeue(m);
3683}
3684
3685/*
3686 * Move the specified page close to the head of the inactive queue,
3687 * bypassing LRU. A marker page is used to maintain FIFO ordering.

--- 6 unchanged lines hidden (view full) ---

3694vm_page_deactivate_noreuse(vm_page_t m)
3695{
3696
3697 vm_page_assert_locked(m);
3698
3699 if (m->wire_count > 0 || (m->oflags & VPO_UNMANAGED) != 0)
3700 return;
3701
3680 vm_page_enqueue(m, PQ_INACTIVE);
3681 } else
3682 vm_page_requeue(m);
3683}
3684
3685/*
3686 * Move the specified page close to the head of the inactive queue,
3687 * bypassing LRU. A marker page is used to maintain FIFO ordering.

--- 6 unchanged lines hidden (view full) ---

3694vm_page_deactivate_noreuse(vm_page_t m)
3695{
3696
3697 vm_page_assert_locked(m);
3698
3699 if (m->wire_count > 0 || (m->oflags & VPO_UNMANAGED) != 0)
3700 return;
3701
3702 if (!vm_page_inactive(m))
3703 vm_page_remque(m);
3704 m->queue = PQ_INACTIVE;
3702 if (!vm_page_inactive(m)) {
3703 vm_page_dequeue(m);
3704 m->queue = PQ_INACTIVE;
3705 }
3705 if ((m->aflags & PGA_REQUEUE_HEAD) == 0)
3706 vm_page_aflag_set(m, PGA_REQUEUE_HEAD);
3707 vm_pqbatch_submit_page(m, PQ_INACTIVE);
3708}
3709
3710/*
3711 * vm_page_launder
3712 *

--- 5 unchanged lines hidden (view full) ---

3718
3719 vm_page_assert_locked(m);
3720 if (m->wire_count > 0 || (m->oflags & VPO_UNMANAGED) != 0)
3721 return;
3722
3723 if (vm_page_in_laundry(m))
3724 vm_page_requeue(m);
3725 else {
3706 if ((m->aflags & PGA_REQUEUE_HEAD) == 0)
3707 vm_page_aflag_set(m, PGA_REQUEUE_HEAD);
3708 vm_pqbatch_submit_page(m, PQ_INACTIVE);
3709}
3710
3711/*
3712 * vm_page_launder
3713 *

--- 5 unchanged lines hidden (view full) ---

3719
3720 vm_page_assert_locked(m);
3721 if (m->wire_count > 0 || (m->oflags & VPO_UNMANAGED) != 0)
3722 return;
3723
3724 if (vm_page_in_laundry(m))
3725 vm_page_requeue(m);
3726 else {
3726 vm_page_remque(m);
3727 vm_page_dequeue(m);
3727 vm_page_enqueue(m, PQ_LAUNDRY);
3728 }
3729}
3730
3731/*
3732 * vm_page_unswappable
3733 *
3734 * Put a page in the PQ_UNSWAPPABLE holding queue.
3735 */
3736void
3737vm_page_unswappable(vm_page_t m)
3738{
3739
3740 vm_page_assert_locked(m);
3741 KASSERT(m->wire_count == 0 && (m->oflags & VPO_UNMANAGED) == 0,
3742 ("page %p already unswappable", m));
3743
3728 vm_page_enqueue(m, PQ_LAUNDRY);
3729 }
3730}
3731
3732/*
3733 * vm_page_unswappable
3734 *
3735 * Put a page in the PQ_UNSWAPPABLE holding queue.
3736 */
3737void
3738vm_page_unswappable(vm_page_t m)
3739{
3740
3741 vm_page_assert_locked(m);
3742 KASSERT(m->wire_count == 0 && (m->oflags & VPO_UNMANAGED) == 0,
3743 ("page %p already unswappable", m));
3744
3744 vm_page_remque(m);
3745 vm_page_dequeue(m);
3745 vm_page_enqueue(m, PQ_UNSWAPPABLE);
3746}
3747
3748/*
3749 * Attempt to free the page. If it cannot be freed, do nothing. Returns true
3750 * if the page is freed and false otherwise.
3751 *
3752 * The page must be managed. The page and its containing object must be

--- 753 unchanged lines hidden ---
3746 vm_page_enqueue(m, PQ_UNSWAPPABLE);
3747}
3748
3749/*
3750 * Attempt to free the page. If it cannot be freed, do nothing. Returns true
3751 * if the page is freed and false otherwise.
3752 *
3753 * The page must be managed. The page and its containing object must be

--- 753 unchanged lines hidden ---