DF-1068 / fix.diff
diff --git a/sys/bus/pci/pci_user.c b/sys/bus/pci/pci_user.c --- a/sys/bus/pci/pci_user.c +++ b/sys/bus/pci/pci_user.c @@ -56,7 +56,7 @@ /* * This is the user interface to PCI configuration space. */ -static struct lwkt_token pci_token = LWKT_TOKEN_INITIALIZER(pci_token); +struct lwkt_token pci_token = LWKT_TOKEN_INITIALIZER(pci_token); static d_open_t pci_open; static d_close_t pci_close; diff --git a/sys/bus/pci/pci.c b/sys/bus/pci/pci.c --- a/sys/bus/pci/pci.c +++ b/sys/bus/pci/pci.c @@ -53,6 +53,7 @@ #include <sys/rman.h> #include <sys/device.h> +#include <sys/thread.h> #include <sys/pciio.h> #include <bus/pci/pcireg.h> #include <bus/pci/pcivar.h> @@ -69,6 +70,8 @@ #include "pcib_if.h" #include "pci_if.h" +extern struct lwkt_token pci_token; + typedef void (*pci_read_cap_t)(device_t, int, int, pcicfgregs *); static uint32_t pci_mapbase(unsigned mapreg); @@ -2152,8 +2155,10 @@ kfree(dinfo->cfg.vpd.vpd_w[i].value, M_DEVBUF); kfree(dinfo->cfg.vpd.vpd_w, M_DEVBUF); } + lwkt_gettoken(&pci_token); STAILQ_REMOVE(devlist_head, dinfo, pci_devinfo, pci_links); kfree(dinfo, M_DEVBUF); + lwkt_reltoken(&pci_token); /* increment the generation count */ pci_generation++; |