buddy: additional assertions that wait_pri is correct

parent 6b3b606e
......@@ -871,6 +871,29 @@ page_free_locked(struct slashmap *map, unsigned bits, size_t page)
*
*/
#ifdef DEBUG
static void
assert_waitq(buddy_t *buddy)
{
unsigned pri;
if (buddy->waiting == 0)
AZ(buddy->wait_pri);
for (pri = BUDDY_WAIT_MAXPRI;
pri > buddy->wait_pri;
pri--)
assert(VTAILQ_EMPTY(&buddy->reqs_head[pri]));
assert(pri == buddy->wait_pri);
assert(VTAILQ_EMPTY(&buddy->reqs_head[pri]) ==
! buddy->waiting);
}
#define ASSERT_WAITQ(buddy) assert_waitq(buddy)
#else
#define ASSERT_WAITQ(buddy) (void)0
#endif
static inline unsigned
buddy_reqs_work_list_locked(struct buddy_reqs_head *head);
......@@ -881,6 +904,8 @@ buddy_wait_work(buddy_t *buddy)
struct buddy_reqs_head *head;
unsigned pri;
ASSERT_WAITQ(buddy);
AN(buddy->waiting);
AN(buddy->deficit);
AZ(buddy->wait_working);
......@@ -895,6 +920,8 @@ buddy_wait_work(buddy_t *buddy)
buddy->wait_pri = pri + 1;
assert(buddy->wait_pri <= BUDDY_WAIT_MAXPRI);
buddy->wait_working = 0;
ASSERT_WAITQ(buddy);
}
// external: wait until space is needed (LRU)
......@@ -1659,6 +1686,8 @@ buddy_reqs_enqueue(struct buddy_reqs *reqs)
CHECK_OBJ(w, I_WAIT_MAGIC);
buddy = reqs->buddy;
ASSERT_WAITQ(buddy);
assert(w->state == IW_ARMED);
w->state = IW_WAITING;
assert(reqs->pri <= BUDDY_WAIT_MAXPRI);
......@@ -1669,6 +1698,7 @@ buddy_reqs_enqueue(struct buddy_reqs *reqs)
if (w->pri > buddy->wait_pri)
buddy->wait_pri = w->pri;
AZ(pthread_cond_broadcast(&buddy->wait_kick_cond));
ASSERT_WAITQ(buddy);
}
/*
......@@ -1727,6 +1757,8 @@ buddy_reqs_wait_cancel(struct buddy_reqs *reqs)
AZ(pthread_mutex_lock(&reqs->buddy->map_mtx));
AZ(pthread_mutex_lock(&w->wait_mtx));
ASSERT_WAITQ(buddy);
if (w->state == IW_WAITING) {
AN(buddy->waiting);
buddy->waiting--;
......@@ -1738,6 +1770,9 @@ buddy_reqs_wait_cancel(struct buddy_reqs *reqs)
}
if (buddy->waiting && buddy->wait_pri == w->pri)
buddy_wait_work(buddy);
ASSERT_WAITQ(buddy);
AZ(pthread_mutex_unlock(&reqs->buddy->map_mtx));
} else {
AZ(pthread_mutex_lock(&w->wait_mtx));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment