svn commit: r335066 - in head/sys: kern sys
Warner Losh
imp at FreeBSD.org
Wed Jun 13 16:48:08 UTC 2018
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;
More information about the svn-src-all
mailing list