Andrew Morton wrote: > Nick Piggin wrote: > >> > If the queue is not congested, blk_congestion_wait() will still sleep. See >> > freed_request(). >> > >> >> Hmm... doesn't look like it to me: >> >> if (rl->count[rw] < queue_congestion_off_threshold(q)) >> clear_queue_congested(q, rw); >> >> And clear_queue_congested does an unconditional wakeup (if there >> is someone sleeping on the congestion queue). > > > That's my point. blk_congestion_wait() will always sleep, regardless of > the queue's congestion state. > Oh yes, but it will return as soon as a single request is finished. Which is probably a couple of milliseconds, rather than the 100 we had hoped for. So the allocators will wake up again and go around the loop and still make no progress. However, if you had a plain io_schedule_timeout there, at least you would sleep for the full extend of the specified timeout. BTW. Jens, now that I look at freed_request, is the memory barrier required? If so, what is it protecting?