release 6.14.2
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
From 9efac88375330a6f29f091e9dd5fd6154670ba56 Mon Sep 17 00:00:00 2001
|
||||
From 04eeb2f53dc530f0f724687b9ed2efdb86c59aed Mon Sep 17 00:00:00 2001
|
||||
From: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
|
||||
Date: Fri, 7 Feb 2025 15:07:46 -0300
|
||||
Subject: tpm: do not start chip while suspended
|
||||
|
176
debian/patches/patchset-pf/fixes/0002-Kunit-to-check-the-longest-symbol-length.patch
vendored
Normal file
176
debian/patches/patchset-pf/fixes/0002-Kunit-to-check-the-longest-symbol-length.patch
vendored
Normal file
@@ -0,0 +1,176 @@
|
||||
From 065753c4084d8ea0b55b8a5abbba3291eeaf5979 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Sergio=20Gonz=C3=A1lez=20Collado?=
|
||||
<sergio.collado@gmail.com>
|
||||
Date: Sun, 2 Mar 2025 23:15:18 +0100
|
||||
Subject: Kunit to check the longest symbol length
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The longest length of a symbol (KSYM_NAME_LEN) was increased to 512
|
||||
in the reference [1]. This patch adds kunit test suite to check the longest
|
||||
symbol length. These tests verify that the longest symbol length defined
|
||||
is supported.
|
||||
|
||||
This test can also help other efforts for longer symbol length,
|
||||
like [2].
|
||||
|
||||
The test suite defines one symbol with the longest possible length.
|
||||
|
||||
The first test verify that functions with names of the created
|
||||
symbol, can be called or not.
|
||||
|
||||
The second test, verify that the symbols are created (or
|
||||
not) in the kernel symbol table.
|
||||
|
||||
[1] https://lore.kernel.org/lkml/20220802015052.10452-6-ojeda@kernel.org/
|
||||
[2] https://lore.kernel.org/lkml/20240605032120.3179157-1-song@kernel.org/
|
||||
|
||||
Tested-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com>
|
||||
Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
|
||||
Reviewed-by: Rae Moar <rmoar@google.com>
|
||||
Signed-off-by: Sergio González Collado <sergio.collado@gmail.com>
|
||||
Link: https://github.com/Rust-for-Linux/linux/issues/504
|
||||
Source: https://lore.kernel.org/rust-for-linux/20250302221518.76874-1-sergio.collado@gmail.com/
|
||||
Cherry-picked-for: https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/issues/63
|
||||
---
|
||||
arch/x86/tools/insn_decoder_test.c | 3 +-
|
||||
lib/Kconfig.debug | 9 ++++
|
||||
lib/Makefile | 2 +
|
||||
lib/longest_symbol_kunit.c | 82 ++++++++++++++++++++++++++++++
|
||||
4 files changed, 95 insertions(+), 1 deletion(-)
|
||||
create mode 100644 lib/longest_symbol_kunit.c
|
||||
|
||||
--- a/arch/x86/tools/insn_decoder_test.c
|
||||
+++ b/arch/x86/tools/insn_decoder_test.c
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <assert.h>
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
+#include <linux/kallsyms.h>
|
||||
|
||||
#define unlikely(cond) (cond)
|
||||
|
||||
@@ -106,7 +107,7 @@ static void parse_args(int argc, char **
|
||||
}
|
||||
}
|
||||
|
||||
-#define BUFSIZE 256
|
||||
+#define BUFSIZE (256 + KSYM_NAME_LEN)
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
--- a/lib/Kconfig.debug
|
||||
+++ b/lib/Kconfig.debug
|
||||
@@ -2838,6 +2838,15 @@ config FORTIFY_KUNIT_TEST
|
||||
by the str*() and mem*() family of functions. For testing runtime
|
||||
traps of FORTIFY_SOURCE, see LKDTM's "FORTIFY_*" tests.
|
||||
|
||||
+config LONGEST_SYM_KUNIT_TEST
|
||||
+ tristate "Test the longest symbol possible" if !KUNIT_ALL_TESTS
|
||||
+ depends on KUNIT && KPROBES
|
||||
+ default KUNIT_ALL_TESTS
|
||||
+ help
|
||||
+ Tests the longest symbol possible
|
||||
+
|
||||
+ If unsure, say N.
|
||||
+
|
||||
config HW_BREAKPOINT_KUNIT_TEST
|
||||
bool "Test hw_breakpoint constraints accounting" if !KUNIT_ALL_TESTS
|
||||
depends on HAVE_HW_BREAKPOINT
|
||||
--- a/lib/Makefile
|
||||
+++ b/lib/Makefile
|
||||
@@ -393,6 +393,8 @@ obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fort
|
||||
obj-$(CONFIG_CRC_KUNIT_TEST) += crc_kunit.o
|
||||
obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o
|
||||
obj-$(CONFIG_USERCOPY_KUNIT_TEST) += usercopy_kunit.o
|
||||
+obj-$(CONFIG_LONGEST_SYM_KUNIT_TEST) += longest_symbol_kunit.o
|
||||
+CFLAGS_longest_symbol_kunit.o += $(call cc-disable-warning, missing-prototypes)
|
||||
|
||||
obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o
|
||||
|
||||
--- /dev/null
|
||||
+++ b/lib/longest_symbol_kunit.c
|
||||
@@ -0,0 +1,82 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Test the longest symbol length. Execute with:
|
||||
+ * ./tools/testing/kunit/kunit.py run longest-symbol
|
||||
+ * --arch=x86_64 --kconfig_add CONFIG_KPROBES=y --kconfig_add CONFIG_MODULES=y
|
||||
+ * --kconfig_add CONFIG_RETPOLINE=n --kconfig_add CONFIG_CFI_CLANG=n
|
||||
+ * --kconfig_add CONFIG_MITIGATION_RETPOLINE=n
|
||||
+ */
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <kunit/test.h>
|
||||
+#include <linux/stringify.h>
|
||||
+#include <linux/kprobes.h>
|
||||
+#include <linux/kallsyms.h>
|
||||
+
|
||||
+#define DI(name) s##name##name
|
||||
+#define DDI(name) DI(n##name##name)
|
||||
+#define DDDI(name) DDI(n##name##name)
|
||||
+#define DDDDI(name) DDDI(n##name##name)
|
||||
+#define DDDDDI(name) DDDDI(n##name##name)
|
||||
+
|
||||
+/*Generate a symbol whose name length is 511 */
|
||||
+#define LONGEST_SYM_NAME DDDDDI(g1h2i3j4k5l6m7n)
|
||||
+
|
||||
+#define RETURN_LONGEST_SYM 0xAAAAA
|
||||
+
|
||||
+noinline int LONGEST_SYM_NAME(void);
|
||||
+noinline int LONGEST_SYM_NAME(void)
|
||||
+{
|
||||
+ return RETURN_LONGEST_SYM;
|
||||
+}
|
||||
+
|
||||
+_Static_assert(sizeof(__stringify(LONGEST_SYM_NAME)) == KSYM_NAME_LEN,
|
||||
+"Incorrect symbol length found. Expected KSYM_NAME_LEN: "
|
||||
+__stringify(KSYM_NAME_LEN) ", but found: "
|
||||
+__stringify(sizeof(LONGEST_SYM_NAME)));
|
||||
+
|
||||
+static void test_longest_symbol(struct kunit *test)
|
||||
+{
|
||||
+ KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, LONGEST_SYM_NAME());
|
||||
+};
|
||||
+
|
||||
+static void test_longest_symbol_kallsyms(struct kunit *test)
|
||||
+{
|
||||
+ unsigned long (*kallsyms_lookup_name)(const char *name);
|
||||
+ static int (*longest_sym)(void);
|
||||
+
|
||||
+ struct kprobe kp = {
|
||||
+ .symbol_name = "kallsyms_lookup_name",
|
||||
+ };
|
||||
+
|
||||
+ if (register_kprobe(&kp) < 0) {
|
||||
+ pr_info("%s: kprobe not registered", __func__);
|
||||
+ KUNIT_FAIL(test, "test_longest_symbol kallsyms: kprobe not registered\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ kunit_warn(test, "test_longest_symbol kallsyms: kprobe registered\n");
|
||||
+ kallsyms_lookup_name = (unsigned long (*)(const char *name))kp.addr;
|
||||
+ unregister_kprobe(&kp);
|
||||
+
|
||||
+ longest_sym =
|
||||
+ (void *) kallsyms_lookup_name(__stringify(LONGEST_SYM_NAME));
|
||||
+ KUNIT_EXPECT_EQ(test, RETURN_LONGEST_SYM, longest_sym());
|
||||
+};
|
||||
+
|
||||
+static struct kunit_case longest_symbol_test_cases[] = {
|
||||
+ KUNIT_CASE(test_longest_symbol),
|
||||
+ KUNIT_CASE(test_longest_symbol_kallsyms),
|
||||
+ {}
|
||||
+};
|
||||
+
|
||||
+static struct kunit_suite longest_symbol_test_suite = {
|
||||
+ .name = "longest-symbol",
|
||||
+ .test_cases = longest_symbol_test_cases,
|
||||
+};
|
||||
+kunit_test_suite(longest_symbol_test_suite);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_DESCRIPTION("Test the longest symbol length");
|
||||
+MODULE_AUTHOR("Sergio González Collado");
|
@@ -1,45 +0,0 @@
|
||||
From 2c26fd36ffb4bed4d55f9c7ba8d4f22db093eba2 Mon Sep 17 00:00:00 2001
|
||||
From: David Rheinsberg <david@readahead.eu>
|
||||
Date: Tue, 24 Jan 2023 12:04:59 +0100
|
||||
Subject: x86/insn_decoder_test: allow longer symbol-names
|
||||
|
||||
Increase the allowed line-length of the insn-decoder-test to 4k to allow
|
||||
for symbol-names longer than 256 characters.
|
||||
|
||||
The insn-decoder-test takes objdump output as input, which may contain
|
||||
symbol-names as instruction arguments. With rust-code entering the
|
||||
kernel, those symbol-names will include mangled-symbols which might
|
||||
exceed the current line-length-limit of the tool.
|
||||
|
||||
By bumping the line-length-limit of the tool to 4k, we get a reasonable
|
||||
buffer for all objdump outputs I have seen so far. Unfortunately, ELF
|
||||
symbol-names are not restricted in length, so technically this might
|
||||
still end up failing if we encounter longer names in the future.
|
||||
|
||||
My compile-failure looks like this:
|
||||
|
||||
arch/x86/tools/insn_decoder_test: error: malformed line 1152000:
|
||||
tBb_+0xf2>
|
||||
|
||||
..which overflowed by 10 characters reading this line:
|
||||
|
||||
ffffffff81458193: 74 3d je ffffffff814581d2 <_RNvXse_NtNtNtCshGpAVYOtgW1_4core4iter8adapters7flattenINtB5_13FlattenCompatINtNtB7_3map3MapNtNtNtBb_3str4iter5CharsNtB1v_17CharEscapeDefaultENtNtBb_4char13EscapeDefaultENtNtBb_3fmt5Debug3fmtBb_+0xf2>
|
||||
|
||||
Signed-off-by: David Rheinsberg <david@readahead.eu>
|
||||
Signed-off-by: Scott Weaver <scweaver@redhat.com>
|
||||
Cherry-picked-for: https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/issues/63
|
||||
---
|
||||
arch/x86/tools/insn_decoder_test.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/x86/tools/insn_decoder_test.c
|
||||
+++ b/arch/x86/tools/insn_decoder_test.c
|
||||
@@ -106,7 +106,7 @@ static void parse_args(int argc, char **
|
||||
}
|
||||
}
|
||||
|
||||
-#define BUFSIZE 256
|
||||
+#define BUFSIZE 4096
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
@@ -1,56 +0,0 @@
|
||||
From 8886788eed16c79124bc530950f09c3f2fa881a8 Mon Sep 17 00:00:00 2001
|
||||
From: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
|
||||
Date: Wed, 12 Feb 2025 16:33:54 +0800
|
||||
Subject: EDAC/igen6: Fix the flood of invalid error reports
|
||||
|
||||
The ECC_ERROR_LOG register of certain SoCs may contain the invalid value
|
||||
~0, which results in a flood of invalid error reports in polling mode.
|
||||
|
||||
Fix the flood of invalid error reports by skipping the invalid ECC error
|
||||
log value ~0.
|
||||
|
||||
Fixes: e14232afa944 ("EDAC/igen6: Add polling support")
|
||||
Reported-by: Ramses <ramses@well-founded.dev>
|
||||
Closes: https://lore.kernel.org/all/OISL8Rv--F-9@well-founded.dev/
|
||||
Tested-by: Ramses <ramses@well-founded.dev>
|
||||
Reported-by: John <therealgraysky@proton.me>
|
||||
Closes: https://lore.kernel.org/all/p5YcxOE6M3Ncxpn2-Ia_wCt61EM4LwIiN3LroQvT_-G2jMrFDSOW5k2A9D8UUzD2toGpQBN1eI0sL5dSKnkO8iteZegLoQEj-DwQaMhGx4A=@proton.me/
|
||||
Tested-by: John <therealgraysky@proton.me>
|
||||
Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
|
||||
Signed-off-by: Tony Luck <tony.luck@intel.com>
|
||||
Link: https://lore.kernel.org/r/20250212083354.31919-1-qiuxu.zhuo@intel.com
|
||||
---
|
||||
drivers/edac/igen6_edac.c | 21 +++++++++++++++------
|
||||
1 file changed, 15 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/edac/igen6_edac.c
|
||||
+++ b/drivers/edac/igen6_edac.c
|
||||
@@ -785,13 +785,22 @@ static u64 ecclog_read_and_clear(struct
|
||||
{
|
||||
u64 ecclog = readq(imc->window + ECC_ERROR_LOG_OFFSET);
|
||||
|
||||
- if (ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)) {
|
||||
- /* Clear CE/UE bits by writing 1s */
|
||||
- writeq(ecclog, imc->window + ECC_ERROR_LOG_OFFSET);
|
||||
- return ecclog;
|
||||
- }
|
||||
+ /*
|
||||
+ * Quirk: The ECC_ERROR_LOG register of certain SoCs may contain
|
||||
+ * the invalid value ~0. This will result in a flood of invalid
|
||||
+ * error reports in polling mode. Skip it.
|
||||
+ */
|
||||
+ if (ecclog == ~0)
|
||||
+ return 0;
|
||||
|
||||
- return 0;
|
||||
+ /* Neither a CE nor a UE. Skip it.*/
|
||||
+ if (!(ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)))
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Clear CE/UE bits by writing 1s */
|
||||
+ writeq(ecclog, imc->window + ECC_ERROR_LOG_OFFSET);
|
||||
+
|
||||
+ return ecclog;
|
||||
}
|
||||
|
||||
static void errsts_clear(struct igen6_imc *imc)
|
@@ -1,4 +1,4 @@
|
||||
From b40bdfdcffa333ad169327c5b8fe1b93542c7e0a Mon Sep 17 00:00:00 2001
|
||||
From 7f3eaa6a64048a0259d2daae8a91e64fbd749641 Mon Sep 17 00:00:00 2001
|
||||
From: Nathan Chancellor <nathan@kernel.org>
|
||||
Date: Tue, 18 Mar 2025 15:32:30 -0700
|
||||
Subject: x86/tools: Drop duplicate unlikely() definition in
|
||||
@@ -25,9 +25,9 @@ Link: https://lore.kernel.org/r/20250318-x86-decoder-test-fix-unlikely-redef-v1-
|
||||
|
||||
--- a/arch/x86/tools/insn_decoder_test.c
|
||||
+++ b/arch/x86/tools/insn_decoder_test.c
|
||||
@@ -11,8 +11,6 @@
|
||||
#include <unistd.h>
|
||||
@@ -12,8 +12,6 @@
|
||||
#include <stdarg.h>
|
||||
#include <linux/kallsyms.h>
|
||||
|
||||
-#define unlikely(cond) (cond)
|
||||
-
|
@@ -1,4 +1,4 @@
|
||||
From 073fb5ff9a001882fa884a0a8efddc88860ad791 Mon Sep 17 00:00:00 2001
|
||||
From cda754004cc36746f5197ed203d013dccf2f5146 Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan McDowell <noodles@meta.com>
|
||||
Date: Wed, 12 Mar 2025 07:31:57 +0200
|
||||
Subject: tpm, tpm_tis: Fix timeout handling when waiting for TPM status
|
@@ -1,4 +1,4 @@
|
||||
From f4511f63677bd3e7831561b1407a69a71cb519bc Mon Sep 17 00:00:00 2001
|
||||
From 32df198f302abc95f532b55c7612c156d3febcd9 Mon Sep 17 00:00:00 2001
|
||||
From: Ming Lei <ming.lei@redhat.com>
|
||||
Date: Mon, 10 Mar 2025 19:54:53 +0800
|
||||
Subject: block: make sure ->nr_integrity_segments is cloned in
|
@@ -1,4 +1,4 @@
|
||||
From 46b8c87f1aa08a0794b45b394c5462f33bec54b0 Mon Sep 17 00:00:00 2001
|
||||
From 0c116e263170e1e5b7325af51659074c977b8a91 Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Stanner <phasta@kernel.org>
|
||||
Date: Wed, 12 Mar 2025 09:06:34 +0100
|
||||
Subject: PCI: Fix wrong length of devres array
|
@@ -1,50 +0,0 @@
|
||||
From e24882a961e2d85cc4c8319a56734a0d7c7867fc Mon Sep 17 00:00:00 2001
|
||||
From: Jann Horn <jannh@google.com>
|
||||
Date: Fri, 3 Jan 2025 19:39:38 +0100
|
||||
Subject: x86/mm: Fix flush_tlb_range() when used for zapping normal PMDs
|
||||
|
||||
On the following path, flush_tlb_range() can be used for zapping normal
|
||||
PMD entries (PMD entries that point to page tables) together with the PTE
|
||||
entries in the pointed-to page table:
|
||||
|
||||
collapse_pte_mapped_thp
|
||||
pmdp_collapse_flush
|
||||
flush_tlb_range
|
||||
|
||||
The arm64 version of flush_tlb_range() has a comment describing that it can
|
||||
be used for page table removal, and does not use any last-level
|
||||
invalidation optimizations. Fix the X86 version by making it behave the
|
||||
same way.
|
||||
|
||||
Currently, X86 only uses this information for the following two purposes,
|
||||
which I think means the issue doesn't have much impact:
|
||||
|
||||
- In native_flush_tlb_multi() for checking if lazy TLB CPUs need to be
|
||||
IPI'd to avoid issues with speculative page table walks.
|
||||
- In Hyper-V TLB paravirtualization, again for lazy TLB stuff.
|
||||
|
||||
The patch "x86/mm: only invalidate final translations with INVLPGB" which
|
||||
is currently under review (see
|
||||
<https://lore.kernel.org/all/20241230175550.4046587-13-riel@surriel.com/>)
|
||||
would probably be making the impact of this a lot worse.
|
||||
|
||||
Fixes: 016c4d92cd16 ("x86/mm/tlb: Add freed_tables argument to flush_tlb_mm_range")
|
||||
Signed-off-by: Jann Horn <jannh@google.com>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lkml.kernel.org/r/20250103-x86-collapse-flush-fix-v1-1-3c521856cfa6@google.com
|
||||
---
|
||||
arch/x86/include/asm/tlbflush.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/x86/include/asm/tlbflush.h
|
||||
+++ b/arch/x86/include/asm/tlbflush.h
|
||||
@@ -311,7 +311,7 @@ static inline bool mm_in_asid_transition
|
||||
flush_tlb_mm_range((vma)->vm_mm, start, end, \
|
||||
((vma)->vm_flags & VM_HUGETLB) \
|
||||
? huge_page_shift(hstate_vma(vma)) \
|
||||
- : PAGE_SHIFT, false)
|
||||
+ : PAGE_SHIFT, true)
|
||||
|
||||
extern void flush_tlb_all(void);
|
||||
extern void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start,
|
29
debian/patches/patchset-pf/fixes/0007-drm-amdgpu-mes11-optimize-MES-pipe-FW-version-fetchi.patch
vendored
Normal file
29
debian/patches/patchset-pf/fixes/0007-drm-amdgpu-mes11-optimize-MES-pipe-FW-version-fetchi.patch
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
From 3cfeab379362feb285fdb631ebc65539c1559034 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
Date: Thu, 27 Mar 2025 17:33:49 -0400
|
||||
Subject: drm/amdgpu/mes11: optimize MES pipe FW version fetching
|
||||
|
||||
Don't fetch it again if we already have it. It seems the
|
||||
don't reliably have the proper value at resume in some
|
||||
cases.
|
||||
|
||||
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4083
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
Cherry-picked-for: https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/issues/121
|
||||
---
|
||||
drivers/gpu/drm/amd/amdgpu/mes_v11_0.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c
|
||||
+++ b/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c
|
||||
@@ -899,6 +899,10 @@ static void mes_v11_0_get_fw_version(str
|
||||
{
|
||||
int pipe;
|
||||
|
||||
+ /* return early if we have already fetched these */
|
||||
+ if (adev->mes.sched_version && adev->mes.kiq_version)
|
||||
+ return;
|
||||
+
|
||||
/* get MES scheduler/KIQ versions */
|
||||
mutex_lock(&adev->srbm_mutex);
|
||||
|
@@ -1,68 +0,0 @@
|
||||
From 7a0abf17cceb511425b7af34291243b4a270e770 Mon Sep 17 00:00:00 2001
|
||||
From: "Guilherme G. Piccoli" <gpiccoli@igalia.com>
|
||||
Date: Sat, 15 Feb 2025 17:58:16 -0300
|
||||
Subject: x86/tsc: Always save/restore TSC sched_clock() on suspend/resume
|
||||
|
||||
TSC could be reset in deep ACPI sleep states, even with invariant TSC.
|
||||
|
||||
That's the reason we have sched_clock() save/restore functions, to deal
|
||||
with this situation. But what happens is that such functions are guarded
|
||||
with a check for the stability of sched_clock - if not considered stable,
|
||||
the save/restore routines aren't executed.
|
||||
|
||||
On top of that, we have a clear comment in native_sched_clock() saying
|
||||
that *even* with TSC unstable, we continue using TSC for sched_clock due
|
||||
to its speed.
|
||||
|
||||
In other words, if we have a situation of TSC getting detected as unstable,
|
||||
it marks the sched_clock as unstable as well, so subsequent S3 sleep cycles
|
||||
could bring bogus sched_clock values due to the lack of the save/restore
|
||||
mechanism, causing warnings like this:
|
||||
|
||||
[22.954918] ------------[ cut here ]------------
|
||||
[22.954923] Delta way too big! 18446743750843854390 ts=18446744072977390405 before=322133536015 after=322133536015 write stamp=18446744072977390405
|
||||
[22.954923] If you just came from a suspend/resume,
|
||||
[22.954923] please switch to the trace global clock:
|
||||
[22.954923] echo global > /sys/kernel/tracing/trace_clock
|
||||
[22.954923] or add trace_clock=global to the kernel command line
|
||||
[22.954937] WARNING: CPU: 2 PID: 5728 at kernel/trace/ring_buffer.c:2890 rb_add_timestamp+0x193/0x1c0
|
||||
|
||||
Notice that the above was reproduced even with "trace_clock=global".
|
||||
|
||||
The fix for that is to _always_ save/restore the sched_clock on suspend
|
||||
cycle _if TSC is used_ as sched_clock - only if we fallback to jiffies
|
||||
the sched_clock_stable() check becomes relevant to save/restore the
|
||||
sched_clock.
|
||||
|
||||
Debugged-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
|
||||
Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com>
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Link: https://lore.kernel.org/r/20250215210314.351480-1-gpiccoli@igalia.com
|
||||
---
|
||||
arch/x86/kernel/tsc.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/x86/kernel/tsc.c
|
||||
+++ b/arch/x86/kernel/tsc.c
|
||||
@@ -959,7 +959,7 @@ static unsigned long long cyc2ns_suspend
|
||||
|
||||
void tsc_save_sched_clock_state(void)
|
||||
{
|
||||
- if (!sched_clock_stable())
|
||||
+ if (!static_branch_likely(&__use_tsc) && !sched_clock_stable())
|
||||
return;
|
||||
|
||||
cyc2ns_suspend = sched_clock();
|
||||
@@ -979,7 +979,7 @@ void tsc_restore_sched_clock_state(void)
|
||||
unsigned long flags;
|
||||
int cpu;
|
||||
|
||||
- if (!sched_clock_stable())
|
||||
+ if (!static_branch_likely(&__use_tsc) && !sched_clock_stable())
|
||||
return;
|
||||
|
||||
local_irq_save(flags);
|
99
debian/patches/patchset-pf/fixes/0008-tpm-Mask-TPM-RC-in-tpm2_start_auth_session.patch
vendored
Normal file
99
debian/patches/patchset-pf/fixes/0008-tpm-Mask-TPM-RC-in-tpm2_start_auth_session.patch
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
From 1ad7c482a722a7c918609390e479c9dd4f717539 Mon Sep 17 00:00:00 2001
|
||||
From: Jarkko Sakkinen <jarkko@kernel.org>
|
||||
Date: Mon, 7 Apr 2025 15:28:05 +0300
|
||||
Subject: tpm: Mask TPM RC in tpm2_start_auth_session()
|
||||
|
||||
tpm2_start_auth_session() does not mask TPM RC correctly from the callers:
|
||||
|
||||
[ 28.766528] tpm tpm0: A TPM error (2307) occurred start auth session
|
||||
|
||||
Process TPM RCs inside tpm2_start_auth_session(), and map them to POSIX
|
||||
error codes.
|
||||
|
||||
Cc: stable@vger.kernel.org # v6.10+
|
||||
Fixes: 699e3efd6c64 ("tpm: Add HMAC session start and end functions")
|
||||
Reported-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Closes: https://lore.kernel.org/linux-integrity/Z_NgdRHuTKP6JK--@gondor.apana.org.au/
|
||||
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
|
||||
---
|
||||
drivers/char/tpm/tpm2-sessions.c | 20 ++++++--------------
|
||||
include/linux/tpm.h | 21 +++++++++++++++++++++
|
||||
2 files changed, 27 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/drivers/char/tpm/tpm2-sessions.c
|
||||
+++ b/drivers/char/tpm/tpm2-sessions.c
|
||||
@@ -40,11 +40,6 @@
|
||||
*
|
||||
* These are the usage functions:
|
||||
*
|
||||
- * tpm2_start_auth_session() which allocates the opaque auth structure
|
||||
- * and gets a session from the TPM. This must be called before
|
||||
- * any of the following functions. The session is protected by a
|
||||
- * session_key which is derived from a random salt value
|
||||
- * encrypted to the NULL seed.
|
||||
* tpm2_end_auth_session() kills the session and frees the resources.
|
||||
* Under normal operation this function is done by
|
||||
* tpm_buf_check_hmac_response(), so this is only to be used on
|
||||
@@ -963,16 +958,13 @@ err:
|
||||
}
|
||||
|
||||
/**
|
||||
- * tpm2_start_auth_session() - create a HMAC authentication session with the TPM
|
||||
- * @chip: the TPM chip structure to create the session with
|
||||
+ * tpm2_start_auth_session() - Create an a HMAC authentication session
|
||||
+ * @chip: A TPM chip
|
||||
*
|
||||
- * This function loads the NULL seed from its saved context and starts
|
||||
- * an authentication session on the null seed, fills in the
|
||||
- * @chip->auth structure to contain all the session details necessary
|
||||
- * for performing the HMAC, encrypt and decrypt operations and
|
||||
- * returns. The NULL seed is flushed before this function returns.
|
||||
+ * Loads the ephemeral key (null seed), and starts an HMAC authenticated
|
||||
+ * session. The null seed is flushed before the return.
|
||||
*
|
||||
- * Return: zero on success or actual error encountered.
|
||||
+ * Returns zero on success, or a POSIX error code.
|
||||
*/
|
||||
int tpm2_start_auth_session(struct tpm_chip *chip)
|
||||
{
|
||||
@@ -1024,7 +1016,7 @@ int tpm2_start_auth_session(struct tpm_c
|
||||
/* hash algorithm for session */
|
||||
tpm_buf_append_u16(&buf, TPM_ALG_SHA256);
|
||||
|
||||
- rc = tpm_transmit_cmd(chip, &buf, 0, "start auth session");
|
||||
+ rc = tpm_to_ret(tpm_transmit_cmd(chip, &buf, 0, "StartAuthSession"));
|
||||
tpm2_flush_context(chip, null_key);
|
||||
|
||||
if (rc == TPM2_RC_SUCCESS)
|
||||
--- a/include/linux/tpm.h
|
||||
+++ b/include/linux/tpm.h
|
||||
@@ -257,8 +257,29 @@ enum tpm2_return_codes {
|
||||
TPM2_RC_TESTING = 0x090A, /* RC_WARN */
|
||||
TPM2_RC_REFERENCE_H0 = 0x0910,
|
||||
TPM2_RC_RETRY = 0x0922,
|
||||
+ TPM2_RC_SESSION_MEMORY = 0x0903,
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * Convert a return value from tpm_transmit_cmd() to a POSIX return value. The
|
||||
+ * fallback return value is -EFAULT.
|
||||
+ */
|
||||
+static inline ssize_t tpm_to_ret(ssize_t ret)
|
||||
+{
|
||||
+ /* Already a POSIX error: */
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ switch (ret) {
|
||||
+ case TPM2_RC_SUCCESS:
|
||||
+ return 0;
|
||||
+ case TPM2_RC_SESSION_MEMORY:
|
||||
+ return -ENOMEM;
|
||||
+ default:
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
enum tpm2_command_codes {
|
||||
TPM2_CC_FIRST = 0x011F,
|
||||
TPM2_CC_HIERARCHY_CONTROL = 0x0121,
|
@@ -1,87 +0,0 @@
|
||||
From bbbc88e65bb8036be1fe3386c0061d9be4c5a442 Mon Sep 17 00:00:00 2001
|
||||
From: Jiri Olsa <jolsa@kernel.org>
|
||||
Date: Wed, 12 Feb 2025 23:04:33 +0100
|
||||
Subject: uprobes/x86: Harden uretprobe syscall trampoline check
|
||||
|
||||
Jann reported a possible issue when trampoline_check_ip returns
|
||||
address near the bottom of the address space that is allowed to
|
||||
call into the syscall if uretprobes are not set up:
|
||||
|
||||
https://lore.kernel.org/bpf/202502081235.5A6F352985@keescook/T/#m9d416df341b8fbc11737dacbcd29f0054413cbbf
|
||||
|
||||
Though the mmap minimum address restrictions will typically prevent
|
||||
creating mappings there, let's make sure uretprobe syscall checks
|
||||
for that.
|
||||
|
||||
Fixes: ff474a78cef5 ("uprobe: Add uretprobe syscall to speed up return probe")
|
||||
Reported-by: Jann Horn <jannh@google.com>
|
||||
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Reviewed-by: Kees Cook <kees@kernel.org>
|
||||
Acked-by: Andrii Nakryiko <andrii@kernel.org>
|
||||
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
|
||||
Acked-by: Alexei Starovoitov <alexei.starovoitov@gmail.com>
|
||||
Cc: Andy Lutomirski <luto@kernel.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Link: https://lore.kernel.org/r/20250212220433.3624297-1-jolsa@kernel.org
|
||||
---
|
||||
arch/x86/kernel/uprobes.c | 14 +++++++++-----
|
||||
include/linux/uprobes.h | 2 ++
|
||||
kernel/events/uprobes.c | 2 +-
|
||||
3 files changed, 12 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/arch/x86/kernel/uprobes.c
|
||||
+++ b/arch/x86/kernel/uprobes.c
|
||||
@@ -357,19 +357,23 @@ void *arch_uprobe_trampoline(unsigned lo
|
||||
return &insn;
|
||||
}
|
||||
|
||||
-static unsigned long trampoline_check_ip(void)
|
||||
+static unsigned long trampoline_check_ip(unsigned long tramp)
|
||||
{
|
||||
- unsigned long tramp = uprobe_get_trampoline_vaddr();
|
||||
-
|
||||
return tramp + (uretprobe_syscall_check - uretprobe_trampoline_entry);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE0(uretprobe)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
- unsigned long err, ip, sp, r11_cx_ax[3];
|
||||
+ unsigned long err, ip, sp, r11_cx_ax[3], tramp;
|
||||
+
|
||||
+ /* If there's no trampoline, we are called from wrong place. */
|
||||
+ tramp = uprobe_get_trampoline_vaddr();
|
||||
+ if (unlikely(tramp == UPROBE_NO_TRAMPOLINE_VADDR))
|
||||
+ goto sigill;
|
||||
|
||||
- if (regs->ip != trampoline_check_ip())
|
||||
+ /* Make sure the ip matches the only allowed sys_uretprobe caller. */
|
||||
+ if (unlikely(regs->ip != trampoline_check_ip(tramp)))
|
||||
goto sigill;
|
||||
|
||||
err = copy_from_user(r11_cx_ax, (void __user *)regs->sp, sizeof(r11_cx_ax));
|
||||
--- a/include/linux/uprobes.h
|
||||
+++ b/include/linux/uprobes.h
|
||||
@@ -39,6 +39,8 @@ struct page;
|
||||
|
||||
#define MAX_URETPROBE_DEPTH 64
|
||||
|
||||
+#define UPROBE_NO_TRAMPOLINE_VADDR (~0UL)
|
||||
+
|
||||
struct uprobe_consumer {
|
||||
/*
|
||||
* handler() can return UPROBE_HANDLER_REMOVE to signal the need to
|
||||
--- a/kernel/events/uprobes.c
|
||||
+++ b/kernel/events/uprobes.c
|
||||
@@ -2169,8 +2169,8 @@ void uprobe_copy_process(struct task_str
|
||||
*/
|
||||
unsigned long uprobe_get_trampoline_vaddr(void)
|
||||
{
|
||||
+ unsigned long trampoline_vaddr = UPROBE_NO_TRAMPOLINE_VADDR;
|
||||
struct xol_area *area;
|
||||
- unsigned long trampoline_vaddr = -1;
|
||||
|
||||
/* Pairs with xol_add_vma() smp_store_release() */
|
||||
area = READ_ONCE(current->mm->uprobes_state.xol_area); /* ^^^ */
|
34
debian/patches/patchset-pf/fixes/0009-ice-mark-ice_write_prof_mask_reg-as-noinline.patch
vendored
Normal file
34
debian/patches/patchset-pf/fixes/0009-ice-mark-ice_write_prof_mask_reg-as-noinline.patch
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
From d3d3441d32966234778ab2e4a127ccccbc6ab092 Mon Sep 17 00:00:00 2001
|
||||
From: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Date: Tue, 8 Apr 2025 12:02:36 +0200
|
||||
Subject: ice: mark ice_write_prof_mask_reg() as noinline
|
||||
|
||||
The following happens during build:
|
||||
|
||||
```
|
||||
drivers/net/ethernet/intel/ice/ice.o: error: objtool: ice_free_prof_mask.isra.0() falls through to next function ice_free_flow_profs.cold()
|
||||
drivers/net/ethernet/intel/ice/ice.o: error: objtool: ice_free_prof_mask.isra.0.cold() is missing an ELF size annotation
|
||||
```
|
||||
|
||||
Marking ice_write_prof_mask_reg() as noinline solves this, although I'm
|
||||
not sure if this is a proper solution. Apparently, this happens with -O3
|
||||
only, the `default` case is never reachable, but the optimiser generates
|
||||
branching to a random code location.
|
||||
|
||||
Link: https://lore.kernel.org/lkml/6nzfoyak4cewjpmdflg5yi7jh2mqqdsfqgljoolx5lvdo2p65p@rwjfl7cqkfoo/
|
||||
Signed-off-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
---
|
||||
drivers/net/ethernet/intel/ice/ice_flex_pipe.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/intel/ice/ice_flex_pipe.c
|
||||
+++ b/drivers/net/ethernet/intel/ice/ice_flex_pipe.c
|
||||
@@ -1404,7 +1404,7 @@ static int ice_prof_inc_ref(struct ice_h
|
||||
* @idx: index of the FV which will use the mask
|
||||
* @mask: the 16-bit mask
|
||||
*/
|
||||
-static void
|
||||
+static noinline void
|
||||
ice_write_prof_mask_reg(struct ice_hw *hw, enum ice_block blk, u16 mask_idx,
|
||||
u16 idx, u16 mask)
|
||||
{
|
76
debian/patches/patchset-pf/fixes/0010-fixes-6.14-update-tpm2_start_auth_session-fix.patch
vendored
Normal file
76
debian/patches/patchset-pf/fixes/0010-fixes-6.14-update-tpm2_start_auth_session-fix.patch
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
From d8c360e932feed8798adf37ffad5d93e47ab032f Mon Sep 17 00:00:00 2001
|
||||
From: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Date: Tue, 8 Apr 2025 19:51:44 +0200
|
||||
Subject: fixes-6.14: update tpm2_start_auth_session() fix
|
||||
|
||||
Signed-off-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
---
|
||||
drivers/char/tpm/tpm2-sessions.c | 2 +-
|
||||
include/linux/tpm.h | 38 +++++++++++++++-----------------
|
||||
2 files changed, 19 insertions(+), 21 deletions(-)
|
||||
|
||||
--- a/drivers/char/tpm/tpm2-sessions.c
|
||||
+++ b/drivers/char/tpm/tpm2-sessions.c
|
||||
@@ -1016,7 +1016,7 @@ int tpm2_start_auth_session(struct tpm_c
|
||||
/* hash algorithm for session */
|
||||
tpm_buf_append_u16(&buf, TPM_ALG_SHA256);
|
||||
|
||||
- rc = tpm_to_ret(tpm_transmit_cmd(chip, &buf, 0, "StartAuthSession"));
|
||||
+ rc = tpm_ret_to_err(tpm_transmit_cmd(chip, &buf, 0, "StartAuthSession"));
|
||||
tpm2_flush_context(chip, null_key);
|
||||
|
||||
if (rc == TPM2_RC_SUCCESS)
|
||||
--- a/include/linux/tpm.h
|
||||
+++ b/include/linux/tpm.h
|
||||
@@ -260,26 +260,6 @@ enum tpm2_return_codes {
|
||||
TPM2_RC_SESSION_MEMORY = 0x0903,
|
||||
};
|
||||
|
||||
-/*
|
||||
- * Convert a return value from tpm_transmit_cmd() to a POSIX return value. The
|
||||
- * fallback return value is -EFAULT.
|
||||
- */
|
||||
-static inline ssize_t tpm_to_ret(ssize_t ret)
|
||||
-{
|
||||
- /* Already a POSIX error: */
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
-
|
||||
- switch (ret) {
|
||||
- case TPM2_RC_SUCCESS:
|
||||
- return 0;
|
||||
- case TPM2_RC_SESSION_MEMORY:
|
||||
- return -ENOMEM;
|
||||
- default:
|
||||
- return -EFAULT;
|
||||
- }
|
||||
-}
|
||||
-
|
||||
enum tpm2_command_codes {
|
||||
TPM2_CC_FIRST = 0x011F,
|
||||
TPM2_CC_HIERARCHY_CONTROL = 0x0121,
|
||||
@@ -457,6 +437,24 @@ static inline u32 tpm2_rc_value(u32 rc)
|
||||
return (rc & BIT(7)) ? rc & 0xbf : rc;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Convert a return value from tpm_transmit_cmd() to POSIX error code.
|
||||
+ */
|
||||
+static inline ssize_t tpm_ret_to_err(ssize_t ret)
|
||||
+{
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ switch (tpm2_rc_value(ret)) {
|
||||
+ case TPM2_RC_SUCCESS:
|
||||
+ return 0;
|
||||
+ case TPM2_RC_SESSION_MEMORY:
|
||||
+ return -ENOMEM;
|
||||
+ default:
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
#if defined(CONFIG_TCG_TPM) || defined(CONFIG_TCG_TPM_MODULE)
|
||||
|
||||
extern int tpm_is_tpm2(struct tpm_chip *chip);
|
47
debian/patches/patchset-pf/fixes/0011-drm-amdgpu-mes12-optimize-MES-pipe-FW-version-fetchi.patch
vendored
Normal file
47
debian/patches/patchset-pf/fixes/0011-drm-amdgpu-mes12-optimize-MES-pipe-FW-version-fetchi.patch
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
From feadcb68955511723dbc2cad800e0524625d62c5 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
Date: Fri, 28 Mar 2025 09:08:57 -0400
|
||||
Subject: drm/amdgpu/mes12: optimize MES pipe FW version fetching
|
||||
|
||||
Don't fetch it again if we already have it. It seems the
|
||||
registers don't reliably have the value at resume in some
|
||||
cases.
|
||||
|
||||
Fixes: 785f0f9fe742 ("drm/amdgpu: Add mes v12_0 ip block support (v4)")
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
---
|
||||
drivers/gpu/drm/amd/amdgpu/mes_v12_0.c | 21 ++++++++++++---------
|
||||
1 file changed, 12 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c
|
||||
+++ b/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c
|
||||
@@ -1390,17 +1390,20 @@ static int mes_v12_0_queue_init(struct a
|
||||
mes_v12_0_queue_init_register(ring);
|
||||
}
|
||||
|
||||
- /* get MES scheduler/KIQ versions */
|
||||
- mutex_lock(&adev->srbm_mutex);
|
||||
- soc21_grbm_select(adev, 3, pipe, 0, 0);
|
||||
+ if (((pipe == AMDGPU_MES_SCHED_PIPE) && !adev->mes.sched_version) ||
|
||||
+ ((pipe == AMDGPU_MES_KIQ_PIPE) && !adev->mes.kiq_version)) {
|
||||
+ /* get MES scheduler/KIQ versions */
|
||||
+ mutex_lock(&adev->srbm_mutex);
|
||||
+ soc21_grbm_select(adev, 3, pipe, 0, 0);
|
||||
|
||||
- if (pipe == AMDGPU_MES_SCHED_PIPE)
|
||||
- adev->mes.sched_version = RREG32_SOC15(GC, 0, regCP_MES_GP3_LO);
|
||||
- else if (pipe == AMDGPU_MES_KIQ_PIPE && adev->enable_mes_kiq)
|
||||
- adev->mes.kiq_version = RREG32_SOC15(GC, 0, regCP_MES_GP3_LO);
|
||||
+ if (pipe == AMDGPU_MES_SCHED_PIPE)
|
||||
+ adev->mes.sched_version = RREG32_SOC15(GC, 0, regCP_MES_GP3_LO);
|
||||
+ else if (pipe == AMDGPU_MES_KIQ_PIPE && adev->enable_mes_kiq)
|
||||
+ adev->mes.kiq_version = RREG32_SOC15(GC, 0, regCP_MES_GP3_LO);
|
||||
|
||||
- soc21_grbm_select(adev, 0, 0, 0, 0);
|
||||
- mutex_unlock(&adev->srbm_mutex);
|
||||
+ soc21_grbm_select(adev, 0, 0, 0, 0);
|
||||
+ mutex_unlock(&adev->srbm_mutex);
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
@@ -1,84 +0,0 @@
|
||||
From 9741b8592433f51ed477c9dba6d304562aa7de18 Mon Sep 17 00:00:00 2001
|
||||
From: Oleg Nesterov <oleg@redhat.com>
|
||||
Date: Mon, 24 Mar 2025 17:00:03 +0100
|
||||
Subject: exec: fix the racy usage of fs_struct->in_exec
|
||||
|
||||
check_unsafe_exec() sets fs->in_exec under cred_guard_mutex, then execve()
|
||||
paths clear fs->in_exec lockless. This is fine if exec succeeds, but if it
|
||||
fails we have the following race:
|
||||
|
||||
T1 sets fs->in_exec = 1, fails, drops cred_guard_mutex
|
||||
|
||||
T2 sets fs->in_exec = 1
|
||||
|
||||
T1 clears fs->in_exec
|
||||
|
||||
T2 continues with fs->in_exec == 0
|
||||
|
||||
Change fs/exec.c to clear fs->in_exec with cred_guard_mutex held.
|
||||
|
||||
Reported-by: syzbot+1c486d0b62032c82a968@syzkaller.appspotmail.com
|
||||
Closes: https://lore.kernel.org/all/67dc67f0.050a0220.25ae54.001f.GAE@google.com/
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Link: https://lore.kernel.org/r/20250324160003.GA8878@redhat.com
|
||||
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
||||
---
|
||||
fs/exec.c | 15 +++++++++------
|
||||
1 file changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/fs/exec.c
|
||||
+++ b/fs/exec.c
|
||||
@@ -1229,13 +1229,12 @@ int begin_new_exec(struct linux_binprm *
|
||||
*/
|
||||
bprm->point_of_no_return = true;
|
||||
|
||||
- /*
|
||||
- * Make this the only thread in the thread group.
|
||||
- */
|
||||
+ /* Make this the only thread in the thread group */
|
||||
retval = de_thread(me);
|
||||
if (retval)
|
||||
goto out;
|
||||
-
|
||||
+ /* see the comment in check_unsafe_exec() */
|
||||
+ current->fs->in_exec = 0;
|
||||
/*
|
||||
* Cancel any io_uring activity across execve
|
||||
*/
|
||||
@@ -1497,6 +1496,8 @@ static void free_bprm(struct linux_binpr
|
||||
}
|
||||
free_arg_pages(bprm);
|
||||
if (bprm->cred) {
|
||||
+ /* in case exec fails before de_thread() succeeds */
|
||||
+ current->fs->in_exec = 0;
|
||||
mutex_unlock(¤t->signal->cred_guard_mutex);
|
||||
abort_creds(bprm->cred);
|
||||
}
|
||||
@@ -1618,6 +1619,10 @@ static void check_unsafe_exec(struct lin
|
||||
* suid exec because the differently privileged task
|
||||
* will be able to manipulate the current directory, etc.
|
||||
* It would be nice to force an unshare instead...
|
||||
+ *
|
||||
+ * Otherwise we set fs->in_exec = 1 to deny clone(CLONE_FS)
|
||||
+ * from another sub-thread until de_thread() succeeds, this
|
||||
+ * state is protected by cred_guard_mutex we hold.
|
||||
*/
|
||||
n_fs = 1;
|
||||
spin_lock(&p->fs->lock);
|
||||
@@ -1862,7 +1867,6 @@ static int bprm_execve(struct linux_binp
|
||||
|
||||
sched_mm_cid_after_execve(current);
|
||||
/* execve succeeded */
|
||||
- current->fs->in_exec = 0;
|
||||
current->in_execve = 0;
|
||||
rseq_execve(current);
|
||||
user_events_execve(current);
|
||||
@@ -1881,7 +1885,6 @@ out:
|
||||
force_fatal_sig(SIGSEGV);
|
||||
|
||||
sched_mm_cid_after_execve(current);
|
||||
- current->fs->in_exec = 0;
|
||||
current->in_execve = 0;
|
||||
|
||||
return retval;
|
Reference in New Issue
Block a user