Page MenuHomeFreeBSD

D49443.id152501.diff
No OneTemporary

D49443.id152501.diff

diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -1599,8 +1599,13 @@
/*
* The page was left invalid. Likely placed there by
* an incomplete fault. Just remove and ignore.
+ *
+ * However, if the map entry is wired, we must hang on to the
+ * page to avoid leaking it, since the entry owns the wiring(s).
+ * Invalid, wired pages can arise here if the backing pager is
+ * truncated.
*/
- if (vm_page_none_valid(m)) {
+ if (vm_page_none_valid(m) && entry->wired_count == 0) {
if (vm_page_iter_remove(&pages, m))
vm_page_free(m);
continue;
@@ -1608,7 +1613,7 @@
/* vm_page_iter_rename() will dirty the page. */
if (!vm_page_iter_rename(&pages, m, new_object, m->pindex -
- offidxstart)) {
+ offidxstart, vm_page_any_valid(m))) {
vm_page_xunbusy(m);
VM_OBJECT_WUNLOCK(new_object);
VM_OBJECT_WUNLOCK(orig_object);
@@ -1793,7 +1798,7 @@
* through the rename. vm_page_iter_rename() will dirty the
* page.
*/
- if (!vm_page_iter_rename(&pages, p, object, new_pindex)) {
+ if (!vm_page_iter_rename(&pages, p, object, new_pindex, true)) {
vm_page_xunbusy(p);
next = vm_object_collapse_scan_wait(&pages, object,
NULL);
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -657,7 +657,7 @@
void vm_page_iter_limit_init(struct pctrie_iter *, vm_object_t, vm_pindex_t);
bool vm_page_iter_remove(struct pctrie_iter *pages, vm_page_t m);
bool vm_page_iter_rename(struct pctrie_iter *old_pages, vm_page_t m,
- vm_object_t new_object, vm_pindex_t new_pindex);
+ vm_object_t new_object, vm_pindex_t new_pindex, bool dirty);
void vm_page_launder(vm_page_t m);
vm_page_t vm_page_lookup(vm_object_t, vm_pindex_t);
vm_page_t vm_page_lookup_unlocked(vm_object_t, vm_pindex_t);
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -2052,7 +2052,7 @@
*/
bool
vm_page_iter_rename(struct pctrie_iter *old_pages, vm_page_t m,
- vm_object_t new_object, vm_pindex_t new_pindex)
+ vm_object_t new_object, vm_pindex_t new_pindex, bool dirty)
{
vm_page_t mpred;
vm_pindex_t opidx;
@@ -2087,7 +2087,8 @@
m->object = new_object;
vm_page_insert_radixdone(m, new_object, mpred);
- vm_page_dirty(m);
+ if (dirty)
+ vm_page_dirty(m);
vm_pager_page_inserted(new_object, m);
return (true);
}

File Metadata

Mime Type
text/plain
Expires
Thu, Aug 20, 4:38 AM (13 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36978333
Default Alt Text
D49443.id152501.diff (2 KB)

Event Timeline