Buddy: copy the priority from reqs to i_wait

otherwise all hell will break loose if we changed reqs->pri, because
we would dequeue from the wrong list head.
parent 3a49292f
......@@ -1663,11 +1663,12 @@ buddy_reqs_enqueue(struct buddy_reqs *reqs)
assert(w->state == IW_ARMED);
w->state = IW_WAITING;
assert(reqs->pri <= BUDDY_WAIT_MAXPRI);
VTAILQ_INSERT_TAIL(&buddy->reqs_head[reqs->pri], reqs, i_wait.list);
w->pri = reqs->pri;
VTAILQ_INSERT_TAIL(&buddy->reqs_head[w->pri], reqs, i_wait.list);
buddy->waiting++;
buddy->deficit += reqs->sz;
if (reqs->pri > buddy->wait_pri)
buddy->wait_pri = reqs->pri;
if (w->pri > buddy->wait_pri)
buddy->wait_pri = w->pri;
AZ(pthread_cond_broadcast(&buddy->wait_kick_cond));
}
......@@ -1722,7 +1723,7 @@ buddy_reqs_wait_cancel(struct buddy_reqs *reqs)
if (w->state == IW_WAITING) {
/* remove from wait list, w->state could be outdated ! */
buddy = reqs->buddy;
head = &buddy->reqs_head[reqs->pri];
head = &buddy->reqs_head[w->pri];
AZ(pthread_mutex_lock(&reqs->buddy->map_mtx));
AZ(pthread_mutex_lock(&w->wait_mtx));
......@@ -1736,7 +1737,7 @@ buddy_reqs_wait_cancel(struct buddy_reqs *reqs)
VTAILQ_REMOVE(head, reqs, i_wait.list);
w->state = IW_SIGNALLED;
}
if (buddy->waiting && buddy->wait_pri == reqs->pri)
if (buddy->waiting && buddy->wait_pri == w->pri)
buddy_wait_work(buddy);
AZ(pthread_mutex_unlock(&reqs->buddy->map_mtx));
} else {
......
......@@ -303,6 +303,7 @@ struct i_wait {
pthread_cond_t wait_cond;
VTAILQ_ENTRY(buddy_reqs) list;
// updated under lock - KEEP SEPERATE FROM "owned by initiator"
uint8_t pri; // index to head for list
uint8_t alloced; // how many of n
enum i_wait_state state;
};
......
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