qio: Track the amount of bytes read
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 26 May 2017 16:49:33 +0000 (12:49 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 26 May 2017 16:49:33 +0000 (12:49 -0400)
This was useful for debugging.  You can see the amount of bytes via 'pip'.

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

index 9ec4133..72b597e 100644 (file)
@@ -526,18 +526,20 @@ static char *pipechaninfo(struct chan *chan, char *ret, size_t ret_l)
                snprintf(ret, ret_l, "Qctl, ID %d", p->path);
                break;
        case Qdata0:
                snprintf(ret, ret_l, "Qctl, ID %d", p->path);
                break;
        case Qdata0:
-               snprintf(ret, ret_l, "Qdata%d, ID %d, %s, rq len %d, wq len %d",
+               snprintf(ret, ret_l,
+                        "Qdata%d, ID %d, %s, rq len %d, wq len %d, total read %llu",
                         0, p->path,
                         SLIST_EMPTY(&p->data_taps) ? "untapped" : "tapped",
                         qlen(p->q[0]),
                         0, p->path,
                         SLIST_EMPTY(&p->data_taps) ? "untapped" : "tapped",
                         qlen(p->q[0]),
-                        qlen(p->q[1]));
+                        qlen(p->q[1]), q_bytes_read(p->q[0]));
                break;
        case Qdata1:
                break;
        case Qdata1:
-               snprintf(ret, ret_l, "Qdata%d, ID %d, %s, rq len %d, wq len %d",
+               snprintf(ret, ret_l,
+                        "Qdata%d, ID %d, %s, rq len %d, wq len %d, total read %llu",
                         1, p->path,
                         SLIST_EMPTY(&p->data_taps) ? "untapped" : "tapped",
                         qlen(p->q[1]),
                         1, p->path,
                         SLIST_EMPTY(&p->data_taps) ? "untapped" : "tapped",
                         qlen(p->q[1]),
-                        qlen(p->q[0]));
+                        qlen(p->q[0]), q_bytes_read(p->q[1]));
                break;
        default:
                ret = "Unknown type";
                break;
        default:
                ret = "Unknown type";
index 2e6fa2f..e36b711 100644 (file)
@@ -837,6 +837,7 @@ void qhangup(struct queue *, char *unused_char_p_t);
 int qisclosed(struct queue *);
 ssize_t qiwrite(struct queue *, void *, int);
 int qlen(struct queue *);
 int qisclosed(struct queue *);
 ssize_t qiwrite(struct queue *, void *, int);
 int qlen(struct queue *);
+size_t q_bytes_read(struct queue *q);
 void qdropoverflow(struct queue *, bool);
 void q_toggle_qmsg(struct queue *q, bool onoff);
 void q_toggle_qcoalesce(struct queue *q, bool onoff);
 void qdropoverflow(struct queue *, bool);
 void q_toggle_qmsg(struct queue *q, bool onoff);
 void q_toggle_qcoalesce(struct queue *q, bool onoff);
index 0ede2b0..410f94d 100644 (file)
@@ -642,9 +642,11 @@ static char *ipchaninfo(struct chan *ch, char *ret, size_t ret_l)
                case Qdata:
                        proto = f->p[PROTO(ch->qid)];
                        conv = proto->conv[CONV(ch->qid)];
                case Qdata:
                        proto = f->p[PROTO(ch->qid)];
                        conv = proto->conv[CONV(ch->qid)];
-                       snprintf(ret, ret_l, "Qdata, %s, proto %s, conv idx %d, rq len %d, wq len %d",
+                       snprintf(ret, ret_l,
+                                "Qdata, %s, proto %s, conv idx %d, rq len %d, wq len %d, total read %llu",
                                 SLIST_EMPTY(&conv->data_taps) ? "untapped" : "tapped",
                                 SLIST_EMPTY(&conv->data_taps) ? "untapped" : "tapped",
-                                proto->name, conv->x, qlen(conv->rq), qlen(conv->wq));
+                                proto->name, conv->x, qlen(conv->rq), qlen(conv->wq),
+                                        q_bytes_read(conv->rq));
                        break;
                case Qarp:
                        ret = "Qarp";
                        break;
                case Qarp:
                        ret = "Qarp";
index 8856b8c..4b0d930 100644 (file)
@@ -76,6 +76,7 @@ struct queue {
        int inilim;                             /* initial limit */
        int state;
        int eof;                                        /* number of eofs read by user */
        int inilim;                             /* initial limit */
        int state;
        int eof;                                        /* number of eofs read by user */
+       size_t bytes_read;
 
        void (*kick) (void *);          /* restart output */
        void (*bypass) (void *, struct block *);        /* bypass queue altogether */
 
        void (*kick) (void *);          /* restart output */
        void (*bypass) (void *, struct block *);        /* bypass queue altogether */
@@ -610,6 +611,7 @@ static struct block *pop_first_block(struct queue *q)
        struct block *b = q->bfirst;
 
        q->dlen -= BLEN(b);
        struct block *b = q->bfirst;
 
        q->dlen -= BLEN(b);
+       q->bytes_read += BLEN(b);
        q->bfirst = b->next;
        b->next = 0;
        return b;
        q->bfirst = b->next;
        b->next = 0;
        return b;
@@ -629,6 +631,7 @@ static void block_and_q_lost_extra(struct block *b, struct queue *q, size_t amt)
 {
        b->extra_len -= amt;
        q->dlen -= amt;
 {
        b->extra_len -= amt;
        q->dlen -= amt;
+       q->bytes_read += amt;
 }
 
 /* Helper: moves ebd from a block (in from_q) to another block.  The *ebd is
 }
 
 /* Helper: moves ebd from a block (in from_q) to another block.  The *ebd is
@@ -671,6 +674,7 @@ static size_t copy_from_first_block(struct queue *q, struct block *to,
                /* We only change dlen, (data len), not q->len, since the q still has
                 * the same block memory allocation (no kfrees happened) */
                q->dlen -= copy_amt;
                /* We only change dlen, (data len), not q->len, since the q still has
                 * the same block memory allocation (no kfrees happened) */
                q->dlen -= copy_amt;
+               q->bytes_read += copy_amt;
        }
        /* Try to extract the remainder from the extra data */
        len -= copy_amt;
        }
        /* Try to extract the remainder from the extra data */
        len -= copy_amt;
@@ -1413,6 +1417,8 @@ void qputback(struct queue *q, struct block *b)
                q->blast = b;
        q->bfirst = b;
        q->dlen += BLEN(b);
                q->blast = b;
        q->bfirst = b;
        q->dlen += BLEN(b);
+       /* qputback seems to undo a read, so we can undo the accounting too. */
+       q->bytes_read -= BLEN(b);
 }
 
 /*
 }
 
 /*
@@ -1780,6 +1786,11 @@ int qlen(struct queue *q)
        return q->dlen;
 }
 
        return q->dlen;
 }
 
+size_t q_bytes_read(struct queue *q)
+{
+       return q->bytes_read;
+}
+
 /*
  * return space remaining before flow control
  *
 /*
  * return space remaining before flow control
  *