qio: Remove q->len
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 29 Mar 2017 14:54:44 +0000 (10:54 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 29 Mar 2017 14:54:44 +0000 (10:54 -0400)
commit5eb3a8e164dc74497e9ecbf0d56f167f971cc770
treea25674805512fe2254540c66da707ea501a6a68c
parente2d1f26d2a06271eed57b6f82124b1a3a0f07de3
qio: Remove q->len

q->dlen is the amount of data bytes in the queue: the bytes that our
clients are adding and removing.

q->len was the amount of total bytes in the queue, including metadata,
block structs, and anything else.  If you had a block with 0 data bytes in
the queue, the size of the block itself counted against q->len.

Note that the qlen() function actually returns q->dlen.  The only time we
really used q->len was for flow control, and that's where it caused
problems.  I had a pipe where the reader didn't wake a writer.  The reader
saw 'was_unwritable', then popped a block of length 0, and did a retry
(this was the Qcoalesce case).  However, popping that block made the queue
writable again, which was unexpected since the reader got nothing.

Instead of mucking around with q->len and q->dlen any further, I just
yanked q->len completely.  It's not clear that we even wanted q->len, and
it's been the source of bugs and confusion for a while now.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/ns/qio.c