qio: Live with Qmsg
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 21 Dec 2016 16:03:11 +0000 (11:03 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 10 Jan 2017 00:01:39 +0000 (19:01 -0500)
I was worried about us losing parts of the block.  That's just the price to
pay to use Qmsg.  This is similar to recvfrom() with SOCK_DGRAM:

If a message is too long to fit in the supplied buffer, excess
bytes may be discarded depending on the type of socket the message
is received from.

The reader will need to deal with this on their own, presumably by knowing
the max amount expected (e.g. MTU) and always reading up to that amount.

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

index 40309c0..0eff769 100644 (file)
@@ -759,9 +759,8 @@ static int __try_qbread(struct queue *q, size_t len, int qio_flags,
                /* Need to retry to make sure we have a first block */
                return QBR_AGAIN;
        }
-       /* Qmsg is a bit weird.  The old 9ns code seemed to yank the entire block,
-        * regardless of len.  We'll do the same, and just return the minimum: the
-        * first block.  I'd be happy to remove this. */
+       /* Qmsg: just return the first block.  Be careful, since our caller might
+        * not read all of the block and thus drop bytes.  Similar to SOCK_DGRAM. */
        if (q->state & Qmsg) {
                ret = pop_first_block(q);
                goto out_ok;