svn commit: r329110 - user/jeff/numa/sys/vm
Jeff Roberson
jeff at FreeBSD.org
Sat Feb 10 22:34:47 UTC 2018
Author: jeff
Date: Sat Feb 10 22:34:46 2018
New Revision: 329110
URL: https://svnweb.freebsd.org/changeset/base/329110
Log:
If a segment includes regions that don't produce full reservations due to
alignment or size we may find valid rv structures that are not initialized.
Don't assert about their contents before we check for a valid object or
we will falsely panic when the domain is 0.
Thanks to kib for pointing this out to me.
Found by: pho
Modified:
user/jeff/numa/sys/vm/vm_reserv.c
Modified: user/jeff/numa/sys/vm/vm_reserv.c
==============================================================================
--- user/jeff/numa/sys/vm/vm_reserv.c Sat Feb 10 20:34:09 2018 (r329109)
+++ user/jeff/numa/sys/vm/vm_reserv.c Sat Feb 10 22:34:46 2018 (r329110)
@@ -1056,9 +1056,9 @@ vm_reserv_free_page(vm_page_t m)
vm_reserv_t rv;
rv = vm_reserv_from_page(m);
- vm_domain_free_assert_locked(VM_DOMAIN(rv->domain));
if (rv->object == NULL)
return (FALSE);
+ vm_domain_free_assert_locked(VM_DOMAIN(rv->domain));
vm_reserv_depopulate(rv, m - rv->pages);
return (TRUE);
}
@@ -1105,9 +1105,9 @@ vm_reserv_is_page_free(vm_page_t m)
vm_reserv_t rv;
rv = vm_reserv_from_page(m);
- vm_domain_free_assert_locked(VM_DOMAIN(rv->domain));
if (rv->object == NULL)
return (false);
+ vm_domain_free_assert_locked(VM_DOMAIN(rv->domain));
return (popmap_is_clear(rv->popmap, m - rv->pages));
}
@@ -1364,18 +1364,14 @@ vm_reserv_startup(vm_offset_t *vaddr, vm_paddr_t end,
vm_page_t
vm_reserv_to_superpage(vm_page_t m)
{
- struct vm_domain *vmd;
vm_reserv_t rv;
VM_OBJECT_ASSERT_LOCKED(m->object);
rv = vm_reserv_from_page(m);
- vmd = VM_DOMAIN(rv->domain);
- vm_domain_free_lock(vmd);
if (rv->object == m->object && rv->popcnt == VM_LEVEL_0_NPAGES)
m = rv->pages;
else
m = NULL;
- vm_domain_free_unlock(vmd);
return (m);
}
More information about the svn-src-user
mailing list