| 1674 | } |
| 1675 | |
| 1676 | static bool |
| 1677 | vm_object_scan_all_shadowed(vm_object_t object) |
| 1678 | { |
| 1679 | vm_object_t backing_object; |
| 1680 | vm_page_t p, pp; |
| 1681 | vm_pindex_t backing_offset_index, new_pindex, pi, ps; |
| 1682 | |
| 1683 | VM_OBJECT_ASSERT_WLOCKED(object); |
| 1684 | VM_OBJECT_ASSERT_WLOCKED(object->backing_object); |
| 1685 | |
| 1686 | backing_object = object->backing_object; |
| 1687 | |
| 1688 | if ((backing_object->flags & OBJ_ANON) == 0) |
| 1689 | return (false); |
| 1690 | |
| 1691 | pi = backing_offset_index = OFF_TO_IDX(object->backing_object_offset); |
| 1692 | p = vm_page_find_least(backing_object, pi); |
| 1693 | ps = swap_pager_find_least(backing_object, pi); |
| 1694 | |
| 1695 | /* |
| 1696 | * Only check pages inside the parent object's range and |
| 1697 | * inside the parent object's mapping of the backing object. |
| 1698 | */ |
| 1699 | for (;; pi++) { |
| 1700 | if (p != NULL && p->pindex < pi) |
| 1701 | p = TAILQ_NEXT(p, listq); |
| 1702 | if (ps < pi) |
| 1703 | ps = swap_pager_find_least(backing_object, pi); |
| 1704 | if (p == NULL && ps >= backing_object->size) |
| 1705 | break; |
| 1706 | else if (p == NULL) |
| 1707 | pi = ps; |
| 1708 | else |
| 1709 | pi = MIN(p->pindex, ps); |
| 1710 | |
| 1711 | new_pindex = pi - backing_offset_index; |
| 1712 | if (new_pindex >= object->size) |
| 1713 | break; |
| 1714 | |
| 1715 | if (p != NULL) { |
| 1716 | /* |
| 1717 | * If the backing object page is busy a |
| 1718 | * grandparent or older page may still be |
| 1719 | * undergoing CoW. It is not safe to collapse |
| 1720 | * the backing object until it is quiesced. |
| 1721 | */ |
| 1722 | if (vm_page_tryxbusy(p) == 0) |
| 1723 | return (false); |
| 1724 | |
| 1725 | /* |
| 1726 | * We raced with the fault handler that left |
| 1727 | * newly allocated invalid page on the object |
| 1728 | * queue and retried. |
| 1729 | */ |
| 1730 | if (!vm_page_all_valid(p)) |
| 1731 | goto unbusy_ret; |
| 1732 | } |
| 1733 |
no test coverage detected