bus: Add device_has_children predicate
Add a device_has_children() function which can be used to check if a device has children without allocating a list of them which we aren't going to use, or even counting them. Also modify device_get_children() so it can be used to query the count without allocating a list. MFC after: 1 week Sponsored by: Klara, Inc. Sponsored by: NetApp, Inc. Reviewed by: imp, markj Differential Revision: https://reviews.freebsd.org/D53918
This commit is contained in:
@@ -1040,6 +1040,7 @@ MLINKS+=devfs_set_cdevpriv.9 devfs_clear_cdevpriv.9 \
|
|||||||
MLINKS+=device_add_child.9 device_add_child_ordered.9
|
MLINKS+=device_add_child.9 device_add_child_ordered.9
|
||||||
MLINKS+=device_enable.9 device_disable.9 \
|
MLINKS+=device_enable.9 device_disable.9 \
|
||||||
device_enable.9 device_is_enabled.9
|
device_enable.9 device_is_enabled.9
|
||||||
|
MLINKS+=device_get_children.9 device_has_children.9
|
||||||
MLINKS+=device_get_ivars.9 device_set_ivars.9
|
MLINKS+=device_get_ivars.9 device_set_ivars.9
|
||||||
MLINKS+=device_get_name.9 device_get_nameunit.9
|
MLINKS+=device_get_name.9 device_get_nameunit.9
|
||||||
MLINKS+=device_get_state.9 device_busy.9 \
|
MLINKS+=device_get_state.9 device_busy.9 \
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
.\" -*- nroff -*-
|
.\" -*- nroff -*-
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 1998 Doug Rabson
|
.\" Copyright (c) 1998 Doug Rabson
|
||||||
|
.\" Copyright (c) 2025 Dag-Erling Smørgrav <des@FreeBSD.org>
|
||||||
.\"
|
.\"
|
||||||
.\" All rights reserved.
|
.\" All rights reserved.
|
||||||
.\"
|
.\"
|
||||||
@@ -26,21 +27,27 @@
|
|||||||
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
.\"
|
.\"
|
||||||
.Dd August 23, 2008
|
.Dd November 28, 2025
|
||||||
.Dt DEVICE_GET_CHILDREN 9
|
.Dt DEVICE_GET_CHILDREN 9
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm device_get_children
|
.Nm device_get_children ,
|
||||||
.Nd get a list of devices connected to a device
|
.Nm device_has_children
|
||||||
|
.Nd examine devices connected to a device
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.In sys/param.h
|
.In sys/param.h
|
||||||
.In sys/bus.h
|
.In sys/bus.h
|
||||||
.Ft int
|
.Ft int
|
||||||
.Fn device_get_children "device_t dev" "device_t **devlistp" "int *devcountp"
|
.Fn device_get_children "device_t dev" "device_t **devlistp" "int *devcountp"
|
||||||
|
.Ft bool
|
||||||
|
.Fn device_has_children "device_t dev"
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
Retrieve a list of all device instances currently connected to
|
The
|
||||||
.Pa dev
|
.Nm device_get_children
|
||||||
and return the list in
|
function retrieves a list of all device instances currently connected
|
||||||
|
to
|
||||||
|
.Fa dev .
|
||||||
|
It returns the list in
|
||||||
.Fa *devlistp
|
.Fa *devlistp
|
||||||
and the count in
|
and the count in
|
||||||
.Fa *devcountp .
|
.Fa *devcountp .
|
||||||
@@ -50,11 +57,35 @@ The memory allocated for the list should be freed using
|
|||||||
and
|
and
|
||||||
.Fa devcountp
|
.Fa devcountp
|
||||||
are not changed when an error is returned.
|
are not changed when an error is returned.
|
||||||
|
.Pp
|
||||||
|
As a special case, if
|
||||||
|
.Fa devlistp
|
||||||
|
is null, no memory is allocated but the count is still returned in
|
||||||
|
.Fa *devcountp .
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Nm device_has_children
|
||||||
|
function returns
|
||||||
|
.Dv true
|
||||||
|
if
|
||||||
|
.Fa dev
|
||||||
|
has at least one child and
|
||||||
|
.Dv false
|
||||||
|
if it has none.
|
||||||
.Sh RETURN VALUES
|
.Sh RETURN VALUES
|
||||||
Zero is returned on success, otherwise an appropriate error is returned.
|
The
|
||||||
|
.Nm device_get_children
|
||||||
|
function returns zero on success and an appropriate error otherwise.
|
||||||
|
The
|
||||||
|
.Nm device_has_children
|
||||||
|
function returns true if the specified device has at least one child
|
||||||
|
and false otherwise.
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr devclass 9 ,
|
.Xr devclass 9 ,
|
||||||
.Xr device 9
|
.Xr device 9
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
|
.An -nosplit
|
||||||
This manual page was written by
|
This manual page was written by
|
||||||
.An Doug Rabson .
|
.An Doug Rabson Aq Mt dfr@FreeBSD.org
|
||||||
|
and
|
||||||
|
.An Dag-Erling Sm\(/orgrav Aq Mt des@FreeBSD.org .
|
||||||
|
|||||||
@@ -1858,6 +1858,10 @@ device_get_children(device_t dev, device_t **devlistp, int *devcountp)
|
|||||||
TAILQ_FOREACH(child, &dev->children, link) {
|
TAILQ_FOREACH(child, &dev->children, link) {
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
if (devlistp == NULL) {
|
||||||
|
*devcountp = count;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
*devlistp = NULL;
|
*devlistp = NULL;
|
||||||
*devcountp = 0;
|
*devcountp = 0;
|
||||||
@@ -1880,6 +1884,20 @@ device_get_children(device_t dev, device_t **devlistp, int *devcountp)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if a device has children
|
||||||
|
*
|
||||||
|
* @param dev the device to examine
|
||||||
|
*
|
||||||
|
* @rerval true the device has at least one child
|
||||||
|
* @retval false the device has no children
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
device_has_children(device_t dev)
|
||||||
|
{
|
||||||
|
return (!TAILQ_EMPTY(&dev->children));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Return the current driver for the device or @c NULL if there
|
* @brief Return the current driver for the device or @c NULL if there
|
||||||
* is no driver currently attached
|
* is no driver currently attached
|
||||||
|
|||||||
@@ -713,6 +713,7 @@ device_state_t device_get_state(device_t dev);
|
|||||||
int device_get_unit(device_t dev);
|
int device_get_unit(device_t dev);
|
||||||
struct sysctl_ctx_list *device_get_sysctl_ctx(device_t dev);
|
struct sysctl_ctx_list *device_get_sysctl_ctx(device_t dev);
|
||||||
struct sysctl_oid *device_get_sysctl_tree(device_t dev);
|
struct sysctl_oid *device_get_sysctl_tree(device_t dev);
|
||||||
|
bool device_has_children(device_t dev);
|
||||||
int device_has_quiet_children(device_t dev);
|
int device_has_quiet_children(device_t dev);
|
||||||
int device_is_alive(device_t dev); /* did probe succeed? */
|
int device_is_alive(device_t dev); /* did probe succeed? */
|
||||||
int device_is_attached(device_t dev); /* did attach succeed? */
|
int device_is_attached(device_t dev); /* did attach succeed? */
|
||||||
|
|||||||
Reference in New Issue
Block a user