linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org,
	"Peter Zijlstra (Intel)" <peterz@infradead.org>,
	Borislav Petkov <bp@suse.de>,
	Josh Poimboeuf <jpoimboe@redhat.com>,
	Alexei Starovoitov <ast@kernel.org>,
	Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Subject: [PATCH 5.15 15/89] x86/alternative: Implement .retpoline_sites support
Date: Fri, 22 Jul 2022 11:10:49 +0200	[thread overview]
Message-ID: <20220722091134.226124208@linuxfoundation.org> (raw)
In-Reply-To: <20220722091133.320803732@linuxfoundation.org>

From: Peter Zijlstra <peterz@infradead.org>

commit 7508500900814d14e2e085cdc4e28142721abbdf upstream.

Rewrite retpoline thunk call sites to be indirect calls for
spectre_v2=off. This ensures spectre_v2=off is as near to a
RETPOLINE=n build as possible.

This is the replacement for objtool writing alternative entries to
ensure the same and achieves feature-parity with the previous
approach.

One noteworthy feature is that it relies on the thunks to be in
machine order to compute the register index.

Specifically, this does not yet address the Jcc __x86_indirect_thunk_*
calls generated by clang, a future patch will add this.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Borislav Petkov <bp@suse.de>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Tested-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/r/20211026120310.232495794@infradead.org
[cascardo: small conflict fixup at arch/x86/kernel/module.c]
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 arch/um/kernel/um_arch.c           |    4 +
 arch/x86/include/asm/alternative.h |    1 
 arch/x86/kernel/alternative.c      |  141 +++++++++++++++++++++++++++++++++++--
 arch/x86/kernel/module.c           |    9 ++
 4 files changed, 150 insertions(+), 5 deletions(-)

--- a/arch/um/kernel/um_arch.c
+++ b/arch/um/kernel/um_arch.c
@@ -421,6 +421,10 @@ void __init check_bugs(void)
 	os_check_bugs();
 }
 
+void apply_retpolines(s32 *start, s32 *end)
+{
+}
+
 void apply_alternatives(struct alt_instr *start, struct alt_instr *end)
 {
 }
--- a/arch/x86/include/asm/alternative.h
+++ b/arch/x86/include/asm/alternative.h
@@ -75,6 +75,7 @@ extern int alternatives_patched;
 
 extern void alternative_instructions(void);
 extern void apply_alternatives(struct alt_instr *start, struct alt_instr *end);
+extern void apply_retpolines(s32 *start, s32 *end);
 
 struct module;
 
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -29,6 +29,7 @@
 #include <asm/io.h>
 #include <asm/fixmap.h>
 #include <asm/paravirt.h>
+#include <asm/asm-prototypes.h>
 
 int __read_mostly alternatives_patched;
 
@@ -113,6 +114,7 @@ static void __init_or_module add_nops(vo
 	}
 }
 
+extern s32 __retpoline_sites[], __retpoline_sites_end[];
 extern struct alt_instr __alt_instructions[], __alt_instructions_end[];
 extern s32 __smp_locks[], __smp_locks_end[];
 void text_poke_early(void *addr, const void *opcode, size_t len);
@@ -221,7 +223,7 @@ static __always_inline int optimize_nops
  * "noinline" to cause control flow change and thus invalidate I$ and
  * cause refetch after modification.
  */
-static void __init_or_module noinline optimize_nops(struct alt_instr *a, u8 *instr)
+static void __init_or_module noinline optimize_nops(u8 *instr, size_t len)
 {
 	struct insn insn;
 	int i = 0;
@@ -239,11 +241,11 @@ static void __init_or_module noinline op
 		 * optimized.
 		 */
 		if (insn.length == 1 && insn.opcode.bytes[0] == 0x90)
-			i += optimize_nops_range(instr, a->instrlen, i);
+			i += optimize_nops_range(instr, len, i);
 		else
 			i += insn.length;
 
-		if (i >= a->instrlen)
+		if (i >= len)
 			return;
 	}
 }
@@ -331,10 +333,135 @@ void __init_or_module noinline apply_alt
 		text_poke_early(instr, insn_buff, insn_buff_sz);
 
 next:
-		optimize_nops(a, instr);
+		optimize_nops(instr, a->instrlen);
 	}
 }
 
