The branch stable/13 has been updated by zlei:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=ec22c4022ddbc62be17b2bc65fe8b6113c8d76e7

commit ec22c4022ddbc62be17b2bc65fe8b6113c8d76e7
Author:     Zhenlei Huang <[email protected]>
AuthorDate: 2026-02-28 11:35:42 +0000
Commit:     Zhenlei Huang <[email protected]>
CommitDate: 2026-03-05 11:12:41 +0000

    vnet: Ensure the space allocated by vnet_data_alloc() is sufficent aligned
    
    Some 32-bit architectures, e.g., armv7, require strict 8-byte
    alignment while doing atomic 64-bit access. Hence aligning to the
    pointer type (4-byte alignment) does not meet the requirement on
    those architectures.
    
    Make the space allocated by vnet_data_alloc() sufficent aligned to
    avoid unaligned access.
    
    PR:             265639
    Diagnosed by:   markj
    Reviewed by:    jhb, markj
    Co-authored-by: jhb
    MFC after:      5 days
    Differential Revision:  https://reviews.freebsd.org/D55560
    
    (cherry picked from commit 32beb3ae71cb320dbe4190a01c036943d99083b3)
    (cherry picked from commit 973d607b284ba68e63f0386af44c28bfde15add2)
    (cherry picked from commit baee504b868b9417c815c0de6474a0d6e5d6b4ac)
---
 sys/net/vnet.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/sys/net/vnet.c b/sys/net/vnet.c
index da5fc5b52a72..a55fd49cb5da 100644
--- a/sys/net/vnet.c
+++ b/sys/net/vnet.c
@@ -172,11 +172,17 @@ static MALLOC_DEFINE(M_VNET_DATA, "vnet_data", "VNET 
data");
 #define        VNET_MODMIN     (8 * PAGE_SIZE)
 #define        VNET_SIZE       roundup2(VNET_BYTES, PAGE_SIZE)
 
+/*
+ * Ensure space allocated by vnet_data_alloc() is suitably aligned for any
+ * object.
+ */
+#define        VNET_DATAALIGN  _Alignof(__max_align_t)
+
 /*
  * Space to store virtualized global variables from loadable kernel modules,
  * and the free list to manage it.
  */
-VNET_DEFINE_STATIC(char, modspace[VNET_MODMIN] __aligned(__alignof(void *)));
+VNET_DEFINE_STATIC(char, modspace[VNET_MODMIN] __aligned(VNET_DATAALIGN));
 
 /*
  * Global lists of subsystem constructor and destructors for vnets.  They are
@@ -381,7 +387,7 @@ vnet_data_alloc(int size)
        void *s;
 
        s = NULL;
-       size = roundup2(size, sizeof(void *));
+       size = roundup2(size, VNET_DATAALIGN);
        sx_xlock(&vnet_data_free_lock);
        TAILQ_FOREACH(df, &vnet_data_free_head, vnd_link) {
                if (df->vnd_len < size)
@@ -399,6 +405,8 @@ vnet_data_alloc(int size)
        }
        sx_xunlock(&vnet_data_free_lock);
 
+       KASSERT(((uintptr_t)s & (VNET_DATAALIGN - 1)) == 0,
+           ("unaligned vnet alloc %p", s));
        return (s);
 }
 
@@ -413,7 +421,7 @@ vnet_data_free(void *start_arg, int size)
        uintptr_t start;
        uintptr_t end;
 
-       size = roundup2(size, sizeof(void *));
+       size = roundup2(size, VNET_DATAALIGN);
        start = (uintptr_t)start_arg;
        end = start + size;
        /*

Reply via email to