svn commit: r254362 - head/sys/vm
Attilio Rao
attilio at FreeBSD.org
Thu Aug 15 11:01:26 UTC 2013
Author: attilio
Date: Thu Aug 15 11:01:25 2013
New Revision: 254362
URL: http://svnweb.freebsd.org/changeset/base/254362
Log:
On the recovery path for vm_page_alloc(), if a page had been requested
wired, unwind back the wiring bits otherwise we can end up freeing a
page that is considered wired.
Sponsored by: EMC / Isilon storage division
Reported by: alc
Modified:
head/sys/vm/vm_page.c
Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c Thu Aug 15 10:38:10 2013 (r254361)
+++ head/sys/vm/vm_page.c Thu Aug 15 11:01:25 2013 (r254362)
@@ -1611,6 +1611,10 @@ vm_page_alloc(vm_object_t object, vm_pin
if (vp != NULL)
vdrop(vp);
pagedaemon_wakeup();
+ if (req & VM_ALLOC_WIRED) {
+ atomic_subtract_int(&cnt.v_wire_count, 1);
+ m->wire_count = 0;
+ }
m->object = NULL;
vm_page_free(m);
return (NULL);
@@ -1806,8 +1810,13 @@ retry:
&deferred_vdrop_list);
if (vm_paging_needed())
pagedaemon_wakeup();
+ if ((req & VM_ALLOC_WIRED) != 0)
+ atomic_subtract_int(&cnt.v_wire_count,
+ npages);
for (m_tmp = m, m = m_ret;
m < &m_ret[npages]; m++) {
+ if ((req & VM_ALLOC_WIRED) != 0)
+ m->wire_count = 0;
if (m >= m_tmp)
m->object = NULL;
vm_page_free(m);
More information about the svn-src-head
mailing list