+#if defined(CONFIG_RETPOLINE) && defined(CONFIG_STACK_VALIDATION)
+
+/*
+ * CALL/JMP *%\reg
+ */
+static int emit_indirect(int op, int reg, u8 *bytes)
+{
+	int i = 0;
+	u8 modrm;
+
+	switch (op) {
+	case CALL_INSN_OPCODE:
+		modrm = 0x10; /* Reg = 2; CALL r/m */
+		break;
+
+	case JMP32_INSN_OPCODE:
+		modrm = 0x20; /* Reg = 4; JMP r/m */
+		break;
+
+	default:
+		WARN_ON_ONCE(1);
+		return -1;
+	}
+
+	if (reg >= 8) {
+		bytes[i++] = 0x41; /* REX.B prefix */
+		reg -= 8;
+	}
+
+	modrm |= 0xc0; /* Mod = 3 */
+	modrm += reg;
+
+	bytes[i++] = 0xff; /* opcode */
+	bytes[i++] = modrm;
+
+	return i;
+}
+
+/*
+ * Rewrite the compiler generated retpoline thunk calls.
+ *
+ * For spectre_v2=off (!X86_FEATURE_RETPOLINE), rewrite them into immediate
+ * indirect instructions, avoiding the extra indirection.
+ *
+ * For example, convert:
+ *
+ *   CALL __x86_indirect_thunk_\reg
+ *
+ * into:
+ *
+ *   CALL *%\reg
+ *
+ */
+static int patch_retpoline(void *addr, struct insn *insn, u8 *bytes)
+{
+	retpoline_thunk_t *target;
+	int reg, i = 0;
+
+	target = addr + insn->length + insn->immediate.value;
+	reg = target - __x86_indirect_thunk_array;
+
+	if (WARN_ON_ONCE(reg & ~0xf))
+		return -1;
+
+	/* If anyone ever does: CALL/JMP *%rsp, we're in deep trouble. */
+	BUG_ON(reg == 4);
+
+	if (cpu_feature_enabled(X86_FEATURE_RETPOLINE))
+		return -1;
+
+	i = emit_indirect(insn->opcode.bytes[0], reg, bytes);
+	if (i < 0)
+		return i;
+
+	for (; i < insn->length;)
+		bytes[i++] = BYTES_NOP1;
+
+	return i;
+}
+
+/*
+ * Generated by 'objtool --retpoline'.
+ */
+void __init_or_module noinline apply_retpolines(s32 *start, s32 *end)
+{
+	s32 *s;
+
+	for (s = start; s < end; s++) {
+		void *addr = (void *)s + *s;
+		struct insn insn;
+		int len, ret;
+		u8 bytes[16];
+		u8 op1, op2;
+
+		ret = insn_decode_kernel(&insn, addr);
+		if (WARN_ON_ONCE(ret < 0))
+			continue;
+
+		op1 = insn.opcode.bytes[0];
+		op2 = insn.opcode.bytes[1];
+
+		switch (op1) {
+		case CALL_INSN_OPCODE:
+		case JMP32_INSN_OPCODE:
+			break;
+
+		default:
+			WARN_ON_ONCE(1);
+			continue;
+		}
+
+		len = patch_retpoline(addr, &insn, bytes);
+		if (len == insn.length) {
+			optimize_nops(bytes, len);
+			text_poke_early(addr, bytes, len);
+		}
+	}
+}
+
+#else /* !RETPOLINES || !CONFIG_STACK_VALIDATION */
+
+void __init_or_module noinline apply_retpolines(s32 *start, s32 *end) { }
+
+#endif /* CONFIG_RETPOLINE && CONFIG_STACK_VALIDATION */
+
 #ifdef CONFIG_SMP
 static void alternatives_smp_lock(const s32 *start, const s32 *end,
 				  u8 *text, u8 *text_end)
