Page MenuHomeFreeBSD

D23506.id68088.diff
No OneTemporary

D23506.id68088.diff

Index: sys/vm/swap_pager.c
===================================================================
--- sys/vm/swap_pager.c
+++ sys/vm/swap_pager.c
@@ -1752,6 +1752,17 @@
("%s: Too many pages: %d", __func__, npages));
KASSERT(object->type == OBJT_SWAP,
("%s: Object not swappable", __func__));
+
+ /*
+ * If all of the pages are resident we have nothing to do. This
+ * also resolves a deadlock with xbusied kernel stacks that have
+ * been written to swap but not yet freed or read from swap without
+ * removing the space.
+ */
+ if (object->resident_page_count == object->size) {
+ swap_pager_freespace(object, 0, object->size);
+ return;
+ }
vm_object_pip_add(object, npages);
vm_page_grab_pages(object, pindex, VM_ALLOC_NORMAL, ma, npages);
for (i = j = 0;; i++) {
Index: sys/vm/vm_glue.c
===================================================================
--- sys/vm/vm_glue.c
+++ sys/vm/vm_glue.c
@@ -342,10 +342,8 @@
VM_OBJECT_WLOCK(ksobj);
(void)vm_page_grab_pages(ksobj, 0, VM_ALLOC_NORMAL | VM_ALLOC_WIRED,
ma, pages);
- for (i = 0; i < pages; i++) {
+ for (i = 0; i < pages; i++)
vm_page_valid(ma[i]);
- vm_page_xunbusy(ma[i]);
- }
VM_OBJECT_WUNLOCK(ksobj);
pmap_qenter(ks, ma, pages);
*ksobjp = ksobj;
@@ -365,7 +363,7 @@
m = vm_page_lookup(ksobj, i);
if (m == NULL)
panic("%s: kstack already missing?", __func__);
- vm_page_busy_acquire(m, 0);
+ vm_page_xbusy_claim(m);
vm_page_unwire_noq(m);
vm_page_free(m);
}
Index: sys/vm/vm_kern.c
===================================================================
--- sys/vm/vm_kern.c
+++ sys/vm/vm_kern.c
@@ -224,7 +224,6 @@
if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0)
pmap_zero_page(m);
vm_page_valid(m);
- vm_page_xunbusy(m);
pmap_enter(kernel_pmap, addr + i, m, prot,
prot | PMAP_ENTER_WIRED, 0);
}
@@ -317,7 +316,6 @@
if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0)
pmap_zero_page(m);
vm_page_valid(m);
- vm_page_xunbusy(m);
pmap_enter(kernel_pmap, tmp, m, VM_PROT_RW,
VM_PROT_RW | PMAP_ENTER_WIRED, 0);
tmp += PAGE_SIZE;
@@ -501,7 +499,6 @@
KASSERT((m->oflags & VPO_UNMANAGED) != 0,
("kmem_malloc: page %p is managed", m));
vm_page_valid(m);
- vm_page_xunbusy(m);
pmap_enter(kernel_pmap, addr + i, m, prot,
prot | PMAP_ENTER_WIRED, 0);
#if VM_NRESERVLEVEL > 0
@@ -591,7 +588,7 @@
#endif
for (; offset < end; offset += PAGE_SIZE, m = next) {
next = vm_page_next(m);
- vm_page_busy_acquire(m, 0);
+ vm_page_xbusy_claim(m);
vm_page_unwire_noq(m);
vm_page_free(m);
}
Index: sys/vm/vm_page.h
===================================================================
--- sys/vm/vm_page.h
+++ sys/vm/vm_page.h
@@ -762,9 +762,14 @@
void vm_page_assert_pga_writeable(vm_page_t m, uint16_t bits);
#define VM_PAGE_ASSERT_PGA_WRITEABLE(m, bits) \
vm_page_assert_pga_writeable(m, bits)
+#define vm_page_xbusy_claim(m) do { \
+ vm_page_assert_xbusied_unchecked((m)); \
+ (m)->busy_lock = VPB_CURTHREAD_EXCLUSIVE; \
+} while (0)
#else
#define VM_PAGE_OBJECT_BUSY_ASSERT(m) (void)0
#define VM_PAGE_ASSERT_PGA_WRITEABLE(m, bits) (void)0
+#define vm_page_xbusy_claim(m)
#endif
#if BYTE_ORDER == BIG_ENDIAN
Index: sys/vm/vm_swapout.c
===================================================================
--- sys/vm/vm_swapout.c
+++ sys/vm/vm_swapout.c
@@ -540,6 +540,7 @@
if (m == NULL)
panic("vm_thread_swapout: kstack already missing?");
vm_page_dirty(m);
+ vm_page_xunbusy_unchecked(m);
vm_page_unwire(m, PQ_LAUNDRY);
}
VM_OBJECT_WUNLOCK(ksobj);
@@ -564,7 +565,6 @@
for (i = 0; i < pages;) {
vm_page_assert_xbusied(ma[i]);
if (vm_page_all_valid(ma[i])) {
- vm_page_xunbusy(ma[i]);
i++;
continue;
}
@@ -581,10 +581,12 @@
KASSERT(rv == VM_PAGER_OK, ("%s: cannot get kstack for proc %d",
__func__, td->td_proc->p_pid));
vm_object_pip_wakeup(ksobj);
- for (j = i; j < i + count; j++)
- vm_page_xunbusy(ma[j]);
i += count;
}
+
+ /* Free the swap space. */
+ for (i = 0; i < pages; i++)
+ vm_pager_page_unswapped(ma[i]);
pmap_qenter(td->td_kstack, ma, pages);
cpu_thread_swapin(td);
}

File Metadata

Mime Type
text/plain
Expires
Fri, May 1, 6:47 PM (18 m, 36 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32593756
Default Alt Text
D23506.id68088.diff (4 KB)

Event Timeline