Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 05 Mar 2026 11:13:23 +0000
From:      Zhenlei Huang <zlei@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: ec22c4022ddb - stable/13 - vnet: Ensure the space allocated by vnet_data_alloc() is sufficent aligned
Message-ID:  <69a96553.40486.7911acc4@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/13 has been updated by zlei:

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

commit ec22c4022ddbc62be17b2bc65fe8b6113c8d76e7
Author:     Zhenlei Huang <zlei@FreeBSD.org>
AuthorDate: 2026-02-28 11:35:42 +0000
Commit:     Zhenlei Huang <zlei@FreeBSD.org>
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;
 	/*


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69a96553.40486.7911acc4>