Add new device method to free the automatically
allocated softc structure which is returned by device_get_softc(). This method can be used to easily implement softc refcounting. This can be desirable when the softc has memory references which are controlled by userspace handles for example. This solves the problem of blocking the caller of device_detach() for a non-deterministic time. Discussed with: kib, ed MFC after: 2 weeks
This commit is contained in:
parent
2203949434
commit
ea1bd564ac
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=239178
@ -316,3 +316,14 @@ METHOD int resume {
|
||||
METHOD int quiesce {
|
||||
device_t dev;
|
||||
} DEFAULT null_quiesce;
|
||||
|
||||
/**
|
||||
* @brief Free the device softc
|
||||
*
|
||||
* @param _dev device pointer
|
||||
* @param _softc pointer to softc
|
||||
*/
|
||||
METHOD void free_softc {
|
||||
device_t _dev;
|
||||
void *_softc;
|
||||
} DEFAULT device_free_softc;
|
||||
|
@ -2406,8 +2406,8 @@ device_get_softc(device_t dev)
|
||||
void
|
||||
device_set_softc(device_t dev, void *softc)
|
||||
{
|
||||
if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC))
|
||||
free(dev->softc, M_BUS_SC);
|
||||
if (dev->softc != NULL && !(dev->flags & DF_EXTERNALSOFTC))
|
||||
DEVICE_FREE_SOFTC(dev, dev->softc);
|
||||
dev->softc = softc;
|
||||
if (dev->softc)
|
||||
dev->flags |= DF_EXTERNALSOFTC;
|
||||
@ -2604,8 +2604,8 @@ device_set_driver(device_t dev, driver_t *driver)
|
||||
if (dev->driver == driver)
|
||||
return (0);
|
||||
|
||||
if (dev->softc && !(dev->flags & DF_EXTERNALSOFTC)) {
|
||||
free(dev->softc, M_BUS_SC);
|
||||
if (dev->softc != NULL && !(dev->flags & DF_EXTERNALSOFTC)) {
|
||||
DEVICE_FREE_SOFTC(dev, dev->softc);
|
||||
dev->softc = NULL;
|
||||
}
|
||||
device_set_desc(dev, NULL);
|
||||
@ -4797,3 +4797,13 @@ bus_free_resource(device_t dev, int type, struct resource *r)
|
||||
return (0);
|
||||
return (bus_release_resource(dev, type, rman_get_rid(r), r));
|
||||
}
|
||||
|
||||
/*
|
||||
* The "dev" argument passed to "device_free_softc()" is allowed to be
|
||||
* NULL, if the device freeing the soft is not available.
|
||||
*/
|
||||
void
|
||||
device_free_softc(device_t dev, void *softc)
|
||||
{
|
||||
free(softc, M_BUS_SC);
|
||||
}
|
||||
|
@ -468,6 +468,7 @@ int device_set_unit(device_t dev, int unit); /* XXX DONT USE XXX */
|
||||
int device_shutdown(device_t dev);
|
||||
void device_unbusy(device_t dev);
|
||||
void device_verbose(device_t dev);
|
||||
void device_free_softc(device_t dev, void *softc);
|
||||
|
||||
/*
|
||||
* Access functions for devclass.
|
||||
|
Loading…
Reference in New Issue
Block a user