dm: core: Allow device names to be freed automatically
Some devices have a name that is stored in allocated memory. At present there is no mechanism to free this memory when the device is unbound. Add a device flag to track whether a name is allocated and a function to add the flag. Free the memory when the device is unbound. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
72a85c0d2d
commit
a2040facd2
|
@ -112,6 +112,8 @@ int device_unbind(struct udevice *dev)
|
|||
|
||||
devres_release_all(dev);
|
||||
|
||||
if (dev->flags & DM_NAME_ALLOCED)
|
||||
free((char *)dev->name);
|
||||
free(dev);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -706,12 +706,18 @@ bool device_is_last_sibling(struct udevice *dev)
|
|||
return list_is_last(&dev->sibling_node, &parent->child_head);
|
||||
}
|
||||
|
||||
void device_set_name_alloced(struct udevice *dev)
|
||||
{
|
||||
dev->flags |= DM_NAME_ALLOCED;
|
||||
}
|
||||
|
||||
int device_set_name(struct udevice *dev, const char *name)
|
||||
{
|
||||
name = strdup(name);
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
dev->name = name;
|
||||
device_set_name_alloced(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -41,6 +41,9 @@ struct driver_info;
|
|||
/* Device is bound */
|
||||
#define DM_FLAG_BOUND (1 << 6)
|
||||
|
||||
/* Device name is allocated and should be freed on unbind() */
|
||||
#define DM_NAME_ALLOCED (1 << 7)
|
||||
|
||||
/**
|
||||
* struct udevice - An instance of a driver
|
||||
*
|
||||
|
@ -523,6 +526,9 @@ bool device_is_last_sibling(struct udevice *dev);
|
|||
* this is unnecessary but for probed devices which don't get a useful name
|
||||
* this function can be helpful.
|
||||
*
|
||||
* The name is allocated and will be freed automatically when the device is
|
||||
* unbound.
|
||||
*
|
||||
* @dev: Device to update
|
||||
* @name: New name (this string is allocated new memory and attached to
|
||||
* the device)
|
||||
|
@ -531,6 +537,16 @@ bool device_is_last_sibling(struct udevice *dev);
|
|||
*/
|
||||
int device_set_name(struct udevice *dev, const char *name);
|
||||
|
||||
/**
|
||||
* device_set_name_alloced() - note that a device name is allocated
|
||||
*
|
||||
* This sets the DM_NAME_ALLOCED flag for the device, so that when it is
|
||||
* unbound the name will be freed. This avoids memory leaks.
|
||||
*
|
||||
* @dev: Device to update
|
||||
*/
|
||||
void device_set_name_alloced(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* device_is_on_pci_bus - Test if a device is on a PCI bus
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue