From nobody Fri May 20 00:21:05 2022 X-Original-To: dev-commits-src-all@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 912B11B40D87; Fri, 20 May 2022 00:21:06 +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 4L46p92sRvz3krC; Fri, 20 May 2022 00:21:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1653006066; 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=yHhk4lUjpitU+/pajrR0gHUSwL6ESz3NeB2C1yHSQmc=; b=u7RExNN12fQFWSZRFJIo+172kQRJwz/0MNE447sn69ITtMaNTNeP3wNoEK2nE0VYfxd3rT b0mpSkxdUHKi3rlzX23OpJ8TBrrNT+UFbjIWz5icPcOlGG05Qkqj8xttQ9YikpVAWncZ12 nbtuNKQlVSaZFBLws24GpMgtQFULalAgIJoD+rg+1B8ldVJw2x0995i3rdjrM+uKMTFVnX fyGDbY7DKt7hNb+ST71jNB9g7bzEkOIRyWZfANew1pfbpwj2Kt43Ff9asZ03K3X7vc6eQi 79PdpKg6LXn16Bng7HoCURICxs8ckX3L3ZiYTI36we3dditu5sYxLIObqoJnfg== 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 39F4E27C10; Fri, 20 May 2022 00:21:05 +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 24K0L5Ox071962; Fri, 20 May 2022 00:21:05 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 24K0L5Ox071961; Fri, 20 May 2022 00:21:05 GMT (envelope-from git) Date: Fri, 20 May 2022 00:21:05 GMT Message-Id: <202205200021.24K0L5Ox071961@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: 80893ea32be0 - stable/13 - pbio: Add locking and remove D_NEEDGIANT. List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 80893ea32be08797049b36dc14e2210e40a4f5b8 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1653006066; 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=yHhk4lUjpitU+/pajrR0gHUSwL6ESz3NeB2C1yHSQmc=; b=Td9wWurRW2XO2UWkOqbKRWehqak3XV7Y7AoADwbY4M2lOyqae3a3xjdKS2veaNX3n62iim JVxJOMn+nyk5ICOEFdA72x5wtFR5rsl2qu7Ar6A9KK7scvuDQD3WHpoLvi5AkvSt33zYag 6AY/6PDoSLX8hPDBaydWO0AXv/aJ7ze/dMZKHCXWF317J1f2XkKKzbLBuG4RwB6IjscdSc NTytVBiuKWrUa2R7vDU8q7v6Pqdwx1rWSNS5l1ZrB2rqyRCU0m6Tm1QoTvQz0N9zm6J4oZ cLyXavTOLwx1Qiu0GqyrW25sZEzlDKGhaCfiD44Ul+nw1Tt7qGNKhd1AzNs9JA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1653006066; a=rsa-sha256; cv=none; b=WSQkCRZBTRECZeNVpAP3RDec0E/ngVDYZial9B7dJKQDbvK6RwwigciBYVzsZSaoTg+bOV Eu6Ll7PCzjOx0MYxYxmG+NZmeKbaZt7cU4YlHtlfkHXnwO+p+3okUXrex8WqIqojEloPS9 ltJcdWjKqKxwDfgtZWiiufE2Jz34BoWtiEnn4sZRyZdrKBEVOUbhJ5FmTFlW8IRRMk8kHv xIVz9aAMIHib4+q3tmMwDpjFJO1P3Scoca2yjCRHIgK9eXNjFW2HfAAN1JLItO4k+8uhVU MrU+vaq8OSwzw9tuwAzV28ue5G5W9clCyQVS5XZbmSowMJkX0wSt16U985O76w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=80893ea32be08797049b36dc14e2210e40a4f5b8 commit 80893ea32be08797049b36dc14e2210e40a4f5b8 Author: John Baldwin AuthorDate: 2022-05-05 23:40:04 +0000 Commit: John Baldwin CommitDate: 2022-05-19 22:01:50 +0000 pbio: Add locking and remove D_NEEDGIANT. Use a sx lock to permit uiomove directly into/out of the the per-port buffers. In addition, the sx lock provides a stronger guarantee that I think this driver wants which is to single-thread read and write calls even while paused. Finally, replace tsleep with dummy wait channels with calls to pause_sig to more clearly communicate the intent. Differential Revision: https://reviews.freebsd.org/D35081 (cherry picked from commit 51f481235c29fb38b92fb08a830385e39df80093) --- sys/dev/pbio/pbio.c | 54 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/sys/dev/pbio/pbio.c b/sys/dev/pbio/pbio.c index 516ec3a73408..0fd841cd5720 100644 --- a/sys/dev/pbio/pbio.c +++ b/sys/dev/pbio/pbio.c @@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$"); #include /* pbio IOCTL definitions */ #include #include +#include #include /* Function prototypes (these should all be static) */ @@ -84,11 +85,8 @@ static char *port_names[] = {"a", "b", "ch", "cl"}; #define pbio_addr(dev) ((dev)->si_drv1) -#define PBIOPRI ((PZERO + 5) | PCATCH) - static struct cdevsw pbio_cdevsw = { .d_version = D_VERSION, - .d_flags = D_NEEDGIANT, .d_open = pbioopen, .d_read = pbioread, .d_write = pbiowrite, @@ -117,6 +115,7 @@ struct pbio_softc { int iomode; /* Virtualized I/O mode port value */ /* The real port is write-only */ struct resource *res; + struct sx lock; }; typedef struct pbio_softc *sc_p; @@ -230,6 +229,7 @@ pbioattach (device_t dev) */ sc->iomode = 0x9b; /* All ports to input */ + sx_init(&sc->lock, "pbio"); for (i = 0; i < PBIO_NPORTS; i++) { make_dev_args_init(&args); args.mda_devsw = &pbio_cdevsw; @@ -249,10 +249,12 @@ pbioioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *td) { struct pbio_softc *scp; - int port; + int error, port; + error = 0; port = PORT(dev); scp = pbio_addr(dev); + sx_xlock(&scp->lock); switch (cmd) { case PBIO_SETDIFF: scp->pd[port].diff = *(int *)data; @@ -273,16 +275,17 @@ pbioioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag, *(int *)data = scp->pd[port].opace; break; default: - return ENXIO; + error = ENXIO; } - return (0); + sx_xunlock(&scp->lock); + return (error); } static int pbioopen(struct cdev *dev, int oflags, int devtype, struct thread *td) { struct pbio_softc *scp; - int ocfg, port; + int error, ocfg, port; int portbit; /* Port configuration bit */ port = PORT(dev); @@ -297,6 +300,8 @@ pbioopen(struct cdev *dev, int oflags, int devtype, struct thread *td) } ocfg = scp->iomode; + error = 0; + sx_xlock(&scp->lock); if (oflags & FWRITE) /* Writing == output; zero the bit */ pboutb(scp, PBIO_CFG, scp->iomode = (ocfg & (~portbit))); @@ -304,9 +309,10 @@ pbioopen(struct cdev *dev, int oflags, int devtype, struct thread *td) /* Reading == input; set the bit */ pboutb(scp, PBIO_CFG, scp->iomode = (ocfg | portbit)); else - return (EACCES); + error = EACCES; + sx_xunlock(&scp->lock); - return (0); + return (error); } /* @@ -341,8 +347,7 @@ portval(int port, struct pbio_softc *scp, char *val) scp->pd[port].oldval = *val; return (0); } - err = tsleep((caddr_t)&(scp->pd[port].diff), PBIOPRI, - "pbiopl", max(1, scp->pd[port].ipace)); + err = pause_sig("pbiopl", max(1, scp->pd[port].ipace)); if (err == EINTR) return (EINTR); } else @@ -354,26 +359,28 @@ static int pbioread(struct cdev *dev, struct uio *uio, int ioflag) { struct pbio_softc *scp; - int err, i, port, ret, toread; + int err, i, port, toread; char val; port = PORT(dev); scp = pbio_addr(dev); + err = 0; + sx_xlock(&scp->lock); while (uio->uio_resid > 0) { toread = min(uio->uio_resid, PBIO_BUFSIZ); - if ((ret = uiomove(scp->pd[port].buff, toread, uio)) != 0) - return (ret); + if ((err = uiomove(scp->pd[port].buff, toread, uio)) != 0) + break; for (i = 0; i < toread; i++) { if ((err = portval(port, scp, &val)) != 0) - return (err); + break; scp->pd[port].buff[i] = val; if (!scp->pd[port].diff && scp->pd[port].ipace) - tsleep((caddr_t)&(scp->pd[port].ipace), PBIOPRI, - "pbioip", scp->pd[port].ipace); + pause_sig("pbioip", scp->pd[port].ipace); } } - return 0; + sx_xunlock(&scp->lock); + return (err); } static int @@ -386,10 +393,12 @@ pbiowrite(struct cdev *dev, struct uio *uio, int ioflag) port = PORT(dev); scp = pbio_addr(dev); + ret = 0; + sx_xlock(&scp->lock); while (uio->uio_resid > 0) { towrite = min(uio->uio_resid, PBIO_BUFSIZ); if ((ret = uiomove(scp->pd[port].buff, towrite, uio)) != 0) - return (ret); + break; for (i = 0; i < towrite; i++) { val = scp->pd[port].buff[i]; switch (port) { @@ -413,12 +422,11 @@ pbiowrite(struct cdev *dev, struct uio *uio, int ioflag) break; } if (scp->pd[port].opace) - tsleep((caddr_t)&(scp->pd[port].opace), - PBIOPRI, "pbioop", - scp->pd[port].opace); + pause_sig("pbioop", scp->pd[port].opace); } } - return (0); + sx_xunlock(&scp->lock); + return (ret); } static int