Date: Thu, 19 Dec 2019 01:25:44 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r355891 - stable/12/sys/geom Message-ID: <201912190125.xBJ1PiRT037144@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Thu Dec 19 01:25:44 2019 New Revision: 355891 URL: https://svnweb.freebsd.org/changeset/base/355891 Log: MFC r355410: Switch GEOM_DEV from make_dev_p() to make_dev_s(). It closes the race condition and so allows to remove few NULL checks. Also while there, use dev->si_drv1 in addition to cp->private to store softc pointer. For calls coming from the dev side it gives reliable cache hit instead of often miss before. Modified: stable/12/sys/geom/geom_dev.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/geom/geom_dev.c ============================================================================== --- stable/12/sys/geom/geom_dev.c Thu Dec 19 00:11:18 2019 (r355890) +++ stable/12/sys/geom/geom_dev.c Thu Dec 19 01:25:44 2019 (r355891) @@ -326,6 +326,7 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, int error; struct cdev *dev, *adev; char buf[SPECNAMELEN + 6]; + struct make_dev_args args; g_trace(G_T_TOPOLOGY, "dev_taste(%s,%s)", mp->name, pp->name); g_topology_assert(); @@ -338,8 +339,17 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, error = g_attach(cp, pp); KASSERT(error == 0, ("g_dev_taste(%s) failed to g_attach, err=%d", pp->name, error)); - error = make_dev_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK, &dev, - &g_dev_cdevsw, NULL, UID_ROOT, GID_OPERATOR, 0640, "%s", gp->name); + + make_dev_args_init(&args); + args.mda_flags = MAKEDEV_CHECKNAME | MAKEDEV_WAITOK; + args.mda_devsw = &g_dev_cdevsw; + args.mda_cr = NULL; + args.mda_uid = UID_ROOT; + args.mda_gid = GID_OPERATOR; + args.mda_mode = 0640; + args.mda_si_drv1 = sc; + args.mda_si_drv2 = cp; + error = make_dev_s(&args, &sc->sc_dev, "%s", gp->name); if (error != 0) { printf("%s: make_dev_p() failed (gp->name=%s, error=%d)\n", __func__, gp->name, error); @@ -350,11 +360,9 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, g_free(sc); return (NULL); } + dev = sc->sc_dev; dev->si_flags |= SI_UNMAPPED; - sc->sc_dev = dev; - dev->si_iosize_max = MAXPHYS; - dev->si_drv2 = cp; error = init_dumpdev(dev); if (error != 0) printf("%s: init_dumpdev() failed (gp->name=%s, error=%d)\n", @@ -389,8 +397,6 @@ g_dev_open(struct cdev *dev, int flags, int fmt, struc int error, r, w, e; cp = dev->si_drv2; - if (cp == NULL) - return (ENXIO); /* g_dev_taste() not done yet */ g_trace(G_T_ACCESS, "g_dev_open(%s, %d, %d, %p)", cp->geom->name, flags, fmt, td); @@ -421,7 +427,7 @@ g_dev_open(struct cdev *dev, int flags, int fmt, struc error = g_access(cp, r, w, e); g_topology_unlock(); if (error == 0) { - sc = cp->private; + sc = dev->si_drv1; mtx_lock(&sc->sc_mtx); if (sc->sc_open == 0 && (sc->sc_active & SC_A_ACTIVE) != 0) wakeup(&sc->sc_active); @@ -443,8 +449,6 @@ g_dev_close(struct cdev *dev, int flags, int fmt, stru int error, r, w, e; cp = dev->si_drv2; - if (cp == NULL) - return (ENXIO); g_trace(G_T_ACCESS, "g_dev_close(%s, %d, %d, %p)", cp->geom->name, flags, fmt, td); @@ -469,7 +473,7 @@ g_dev_close(struct cdev *dev, int flags, int fmt, stru if (r + w + e == 0) return (EINVAL); - sc = cp->private; + sc = dev->si_drv1; mtx_lock(&sc->sc_mtx); sc->sc_open += r + w + e; if (sc->sc_open == 0) @@ -748,7 +752,6 @@ g_dev_strategy(struct bio *bp) ("Wrong bio_cmd bio=%p cmd=%d", bp, bp->bio_cmd)); dev = bp->bio_dev; cp = dev->si_drv2; - sc = cp->private; KASSERT(cp->acr || cp->acw, ("Consumer with zero access count in g_dev_strategy")); biotrack(bp, __func__); @@ -760,6 +763,7 @@ g_dev_strategy(struct bio *bp) return; } #endif + sc = dev->si_drv1; KASSERT(sc->sc_open > 0, ("Closed device in g_dev_strategy")); atomic_add_int(&sc->sc_active, 1);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201912190125.xBJ1PiRT037144>