From owner-svn-src-all@freebsd.org Mon Dec 30 00:46:11 2019 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id A34CA1D0017; Mon, 30 Dec 2019 00:46:11 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 47mJdb3pfPz4L0D; Mon, 30 Dec 2019 00:46:11 +0000 (UTC) (envelope-from mav@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 79CFD21D5D; Mon, 30 Dec 2019 00:46:11 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id xBU0kBge035307; Mon, 30 Dec 2019 00:46:11 GMT (envelope-from mav@FreeBSD.org) Received: (from mav@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id xBU0kAhm035303; Mon, 30 Dec 2019 00:46:10 GMT (envelope-from mav@FreeBSD.org) Message-Id: <201912300046.xBU0kAhm035303@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mav set sender to mav@FreeBSD.org using -f From: Alexander Motin Date: Mon, 30 Dec 2019 00:46:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r356192 - head/sys/geom X-SVN-Group: head X-SVN-Commit-Author: mav X-SVN-Commit-Paths: head/sys/geom X-SVN-Commit-Revision: 356192 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Dec 2019 00:46:11 -0000 Author: mav Date: Mon Dec 30 00:46:10 2019 New Revision: 356192 URL: https://svnweb.freebsd.org/changeset/base/356192 Log: Retire nstart/nend counters. Those counters were abused for decade to workaround broken orphanization process in different classes by delaying the call while there are active requests. But from one side it did not close all the races, while from another was quite expensive on SMP due to trashing twice per request cache lines of consumer and provider and requiring locks. It lost its sense after I manually went through all the GEOM classes in base and made orphanization wait for either provider close or request completion. Consumer counters are still used under INVARIANTS to detect premature consumer close and detach. Provider counters are removed completely. Sponsored by: iXsystems, Inc. Modified: head/sys/geom/geom.h head/sys/geom/geom_event.c head/sys/geom/geom_io.c head/sys/geom/geom_subr.c Modified: head/sys/geom/geom.h ============================================================================== --- head/sys/geom/geom.h Mon Dec 30 00:16:58 2019 (r356191) +++ head/sys/geom/geom.h Mon Dec 30 00:46:10 2019 (r356192) @@ -218,7 +218,8 @@ struct g_provider { off_t stripesize; off_t stripeoffset; struct devstat *stat; - u_int nstart, nend; + u_int spare1; + u_int spare2; u_int flags; #define G_PF_WITHER 0x2 #define G_PF_ORPHAN 0x4 Modified: head/sys/geom/geom_event.c ============================================================================== --- head/sys/geom/geom_event.c Mon Dec 30 00:16:58 2019 (r356191) +++ head/sys/geom/geom_event.c Mon Dec 30 00:46:10 2019 (r356192) @@ -241,10 +241,7 @@ one_event(void) g_topology_assert(); mtx_lock(&g_eventlock); - TAILQ_FOREACH(pp, &g_doorstep, orphan) { - if (pp->nstart == pp->nend) - break; - } + pp = TAILQ_FIRST(&g_doorstep); if (pp != NULL) { G_VALID_PROVIDER(pp); TAILQ_REMOVE(&g_doorstep, pp, orphan); @@ -299,7 +296,7 @@ g_run_events() } else { g_topology_unlock(); msleep(&g_wait_event, &g_eventlock, PRIBIO | PDROP, - "-", TAILQ_EMPTY(&g_doorstep) ? 0 : hz / 10); + "-", 0); } } /* NOTREACHED */ Modified: head/sys/geom/geom_io.c ============================================================================== --- head/sys/geom/geom_io.c Mon Dec 30 00:16:58 2019 (r356191) +++ head/sys/geom/geom_io.c Mon Dec 30 00:46:10 2019 (r356192) @@ -580,8 +580,9 @@ g_io_request(struct bio *bp, struct g_consumer *cp) devstat_start_transaction(pp->stat, &bp->bio_t0); if (g_collectstats & G_STATS_CONSUMERS) devstat_start_transaction(cp->stat, &bp->bio_t0); - pp->nstart++; +#ifdef INVARIANTS cp->nstart++; +#endif mtx_unlock(mtxp); if (direct) { @@ -691,8 +692,9 @@ g_io_deliver(struct bio *bp, int error) devstat_end_transaction_bio_bt(pp->stat, bp, &now); if (g_collectstats & G_STATS_CONSUMERS) devstat_end_transaction_bio_bt(cp->stat, bp, &now); +#ifdef INVARIANTS cp->nend++; - pp->nend++; +#endif mtx_unlock(mtxp); if (error != ENOMEM) { Modified: head/sys/geom/geom_subr.c ============================================================================== --- head/sys/geom/geom_subr.c Mon Dec 30 00:16:58 2019 (r356191) +++ head/sys/geom/geom_subr.c Mon Dec 30 00:46:10 2019 (r356192) @@ -939,6 +939,9 @@ g_access(struct g_consumer *cp, int dcr, int dcw, int KASSERT(cp->acw + dcw >= 0, ("access resulting in negative acw")); KASSERT(cp->ace + dce >= 0, ("access resulting in negative ace")); KASSERT(dcr != 0 || dcw != 0 || dce != 0, ("NOP access request")); + KASSERT(cp->acr + dcr != 0 || cp->acw + dcw != 0 || + cp->ace + dce != 0 || cp->nstart == cp->nend, + ("Last close with active requests")); KASSERT(gp->access != NULL, ("NULL geom->access")); /* @@ -1426,8 +1429,10 @@ db_show_geom_consumer(int indent, struct g_consumer *c } gprintln(" access: r%dw%de%d", cp->acr, cp->acw, cp->ace); gprintln(" flags: 0x%04x", cp->flags); +#ifdef INVARIANTS gprintln(" nstart: %u", cp->nstart); gprintln(" nend: %u", cp->nend); +#endif } else { gprintf("consumer: %p (%s), access=r%dw%de%d", cp, cp->provider != NULL ? cp->provider->name : "none", @@ -1459,8 +1464,6 @@ db_show_geom_provider(int indent, struct g_provider *p provider_flags_to_string(pp, flags, sizeof(flags)), pp->flags); gprintln(" error: %d", pp->error); - gprintln(" nstart: %u", pp->nstart); - gprintln(" nend: %u", pp->nend); if (LIST_EMPTY(&pp->consumers)) gprintln(" consumers: none"); } else {