--- a/sys/dev/agp/agppriv.h +++ b/sys/dev/agp/agppriv.h @@ -75,6 +75,7 @@ struct agp_memory_list as_memory; /* list of allocated memory */ int as_nextid; /* next memory block id */ int as_isopen; /* user device is open */ + int as_opencount; /* open reference count */ struct cdev *as_devnode; /* from make_dev */ struct lock as_lock; /* lock for access to GATT */ }; --- a/sys/dev/agp/agp.c +++ b/sys/dev/agp/agp.c @@ -778,6 +778,8 @@ device_t dev = kdev->si_drv1; struct agp_softc *sc = device_get_softc(dev); + lockmgr(&sc->as_lock, LK_EXCLUSIVE); + sc->as_opencount++; if (!sc->as_isopen) { sc->as_isopen = 1; device_busy(dev); @@ -808,6 +810,7 @@ sc->as_isopen = 0; device_unbusy(dev); } + lockmgr(&sc->as_lock, LK_RELEASE); return 0; }