Hi,

On Mon, Feb 23, 2026 at 05:13:29PM +0100, Peter Eisentraut wrote:
> On 13.02.26 09:03, Bertrand Drouvot wrote:
> > +/*
> > + * If compiler understands aligned pragma, use it to align the struct at 
> > cache
> > + * line boundaries.  This is just for performance, to (a) avoid false 
> > sharing
> > + * and (b) to make the multiplication / division to convert between PGPROC 
> > *
> > + * and ProcNumber be a little cheaper.
> > + */
> > +#if defined(pg_attribute_aligned)
> > +                       pg_attribute_aligned(PG_CACHE_LINE_SIZE)
> > +#endif
> > +PGPROC;
> 
> You can/should use C11 standard alignas(), so you don't need to worry about
> whether it's supported or not.

Oh right, I did not notice 300c8f53247 and following like e7075a3405c, 
d4c0f91f7d5
and 97e04c74bed.

PFA, 0001 doing so for PGPROC and PgAioUringContext. As those are typedef, 
the patch puts alignas within the struct.

For PGPROC at the start of the struct, I think that placing it on the first 
member
is the right location because it ensures the whole struct is aligned to 
PG_CACHE_LINE_SIZE
without adding padding before this member. For example if I set it on 
backendType,
then it adds 100 bytes of padding and the struct is obviously still a multiple 
of
PG_CACHE_LINE_SIZE but is now 1024 bytes (instead of 896).

For PgAioUringContext at completion_lock (like suggested by Andres in [1]), 
which
is also the start of the struct.

I checked and the padding for those are exactly the same after the changes.

0002, is also making use of alignas in ItemPointerData, but this one is more
tricky so I'm not sure that's worth it (given the fact that we still need to
keep pg_attribute_aligned() as explained by Peter in [2]).

[1]: 
https://postgr.es/m/lsgnps74ictxtm5karcobenxtt5rvoylvbvx7ja6r5rjcund7v%40owxqgv7gisns
[2]: https://postgr.es/m/46f05236-d4d4-4b4e-84d4-faa500f14691%40eisentraut.org

Regards,

-- 
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com
>From 3152fd1e4934378823d5e535f876cf1333cb086e Mon Sep 17 00:00:00 2001
From: Bertrand Drouvot <[email protected]>
Date: Tue, 24 Feb 2026 09:21:19 +0000
Subject: [PATCH v1 1/2] Use C11 alignas in typedef definitions

They were already using pg_attribute_aligned.  This replaces that with
alignas and moves that into the required syntactic position.

Suggested-by: Peter Eisentraut <[email protected]>
Author: Bertrand Drouvot <[email protected]>
Discussion: https://postgr.es/m/d7a788fa-e609-4894-a8be-2f70e135424f%40eisentraut.org
---
 src/backend/storage/aio/method_io_uring.c | 16 ++++++++--------
 src/include/storage/proc.h                | 13 +++++--------
 2 files changed, 13 insertions(+), 16 deletions(-)
  58.1% src/backend/storage/aio/
  41.8% src/include/storage/

diff --git a/src/backend/storage/aio/method_io_uring.c b/src/backend/storage/aio/method_io_uring.c
index ed6e71bcd46..50ea9f8e51c 100644
--- a/src/backend/storage/aio/method_io_uring.c
+++ b/src/backend/storage/aio/method_io_uring.c
@@ -77,15 +77,15 @@ const IoMethodOps pgaio_uring_ops = {
 	.wait_one = pgaio_uring_wait_one,
 };
 
-/*
- * Per-backend state when using io_method=io_uring
- *
- * Align the whole struct to a cacheline boundary, to prevent false sharing
- * between completion_lock and prior backend's io_uring_ring.
- */
-typedef struct pg_attribute_aligned (PG_CACHE_LINE_SIZE)
-PgAioUringContext
+/* Per-backend state when using io_method=io_uring */
+typedef struct PgAioUringContext
 {
+	/*
+	 * Align the whole struct to a cacheline boundary, to prevent false
+	 * sharing between completion_lock and prior backend's io_uring_ring.
+	 */
+	alignas(PG_CACHE_LINE_SIZE)
+
 	/*
 	 * Multiple backends can process completions for this backend's io_uring
 	 * instance (e.g. when the backend issuing IO is busy doing something
diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h
index a8d2e7db1a1..fe798d350f1 100644
--- a/src/include/storage/proc.h
+++ b/src/include/storage/proc.h
@@ -180,6 +180,11 @@ typedef enum
  */
 typedef struct PGPROC
 {
+	/*
+	 * Align the struct at cache line boundaries.  This is just for
+	 * performance, to avoid false sharing.
+	 */
+	alignas(PG_CACHE_LINE_SIZE)
 	dlist_head *procgloballist; /* procglobal list that owns this PGPROC */
 	dlist_node	freeProcsLink;	/* link in procgloballist, when in recycled
 								 * state */
@@ -375,14 +380,6 @@ typedef struct PGPROC
 
 	uint32		wait_event_info;	/* proc's wait information */
 }
-
-/*
- * If compiler understands aligned pragma, use it to align the struct at cache
- * line boundaries.  This is just for performance, to avoid false sharing.
- */
-#if defined(pg_attribute_aligned)
-			pg_attribute_aligned(PG_CACHE_LINE_SIZE)
-#endif
 PGPROC;
 
 extern PGDLLIMPORT PGPROC *MyProc;
-- 
2.34.1

>From e908a2c0e2b0a9d8a6915f60439f75adfe885b66 Mon Sep 17 00:00:00 2001
From: Bertrand Drouvot <[email protected]>
Date: Tue, 24 Feb 2026 09:55:36 +0000
Subject: [PATCH v1 2/2] Use C11 alignas in more tricky typedef definition

Same as commit "xxx" but the alignas has to be guarded because it makes sense
if used together with pg_attribute_packed().

Suggested-by: Peter Eisentraut <[email protected]>
Author: Bertrand Drouvot <[email protected]>
Discussion: https://postgr.es/m/d7a788fa-e609-4894-a8be-2f70e135424f%40eisentraut.org
---
 src/include/storage/itemptr.h | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
 100.0% src/include/storage/

diff --git a/src/include/storage/itemptr.h b/src/include/storage/itemptr.h
index 8b3392dbefe..a70c543dac3 100644
--- a/src/include/storage/itemptr.h
+++ b/src/include/storage/itemptr.h
@@ -35,14 +35,17 @@
  */
 typedef struct ItemPointerData
 {
+/* If compiler understands packed pragma, use alignas with it */
+#if defined(pg_attribute_packed)
+	alignas(2)
+#endif
 	BlockIdData ip_blkid;
 	OffsetNumber ip_posid;
 }
 
-/* If compiler understands packed and aligned pragmas, use those */
-#if defined(pg_attribute_packed) && defined(pg_attribute_aligned)
+/* If compiler understands packed pragma, use it with alignas */
+#if defined(pg_attribute_packed)
 			pg_attribute_packed()
-			pg_attribute_aligned(2)
 #endif
 ItemPointerData;
 
-- 
2.34.1

Reply via email to