@@ -643,6 +770,12 @@ void __init alternative_instructions(voi
 	apply_paravirt(__parainstructions, __parainstructions_end);
 
 	/*
+	 * Rewrite the retpolines, must be done before alternatives since
+	 * those can rewrite the retpoline thunks.
+	 */
+	apply_retpolines(__retpoline_sites, __retpoline_sites_end);
+
+	/*
 	 * Then patch alternatives, such that those paravirt calls that are in
 	 * alternatives can be overwritten by their immediate fragments.
 	 */
--- a/arch/x86/kernel/module.c
+++ b/arch/x86/kernel/module.c
@@ -252,7 +252,8 @@ int module_finalize(const Elf_Ehdr *hdr,
 		    struct module *me)
 {
 	const Elf_Shdr *s, *text = NULL, *alt = NULL, *locks = NULL,
-		*para = NULL, *orc = NULL, *orc_ip = NULL;
+		*para = NULL, *orc = NULL, *orc_ip = NULL,
+		*retpolines = NULL;
 	char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
 
 	for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) {
@@ -268,6 +269,8 @@ int module_finalize(const Elf_Ehdr *hdr,
 			orc = s;
 		if (!strcmp(".orc_unwind_ip", secstrings + s->sh_name))
 			orc_ip = s;
+		if (!strcmp(".retpoline_sites", secstrings + s->sh_name))
+			retpolines = s;
 	}
 
 	/*
@@ -278,6 +281,10 @@ int module_finalize(const Elf_Ehdr *hdr,
 		void *pseg = (void *)para->sh_addr;
 		apply_paravirt(pseg, pseg + para->sh_size);
 	}
+	if (retpolines) {
+		void *rseg = (void *)retpolines->sh_addr;
+		apply_retpolines(rseg, rseg + retpolines->sh_size);
+	}
 	if (alt) {
 		/* patch .altinstructions */
 		void *aseg = (void *)alt->sh_addr;



  parent reply	other threads:[~2022-07-22  9:21 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-22  9:10 [PATCH 5.15 00/89] 5.15.57-rc1 review Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 01/89] x86/traps: Use pt_regs directly in fixup_bad_iret() Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 02/89] x86/entry: Switch the stack after error_entry() returns Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 03/89] x86/entry: Move PUSH_AND_CLEAR_REGS out of error_entry() Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 04/89] x86/entry: Dont call error_entry() for XENPV Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 05/89] objtool: Classify symbols Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 06/89] objtool: Explicitly avoid self modifying code in .altinstr_replacement Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 07/89] objtool: Shrink struct instruction Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 08/89] objtool,x86: Replace alternatives with .retpoline_sites Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 09/89] objtool: Introduce CFI hash Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 10/89] x86/retpoline: Remove unused replacement symbols Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 11/89] x86/asm: Fix register order Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 12/89] x86/asm: Fixup odd GEN-for-each-reg.h usage Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 13/89] x86/retpoline: Move the retpoline thunk declarations to nospec-branch.h Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 14/89] x86/retpoline: Create a retpoline thunk array Greg Kroah-Hartman
