qio: Allow changing limits dynamically
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 19 Jun 2017 15:03:33 +0000 (11:03 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 20 Jul 2017 12:19:46 +0000 (08:19 -0400)
The queue's limit is the point at which writers get blocked.  Specifically,
they block once the qlen crosses the limit - the actual write succeeds.

The tricky bit is that if you increase the limit, some writers may become
unblocked.  Similarly, the queue may become writable, which requires us to
fire a tap.

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

index f421b1a..a505011 100644 (file)
@@ -849,7 +849,8 @@ void qputback(struct queue *, struct block *);
 size_t qread(struct queue *q, void *va, size_t len);
 size_t qread_nonblock(struct queue *q, void *va, size_t len);
 void qreopen(struct queue *);
-void qsetlimit(struct queue *, int);
+void qsetlimit(struct queue *, size_t);
+size_t qgetlimit(struct queue *);
 int qwindow(struct queue *);
 ssize_t qwrite(struct queue *, void *, int);
 ssize_t qwrite_nonblock(struct queue *, void *, int);
index 7234d02..5454df0 100644 (file)
@@ -1829,9 +1829,20 @@ int qcanread(struct queue *q)
 /*
  *  change queue limit
  */
-void qsetlimit(struct queue *q, int limit)
+void qsetlimit(struct queue *q, size_t limit)
 {
+       bool was_writable = qwritable(q);
+
        q->limit = limit;
+       if (!was_writable && qwritable(q)) {
+               rendez_wakeup(&q->wr);
+               qwake_cb(q, FDTAP_FILT_WRITABLE);
+       }
+}
+
+size_t qgetlimit(struct queue *q)
+{
+       return q->limit;
 }
 
 /*