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?

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);

Reply via email to