qio: Consolidate readers into __qbread()
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 30 Mar 2016 18:08:45 +0000 (14:08 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 5 Apr 2016 19:42:14 +0000 (15:42 -0400)
commit5dd85903dd8f226e35abb2568b839b1f3e60dc90
treefa8125c3dada2599ebfcd2530fe5182f9b998ba3
parent4fe57d436fe72b628f3a69de1929636d0941a4ad
qio: Consolidate readers into __qbread()

There are a bunch of different functions that read from a queue:
- qread()
- qbread()
- qget()
- qdiscard()

And I'll be adding more soon.

They all had slightly different semantics, but mostly did the same thing.
I consolidated them into one __qbread(), which returns a blocklist.  The
functions do whatever they want with the list.

To some extent, this will be a little slower than before.  Other than just
stuff like branching, qdiscard was able to just free as it went, instead of
transferring them to a new list (meaning it never needed the 'spare' block
for allocations).  Same goes for qread().

OTOH, qread was holding a spinlock and writing to user memory.  Not
anymore!  So that will save us from a source of complexity later.

We do have slightly different semantics now.  __qbread() will *attempt* to
get up to len, but might return early (with amt > 0) while there is more
data in the queue.  Some of the functions, like qdiscard(), can't handle
this.  I used a somewhat racy loop around __qbread() in that case.

There's now only one source of producer wakeup, where I preserved
Presotto's comment and change to the heuristic.  Who knows if that was
supposed to apply in other places, or if it was just added to the place
that popped up during profiling.  Now there's just one site.

A lot of QIO is an unclear mess.  Why does qbread return only one block?
(Note in #mnt that a dev.bread expects to get a blocklist back).  Why is a
blocklist different than a block in many places?   Good thing we have
blocklen() (length of a block list) and BLEN() (length of a block).   Why
are so many functions mucking with queues without locks?  (e.g. qaddlist())
Good times.

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