Force the Qcoalesce flag on pipe fds
authorKevin Klues <klueska@cs.berkeley.edu>
Fri, 14 Mar 2014 23:32:43 +0000 (16:32 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Fri, 14 Mar 2014 23:32:43 +0000 (16:32 -0700)
Without this writes can produce blocks of length 0, and reads can read
them.  This causes problems since reading a zero length blcok returns 0
, and 0 means EOF from the perspective of user space.  Turning on the
Qcoalesce flag removes these 0 length blocks from consideration.

kern/drivers/dev/pipe.c
kern/src/ns/qio.c

index cd09721..da2dba8 100644 (file)
@@ -92,10 +92,10 @@ static struct chan *pipeattach(char *spec)
        kref_init(&p->ref, pipe_release, 1);
        qlock_init(&p->qlock);
 
-       p->q[0] = qopen(pipealloc.pipeqsize, 0, 0, 0);
+       p->q[0] = qopen(pipealloc.pipeqsize, Qcoalesce, 0, 0);
        if (p->q[0] == 0)
                error(Enomem);
-       p->q[1] = qopen(pipealloc.pipeqsize, 0, 0, 0);
+       p->q[1] = qopen(pipealloc.pipeqsize, Qcoalesce, 0, 0);
        if (p->q[1] == 0)
                error(Enomem);
        poperror();
index c4b21c7..4f76e6f 100644 (file)
@@ -686,6 +686,8 @@ int qproduce(struct queue *q, void *vp, int len)
 
        /* save in buffer */
        /* use Qcoalesce here to save storage */
+       // TODO: Consider removing the Qcoalesce flag and force a coalescing
+       // strategy by default.
        b = q->blast;
        if ((q->state & Qcoalesce) == 0 || q->bfirst == NULL
                || b->lim - b->wp < len) {
@@ -1077,6 +1079,8 @@ again:
        }
 
        /* if we get here, there's at least one block in the queue */
+       // TODO: Consider removing the Qcoalesce flag and force a coalescing
+       // strategy by default.
        if (q->state & Qcoalesce) {
                /* when coalescing, 0 length blocks just go away */
                b = q->bfirst;