diff mbox series

device-tree: optimize size of struct dt_device_node

Message ID 20250212154358.2540389-1-grygorii_strashko@epam.com (mailing list archive)
State New
Headers show
Series device-tree: optimize size of struct dt_device_node | expand

Commit Message

Grygorii Strashko Feb. 12, 2025, 3:43 p.m. UTC
From: Michal Orzel <michal.orzel@amd.com>

The current placement of fields in struct dt_device_node is not optimal and
introduces holes due to fields alignment.

Checked with "'pahole xen-syms -C dt_device_node"

ARM64 size 144B, 16B holes:
	/* size: 144, cachelines: 3, members: 15 */
	/* sum members: 128, holes: 3, sum holes: 16 */
	/* last cacheline: 16 bytes */
ARM32 size 72B, 4B holes
	/* size: 72, cachelines: 2, members: 15 */
	/* sum members: 68, holes: 2, sum holes: 4 */
	/* last cacheline: 8 bytes */

This patch optimizes size of struct dt_device_node by rearranging its
field, which eliminates holes and reduces structure size by 16B(ARM64) and
4B(ARM32).

After ARM64 size 128B, no holes (-16B):
	/* size: 128, cachelines: 2, members: 15 */
After ARM32 size 68B, no holes (-4B)
	/* size: 68, cachelines: 2, members: 15 */
	/* last cacheline: 4 bytes */

Signed-off-by: Michal Orzel <michal.orzel@amd.com>
Signed-off-by: Grygorii Strashko <grygorii_strashko@epam.com>
---
This patch follows discussion in [1]
[1] https://patchwork.kernel.org/comment/26239672/

 xen/include/xen/device_tree.h | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

Comments

Stefano Stabellini Feb. 12, 2025, 10:05 p.m. UTC | #1
On Wed, 12 Feb 2025, Grygorii Strashko wrote:
> From: Michal Orzel <michal.orzel@amd.com>
> 
> The current placement of fields in struct dt_device_node is not optimal and
> introduces holes due to fields alignment.
> 
> Checked with "'pahole xen-syms -C dt_device_node"
> 
> ARM64 size 144B, 16B holes:
> 	/* size: 144, cachelines: 3, members: 15 */
> 	/* sum members: 128, holes: 3, sum holes: 16 */
> 	/* last cacheline: 16 bytes */
> ARM32 size 72B, 4B holes
> 	/* size: 72, cachelines: 2, members: 15 */
> 	/* sum members: 68, holes: 2, sum holes: 4 */
> 	/* last cacheline: 8 bytes */
> 
> This patch optimizes size of struct dt_device_node by rearranging its
> field, which eliminates holes and reduces structure size by 16B(ARM64) and
> 4B(ARM32).
> 
> After ARM64 size 128B, no holes (-16B):
> 	/* size: 128, cachelines: 2, members: 15 */
> After ARM32 size 68B, no holes (-4B)
> 	/* size: 68, cachelines: 2, members: 15 */
> 	/* last cacheline: 4 bytes */
> 
> Signed-off-by: Michal Orzel <michal.orzel@amd.com>
> Signed-off-by: Grygorii Strashko <grygorii_strashko@epam.com>

Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>


> ---
> This patch follows discussion in [1]
> [1] https://patchwork.kernel.org/comment/26239672/
> 
>  xen/include/xen/device_tree.h | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h
> index 5ff763bb80bb..0ff80fda04da 100644
> --- a/xen/include/xen/device_tree.h
> +++ b/xen/include/xen/device_tree.h
> @@ -81,17 +81,10 @@ struct dt_property {
>  struct dt_device_node {
>      const char *name;
>      const char *type;
> -    dt_phandle phandle;
>      char *full_name;
> +    dt_phandle phandle;
>      domid_t used_by; /* By default it's used by dom0 */
>  
> -    struct dt_property *properties;
> -    struct dt_device_node *parent;
> -    struct dt_device_node *child;
> -    struct dt_device_node *sibling;
> -    struct dt_device_node *next; /* TODO: Remove it. Only use to know the last children */
> -    struct dt_device_node *allnext;
> -
>      /* IOMMU specific fields */
>      bool is_protected;
>  
> @@ -100,6 +93,13 @@ struct dt_device_node {
>      bool static_evtchn_created;
>  #endif
>  
> +    struct dt_property *properties;
> +    struct dt_device_node *parent;
> +    struct dt_device_node *child;
> +    struct dt_device_node *sibling;
> +    struct dt_device_node *next; /* TODO: Remove it. Only use to know the last children */
> +    struct dt_device_node *allnext;
> +
>      /*
>       * The main purpose of this list is to link the structure in the list
>       * of devices assigned to domain.
> -- 
> 2.34.1
>
diff mbox series

Patch

diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h
index 5ff763bb80bb..0ff80fda04da 100644
--- a/xen/include/xen/device_tree.h
+++ b/xen/include/xen/device_tree.h
@@ -81,17 +81,10 @@  struct dt_property {
 struct dt_device_node {
     const char *name;
     const char *type;
-    dt_phandle phandle;
     char *full_name;
+    dt_phandle phandle;
     domid_t used_by; /* By default it's used by dom0 */
 
-    struct dt_property *properties;
-    struct dt_device_node *parent;
-    struct dt_device_node *child;
-    struct dt_device_node *sibling;
-    struct dt_device_node *next; /* TODO: Remove it. Only use to know the last children */
-    struct dt_device_node *allnext;
-
     /* IOMMU specific fields */
     bool is_protected;
 
@@ -100,6 +93,13 @@  struct dt_device_node {
     bool static_evtchn_created;
 #endif
 
+    struct dt_property *properties;
+    struct dt_device_node *parent;
+    struct dt_device_node *child;
+    struct dt_device_node *sibling;
+    struct dt_device_node *next; /* TODO: Remove it. Only use to know the last children */
+    struct dt_device_node *allnext;
+
     /*
      * The main purpose of this list is to link the structure in the list
      * of devices assigned to domain.