> Date: Tue, 16 Apr 2019 16:39:42 +0200 > From: Patrick Wildt <patr...@blueri.se> > > On Tue, Apr 16, 2019 at 03:23:37PM +0200, Mark Kettenis wrote: > > > Date: Mon, 15 Apr 2019 08:50:04 +0200 > > > From: Patrick Wildt <patr...@blueri.se> > > > Content-Type: text/plain; charset="utf-8" > > > Content-Disposition: inline > > > > > > Hi, > > > > > > with kettenis' change from 2015(?) we are able to configure ppb(4)'s > > > that are hotplugged. I think on detach we should make sure to free the > > > bus range that was allocated for that device dynamically. Otherwise > > > plug and pull can starve the extent. > > > > > > Feedback? > > > > The only thing I can think of is that the name sc_pbusex is a > > bitconfusing since we already have sc_pmemex where the "p" stands for > > prefetchable. Maybe just call it sc_parent_busex? > > Heh, true, you're right. That better? ok?
ok kettenis@ Regadring the other ppb(4) diff; I'd like to test that on a system with ExpressCard first. > diff --git a/sys/dev/pci/ppb.c b/sys/dev/pci/ppb.c > index 34e3697dd51..b4894926bd0 100644 > --- a/sys/dev/pci/ppb.c > +++ b/sys/dev/pci/ppb.c > @@ -66,6 +66,7 @@ struct ppb_softc { > pcitag_t sc_tag; /* ...and tag. */ > pci_intr_handle_t sc_ih[4]; > void *sc_intrhand; > + struct extent *sc_parent_busex; > struct extent *sc_busex; > struct extent *sc_ioex; > struct extent *sc_memex; > @@ -77,6 +78,9 @@ struct ppb_softc { > struct task sc_remove_task; > struct timeout sc_to; > > + u_long sc_busnum; > + u_long sc_busrange; > + > bus_addr_t sc_iobase, sc_iolimit; > bus_addr_t sc_membase, sc_memlimit; > bus_addr_t sc_pmembase, sc_pmemlimit; > @@ -390,6 +394,10 @@ ppbdetach(struct device *self, int flags) > free(name, M_DEVBUF, PPB_EXNAMLEN); > } > > + if (sc->sc_parent_busex) > + extent_free(sc->sc_parent_busex, sc->sc_busnum, > + sc->sc_busrange, EX_NOWAIT); > + > return (rv); > } > > @@ -529,6 +537,9 @@ ppb_alloc_busrange(struct ppb_softc *sc, struct > pci_attach_args *pa, > if (extent_alloc(pa->pa_busex, busrange, 1, 0, 0, > EX_NOWAIT, &busnum)) > continue; > + sc->sc_parent_busex = pa->pa_busex; > + sc->sc_busnum = busnum; > + sc->sc_busrange = busrange; > *busdata |= pa->pa_bus; > *busdata |= (busnum << 8); > *busdata |= ((busnum + busrange - 1) << 16); >