Hello everyone,
   I'm newbie to sending patches by patch, but I'm still very used to
   modern git hosting. Patch changes are simple in gnulib, using pahole
   tool from Red Hat (https://linux.die.net/man/1/pahole), I found that
   'rofile' structure in memory takes 72 bytes, which does not fit into 64
   byte cpu cacheline and consumes more processor cycles. If you have
   benchmarks tied to 'rofile', there may be a decent increase. How to run
   the tests?
From 3a5c97e9eda30c451d4bf9afb2c15e2acf282de6 Mon Sep 17 00:00:00 2001
From: Herman Semenoff <[email protected]>
Date: Wed, 24 Sep 2025 23:32:27 +0300
Subject: [PATCH] lib: align struct rofile to 64 bytes (1 cpu cacheline)

References:
    https://wr.informatik.uni-hamburg.de/_media/teaching/wintersemester_2013_2014/epc-14-haase-svenhendrik-alignmentinc-presentation.pdf
    https://hpc.rz.rptu.de/Tutorials/AVX/alignment.shtml
    https://en.wikipedia.org/wiki/Data_structure_alignment
    https://stackoverflow.com/a/20882083
    https://zijishi.xyz/post/optimization-technique/learning-to-use-data-alignment/
---
 lib/stackvma.c | 2 +-
 lib/vma-iter.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/stackvma.c b/lib/stackvma.c
index 95bb80db7c..72cc1b89b8 100644
--- a/lib/stackvma.c
+++ b/lib/stackvma.c
@@ -142,13 +142,13 @@ struct rofile
     size_t position;
     size_t filled;
     int eof_seen;
+    char stack_allocated_buffer[STACK_ALLOCATED_BUFFER_SIZE];
     /* These fields deal with allocation of the buffer.  */
     char *buffer;
     char *auxmap;
     size_t auxmap_length;
     uintptr_t auxmap_start;
     uintptr_t auxmap_end;
-    char stack_allocated_buffer[STACK_ALLOCATED_BUFFER_SIZE];
   };
 
 /* Open a read-only file stream.  */
diff --git a/lib/vma-iter.c b/lib/vma-iter.c
index 009835f60c..f6732ffb5a 100644
--- a/lib/vma-iter.c
+++ b/lib/vma-iter.c
@@ -164,13 +164,13 @@ struct rofile
     size_t position;
     size_t filled;
     int eof_seen;
+    char stack_allocated_buffer[STACK_ALLOCATED_BUFFER_SIZE];
     /* These fields deal with allocation of the buffer.  */
     char *buffer;
     char *auxmap;
     size_t auxmap_length;
     unsigned long auxmap_start;
     unsigned long auxmap_end;
-    char stack_allocated_buffer[STACK_ALLOCATED_BUFFER_SIZE];
   };
 
 /* Open a read-only file stream.  */
-- 
2.51.0

  • gnulib: align struct rof... Герман Семёнов

Reply via email to