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) ...@@ -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 static inline unsigned
buddy_reqs_work_list_locked(struct buddy_reqs_head *head); buddy_reqs_work_list_locked(struct buddy_reqs_head *head);
...@@ -881,6 +904,8 @@ buddy_wait_work(buddy_t *buddy) ...@@ -881,6 +904,8 @@ buddy_wait_work(buddy_t *buddy)
struct buddy_reqs_head *head; struct buddy_reqs_head *head;
unsigned pri; unsigned pri;
ASSERT_WAITQ(buddy);
AN(buddy->waiting); AN(buddy->waiting);
AN(buddy->deficit); AN(buddy->deficit);
AZ(buddy->wait_working); AZ(buddy->wait_working);
...@@ -895,6 +920,8 @@ buddy_wait_work(buddy_t *buddy) ...@@ -895,6 +920,8 @@ buddy_wait_work(buddy_t *buddy)
buddy->wait_pri = pri + 1; buddy->wait_pri = pri + 1;
assert(buddy->wait_pri <= BUDDY_WAIT_MAXPRI); assert(buddy->wait_pri <= BUDDY_WAIT_MAXPRI);
buddy->wait_working = 0; buddy->wait_working = 0;
ASSERT_WAITQ(buddy);
} }
// external: wait until space is needed (LRU) // external: wait until space is needed (LRU)
...@@ -1659,6 +1686,8 @@ buddy_reqs_enqueue(struct buddy_reqs *reqs) ...@@ -1659,6 +1686,8 @@ buddy_reqs_enqueue(struct buddy_reqs *reqs)
CHECK_OBJ(w, I_WAIT_MAGIC); CHECK_OBJ(w, I_WAIT_MAGIC);
buddy = reqs->buddy; buddy = reqs->buddy;
ASSERT_WAITQ(buddy);
assert(w->state == IW_ARMED); assert(w->state == IW_ARMED);
w->state = IW_WAITING; w->state = IW_WAITING;
assert(reqs->pri <= BUDDY_WAIT_MAXPRI); assert(reqs->pri <= BUDDY_WAIT_MAXPRI);
...@@ -1669,6 +1698,7 @@ buddy_reqs_enqueue(struct buddy_reqs *reqs) ...@@ -1669,6 +1698,7 @@ buddy_reqs_enqueue(struct buddy_reqs *reqs)
if (w->pri > buddy->wait_pri) if (w->pri > buddy->wait_pri)
buddy->wait_pri = w->pri; buddy->wait_pri = w->pri;
AZ(pthread_cond_broadcast(&buddy->wait_kick_cond)); AZ(pthread_cond_broadcast(&buddy->wait_kick_cond));
ASSERT_WAITQ(buddy);
} }
/* /*
...@@ -1727,6 +1757,8 @@ buddy_reqs_wait_cancel(struct buddy_reqs *reqs) ...@@ -1727,6 +1757,8 @@ buddy_reqs_wait_cancel(struct buddy_reqs *reqs)
AZ(pthread_mutex_lock(&reqs->buddy->map_mtx)); AZ(pthread_mutex_lock(&reqs->buddy->map_mtx));
AZ(pthread_mutex_lock(&w->wait_mtx)); AZ(pthread_mutex_lock(&w->wait_mtx));
ASSERT_WAITQ(buddy);
if (w->state == IW_WAITING) { if (w->state == IW_WAITING) {
AN(buddy->waiting); AN(buddy->waiting);
buddy->waiting--; buddy->waiting--;
...@@ -1738,6 +1770,9 @@ buddy_reqs_wait_cancel(struct buddy_reqs *reqs) ...@@ -1738,6 +1770,9 @@ buddy_reqs_wait_cancel(struct buddy_reqs *reqs)
} }
if (buddy->waiting && buddy->wait_pri == w->pri) if (buddy->waiting && buddy->wait_pri == w->pri)
buddy_wait_work(buddy); buddy_wait_work(buddy);
ASSERT_WAITQ(buddy);
AZ(pthread_mutex_unlock(&reqs->buddy->map_mtx)); AZ(pthread_mutex_unlock(&reqs->buddy->map_mtx));
} else { } else {
AZ(pthread_mutex_lock(&w->wait_mtx)); 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