mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Alexandre Chartre <alexandre.chartre@oracle.com>
To: linux-kernel@vger.kernel.org, mingo@kernel.org,
	jpoimboe@kernel.org, peterz@infradead.org,
	david.laight.linux@gmail.com
Cc: alexandre.chartre@oracle.com
Subject: [PATCH v6 08/30] objtool: Extract code to validate instruction from the validate branch loop
Date: Fri, 21 Nov 2025 10:53:18 +0100	[thread overview]
Message-ID: <20251121095340.464045-9-alexandre.chartre@oracle.com> (raw)
In-Reply-To: <20251121095340.464045-1-alexandre.chartre@oracle.com>

The code to validate a branch loops through all instructions of the
branch and validate each instruction. Move the code to validate an
instruction to a separated function.

Signed-off-by: Alexandre Chartre <alexandre.chartre@oracle.com>
---
 tools/objtool/check.c | 386 ++++++++++++++++++++++--------------------
 1 file changed, 205 insertions(+), 181 deletions(-)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index dd61c3242def5..9c1888e21c1d8 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -3706,253 +3706,277 @@ static void checksum_update_insn(struct objtool_file *file, struct symbol *func,
 	checksum_update(func, insn, &offset, sizeof(offset));
 }
 
-/*
- * Follow the branch starting at the given instruction, and recursively follow
- * any other branches (jumps).  Meanwhile, track the frame pointer state at
- * each instruction and validate all the rules described in
- * tools/objtool/Documentation/objtool.txt.
- */
 static int validate_branch(struct objtool_file *file, struct symbol *func,
-			   struct instruction *insn, struct insn_state state)
+			   struct instruction *insn, struct insn_state state);
+
+static int validate_insn(struct objtool_file *file, struct symbol *func,
+			 struct instruction *insn, struct insn_state *statep,
+			 struct instruction *prev_insn, struct instruction *next_insn,
+			 bool *dead_end)
 {
 	struct alternative *alt;
-	struct instruction *next_insn, *prev_insn = NULL;
 	u8 visited;
 	int ret;
 
-	if (func && func->ignore)
-		return 0;
+	/*
+	 * Any returns before the end of this function are effectively dead
+	 * ends, i.e. validate_branch() has reached the end of the branch.
+	 */
+	*dead_end = true;
 
-	while (1) {
-		next_insn = next_insn_to_validate(file, insn);
+	visited = VISITED_BRANCH << statep->uaccess;
+	if (insn->visited & VISITED_BRANCH_MASK) {
+		if (!insn->hint && !insn_cfi_match(insn, &statep->cfi))
+			return 1;
 
-		if (opts.checksum && func && insn->sec)
-			checksum_update_insn(file, func, insn);
+		if (insn->visited & visited)
+			return 0;
+	} else {
+		nr_insns_visited++;
+	}
 
-		if (func && insn_func(insn) && func != insn_func(insn)->pfunc) {
-			/* Ignore KCFI type preambles, which always fall through */
-			if (is_prefix_func(func))
-				return 0;
+	if (statep->noinstr)
+		statep->instr += insn->instr;
 
-			if (file->ignore_unreachables)
-				return 0;
+	if (insn->hint) {
+		if (insn->restore) {
+			struct instruction *save_insn, *i;
 
-			WARN("%s() falls through to next function %s()",
-			     func->name, insn_func(insn)->name);
-			func->warned = 1;
+			i = insn;
+			save_insn = NULL;
 
-			return 1;
-		}
+			sym_for_each_insn_continue_reverse(file, func, i) {
+				if (i->save) {
+					save_insn = i;
+					break;
+				}
+			}
 
-		visited = VISITED_BRANCH << state.uaccess;
-		if (insn->visited & VISITED_BRANCH_MASK) {
-			if (!insn->hint && !insn_cfi_match(insn, &state.cfi))
+			if (!save_insn) {
+				WARN_INSN(insn, "no corresponding CFI save for CFI restore");
 				return 1;
+			}
 
-			if (insn->visited & visited)
-				return 0;
-		} else {
-			nr_insns_visited++;
+			if (!save_insn->visited) {
+				/*
+				 * If the restore hint insn is at the
+				 * beginning of a basic block and was
+				 * branched to from elsewhere, and the
+				 * save insn hasn't been visited yet,
+				 * defer following this branch for now.
+				 * It will be seen later via the
+				 * straight-line path.
+				 */
+				if (!prev_insn)
+					return 0;
+
+				WARN_INSN(insn, "objtool isn't smart enough to handle this CFI save/restore combo");
+				return 1;
+			}
+
+			insn->cfi = save_insn->cfi;
+			nr_cfi_reused++;
 		}
 
-		if (state.noinstr)
-			state.instr += insn->instr;
+		statep->cfi = *insn->cfi;
+	} else {
+		/* XXX track if we actually changed statep->cfi */
 
-		if (insn->hint) {
-			if (insn->restore) {
-				struct instruction *save_insn, *i;
+		if (prev_insn && !cficmp(prev_insn->cfi, &statep->cfi)) {
+			insn->cfi = prev_insn->cfi;
+			nr_cfi_reused++;
+		} else {
+			insn->cfi = cfi_hash_find_or_add(&statep->cfi);
+		}
+	}
 
-				i = insn;
-				save_insn = NULL;
+	insn->visited |= visited;
 
-				sym_for_each_insn_continue_reverse(file, func, i) {
-					if (i->save) {
-						save_insn = i;
-						break;
-					}
-				}
+	if (propagate_alt_cfi(file, insn))
+		return 1;
 
-				if (!save_insn) {
-					WARN_INSN(insn, "no corresponding CFI save for CFI restore");
-					return 1;
-				}
+	if (insn->alts) {
+		for (alt = insn->alts; alt; alt = alt->next) {
+			ret = validate_branch(file, func, alt->insn, *statep);
+			if (ret) {
+				BT_INSN(insn, "(alt)");
+				return ret;
+			}
+		}
+	}
 
-				if (!save_insn->visited) {
-					/*
-					 * If the restore hint insn is at the
-					 * beginning of a basic block and was
-					 * branched to from elsewhere, and the
-					 * save insn hasn't been visited yet,
-					 * defer following this branch for now.
-					 * It will be seen later via the
-					 * straight-line path.
-					 */
-					if (!prev_insn)
-						return 0;
+	if (skip_alt_group(insn))
+		return 0;
 
-					WARN_INSN(insn, "objtool isn't smart enough to handle this CFI save/restore combo");
-					return 1;
-				}
+	if (handle_insn_ops(insn, next_insn, statep))
+		return 1;
 
-				insn->cfi = save_insn->cfi;
-				nr_cfi_reused++;
-			}
+	switch (insn->type) {
 
-			state.cfi = *insn->cfi;
-		} else {
-			/* XXX track if we actually changed state.cfi */
+	case INSN_RETURN:
+		return validate_return(func, insn, statep);
 
-			if (prev_insn && !cficmp(prev_insn->cfi, &state.cfi)) {
-				insn->cfi = prev_insn->cfi;
-				nr_cfi_reused++;
-			} else {
-				insn->cfi = cfi_hash_find_or_add(&state.cfi);
-			}
+	case INSN_CALL:
+	case INSN_CALL_DYNAMIC:
+		ret = validate_call(file, insn, statep);
+		if (ret)
+			return ret;
+
+		if (opts.stackval && func && !is_special_call(insn) &&
+		    !has_valid_stack_frame(statep)) {
+			WARN_INSN(insn, "call without frame pointer save/setup");
+			return 1;
 		}
 
-		insn->visited |= visited;
+		break;
 
-		if (propagate_alt_cfi(file, insn))
-			return 1;
+	case INSN_JUMP_CONDITIONAL:
+	case INSN_JUMP_UNCONDITIONAL:
+		if (is_sibling_call(insn)) {
+			ret = validate_sibling_call(file, insn, statep);
+			if (ret)
+				return ret;
 
-		if (insn->alts) {
-			for (alt = insn->alts; alt; alt = alt->next) {
-				ret = validate_branch(file, func, alt->insn, state);
-				if (ret) {
-					BT_INSN(insn, "(alt)");
-					return ret;
-				}
+		} else if (insn->jump_dest) {
+			ret = validate_branch(file, func,
+					      insn->jump_dest, *statep);
+			if (ret) {
+				BT_INSN(insn, "(branch)");
+				return ret;
 			}
 		}
 
-		if (skip_alt_group(insn))
+		if (insn->type == INSN_JUMP_UNCONDITIONAL)
 			return 0;
 
-		if (handle_insn_ops(insn, next_insn, &state))
-			return 1;
-
-		switch (insn->type) {
-
-		case INSN_RETURN:
-			return validate_return(func, insn, &state);
+		break;
 
-		case INSN_CALL:
-		case INSN_CALL_DYNAMIC:
-			ret = validate_call(file, insn, &state);
+	case INSN_JUMP_DYNAMIC:
+	case INSN_JUMP_DYNAMIC_CONDITIONAL:
+		if (is_sibling_call(insn)) {
+			ret = validate_sibling_call(file, insn, statep);
 			if (ret)
 				return ret;
+		}
 
-			if (opts.stackval && func && !is_special_call(insn) &&
-			    !has_valid_stack_frame(&state)) {
-				WARN_INSN(insn, "call without frame pointer save/setup");
-				return 1;
-			}
+		if (insn->type == INSN_JUMP_DYNAMIC)
+			return 0;
 
-			break;
+		break;
 
-		case INSN_JUMP_CONDITIONAL:
-		case INSN_JUMP_UNCONDITIONAL:
-			if (is_sibling_call(insn)) {
-				ret = validate_sibling_call(file, insn, &state);
-				if (ret)
-					return ret;
+	case INSN_SYSCALL:
+		if (func && (!next_insn || !next_insn->hint)) {
+			WARN_INSN(insn, "unsupported instruction in callable function");
+			return 1;
+		}
 
-			} else if (insn->jump_dest) {
-				ret = validate_branch(file, func,
-						      insn->jump_dest, state);
-				if (ret) {
-					BT_INSN(insn, "(branch)");
-					return ret;
-				}
-			}
+		break;
 
-			if (insn->type == INSN_JUMP_UNCONDITIONAL)
-				return 0;
+	case INSN_SYSRET:
+		if (func && (!next_insn || !next_insn->hint)) {
+			WARN_INSN(insn, "unsupported instruction in callable function");
+			return 1;
+		}
+
+		return 0;
 
+	case INSN_STAC:
+		if (!opts.uaccess)
 			break;
 
-		case INSN_JUMP_DYNAMIC:
-		case INSN_JUMP_DYNAMIC_CONDITIONAL:
-			if (is_sibling_call(insn)) {
-				ret = validate_sibling_call(file, insn, &state);
-				if (ret)
-					return ret;
-			}
+		if (statep->uaccess) {
+			WARN_INSN(insn, "recursive UACCESS enable");
+			return 1;
+		}
 
-			if (insn->type == INSN_JUMP_DYNAMIC)
-				return 0;
+		statep->uaccess = true;
+		break;
 
+	case INSN_CLAC:
+		if (!opts.uaccess)
 			break;
 
-		case INSN_SYSCALL:
-			if (func && (!next_insn || !next_insn->hint)) {
-				WARN_INSN(insn, "unsupported instruction in callable function");
-				return 1;
-			}
+		if (!statep->uaccess && func) {
+			WARN_INSN(insn, "redundant UACCESS disable");
+			return 1;
+		}
 
-			break;
+		if (func_uaccess_safe(func) && !statep->uaccess_stack) {
+			WARN_INSN(insn, "UACCESS-safe disables UACCESS");
+			return 1;
+		}
 
-		case INSN_SYSRET:
-			if (func && (!next_insn || !next_insn->hint)) {
-				WARN_INSN(insn, "unsupported instruction in callable function");
-				return 1;
-			}
+		statep->uaccess = false;
+		break;
 
-			return 0;
+	case INSN_STD:
+		if (statep->df) {
+			WARN_INSN(insn, "recursive STD");
+			return 1;
+		}
 
-		case INSN_STAC:
-			if (!opts.uaccess)
-				break;
+		statep->df = true;
+		break;
 
-			if (state.uaccess) {
-				WARN_INSN(insn, "recursive UACCESS enable");
-				return 1;
-			}
+	case INSN_CLD:
+		if (!statep->df && func) {
+			WARN_INSN(insn, "redundant CLD");
+			return 1;
+		}
 
-			state.uaccess = true;
-			break;
+		statep->df = false;
+		break;
 
-		case INSN_CLAC:
-			if (!opts.uaccess)
-				break;
+	default:
+		break;
+	}
 
-			if (!state.uaccess && func) {
-				WARN_INSN(insn, "redundant UACCESS disable");
-				return 1;
-			}
+	*dead_end = insn->dead_end;
 
-			if (func_uaccess_safe(func) && !state.uaccess_stack) {
-				WARN_INSN(insn, "UACCESS-safe disables UACCESS");
-				return 1;
-			}
+	return 0;
+}
 
-			state.uaccess = false;
-			break;
+/*
+ * Follow the branch starting at the given instruction, and recursively follow
+ * any other branches (jumps).  Meanwhile, track the frame pointer state at
+ * each instruction and validate all the rules described in
+ * tools/objtool/Documentation/objtool.txt.
+ */
+static int validate_branch(struct objtool_file *file, struct symbol *func,
+			   struct instruction *insn, struct insn_state state)
+{
+	struct instruction *next_insn, *prev_insn = NULL;
+	bool dead_end;
+	int ret;
 
-		case INSN_STD:
-			if (state.df) {
-				WARN_INSN(insn, "recursive STD");
-				return 1;
-			}
+	if (func && func->ignore)
+		return 0;
 
-			state.df = true;
-			break;
+	while (1) {
+		next_insn = next_insn_to_validate(file, insn);
 
-		case INSN_CLD:
-			if (!state.df && func) {
-				WARN_INSN(insn, "redundant CLD");
-				return 1;
-			}
+		if (opts.checksum && func && insn->sec)
+			checksum_update_insn(file, func, insn);
 
-			state.df = false;
-			break;
+		if (func && insn_func(insn) && func != insn_func(insn)->pfunc) {
+			/* Ignore KCFI type preambles, which always fall through */
+			if (is_prefix_func(func))
+				return 0;
 
-		default:
-			break;
+			if (file->ignore_unreachables)
+				return 0;
+
+			WARN("%s() falls through to next function %s()",
+			     func->name, insn_func(insn)->name);
+			func->warned = 1;
+
+			return 1;
 		}
 
-		if (insn->dead_end)
-			return 0;
+		ret = validate_insn(file, func, insn, &state, prev_insn, next_insn,
+				    &dead_end);
+		if (dead_end)
+			break;
 
 		if (!next_insn) {
 			if (state.cfi.cfa.base == CFI_UNDEFINED)
@@ -3970,7 +3994,7 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
 		insn = next_insn;
 	}
 
-	return 0;
+	return ret;
 }
 
 static int validate_unwind_hint(struct objtool_file *file,
-- 
2.43.5


  parent reply	other threads:[~2025-11-21  9:54 UTC|newest]

Thread overview: 110+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-21  9:53 [PATCH v6 00/30] objtool: Function validation tracing Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 01/30] objtool: Move disassembly functions to a separated file Alexandre Chartre
2025-11-24  9:12   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 02/30] objtool: Create disassembly context Alexandre Chartre
2025-11-24  9:12   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 03/30] objtool: Disassemble code with libopcodes instead of running objdump Alexandre Chartre
2025-11-24  9:12   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-25 18:16   ` [PATCH v6 03/30] " Nathan Chancellor
2025-11-26  9:00     ` Alexandre Chartre
2025-11-26 10:07       ` David Laight
2025-11-26 10:29         ` Alexandre Chartre
2025-12-09  6:58   ` Guenter Roeck
2025-12-09  7:51     ` Alexandre Chartre
2025-12-09 15:11       ` Guenter Roeck
2025-12-09 22:25       ` Maciej W. Rozycki
2025-12-10  5:08         ` Guenter Roeck
2025-12-10  7:53           ` Alexandre Chartre
2025-12-10 15:26             ` Guenter Roeck
2025-12-10 16:36               ` Alexandre Chartre
2025-12-10 18:42                 ` Guenter Roeck
2025-12-10 21:54                   ` Guenter Roeck
2025-12-15 16:00                     ` Alexandre Chartre
2025-12-15 16:46                       ` Guenter Roeck
2025-12-10  7:06         ` Alexandre Chartre
2025-12-10  8:56           ` Peter Zijlstra
2025-12-10  8:53         ` Peter Zijlstra
2025-12-10 12:01           ` Maciej W. Rozycki
2025-11-21  9:53 ` [PATCH v6 04/30] tool build: Remove annoying newline in build output Alexandre Chartre
2025-11-24  9:12   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 05/30] objtool: Print symbol during disassembly Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 06/30] objtool: Store instruction disassembly result Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 07/30] objtool: Disassemble instruction on warning or backtrace Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` Alexandre Chartre [this message]
2025-11-24  9:11   ` [tip: objtool/core] objtool: Extract code to validate instruction from the validate branch loop tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 09/30] objtool: Record symbol name max length Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 10/30] objtool: Add option to trace function validation Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 11/30] objtool: Trace instruction state changes during " Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-12-01 20:23   ` [PATCH v6 11/30] " Nathan Chancellor
2025-12-02  1:30     ` Josh Poimboeuf
2025-12-02  8:34       ` Alexandre Chartre
2025-12-02 16:13         ` Josh Poimboeuf
2025-12-02 18:09           ` David Laight
2025-11-21  9:53 ` [PATCH v6 12/30] objtool: Improve register reporting " Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 13/30] objtool: Identify the different types of alternatives Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 14/30] objtool: Add functions to better name alternatives Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 15/30] objtool: Improve tracing of alternative instructions Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 16/30] objtool: Do not validate IBT for .return_sites and .call_sites Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 17/30] objtool: Add the --disas=<function-pattern> action Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 18/30] objtool: Preserve alternatives order Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 19/30] objtool: Print headers for alternatives Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 20/30] objtool: Disassemble group alternatives Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 21/30] objtool: Print addresses with alternative instructions Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 22/30] objtool: Disassemble exception table alternatives Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 23/30] objtool: Disassemble jump " Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 24/30] objtool: Fix address references in alternatives Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 25/30] objtool: Provide access to feature and flags of group alternatives Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 26/30] objtool: Function to get the name of a CPU feature Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-24 10:44   ` tip-bot2 for Alexandre Chartre
2025-11-24 11:59     ` Peter Zijlstra
2025-11-24 12:26       ` Borislav Petkov
2025-11-24 12:40         ` Alexandre Chartre
2025-11-24 19:05           ` david laight
2025-11-24 16:43         ` Alexandre Chartre
2025-11-24 20:14           ` Borislav Petkov
2025-11-24 19:49   ` [tip: objtool/core] objtool: Add " tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 27/30] objtool: Improve naming of group alternatives Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-24 10:44   ` tip-bot2 for Alexandre Chartre
2025-11-24 19:49   ` tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 28/30] objtool: Compact output for alternatives with one instruction Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-24 10:43   ` tip-bot2 for Alexandre Chartre
2025-11-24 19:49   ` tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 29/30] objtool: Add wide output for disassembly Alexandre Chartre
2025-11-24  9:11   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-24 10:43   ` tip-bot2 for Alexandre Chartre
2025-11-24 19:49   ` tip-bot2 for Alexandre Chartre
2025-11-21  9:53 ` [PATCH v6 30/30] objtool: Trim trailing NOPs in alternative Alexandre Chartre
2025-11-24  9:10   ` [tip: objtool/core] " tip-bot2 for Alexandre Chartre
2025-11-24 10:43   ` tip-bot2 for Alexandre Chartre
2025-11-24 19:49   ` tip-bot2 for Alexandre Chartre
2025-11-21 10:36 ` [PATCH v6 00/30] objtool: Function validation tracing Peter Zijlstra
2025-11-21 13:16   ` Alexandre Chartre
2025-11-21 13:51     ` Alexandre Chartre
2025-11-21 14:30       ` Peter Zijlstra
2025-11-24 11:04 ` Borislav Petkov
2025-11-24 11:39   ` Alexandre Chartre
2025-11-24 12:39     ` Borislav Petkov
2025-11-24 12:27   ` David Laight

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251121095340.464045-9-alexandre.chartre@oracle.com \
    --to=alexandre.chartre@oracle.com \
    --cc=david.laight.linux@gmail.com \
    --cc=jpoimboe@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®