* vm_object_page_collect_flush() was trying to re-protect VM pages that
were still marked dirty after pageout I/O was initiated without owning
the BUSY bit on the page. This operation could race whatever I/O was
going on and multiple issues. Remove the re-protect.
Just don't do it. It's an unnecessary operation. We still re-set
PG_CLEANCHK on the page and that should be fine insofar as the pageout
daemon goes.
* Note that the pageout_flush code protects the VM pages properly (to
read-only) prior to initiating I/O .
* Should fix bug #2350
* Might be related to the wire-count bug considering that we were messing
with the page's pmap without owning the BUSY bit. Small chance.
static void vm_object_qcollapse(vm_object_t object,
vm_object_t backing_object);
static void vm_object_qcollapse(vm_object_t object,
vm_object_t backing_object);
-static int vm_object_page_collect_flush(vm_object_t object, vm_page_t p,
+static void vm_object_page_collect_flush(vm_object_t object, vm_page_t p,
int pagerflags);
static void vm_object_lock_init(vm_object_t);
int pagerflags);
static void vm_object_lock_init(vm_object_t);
*
* The caller must hold the object.
*/
*
* The caller must hold the object.
*/
vm_object_page_collect_flush(vm_object_t object, vm_page_t p, int pagerflags)
{
int runlen;
vm_object_page_collect_flush(vm_object_t object, vm_page_t p, int pagerflags)
{
int runlen;
vm_pageout_flush(ma, runlen, pagerflags);
vm_pageout_flush(ma, runlen, pagerflags);
+ /*
+ * WARNING: Related pages are still held but the BUSY was inherited
+ * by the pageout I/O, so the pages might not be busy any
+ * more. We cannot re-protect the page without waiting
+ * for the I/O to complete and then busying it again.
+ */
for (i = 0; i < runlen; i++) {
if (ma[i]->valid & ma[i]->dirty) {
for (i = 0; i < runlen; i++) {
if (ma[i]->valid & ma[i]->dirty) {
- vm_page_protect(ma[i], VM_PROT_READ);
+ /*vm_page_protect(ma[i], VM_PROT_READ);*/
vm_page_flag_set(ma[i], PG_CLEANCHK);
/*
vm_page_flag_set(ma[i], PG_CLEANCHK);
/*
}
vm_page_unhold(ma[i]);
}
}
vm_page_unhold(ma[i]);
}