From nobody Tue May 23 14:27:28 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4QQc8w3nGjz4CXTm; Tue, 23 May 2023 14:27:28 +0000 (UTC) (envelope-from git@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4QQc8w34hXz44LJ; Tue, 23 May 2023 14:27:28 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1684852048; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=BsfyMIxhMOVMQA2Wm526YrUskDpewVmOh2hAArhBojA=; b=vykiMcJfabjjPwJkbBPUzh5iKarP/eo6KpbToI2JKoVjTx6V/O1b9H2Xga5xsuh17SBrty F4wWVIeT8KRRS+d/S1if9RBDHwYUbBFeELm2CaRSYzLd1v5UHx5rx73jYEz7wgxTeXB6di XrGp+FP3W83XCh/fTfy18zquGjX6nsV/actEThBYrhYYfU3ZkQlM6ktMgwwa06Zx33Letn 2nBAJk8yOdBqngrFWzEbSj1YUm6PNUa8YqkgmV2fRrUTCjQ1FkSIG7BR1lAWXG+oVetqQC ex9TraSCJ0k4oRTOPDMH4TS8U2cgXo7CEXbjf7Kat9tPUj74xu8SWfBWrjqyMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1684852048; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=BsfyMIxhMOVMQA2Wm526YrUskDpewVmOh2hAArhBojA=; b=dN+Q80pD/+kSiUBSfJ7InK27gPh7BvyNAzcleWU6iiBkrOZDyUgsxI4A04m9YWBJcb1pOo pNggItqW4NUWpFjc6dLHqx2gswqFOJP+2TjoPNLQ1qIq8N6efQ9c1vSTfa9WKvtWWsIHjc Yi0WcVqovhyd6qrVdoLYcIeEgGgQSwdtODwdsejd9gYRIX1VJpUObAncz6vMztYDyirZEv gloS9lEZYXn4gPNXJk2SyXl/m8rkYw8rdpYrs1r0wAsbewYO6F8nkTAWNRiEux5vqeb8KY syZh3antaBsTsEIQGdgVTjKH5oijBYPk4UuTNhv725gxRvYGMgk7xTNzWDdYvA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1684852048; a=rsa-sha256; cv=none; b=Fb4WX8d1kvmDojHfbmKjadxhAresvPm9F2nk+JVkMvWHz/kCPQIXwsPAGMknJ0w70jXIAg 52hXt31u3Wrw/T4eqdsNJsTlG5Raas3WTOA5p9Yxh5Iqbj+jB0Gku//6uPwl+ZyfDgx7HP bJEuvdAArjlm9Ki0twREbg63D76WXCoyZRyf1VkM4Hg6pBCy0pxdwbHFzXcPyAUsCHesKM ylysw9G9OAev4Zin35hXVcNA2hizcwqEv0hlg2ay6vFVqRsT5Otxtd24pLGD0GMwUK1nbq b3iEL/i6LErW9ISbiNIw3LZ9QgyhJUHOQLSH3nzJC4f/tm370OQiJ7HrlATrQA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4QQc8w22m5z13C9; Tue, 23 May 2023 14:27:28 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 34NERScf015610; Tue, 23 May 2023 14:27:28 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 34NERS3o015609; Tue, 23 May 2023 14:27:28 GMT (envelope-from git) Date: Tue, 23 May 2023 14:27:28 GMT Message-Id: <202305231427.34NERS3o015609@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mark Johnston Subject: git: 30038a8b4efc - main - md: Get rid of the pbuf zone List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 30038a8b4efc6d0b9f8f295e28bc205fe9728310 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=30038a8b4efc6d0b9f8f295e28bc205fe9728310 commit 30038a8b4efc6d0b9f8f295e28bc205fe9728310 Author: Mark Johnston AuthorDate: 2023-05-23 14:14:06 +0000 Commit: Mark Johnston CommitDate: 2023-05-23 14:27:10 +0000 md: Get rid of the pbuf zone The zone is used solely to provide KVA for mapping BIOs so that we can pass mapped buffers to VOP_READ and VOP_WRITE. Currently we preallocate nswbuf/10 bufs for this purpose during boot. The intent was to limit KVA usage on 32-bit systems, but the preallocation means that we in fact consumed more KVA than needed unless one has more than nswbuf/10 (typically 25) vnode-backed MD devices in existence, which I would argue is the uncommon case. Meanwhile, all I/O to an MD is handled by a dedicated thread, so we can instead simply preallocate the KVA region at MD device creation time. Event: BSDCan 2023 Reviewed by: kib MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D40215 --- sys/dev/md/md.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index bb4b61783c93..a719dccb1955 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -98,6 +98,7 @@ #include #include +#include #include #include #include @@ -232,8 +233,6 @@ static LIST_HEAD(, md_s) md_softc_list = LIST_HEAD_INITIALIZER(md_softc_list); #define NMASK (NINDIR-1) static int nshift; -static uma_zone_t md_pbuf_zone; - struct indir { uintptr_t *array; u_int total; @@ -276,6 +275,7 @@ struct md_s { char file[PATH_MAX]; char label[PATH_MAX]; struct ucred *cred; + vm_offset_t kva; /* MD_SWAP related fields */ vm_object_t object; @@ -877,11 +877,11 @@ mdstart_vnode(struct md_s *sc, struct bio *bp) struct iovec *piov; struct mount *mp; struct vnode *vp; - struct buf *pb; bus_dma_segment_t *vlist; struct thread *td; off_t iolen, iostart, off, len; int ma_offs, npages; + bool mapped; switch (bp->bio_cmd) { case BIO_READ: @@ -902,11 +902,11 @@ mdstart_vnode(struct md_s *sc, struct bio *bp) td = curthread; vp = sc->vnode; - pb = NULL; piov = NULL; ma_offs = bp->bio_ma_offset; off = bp->bio_offset; len = bp->bio_length; + mapped = false; /* * VNODE I/O @@ -955,22 +955,21 @@ mdstart_vnode(struct md_s *sc, struct bio *bp) auio.uio_iovcnt = piov - auio.uio_iov; piov = auio.uio_iov; } else if ((bp->bio_flags & BIO_UNMAPPED) != 0) { - pb = uma_zalloc(md_pbuf_zone, M_WAITOK); - MPASS((pb->b_flags & B_MAXPHYS) != 0); bp->bio_resid = len; unmapped_step: npages = atop(min(maxphys, round_page(len + (ma_offs & PAGE_MASK)))); iolen = min(ptoa(npages) - (ma_offs & PAGE_MASK), len); KASSERT(iolen > 0, ("zero iolen")); - pmap_qenter((vm_offset_t)pb->b_data, - &bp->bio_ma[atop(ma_offs)], npages); - aiov.iov_base = (void *)((vm_offset_t)pb->b_data + - (ma_offs & PAGE_MASK)); + KASSERT(npages <= atop(MAXPHYS + PAGE_SIZE), + ("npages %d too large", npages)); + pmap_qenter(sc->kva, &bp->bio_ma[atop(ma_offs)], npages); + aiov.iov_base = (void *)(sc->kva + (ma_offs & PAGE_MASK)); aiov.iov_len = iolen; auio.uio_iov = &aiov; auio.uio_iovcnt = 1; auio.uio_resid = iolen; + mapped = true; } else { aiov.iov_base = bp->bio_data; aiov.iov_len = bp->bio_length; @@ -998,8 +997,8 @@ unmapped_step: VOP_ADVISE(vp, iostart, auio.uio_offset - 1, POSIX_FADV_DONTNEED); - if (pb != NULL) { - pmap_qremove((vm_offset_t)pb->b_data, npages); + if (mapped) { + pmap_qremove(sc->kva, npages); if (error == 0) { len -= iolen; bp->bio_resid -= iolen; @@ -1007,7 +1006,6 @@ unmapped_step: if (len > 0) goto unmapped_step; } - uma_zfree(md_pbuf_zone, pb); } else { bp->bio_resid = auio.uio_resid; } @@ -1276,7 +1274,7 @@ mdnew(int unit, int *errp, enum md_types type) return (NULL); } - sc = (struct md_s *)malloc(sizeof *sc, M_MD, M_WAITOK | M_ZERO); + sc = malloc(sizeof(*sc), M_MD, M_WAITOK | M_ZERO); sc->type = type; bioq_init(&sc->bio_queue); mtx_init(&sc->queue_mtx, "md bio queue", NULL, MTX_DEF); @@ -1484,6 +1482,8 @@ mdcreate_vnode(struct md_s *sc, struct md_req *mdr, struct thread *td) nd.ni_vp->v_vflag &= ~VV_MD; goto bad; } + + sc->kva = kva_alloc(MAXPHYS + PAGE_SIZE); return (0); bad: VOP_UNLOCK(nd.ni_vp); @@ -1542,6 +1542,8 @@ mddestroy(struct md_s *sc, struct thread *td) destroy_indir(sc, sc->indir); if (sc->uma) uma_zdestroy(sc->uma); + if (sc->kva) + kva_free(sc->kva, MAXPHYS + PAGE_SIZE); LIST_REMOVE(sc, list); free_unr(md_uh, sc->unit); @@ -2076,7 +2078,6 @@ g_md_init(struct g_class *mp __unused) sx_xunlock(&md_sx); } } - md_pbuf_zone = pbuf_zsecond_create("mdpbuf", nswbuf / 10); status_dev = make_dev(&mdctl_cdevsw, INT_MAX, UID_ROOT, GID_WHEEL, 0600, MDCTL_NAME); g_topology_lock(); @@ -2172,6 +2173,5 @@ g_md_fini(struct g_class *mp __unused) sx_destroy(&md_sx); if (status_dev != NULL) destroy_dev(status_dev); - uma_zdestroy(md_pbuf_zone); delete_unrhdr(md_uh); }