lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250327205355.378659-27-mingo@kernel.org>
Date: Thu, 27 Mar 2025 21:53:39 +0100
From: Ingo Molnar <mingo@...nel.org>
To: linux-kernel@...r.kernel.org
Cc: Juergen Gross <jgross@...e.com>,
	"H . Peter Anvin" <hpa@...or.com>,
	Linus Torvalds <torvalds@...ux-foundation.org>,
	Peter Zijlstra <peterz@...radead.org>,
	Borislav Petkov <bp@...en8.de>,
	Thomas Gleixner <tglx@...utronix.de>
Subject: [PATCH 26/41] x86/alternatives: Introduce 'struct text_poke_int3_array' and move tp_vec and tp_vec_nr to it

struct text_poke_array is an equivalent structure to these global variables:

	static struct text_poke_int3_loc tp_vec[TP_VEC_MAX];
	static int tp_vec_nr;

Note that we intentionally mirror much of the naming of
'struct text_poke_int3_vec', which will further highlight
the unecessary layering going on in this code, and will
ease its removal.

No change in functionality.

Signed-off-by: Ingo Molnar <mingo@...nel.org>
---
 arch/x86/kernel/alternative.c | 43 +++++++++++++++++++++++--------------------
 1 file changed, 23 insertions(+), 20 deletions(-)

diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index 393d796e797d..cf3bcaa97957 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -2467,14 +2467,21 @@ struct text_poke_int3_loc {
 };
 
 struct text_poke_int3_vec {
-	struct text_poke_int3_loc *vec;
 	int nr_entries;
+	struct text_poke_int3_loc *vec;
 };
 
 static DEFINE_PER_CPU(atomic_t, int3_refs);
 
 static struct text_poke_int3_vec int3_vec;
 
+#define TP_ARRAY_NR_ENTRIES_MAX (PAGE_SIZE / sizeof(struct text_poke_int3_loc))
+
+static struct text_poke_int3_array {
+	int nr_entries;
+	struct text_poke_int3_loc vec[TP_ARRAY_NR_ENTRIES_MAX];
+} tp_array;
+
 static __always_inline
 struct text_poke_int3_vec *try_get_desc(void)
 {
@@ -2510,10 +2517,6 @@ static __always_inline int patch_cmp(const void *key, const void *elt)
 	return 0;
 }
 
-#define TP_VEC_MAX (PAGE_SIZE / sizeof(struct text_poke_int3_loc))
-static struct text_poke_int3_loc tp_vec[TP_VEC_MAX];
-static int tp_vec_nr;
-
 noinstr int text_poke_int3_handler(struct pt_regs *regs)
 {
 	struct text_poke_int3_vec *desc;
@@ -2538,7 +2541,7 @@ noinstr int text_poke_int3_handler(struct pt_regs *regs)
 	if (!desc)
 		return 0;
 
-	WARN_ON_ONCE(desc->vec != tp_vec);
+	WARN_ON_ONCE(desc->vec != tp_array.vec);
 
 	/*
 	 * Discount the INT3. See text_poke_int3_batch().
@@ -2627,8 +2630,8 @@ static void text_poke_int3_batch(struct text_poke_int3_loc *tp, unsigned int nr_
 
 	lockdep_assert_held(&text_mutex);
 
-	WARN_ON_ONCE(tp != tp_vec);
-	WARN_ON_ONCE(nr_entries != tp_vec_nr);
+	WARN_ON_ONCE(tp != tp_array.vec);
+	WARN_ON_ONCE(nr_entries != tp_array.nr_entries);
 
 	int3_vec.vec = tp;
 	int3_vec.nr_entries = nr_entries;
@@ -2843,7 +2846,7 @@ static void text_poke_int3_loc_init(struct text_poke_int3_loc *tp, void *addr,
 }
 
 /*
- * We hard rely on the tp_vec being ordered; ensure this is so by flushing
+ * We hard rely on the tp_array.vec being ordered; ensure this is so by flushing
  * early if needed.
  */
 static bool tp_addr_ordered(void *addr)
@@ -2852,7 +2855,7 @@ static bool tp_addr_ordered(void *addr)
 
 	WARN_ON_ONCE(!addr);
 
-	if (!tp_vec_nr)
+	if (!tp_array.nr_entries)
 		return true;
 
 	/*
@@ -2861,7 +2864,7 @@ static bool tp_addr_ordered(void *addr)
 	 * is violated and we must first flush all pending patching
 	 * requests:
 	 */
-	tp = &tp_vec[tp_vec_nr-1];
+	tp = &tp_array.vec[tp_array.nr_entries-1];
 	if ((unsigned long)text_poke_int3_addr(tp) > (unsigned long)addr)
 		return false;
 
@@ -2870,9 +2873,9 @@ static bool tp_addr_ordered(void *addr)
 
 void text_poke_int3_finish(void)
 {
-	if (tp_vec_nr) {
-		text_poke_int3_batch(tp_vec, tp_vec_nr);
-		tp_vec_nr = 0;
+	if (tp_array.nr_entries) {
+		text_poke_int3_batch(tp_array.vec, tp_array.nr_entries);
+		tp_array.nr_entries = 0;
 	}
 }
 
@@ -2880,9 +2883,9 @@ static void text_poke_int3_flush(void *addr)
 {
 	lockdep_assert_held(&text_mutex);
 
-	if (tp_vec_nr == TP_VEC_MAX || !tp_addr_ordered(addr)) {
-		text_poke_int3_batch(tp_vec, tp_vec_nr);
-		tp_vec_nr = 0;
+	if (tp_array.nr_entries == TP_ARRAY_NR_ENTRIES_MAX || !tp_addr_ordered(addr)) {
+		text_poke_int3_batch(tp_array.vec, tp_array.nr_entries);
+		tp_array.nr_entries = 0;
 	}
 }
 
@@ -2892,7 +2895,7 @@ void __ref text_poke_int3_queue(void *addr, const void *opcode, size_t len, cons
 
 	text_poke_int3_flush(addr);
 
-	tp = &tp_vec[tp_vec_nr++];
+	tp = &tp_array.vec[tp_array.nr_entries++];
 	text_poke_int3_loc_init(tp, addr, opcode, len, emulate);
 }
 
@@ -2912,9 +2915,9 @@ void __ref text_poke_int3(void *addr, const void *opcode, size_t len, const void
 	struct text_poke_int3_loc *tp;
 
 	/* Batch-patching should not be mixed with single-patching: */
-	WARN_ON_ONCE(tp_vec_nr != 0);
+	WARN_ON_ONCE(tp_array.nr_entries != 0);
 
-	tp = &tp_vec[tp_vec_nr++];
+	tp = &tp_array.vec[tp_array.nr_entries++];
 	text_poke_int3_loc_init(tp, addr, opcode, len, emulate);
 
 	text_poke_int3_finish();
-- 
2.45.2


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