Skip to content

Commit 23c4319

Browse files
rscharfegitster
authored andcommitted
revision: reallocate TOPO_WALK object flags
The bit fields in struct object have an unfortunate layout. Here's what pahole reports on x86_64 GNU/Linux: struct object { unsigned int parsed:1; /* 0: 0 4 */ unsigned int type:3; /* 0: 1 4 */ /* XXX 28 bits hole, try to pack */ /* Force alignment to the next boundary: */ unsigned int :0; unsigned int flags:29; /* 4: 0 4 */ /* XXX 3 bits hole, try to pack */ struct object_id oid; /* 8 32 */ /* size: 40, cachelines: 1, members: 4 */ /* sum members: 32 */ /* sum bitfield members: 33 bits, bit holes: 2, sum bit holes: 31 bits */ /* last cacheline: 40 bytes */ }; Notice the 1+3+29=33 bits in bit fields and 28+3=31 bits in holes. There are holes inside the flags bit field as well -- while some object flags are used for more than one purpose, 22, 23 and 24 are still free. Use 23 and 24 instead of 27 and 28 for TOPO_WALK_EXPLORED and TOPO_WALK_INDEGREE. This allows us to reduce FLAG_BITS by one so that all bitfields combined fit into a single 32-bit slot: struct object { unsigned int parsed:1; /* 0: 0 4 */ unsigned int type:3; /* 0: 1 4 */ unsigned int flags:28; /* 0: 4 4 */ struct object_id oid; /* 4 32 */ /* size: 36, cachelines: 1, members: 4 */ /* last cacheline: 36 bytes */ }; With this tight packing the size of struct object is reduced by 10%. Other architectures probably benefit as well. Signed-off-by: René Scharfe <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent c9c318d commit 23c4319

File tree

2 files changed

+6
-5
lines changed

2 files changed

+6
-5
lines changed

object.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ struct object_array {
5959

6060
/*
6161
* object flag allocation:
62-
* revision.h: 0---------10 15 25----28
62+
* revision.h: 0---------10 15 23------26
6363
* fetch-pack.c: 01
6464
* negotiator/default.c: 2--5
6565
* walker.c: 0-2
@@ -79,7 +79,7 @@ struct object_array {
7979
* builtin/show-branch.c: 0-------------------------------------------26
8080
* builtin/unpack-objects.c: 2021
8181
*/
82-
#define FLAG_BITS 29
82+
#define FLAG_BITS 28
8383

8484
/*
8585
* The object type is stored in 3 bits.

revision.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@
3737

3838
/* WARNING: This is also used as REACHABLE in commit-graph.c. */
3939
#define PULL_MERGE (1u<<15)
40+
41+
#define TOPO_WALK_EXPLORED (1u<<23)
42+
#define TOPO_WALK_INDEGREE (1u<<24)
43+
4044
/*
4145
* Indicates object was reached by traversal. i.e. not given by user on
4246
* command-line or stdin.
@@ -48,9 +52,6 @@
4852
#define TRACK_LINEAR (1u<<26)
4953
#define ALL_REV_FLAGS (((1u<<11)-1) | NOT_USER_GIVEN | TRACK_LINEAR | PULL_MERGE)
5054

51-
#define TOPO_WALK_EXPLORED (1u<<27)
52-
#define TOPO_WALK_INDEGREE (1u<<28)
53-
5455
#define DECORATE_SHORT_REFS 1
5556
#define DECORATE_FULL_REFS 2
5657

0 commit comments

Comments
 (0)