vmem_check_sanity: refactor overlapping check for better readability.

Move use of vmem_check_sanity into locked sections. Pointed out by ad@
This commit is contained in:
cegger 2008-12-09 07:54:59 +00:00
parent 29221b9676
commit 33d827105a
1 changed files with 82 additions and 57 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_vmem.c,v 1.47 2008/12/07 22:39:01 cegger Exp $ */
/* $NetBSD: subr_vmem.c,v 1.48 2008/12/09 07:54:59 cegger Exp $ */
/*-
* Copyright (c)2006 YAMAMOTO Takashi,
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.47 2008/12/07 22:39:01 cegger Exp $");
__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.48 2008/12/09 07:54:59 cegger Exp $");
#define VMEM_DEBUG
#if defined(_KERNEL)
@ -749,6 +749,81 @@ vmem_fit(const bt_t *bt, vmem_size_t size, vmem_size_t align, vmem_size_t phase,
#define vmem_check_sanity(vm) true
#else
static bool
vmem_check_spanoverlap(const char *func, const vmem_t *vm,
const bt_t *bt, const bt_t *bt2)
{
switch (bt->bt_type) {
case BT_TYPE_BUSY:
case BT_TYPE_FREE:
if (BT_ISSPAN_P(bt2))
return true;
break;
case BT_TYPE_SPAN:
case BT_TYPE_SPAN_STATIC:
if (bt2->bt_type == BT_TYPE_BUSY
|| bt2->bt_type == BT_TYPE_FREE)
return true;
break;
}
if (bt->bt_start > bt2->bt_start) {
if (bt->bt_start >= BT_END(bt2))
return true;
printf("%s: overlapping VMEM '%s' span 0x%"
PRIx64" - 0x%"PRIx64" %s\n",
func, vm->vm_name,
(uint64_t)bt->bt_start,
(uint64_t)BT_END(bt),
(bt->bt_type == BT_TYPE_BUSY) ?
"allocated" :
(bt->bt_type == BT_TYPE_FREE) ?
"free" :
(bt->bt_type == BT_TYPE_SPAN) ?
"span" : "static span");
printf("%s: overlapping VMEM '%s' span 0x%"
PRIx64" - 0x%"PRIx64" %s\n",
func, vm->vm_name,
(uint64_t)bt2->bt_start,
(uint64_t)BT_END(bt2),
(bt2->bt_type == BT_TYPE_BUSY) ?
"allocated" :
(bt2->bt_type == BT_TYPE_FREE) ?
"free" :
(bt2->bt_type == BT_TYPE_SPAN) ?
"span" : "static span");
return false;
}
if (BT_END(bt) > bt2->bt_start) {
printf("%s: overlapping VMEM '%s' span 0x%"
PRIx64" - 0x%"PRIx64" %s\n",
func, vm->vm_name,
(uint64_t)bt->bt_start,
(uint64_t)BT_END(bt),
(bt->bt_type == BT_TYPE_BUSY) ?
"allocated" :
(bt->bt_type == BT_TYPE_FREE) ?
"free" :
(bt->bt_type == BT_TYPE_SPAN) ?
"span" : "static span");
printf("%s: overlapping VMEM '%s' span 0x%"
PRIx64" - 0x%"PRIx64" %s\n",
func, vm->vm_name,
(uint64_t)bt2->bt_start,
(uint64_t)BT_END(bt2),
(bt2->bt_type == BT_TYPE_BUSY) ?
"allocated" :
(bt2->bt_type == BT_TYPE_FREE) ?
"free" :
(bt2->bt_type == BT_TYPE_SPAN) ?
"span" : "static span");
return false;
}
return true;
}
static bool
vmem_check_sanity(vmem_t *vm)
{
@ -789,59 +864,9 @@ vmem_check_sanity(vmem_t *vm)
if (bt == bt2)
continue;
if (bt->bt_start > bt2->bt_start) {
if (bt->bt_start >= BT_END(bt2))
continue;
printf("%s: overlapping VMEM '%s' span 0x%"
PRIx64" - 0x%"PRIx64" %s\n",
__func__, vm->vm_name,
(uint64_t)bt->bt_start,
(uint64_t)BT_END(bt),
(bt->bt_type == BT_TYPE_BUSY) ?
"allocated" :
(bt->bt_type == BT_TYPE_FREE) ?
"free" :
(bt->bt_type == BT_TYPE_SPAN) ?
"span" : "static span");
printf("%s: overlapping VMEM '%s' span 0x%"
PRIx64" - 0x%"PRIx64" %s\n",
__func__, vm->vm_name,
(uint64_t)bt2->bt_start,
(uint64_t)BT_END(bt2),
(bt2->bt_type == BT_TYPE_BUSY) ?
"allocated" :
(bt2->bt_type == BT_TYPE_FREE) ?
"free" :
(bt2->bt_type == BT_TYPE_SPAN) ?
"span" : "static span");
if (vmem_check_spanoverlap(__func__, vm, bt, bt2)
== false)
return false;
}
if (BT_END(bt) > bt2->bt_start) {
printf("%s: overlapping VMEM '%s' span 0x%"
PRIx64" - 0x%"PRIx64" %s\n",
__func__, vm->vm_name,
(uint64_t)bt->bt_start,
(uint64_t)BT_END(bt),
(bt->bt_type == BT_TYPE_BUSY) ?
"allocated" :
(bt->bt_type == BT_TYPE_FREE) ?
"free" :
(bt->bt_type == BT_TYPE_SPAN) ?
"span" : "static span");
printf("%s: overlapping VMEM '%s' span 0x%"
PRIx64" - 0x%"PRIx64" %s\n",
__func__, vm->vm_name,
(uint64_t)bt2->bt_start,
(uint64_t)BT_END(bt2),
(bt2->bt_type == BT_TYPE_BUSY) ?
"allocated" :
(bt2->bt_type == BT_TYPE_FREE) ?
"free" :
(bt2->bt_type == BT_TYPE_SPAN) ?
"span" : "static span");
return false;
}
}
}
@ -1007,7 +1032,6 @@ vmem_xalloc(vmem_t *vm, vmem_size_t size0, vmem_size_t align, vmem_size_t phase,
KASSERT(nocross == 0 || nocross >= size);
KASSERT(maxaddr == 0 || minaddr < maxaddr);
KASSERT(!VMEM_CROSS_P(phase, phase + size - 1, nocross));
KASSERT(vmem_check_sanity(vm));
if (align == 0) {
align = vm->vm_quantum_mask + 1;
@ -1028,6 +1052,7 @@ retry_strat:
retry:
bt = NULL;
VMEM_LOCK(vm);
KASSERT(vmem_check_sanity(vm));
if (strat == VM_INSTANTFIT) {
for (list = first; list < end; list++) {
bt = LIST_FIRST(list);
@ -1105,15 +1130,15 @@ gotit:
bt_insfree(vm, bt);
bt_insseg(vm, btnew, CIRCLEQ_PREV(bt, bt_seglist));
bt_insbusy(vm, btnew);
VMEM_UNLOCK(vm);
KASSERT(vmem_check_sanity(vm));
VMEM_UNLOCK(vm);
} else {
bt->bt_type = BT_TYPE_BUSY;
bt_insbusy(vm, bt);
KASSERT(vmem_check_sanity(vm));
VMEM_UNLOCK(vm);
bt_free(vm, btnew);
btnew = bt;
KASSERT(vmem_check_sanity(vm));
}
if (btnew2 != NULL) {
bt_free(vm, btnew2);