Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Jun 2018 15:12:29 -0400
From:      Ravi Pokala <rpokala@freebsd.org>
To:        Warner Losh <imp@FreeBSD.org>, <src-committers@freebsd.org>, <svn-src-all@freebsd.org>, <svn-src-head@freebsd.org>
Subject:   Re: svn commit: r335066 - in head/sys: kern sys
Message-ID:  <7D695D8A-D273-4914-9980-F4BD096A80A2@panasas.com>
In-Reply-To: <201806131648.w5DGm7i4037714@repo.freebsd.org>
References:  <201806131648.w5DGm7i4037714@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi Warner,

I have many questions...

"Car limit"? I'm not sure what you mean by that?

This change starts tracking the total number of BIOs on the queue, but doesn't actually do anything with that value.

When there are more requests batched than the limit, your comment say you "start over", and the code says you bioq_insert_tail(). Why does the latter imply "start(ing) over"?

Thanks,

Ravi (rpokala@)

-----Original Message-----
From: <owner-src-committers@freebsd.org> on behalf of Warner Losh <imp@FreeBSD.org>
Date: 2018-06-13, Wednesday at 12:48
To: <src-committers@freebsd.org>, <svn-src-all@freebsd.org>, <svn-src-head@freebsd.org>
Subject: svn commit: r335066 - in head/sys: kern sys

Author: imp
Date: Wed Jun 13 16:48:07 2018
New Revision: 335066
URL: https://svnweb.freebsd.org/changeset/base/335066

Log:
  Implement a 'car limit' for bioq.
  
  Allow one to implement a 'car limit' for
  bioq_disksort. debug.bioq_batchsize sets the size of car limit. Every
  time we queue that many requests, we start over so that we limit the
  latency for requests when the software queue depths are large. A value
  of '0', the default, means to revert to the old behavior.
  
  Sponsored by: Netflix

Modified:
  head/sys/kern/subr_disk.c
  head/sys/sys/bio.h

Modified: head/sys/kern/subr_disk.c
==============================================================================
--- head/sys/kern/subr_disk.c	Wed Jun 13 15:58:33 2018	(r335065)
+++ head/sys/kern/subr_disk.c	Wed Jun 13 16:48:07 2018	(r335066)
@@ -23,8 +23,13 @@ __FBSDID("$FreeBSD$");
 #include <sys/bio.h>
 #include <sys/conf.h>
 #include <sys/disk.h>
+#include <sys/sysctl.h>
 #include <geom/geom_disk.h>
 
+static int bioq_batchsize = 0;
+SYSCTL_INT(_debug, OID_AUTO, bioq_batchsize, CTLFLAG_RW,
+    &bioq_batchsize, 0, "BIOQ batch size");
+
 /*-
  * Disk error is the preface to plaintive error messages
  * about failing disk transfers.  It prints messages of the form
@@ -152,6 +157,8 @@ bioq_init(struct bio_queue_head *head)
 	TAILQ_INIT(&head->queue);
 	head->last_offset = 0;
 	head->insert_point = NULL;
+	head->total = 0;
+	head->batched = 0;
 }
 
 void
@@ -165,6 +172,7 @@ bioq_remove(struct bio_queue_head *head, struct bio *b
 		head->insert_point = NULL;
 
 	TAILQ_REMOVE(&head->queue, bp, bio_queue);
+	head->total--;
 }
 
 void
@@ -183,6 +191,8 @@ bioq_insert_head(struct bio_queue_head *head, struct b
 	if (head->insert_point == NULL)
 		head->last_offset = bp->bio_offset;
 	TAILQ_INSERT_HEAD(&head->queue, bp, bio_queue);
+	head->total++;
+	head->batched = 0;
 }
 
 void
@@ -190,6 +200,7 @@ bioq_insert_tail(struct bio_queue_head *head, struct b
 {
 
 	TAILQ_INSERT_TAIL(&head->queue, bp, bio_queue);
+	head->total++;
 	head->insert_point = bp;
 	head->last_offset = bp->bio_offset;
 }
@@ -248,6 +259,11 @@ bioq_disksort(struct bio_queue_head *head, struct bio 
 		return;
 	}
 
+	if (bioq_batchsize > 0 && head->batched > bioq_batchsize) {
+		bioq_insert_tail(head, bp);
+		return;
+	}
+
 	prev = NULL;
 	key = bioq_bio_key(head, bp);
 	cur = TAILQ_FIRST(&head->queue);
@@ -266,4 +282,6 @@ bioq_disksort(struct bio_queue_head *head, struct bio 
 		TAILQ_INSERT_HEAD(&head->queue, bp, bio_queue);
 	else
 		TAILQ_INSERT_AFTER(&head->queue, prev, bp, bio_queue);
+	head->total++;
+	head->batched++;
 }

Modified: head/sys/sys/bio.h
==============================================================================
--- head/sys/sys/bio.h	Wed Jun 13 15:58:33 2018	(r335065)
+++ head/sys/sys/bio.h	Wed Jun 13 16:48:07 2018	(r335066)
@@ -138,6 +138,8 @@ struct bio_queue_head {
 	TAILQ_HEAD(bio_queue, bio) queue;
 	off_t last_offset;
 	struct	bio *insert_point;
+	int total;
+	int batched;
 };
 
 extern struct vm_map *bio_transient_map;






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?7D695D8A-D273-4914-9980-F4BD096A80A2>