From owner-svn-src-head@freebsd.org Wed Jun 13 16:48:08 2018 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 4515C101C90E; Wed, 13 Jun 2018 16:48:08 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id E38876D232; Wed, 13 Jun 2018 16:48:07 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id A82C01C1E1; Wed, 13 Jun 2018 16:48:07 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w5DGm71M037717; Wed, 13 Jun 2018 16:48:07 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w5DGm7i4037714; Wed, 13 Jun 2018 16:48:07 GMT (envelope-from imp@FreeBSD.org) Message-Id: <201806131648.w5DGm7i4037714@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Wed, 13 Jun 2018 16:48:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r335066 - in head/sys: kern sys X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: in head/sys: kern sys X-SVN-Commit-Revision: 335066 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 Jun 2018 16:48:08 -0000 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 #include #include +#include #include +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;