2022-07-22  9:10 ` Greg Kroah-Hartman [this message]
2022-07-22  9:10 ` [PATCH 5.15 16/89] x86/alternative: Handle Jcc __x86_indirect_thunk_\reg Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 17/89] x86/alternative: Try inline spectre_v2=retpoline,amd Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 18/89] x86/alternative: Add debug prints to apply_retpolines() Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 19/89] bpf,x86: Simplify computing label offsets Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 20/89] bpf,x86: Respect X86_FEATURE_RETPOLINE* Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 21/89] objtool: Default ignore INT3 for unreachable Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 22/89] x86/entry: Remove skip_r11rcx Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 23/89] x86/realmode: build with -D__DISABLE_EXPORTS Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 24/89] x86/kvm/vmx: Make noinstr clean Greg Kroah-Hartman
2022-07-22  9:10 ` [PATCH 5.15 25/89] x86/cpufeatures: Move RETPOLINE flags to word 11 Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 26/89] x86/retpoline: Cleanup some #ifdefery Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 27/89] x86/retpoline: Swizzle retpoline thunk Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 28/89] x86/retpoline: Use -mfunction-return Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 29/89] x86: Undo return-thunk damage Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 30/89] x86,objtool: Create .return_sites Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 31/89] objtool: skip non-text sections when adding return-thunk sites Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 32/89] x86,static_call: Use alternative RET encoding Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 33/89] x86/ftrace: " Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 34/89] x86/bpf: " Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 35/89] x86/kvm: Fix SETcc emulation for return thunks Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 36/89] x86/vsyscall_emu/64: Dont use RET in vsyscall emulation Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 37/89] x86/sev: Avoid using __x86_return_thunk Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 38/89] x86: Use return-thunk in asm code Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 39/89] x86/entry: Avoid very early RET Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 40/89] objtool: Treat .text.__x86.* as noinstr Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 41/89] x86: Add magic AMD return-thunk Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 42/89] x86/bugs: Report AMD retbleed vulnerability Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 43/89] x86/bugs: Add AMD retbleed= boot parameter Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 44/89] x86/bugs: Enable STIBP for JMP2RET Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 45/89] x86/bugs: Keep a per-CPU IA32_SPEC_CTRL value Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 46/89] x86/entry: Add kernel IBRS implementation Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 47/89] x86/bugs: Optimize SPEC_CTRL MSR writes Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 48/89] x86/speculation: Add spectre_v2=ibrs option to support Kernel IBRS Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 49/89] x86/bugs: Split spectre_v2_select_mitigation() and spectre_v2_user_select_mitigation() Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 50/89] x86/bugs: Report Intel retbleed vulnerability Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 51/89] intel_idle: Disable IBRS during long idle Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 52/89] objtool: Update Retpoline validation Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 53/89] x86/xen: Rename SYS* entry points Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 54/89] x86/xen: Add UNTRAIN_RET Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 55/89] x86/bugs: Add retbleed=ibpb Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 56/89] x86/bugs: Do IBPB fallback check only once Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 57/89] objtool: Add entry UNRET validation Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 58/89] x86/cpu/amd: Add Spectral Chicken Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 59/89] x86/speculation: Fix RSB filling with CONFIG_RETPOLINE=n Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 60/89] x86/speculation: Fix firmware entry SPEC_CTRL handling Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 61/89] x86/speculation: Fix SPEC_CTRL write on SMT state change Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 62/89] x86/speculation: Use cached host SPEC_CTRL value for guest entry/exit Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 63/89] x86/speculation: Remove x86_spec_ctrl_mask Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 64/89] objtool: Re-add UNWIND_HINT_{SAVE_RESTORE} Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 65/89] KVM: VMX: Flatten __vmx_vcpu_run() Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 66/89] KVM: VMX: Convert launched argument to flags Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 67/89] KVM: VMX: Prevent guest RSB poisoning attacks with eIBRS Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 68/89] KVM: VMX: Fix IBRS handling after vmexit Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 69/89] x86/speculation: Fill RSB on vmexit for IBRS Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 70/89] x86/common: Stamp out the stepping madness Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 71/89] x86/cpu/amd: Enumerate BTC_NO Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 72/89] x86/retbleed: Add fine grained Kconfig knobs Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 73/89] x86/bugs: Add Cannon lake to RETBleed affected CPU list Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 74/89] x86/entry: Move PUSH_AND_CLEAR_REGS() back into error_entry Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 75/89] x86/bugs: Do not enable IBPB-on-entry when IBPB is not supported Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 76/89] x86/kexec: Disable RET on kexec Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 77/89] x86/speculation: Disable RRSBA behavior Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 78/89] x86/static_call: Serialize __static_call_fixup() properly Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 79/89] x86/xen: Fix initialisation in hypercall_page after rethunk Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 80/89] x86/asm/32: Fix ANNOTATE_UNRET_SAFE use on 32-bit Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 81/89] x86/speculation: Use DECLARE_PER_CPU for x86_spec_ctrl_current Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 82/89] efi/x86: use naked RET on mixed mode call wrapper Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 83/89] x86/kvm: fix FASTOP_SIZE when return thunks are enabled Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 84/89] KVM: emulate: do not adjust size of fastop and setcc subroutines Greg Kroah-Hartman
2022-07-22  9:11 ` [PATCH 5.15 85/89] tools arch x86: Sync the msr-index.h copy with the kernel sources Greg Kroah-Hartman
2022-07-22  9:12 ` [PATCH 5.15 86/89] tools headers cpufeatures: Sync " Greg Kroah-Hartman
2022-07-22  9:12 ` [PATCH 5.15 87/89] x86/bugs: Remove apostrophe typo Greg Kroah-Hartman
2022-07-22  9:12 ` [PATCH 5.15 88/89] um: Add missing apply_returns() Greg Kroah-Hartman
2022-07-22  9:12 ` [PATCH 5.15 89/89] x86: Use -mindirect-branch-cs-prefix for RETPOLINE builds Greg Kroah-Hartman
2022-07-22 12:14 ` [PATCH 5.15 00/89] 5.15.57-rc1 review Bagas Sanjaya
2022-07-22 17:58 ` Florian Fainelli
2022-07-22 19:36 ` Naresh Kamboju
2022-07-22 21:59 ` Guenter Roeck
2022-07-23  4:21 ` Ron Economos
2022-07-23  8:55 ` Sudip Mukherjee (Codethink)

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=20220722091134.226124208@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=ast@kernel.org \
    --cc=bp@suse.de \
    --cc=cascardo@canonical.com \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=stable@vger.kernel.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;
as well as URLs for NNTP newsgroup(s).