diff options
author | Simon Glass <sjg@chromium.org> | 2022-05-08 04:39:25 -0600 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2022-06-28 03:09:52 +0100 |
commit | 0dfda34ca594c701955cfcb71711a7599f97bae3 (patch) | |
tree | bc1741d705ae3a62c98477e510535d3193c97802 /include/dm | |
parent | 930a3ddadebf3660cc3163081671de189300afdd (diff) | |
download | u-boot-0dfda34ca594c701955cfcb71711a7599f97bae3.tar.gz |
dm: core: Add a way to collect memory usage
Add a function for collecting the amount of memory used by driver model,
including devices, uclasses and attached data and tags.
This information can provide insights into how to reduce the memory
required by driver model. Future work may look at execution speed also.
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'include/dm')
-rw-r--r-- | include/dm/root.h | 45 | ||||
-rw-r--r-- | include/dm/tag.h | 11 |
2 files changed, 56 insertions, 0 deletions
diff --git a/include/dm/root.h b/include/dm/root.h index e888fb993c..382f83c7f5 100644 --- a/include/dm/root.h +++ b/include/dm/root.h @@ -9,12 +9,50 @@ #ifndef _DM_ROOT_H_ #define _DM_ROOT_H_ +#include <dm/tag.h> + struct udevice; /* Head of the uclass list if CONFIG_OF_PLATDATA_INST is enabled */ extern struct list_head uclass_head; /** + * struct dm_stats - Information about driver model memory usage + * + * @total_size: All data + * @dev_count: Number of devices + * @dev_size: Size of all devices (just the struct udevice) + * @dev_name_size: Bytes used by device names + * @uc_count: Number of uclasses + * @uc_size: Size of all uclasses (just the struct uclass) + * @tag_count: Number of tags + * @tag_size: Bytes used by all tags + * @uc_attach_count: Number of uclasses with attached data (priv) + * @uc_attach_size: Total size of that attached data + * @attach_count_total: Total number of attached data items for all udevices and + * uclasses + * @attach_size_total: Total number of bytes of attached data + * @attach_count: Number of devices with attached, for each type + * @attach_size: Total number of bytes of attached data, for each type + */ +struct dm_stats { + int total_size; + int dev_count; + int dev_size; + int dev_name_size; + int uc_count; + int uc_size; + int tag_count; + int tag_size; + int uc_attach_count; + int uc_attach_size; + int attach_count_total; + int attach_size_total; + int attach_count[DM_TAG_ATTACH_COUNT]; + int attach_size[DM_TAG_ATTACH_COUNT]; +}; + +/** * dm_root() - Return pointer to the top of the driver tree * * This function returns pointer to the root node of the driver tree, @@ -141,4 +179,11 @@ static inline int dm_remove_devices_flags(uint flags) { return 0; } */ void dm_get_stats(int *device_countp, int *uclass_countp); +/** + * dm_get_mem() - Get stats on memory usage in driver model + * + * @mem: Place to put the information + */ +void dm_get_mem(struct dm_stats *stats); + #endif diff --git a/include/dm/tag.h b/include/dm/tag.h index 9cb5d68f0a..1ea3c9f7af 100644 --- a/include/dm/tag.h +++ b/include/dm/tag.h @@ -10,6 +10,7 @@ #include <linux/list.h> #include <linux/types.h> +struct dm_stats; struct udevice; enum dm_tag_t { @@ -118,4 +119,14 @@ int dev_tag_del(struct udevice *dev, enum dm_tag_t tag); */ int dev_tag_del_all(struct udevice *dev); +/** + * dev_tag_collect_stats() - Collect information on driver model performance + * + * This collects information on how driver model is performing. For now it only + * includes memory usage + * + * @stats: Place to put the collected information + */ +void dev_tag_collect_stats(struct dm_stats *stats); + #endif /* _DM_TAG_H */ |