From: Sasha Levin Date: Tue, 25 Jun 2024 03:25:02 +0000 (-0400) Subject: Fixes for 6.6 X-Git-Tag: v6.1.96~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=33ccc66eb6e39c86573ed0eb00608fe32027b299;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 6.6 Signed-off-by: Sasha Levin --- diff --git a/queue-6.6/efi-loongarch-directly-position-the-loaded-image-fil.patch b/queue-6.6/efi-loongarch-directly-position-the-loaded-image-fil.patch new file mode 100644 index 00000000000..401bfc7e5e2 --- /dev/null +++ b/queue-6.6/efi-loongarch-directly-position-the-loaded-image-fil.patch @@ -0,0 +1,161 @@ +From 81a9374f36b5ab0bf01b63a93ff7164beedd1221 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Dec 2023 17:14:05 +0800 +Subject: efi/loongarch: Directly position the loaded image file + +From: Wang Yao + +[ Upstream commit 174a0c565cea74a7811ff79fbee1b70247570ade ] + +The use of the 'kernel_offset' variable to position the image file that +has been loaded by UEFI or GRUB is unnecessary, because we can directly +position the loaded image file through using the image_base field of the +efi_loaded_image struct provided by UEFI. + +Replace kernel_offset with image_base to position the image file that has +been loaded by UEFI or GRUB. + +Signed-off-by: Wang Yao +Signed-off-by: Ard Biesheuvel +Stable-dep-of: beb2800074c1 ("LoongArch: Fix entry point in kernel image header") +Signed-off-by: Sasha Levin +--- + arch/loongarch/include/asm/efi.h | 2 -- + arch/loongarch/kernel/head.S | 1 - + arch/loongarch/kernel/image-vars.h | 1 - + arch/loongarch/kernel/vmlinux.lds.S | 1 - + drivers/firmware/efi/libstub/loongarch-stub.c | 9 +++++---- + drivers/firmware/efi/libstub/loongarch-stub.h | 4 ++++ + drivers/firmware/efi/libstub/loongarch.c | 6 ++++-- + 7 files changed, 13 insertions(+), 11 deletions(-) + create mode 100644 drivers/firmware/efi/libstub/loongarch-stub.h + +diff --git a/arch/loongarch/include/asm/efi.h b/arch/loongarch/include/asm/efi.h +index 91d81f9730ab3..eddc8e79b3fae 100644 +--- a/arch/loongarch/include/asm/efi.h ++++ b/arch/loongarch/include/asm/efi.h +@@ -32,6 +32,4 @@ static inline unsigned long efi_get_kimg_min_align(void) + + #define EFI_KIMG_PREFERRED_ADDRESS PHYSADDR(VMLINUX_LOAD_ADDRESS) + +-unsigned long kernel_entry_address(unsigned long kernel_addr); +- + #endif /* _ASM_LOONGARCH_EFI_H */ +diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S +index 53b883db07862..0ecab42163928 100644 +--- a/arch/loongarch/kernel/head.S ++++ b/arch/loongarch/kernel/head.S +@@ -34,7 +34,6 @@ pe_header: + + SYM_DATA(kernel_asize, .long _kernel_asize); + SYM_DATA(kernel_fsize, .long _kernel_fsize); +-SYM_DATA(kernel_offset, .long _kernel_offset); + + #endif + +diff --git a/arch/loongarch/kernel/image-vars.h b/arch/loongarch/kernel/image-vars.h +index 5087416b9678d..41ddcf56d21c7 100644 +--- a/arch/loongarch/kernel/image-vars.h ++++ b/arch/loongarch/kernel/image-vars.h +@@ -11,7 +11,6 @@ __efistub_strcmp = strcmp; + __efistub_kernel_entry = kernel_entry; + __efistub_kernel_asize = kernel_asize; + __efistub_kernel_fsize = kernel_fsize; +-__efistub_kernel_offset = kernel_offset; + #if defined(CONFIG_EFI_EARLYCON) || defined(CONFIG_SYSFB) + __efistub_screen_info = screen_info; + #endif +diff --git a/arch/loongarch/kernel/vmlinux.lds.S b/arch/loongarch/kernel/vmlinux.lds.S +index bb2ec86f37a8e..a5d0cd2035da0 100644 +--- a/arch/loongarch/kernel/vmlinux.lds.S ++++ b/arch/loongarch/kernel/vmlinux.lds.S +@@ -143,7 +143,6 @@ SECTIONS + _kernel_fsize = _edata - _text; + _kernel_vsize = _end - __initdata_begin; + _kernel_rsize = _edata - __initdata_begin; +- _kernel_offset = kernel_offset - _text; + #endif + + .gptab.sdata : { +diff --git a/drivers/firmware/efi/libstub/loongarch-stub.c b/drivers/firmware/efi/libstub/loongarch-stub.c +index d6ec5d4b8dbe0..736b6aae323d3 100644 +--- a/drivers/firmware/efi/libstub/loongarch-stub.c ++++ b/drivers/firmware/efi/libstub/loongarch-stub.c +@@ -8,10 +8,10 @@ + #include + #include + #include "efistub.h" ++#include "loongarch-stub.h" + + extern int kernel_asize; + extern int kernel_fsize; +-extern int kernel_offset; + extern int kernel_entry; + + efi_status_t handle_kernel_image(unsigned long *image_addr, +@@ -24,7 +24,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr, + efi_status_t status; + unsigned long kernel_addr = 0; + +- kernel_addr = (unsigned long)&kernel_offset - kernel_offset; ++ kernel_addr = (unsigned long)image->image_base; + + status = efi_relocate_kernel(&kernel_addr, kernel_fsize, kernel_asize, + EFI_KIMG_PREFERRED_ADDRESS, efi_get_kimg_min_align(), 0x0); +@@ -35,9 +35,10 @@ efi_status_t handle_kernel_image(unsigned long *image_addr, + return status; + } + +-unsigned long kernel_entry_address(unsigned long kernel_addr) ++unsigned long kernel_entry_address(unsigned long kernel_addr, ++ efi_loaded_image_t *image) + { +- unsigned long base = (unsigned long)&kernel_offset - kernel_offset; ++ unsigned long base = (unsigned long)image->image_base; + + return (unsigned long)&kernel_entry - base + kernel_addr; + } +diff --git a/drivers/firmware/efi/libstub/loongarch-stub.h b/drivers/firmware/efi/libstub/loongarch-stub.h +new file mode 100644 +index 0000000000000..cd015955a0152 +--- /dev/null ++++ b/drivers/firmware/efi/libstub/loongarch-stub.h +@@ -0,0 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++unsigned long kernel_entry_address(unsigned long kernel_addr, ++ efi_loaded_image_t *image); +diff --git a/drivers/firmware/efi/libstub/loongarch.c b/drivers/firmware/efi/libstub/loongarch.c +index 0e0aa6cda73f7..684c9354637c6 100644 +--- a/drivers/firmware/efi/libstub/loongarch.c ++++ b/drivers/firmware/efi/libstub/loongarch.c +@@ -8,6 +8,7 @@ + #include + #include + #include "efistub.h" ++#include "loongarch-stub.h" + + typedef void __noreturn (*kernel_entry_t)(bool efi, unsigned long cmdline, + unsigned long systab); +@@ -37,7 +38,8 @@ static efi_status_t exit_boot_func(struct efi_boot_memmap *map, void *priv) + return EFI_SUCCESS; + } + +-unsigned long __weak kernel_entry_address(unsigned long kernel_addr) ++unsigned long __weak kernel_entry_address(unsigned long kernel_addr, ++ efi_loaded_image_t *image) + { + return *(unsigned long *)(kernel_addr + 8) - VMLINUX_LOAD_ADDRESS + kernel_addr; + } +@@ -73,7 +75,7 @@ efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image, + csr_write64(CSR_DMW0_INIT, LOONGARCH_CSR_DMWIN0); + csr_write64(CSR_DMW1_INIT, LOONGARCH_CSR_DMWIN1); + +- real_kernel_entry = (void *)kernel_entry_address(kernel_addr); ++ real_kernel_entry = (void *)kernel_entry_address(kernel_addr, image); + + real_kernel_entry(true, (unsigned long)cmdline_ptr, + (unsigned long)efi_system_table); +-- +2.43.0 + diff --git a/queue-6.6/efi-move-screen_info-into-efi-init-code.patch b/queue-6.6/efi-move-screen_info-into-efi-init-code.patch new file mode 100644 index 00000000000..0ff696828b9 --- /dev/null +++ b/queue-6.6/efi-move-screen_info-into-efi-init-code.patch @@ -0,0 +1,228 @@ +From febffe2fbf0547a71e8f44c3a54ae7a8dd546015 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 17 Oct 2023 11:39:46 +0200 +Subject: efi: move screen_info into efi init code + +From: Arnd Bergmann + +[ Upstream commit b8466fe82b79215b9ae28623a87c9a937ebd4f80 ] + +After the vga console no longer relies on global screen_info, there are +only two remaining use cases: + + - on the x86 architecture, it is used for multiple boot methods + (bzImage, EFI, Xen, kexec) to commucate the initial VGA or framebuffer + settings to a number of device drivers. + + - on other architectures, it is only used as part of the EFI stub, + and only for the three sysfb framebuffers (simpledrm, simplefb, efifb). + +Remove the duplicate data structure definitions by moving it into the +efi-init.c file that sets it up initially for the EFI case, leaving x86 +as an exception that retains its own definition for non-EFI boots. + +The added #ifdefs here are optional, I added them to further limit the +reach of screen_info to configurations that have at least one of the +users enabled. + +Reviewed-by: Ard Biesheuvel +Reviewed-by: Javier Martinez Canillas +Acked-by: Helge Deller +Signed-off-by: Arnd Bergmann +Link: https://lore.kernel.org/r/20231017093947.3627976-1-arnd@kernel.org +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: beb2800074c1 ("LoongArch: Fix entry point in kernel image header") +Signed-off-by: Sasha Levin +--- + arch/arm64/kernel/efi.c | 4 ---- + arch/arm64/kernel/image-vars.h | 2 ++ + arch/loongarch/kernel/efi.c | 8 +++++++- + arch/loongarch/kernel/image-vars.h | 2 ++ + arch/loongarch/kernel/setup.c | 5 ----- + arch/riscv/kernel/image-vars.h | 2 ++ + arch/riscv/kernel/setup.c | 5 ----- + drivers/firmware/efi/efi-init.c | 14 +++++++++++++- + drivers/firmware/efi/libstub/efi-stub-entry.c | 8 +++++++- + 9 files changed, 33 insertions(+), 17 deletions(-) + +diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c +index 2b478ca356b00..52089f111c8db 100644 +--- a/arch/arm64/kernel/efi.c ++++ b/arch/arm64/kernel/efi.c +@@ -71,10 +71,6 @@ static __init pteval_t create_mapping_protection(efi_memory_desc_t *md) + return pgprot_val(PAGE_KERNEL_EXEC); + } + +-/* we will fill this structure from the stub, so don't put it in .bss */ +-struct screen_info screen_info __section(".data"); +-EXPORT_SYMBOL(screen_info); +- + int __init efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md) + { + pteval_t prot_val = create_mapping_protection(md); +diff --git a/arch/arm64/kernel/image-vars.h b/arch/arm64/kernel/image-vars.h +index 35f3c79595137..5e4dc72ab1bda 100644 +--- a/arch/arm64/kernel/image-vars.h ++++ b/arch/arm64/kernel/image-vars.h +@@ -27,7 +27,9 @@ PROVIDE(__efistub__text = _text); + PROVIDE(__efistub__end = _end); + PROVIDE(__efistub___inittext_end = __inittext_end); + PROVIDE(__efistub__edata = _edata); ++#if defined(CONFIG_EFI_EARLYCON) || defined(CONFIG_SYSFB) + PROVIDE(__efistub_screen_info = screen_info); ++#endif + PROVIDE(__efistub__ctype = _ctype); + + PROVIDE(__pi___memcpy = __pi_memcpy); +diff --git a/arch/loongarch/kernel/efi.c b/arch/loongarch/kernel/efi.c +index 9fc10cea21e10..acb5d3385675c 100644 +--- a/arch/loongarch/kernel/efi.c ++++ b/arch/loongarch/kernel/efi.c +@@ -68,6 +68,11 @@ void __init efi_runtime_init(void) + + unsigned long __initdata screen_info_table = EFI_INVALID_TABLE_ADDR; + ++#if defined(CONFIG_SYSFB) || defined(CONFIG_EFI_EARLYCON) ++struct screen_info screen_info __section(".data"); ++EXPORT_SYMBOL_GPL(screen_info); ++#endif ++ + static void __init init_screen_info(void) + { + struct screen_info *si; +@@ -115,7 +120,8 @@ void __init efi_init(void) + + set_bit(EFI_CONFIG_TABLES, &efi.flags); + +- init_screen_info(); ++ if (IS_ENABLED(CONFIG_EFI_EARLYCON) || IS_ENABLED(CONFIG_SYSFB)) ++ init_screen_info(); + + if (boot_memmap == EFI_INVALID_TABLE_ADDR) + return; +diff --git a/arch/loongarch/kernel/image-vars.h b/arch/loongarch/kernel/image-vars.h +index e561989d02de9..5087416b9678d 100644 +--- a/arch/loongarch/kernel/image-vars.h ++++ b/arch/loongarch/kernel/image-vars.h +@@ -12,7 +12,9 @@ __efistub_kernel_entry = kernel_entry; + __efistub_kernel_asize = kernel_asize; + __efistub_kernel_fsize = kernel_fsize; + __efistub_kernel_offset = kernel_offset; ++#if defined(CONFIG_EFI_EARLYCON) || defined(CONFIG_SYSFB) + __efistub_screen_info = screen_info; ++#endif + + #endif + +diff --git a/arch/loongarch/kernel/setup.c b/arch/loongarch/kernel/setup.c +index 6748d7f3f2219..6464e1eac4cbd 100644 +--- a/arch/loongarch/kernel/setup.c ++++ b/arch/loongarch/kernel/setup.c +@@ -16,7 +16,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -57,10 +56,6 @@ + #define SMBIOS_CORE_PACKAGE_OFFSET 0x23 + #define LOONGSON_EFI_ENABLE (1 << 3) + +-#ifdef CONFIG_EFI +-struct screen_info screen_info __section(".data"); +-#endif +- + unsigned long fw_arg0, fw_arg1, fw_arg2; + DEFINE_PER_CPU(unsigned long, kernelsp); + struct cpuinfo_loongarch cpu_data[NR_CPUS] __read_mostly; +diff --git a/arch/riscv/kernel/image-vars.h b/arch/riscv/kernel/image-vars.h +index ea1a10355ce90..3df30dd1c458b 100644 +--- a/arch/riscv/kernel/image-vars.h ++++ b/arch/riscv/kernel/image-vars.h +@@ -28,7 +28,9 @@ __efistub__start_kernel = _start_kernel; + __efistub__end = _end; + __efistub__edata = _edata; + __efistub___init_text_end = __init_text_end; ++#if defined(CONFIG_EFI_EARLYCON) || defined(CONFIG_SYSFB) + __efistub_screen_info = screen_info; ++#endif + + #endif + +diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c +index ddadee6621f0d..1befd73a12505 100644 +--- a/arch/riscv/kernel/setup.c ++++ b/arch/riscv/kernel/setup.c +@@ -15,7 +15,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -40,10 +39,6 @@ + + #include "head.h" + +-#if defined(CONFIG_EFI) +-struct screen_info screen_info __section(".data"); +-#endif +- + /* + * The lucky hart to first increment this variable will boot the other cores. + * This is used before the kernel initializes the BSS so it can't be in the +diff --git a/drivers/firmware/efi/efi-init.c b/drivers/firmware/efi/efi-init.c +index 59b0d7197b685..a00e07b853f22 100644 +--- a/drivers/firmware/efi/efi-init.c ++++ b/drivers/firmware/efi/efi-init.c +@@ -55,6 +55,15 @@ static phys_addr_t __init efi_to_phys(unsigned long addr) + + extern __weak const efi_config_table_type_t efi_arch_tables[]; + ++/* ++ * x86 defines its own screen_info and uses it even without EFI, ++ * everything else can get it from here. ++ */ ++#if !defined(CONFIG_X86) && (defined(CONFIG_SYSFB) || defined(CONFIG_EFI_EARLYCON)) ++struct screen_info screen_info __section(".data"); ++EXPORT_SYMBOL_GPL(screen_info); ++#endif ++ + static void __init init_screen_info(void) + { + struct screen_info *si; +@@ -241,5 +250,8 @@ void __init efi_init(void) + memblock_reserve(data.phys_map & PAGE_MASK, + PAGE_ALIGN(data.size + (data.phys_map & ~PAGE_MASK))); + +- init_screen_info(); ++ if (IS_ENABLED(CONFIG_X86) || ++ IS_ENABLED(CONFIG_SYSFB) || ++ IS_ENABLED(CONFIG_EFI_EARLYCON)) ++ init_screen_info(); + } +diff --git a/drivers/firmware/efi/libstub/efi-stub-entry.c b/drivers/firmware/efi/libstub/efi-stub-entry.c +index 2f1902e5d4075..a6c0498351905 100644 +--- a/drivers/firmware/efi/libstub/efi-stub-entry.c ++++ b/drivers/firmware/efi/libstub/efi-stub-entry.c +@@ -13,7 +13,13 @@ struct screen_info *alloc_screen_info(void) + { + if (IS_ENABLED(CONFIG_ARM)) + return __alloc_screen_info(); +- return (void *)&screen_info + screen_info_offset; ++ ++ if (IS_ENABLED(CONFIG_X86) || ++ IS_ENABLED(CONFIG_EFI_EARLYCON) || ++ IS_ENABLED(CONFIG_SYSFB)) ++ return (void *)&screen_info + screen_info_offset; ++ ++ return NULL; + } + + /* +-- +2.43.0 + diff --git a/queue-6.6/loongarch-fix-entry-point-in-kernel-image-header.patch b/queue-6.6/loongarch-fix-entry-point-in-kernel-image-header.patch new file mode 100644 index 00000000000..569796e2b77 --- /dev/null +++ b/queue-6.6/loongarch-fix-entry-point-in-kernel-image-header.patch @@ -0,0 +1,88 @@ +From 33de791ad3eaad2e65d3b0de88a7e8eeaa969c4a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 3 Jun 2024 15:45:53 +0800 +Subject: LoongArch: Fix entry point in kernel image header + +From: Jiaxun Yang + +[ Upstream commit beb2800074c15362cf9f6c7301120910046d6556 ] + +Currently kernel entry in head.S is in DMW address range, firmware is +instructed to jump to this address after loading the kernel image. + +However kernel should not make any assumption on firmware's DMW +setting, thus the entry point should be a physical address falls into +direct translation region. + +Fix by converting entry address to physical and amend entry calculation +logic in libstub accordingly. + +BTW, use ABSOLUTE() to calculate variables to make Clang/LLVM happy. + +Cc: stable@vger.kernel.org +Signed-off-by: Jiaxun Yang +Signed-off-by: Huacai Chen +Signed-off-by: Sasha Levin +--- + arch/loongarch/kernel/head.S | 2 +- + arch/loongarch/kernel/vmlinux.lds.S | 10 ++++++---- + drivers/firmware/efi/libstub/loongarch.c | 2 +- + 3 files changed, 8 insertions(+), 6 deletions(-) + +diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S +index 0ecab42163928..e336fbc4eb967 100644 +--- a/arch/loongarch/kernel/head.S ++++ b/arch/loongarch/kernel/head.S +@@ -22,7 +22,7 @@ + _head: + .word MZ_MAGIC /* "MZ", MS-DOS header */ + .org 0x8 +- .dword kernel_entry /* Kernel entry point */ ++ .dword _kernel_entry /* Kernel entry point (physical address) */ + .dword _kernel_asize /* Kernel image effective size */ + .quad PHYS_LINK_KADDR /* Kernel image load offset from start of RAM */ + .org 0x38 /* 0x20 ~ 0x37 reserved */ +diff --git a/arch/loongarch/kernel/vmlinux.lds.S b/arch/loongarch/kernel/vmlinux.lds.S +index a5d0cd2035da0..d5afd0c80a499 100644 +--- a/arch/loongarch/kernel/vmlinux.lds.S ++++ b/arch/loongarch/kernel/vmlinux.lds.S +@@ -5,6 +5,7 @@ + + #define PAGE_SIZE _PAGE_SIZE + #define RO_EXCEPTION_TABLE_ALIGN 4 ++#define PHYSADDR_MASK 0xffffffffffff /* 48-bit */ + + /* + * Put .bss..swapper_pg_dir as the first thing in .bss. This will +@@ -139,10 +140,11 @@ SECTIONS + + #ifdef CONFIG_EFI_STUB + /* header symbols */ +- _kernel_asize = _end - _text; +- _kernel_fsize = _edata - _text; +- _kernel_vsize = _end - __initdata_begin; +- _kernel_rsize = _edata - __initdata_begin; ++ _kernel_entry = ABSOLUTE(kernel_entry & PHYSADDR_MASK); ++ _kernel_asize = ABSOLUTE(_end - _text); ++ _kernel_fsize = ABSOLUTE(_edata - _text); ++ _kernel_vsize = ABSOLUTE(_end - __initdata_begin); ++ _kernel_rsize = ABSOLUTE(_edata - __initdata_begin); + #endif + + .gptab.sdata : { +diff --git a/drivers/firmware/efi/libstub/loongarch.c b/drivers/firmware/efi/libstub/loongarch.c +index 684c9354637c6..d0ef93551c44f 100644 +--- a/drivers/firmware/efi/libstub/loongarch.c ++++ b/drivers/firmware/efi/libstub/loongarch.c +@@ -41,7 +41,7 @@ static efi_status_t exit_boot_func(struct efi_boot_memmap *map, void *priv) + unsigned long __weak kernel_entry_address(unsigned long kernel_addr, + efi_loaded_image_t *image) + { +- return *(unsigned long *)(kernel_addr + 8) - VMLINUX_LOAD_ADDRESS + kernel_addr; ++ return *(unsigned long *)(kernel_addr + 8) - PHYSADDR(VMLINUX_LOAD_ADDRESS) + kernel_addr; + } + + efi_status_t efi_boot_kernel(void *handle, efi_loaded_image_t *image, +-- +2.43.0 + diff --git a/queue-6.6/nbd-fix-signal-handling.patch b/queue-6.6/nbd-fix-signal-handling.patch new file mode 100644 index 00000000000..ca4af87e06f --- /dev/null +++ b/queue-6.6/nbd-fix-signal-handling.patch @@ -0,0 +1,159 @@ +From 69d03846368338f35f185a72b4e0d977255446e4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 May 2024 13:23:13 -0700 +Subject: nbd: Fix signal handling + +From: Bart Van Assche + +[ Upstream commit e56d4b633fffea9510db468085bed0799cba4ecd ] + +Both nbd_send_cmd() and nbd_handle_cmd() return either a negative error +number or a positive blk_status_t value. nbd_queue_rq() converts these +return values into a blk_status_t value. There is a bug in the conversion +code: if nbd_send_cmd() returns BLK_STS_RESOURCE, nbd_queue_rq() should +return BLK_STS_RESOURCE instead of BLK_STS_OK. Fix this, move the +conversion code into nbd_handle_cmd() and fix the remaining sparse warnings. + +This patch fixes the following sparse warnings: + +drivers/block/nbd.c:673:32: warning: incorrect type in return expression (different base types) +drivers/block/nbd.c:673:32: expected int +drivers/block/nbd.c:673:32: got restricted blk_status_t [usertype] +drivers/block/nbd.c:714:48: warning: incorrect type in return expression (different base types) +drivers/block/nbd.c:714:48: expected int +drivers/block/nbd.c:714:48: got restricted blk_status_t [usertype] +drivers/block/nbd.c:1120:21: warning: incorrect type in assignment (different base types) +drivers/block/nbd.c:1120:21: expected int [assigned] ret +drivers/block/nbd.c:1120:21: got restricted blk_status_t [usertype] +drivers/block/nbd.c:1125:16: warning: incorrect type in return expression (different base types) +drivers/block/nbd.c:1125:16: expected restricted blk_status_t +drivers/block/nbd.c:1125:16: got int [assigned] ret + +Cc: Christoph Hellwig +Cc: Josef Bacik +Cc: Yu Kuai +Cc: Markus Pargmann +Fixes: fc17b6534eb8 ("blk-mq: switch ->queue_rq return value to blk_status_t") +Cc: stable@vger.kernel.org +Signed-off-by: Bart Van Assche +Link: https://lore.kernel.org/r/20240510202313.25209-6-bvanassche@acm.org +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + drivers/block/nbd.c | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c +index a906674f71147..1089dc646b808 100644 +--- a/drivers/block/nbd.c ++++ b/drivers/block/nbd.c +@@ -569,6 +569,10 @@ static inline int was_interrupted(int result) + return result == -ERESTARTSYS || result == -EINTR; + } + ++/* ++ * Returns BLK_STS_RESOURCE if the caller should retry after a delay. Returns ++ * -EAGAIN if the caller should requeue @cmd. Returns -EIO if sending failed. ++ */ + static int nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd, int index) + { + struct request *req = blk_mq_rq_from_pdu(cmd); +@@ -652,7 +656,7 @@ static int nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd, int index) + nsock->sent = sent; + } + set_bit(NBD_CMD_REQUEUED, &cmd->flags); +- return BLK_STS_RESOURCE; ++ return (__force int)BLK_STS_RESOURCE; + } + dev_err_ratelimited(disk_to_dev(nbd->disk), + "Send control failed (result %d)\n", result); +@@ -693,7 +697,7 @@ static int nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd, int index) + nsock->pending = req; + nsock->sent = sent; + set_bit(NBD_CMD_REQUEUED, &cmd->flags); +- return BLK_STS_RESOURCE; ++ return (__force int)BLK_STS_RESOURCE; + } + dev_err(disk_to_dev(nbd->disk), + "Send data failed (result %d)\n", +@@ -990,7 +994,7 @@ static int wait_for_reconnect(struct nbd_device *nbd) + return !test_bit(NBD_RT_DISCONNECTED, &config->runtime_flags); + } + +-static int nbd_handle_cmd(struct nbd_cmd *cmd, int index) ++static blk_status_t nbd_handle_cmd(struct nbd_cmd *cmd, int index) + { + struct request *req = blk_mq_rq_from_pdu(cmd); + struct nbd_device *nbd = cmd->nbd; +@@ -1004,14 +1008,14 @@ static int nbd_handle_cmd(struct nbd_cmd *cmd, int index) + if (!config) { + dev_err_ratelimited(disk_to_dev(nbd->disk), + "Socks array is empty\n"); +- return -EINVAL; ++ return BLK_STS_IOERR; + } + + if (index >= config->num_connections) { + dev_err_ratelimited(disk_to_dev(nbd->disk), + "Attempted send on invalid socket\n"); + nbd_config_put(nbd); +- return -EINVAL; ++ return BLK_STS_IOERR; + } + cmd->status = BLK_STS_OK; + again: +@@ -1034,7 +1038,7 @@ static int nbd_handle_cmd(struct nbd_cmd *cmd, int index) + */ + sock_shutdown(nbd); + nbd_config_put(nbd); +- return -EIO; ++ return BLK_STS_IOERR; + } + goto again; + } +@@ -1047,7 +1051,7 @@ static int nbd_handle_cmd(struct nbd_cmd *cmd, int index) + blk_mq_start_request(req); + if (unlikely(nsock->pending && nsock->pending != req)) { + nbd_requeue_cmd(cmd); +- ret = 0; ++ ret = BLK_STS_OK; + goto out; + } + /* +@@ -1066,19 +1070,19 @@ static int nbd_handle_cmd(struct nbd_cmd *cmd, int index) + "Request send failed, requeueing\n"); + nbd_mark_nsock_dead(nbd, nsock, 1); + nbd_requeue_cmd(cmd); +- ret = 0; ++ ret = BLK_STS_OK; + } + out: + mutex_unlock(&nsock->tx_lock); + nbd_config_put(nbd); +- return ret; ++ return ret < 0 ? BLK_STS_IOERR : (__force blk_status_t)ret; + } + + static blk_status_t nbd_queue_rq(struct blk_mq_hw_ctx *hctx, + const struct blk_mq_queue_data *bd) + { + struct nbd_cmd *cmd = blk_mq_rq_to_pdu(bd->rq); +- int ret; ++ blk_status_t ret; + + /* + * Since we look at the bio's to send the request over the network we +@@ -1098,10 +1102,6 @@ static blk_status_t nbd_queue_rq(struct blk_mq_hw_ctx *hctx, + * appropriate. + */ + ret = nbd_handle_cmd(cmd, hctx->queue_num); +- if (ret < 0) +- ret = BLK_STS_IOERR; +- else if (!ret) +- ret = BLK_STS_OK; + mutex_unlock(&cmd->lock); + + return ret; +-- +2.43.0 + diff --git a/queue-6.6/nbd-improve-the-documentation-of-the-locking-assumpt.patch b/queue-6.6/nbd-improve-the-documentation-of-the-locking-assumpt.patch new file mode 100644 index 00000000000..6f07d2e300a --- /dev/null +++ b/queue-6.6/nbd-improve-the-documentation-of-the-locking-assumpt.patch @@ -0,0 +1,60 @@ +From 7f49b2cf48bfdee465574d940e8e466dc4499bd6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 May 2024 13:23:11 -0700 +Subject: nbd: Improve the documentation of the locking assumptions + +From: Bart Van Assche + +[ Upstream commit 2a6751e052ab4789630bc889c814037068723bc1 ] + +Document locking assumptions with lockdep_assert_held() instead of source +code comments. The advantage of lockdep_assert_held() is that it is +verified at runtime if lockdep is enabled in the kernel config. + +Cc: Christoph Hellwig +Cc: Josef Bacik +Cc: Yu Kuai +Cc: Markus Pargmann +Signed-off-by: Bart Van Assche +Link: https://lore.kernel.org/r/20240510202313.25209-4-bvanassche@acm.org +Signed-off-by: Jens Axboe +Stable-dep-of: e56d4b633fff ("nbd: Fix signal handling") +Signed-off-by: Sasha Levin +--- + drivers/block/nbd.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c +index df738eab02433..a906674f71147 100644 +--- a/drivers/block/nbd.c ++++ b/drivers/block/nbd.c +@@ -569,7 +569,6 @@ static inline int was_interrupted(int result) + return result == -ERESTARTSYS || result == -EINTR; + } + +-/* always call with the tx_lock held */ + static int nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd, int index) + { + struct request *req = blk_mq_rq_from_pdu(cmd); +@@ -586,6 +585,9 @@ static int nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd, int index) + u32 nbd_cmd_flags = 0; + int sent = nsock->sent, skip = 0; + ++ lockdep_assert_held(&cmd->lock); ++ lockdep_assert_held(&nsock->tx_lock); ++ + iov_iter_kvec(&from, ITER_SOURCE, &iov, 1, sizeof(request)); + + type = req_to_nbd_cmd_type(req); +@@ -996,6 +998,8 @@ static int nbd_handle_cmd(struct nbd_cmd *cmd, int index) + struct nbd_sock *nsock; + int ret; + ++ lockdep_assert_held(&cmd->lock); ++ + config = nbd_get_config_unlocked(nbd); + if (!config) { + dev_err_ratelimited(disk_to_dev(nbd->disk), +-- +2.43.0 + diff --git a/queue-6.6/ocfs2-convert-to-new-timestamp-accessors.patch b/queue-6.6/ocfs2-convert-to-new-timestamp-accessors.patch new file mode 100644 index 00000000000..a2be843746d --- /dev/null +++ b/queue-6.6/ocfs2-convert-to-new-timestamp-accessors.patch @@ -0,0 +1,458 @@ +From c80483d319bca2c4e738988e7a5df87cdbbc3b1b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 4 Oct 2023 14:52:41 -0400 +Subject: ocfs2: convert to new timestamp accessors + +From: Jeff Layton + +[ Upstream commit fd6acbbc4d1edb218ade7ac0ab1839f9e4fcd094 ] + +Convert to using the new inode timestamp accessor functions. + +Signed-off-by: Jeff Layton +Link: https://lore.kernel.org/r/20231004185347.80880-54-jlayton@kernel.org +Signed-off-by: Christian Brauner +Stable-dep-of: 8c40984eeb88 ("ocfs2: update inode fsync transaction id in ocfs2_unlink and ocfs2_link") +Signed-off-by: Sasha Levin +--- + fs/ocfs2/acl.c | 4 ++-- + fs/ocfs2/alloc.c | 6 +++--- + fs/ocfs2/aops.c | 6 +++--- + fs/ocfs2/dir.c | 9 +++++---- + fs/ocfs2/dlmfs/dlmfs.c | 4 ++-- + fs/ocfs2/dlmglue.c | 29 ++++++++++++++--------------- + fs/ocfs2/file.c | 30 ++++++++++++++++-------------- + fs/ocfs2/inode.c | 28 ++++++++++++++-------------- + fs/ocfs2/move_extents.c | 4 ++-- + fs/ocfs2/namei.c | 16 ++++++++-------- + fs/ocfs2/refcounttree.c | 12 ++++++------ + fs/ocfs2/xattr.c | 4 ++-- + 12 files changed, 77 insertions(+), 75 deletions(-) + +diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c +index e75137a8e7cb4..62464d194da3f 100644 +--- a/fs/ocfs2/acl.c ++++ b/fs/ocfs2/acl.c +@@ -193,8 +193,8 @@ static int ocfs2_acl_set_mode(struct inode *inode, struct buffer_head *di_bh, + inode->i_mode = new_mode; + inode_set_ctime_current(inode); + di->i_mode = cpu_to_le16(inode->i_mode); +- di->i_ctime = cpu_to_le64(inode_get_ctime(inode).tv_sec); +- di->i_ctime_nsec = cpu_to_le32(inode_get_ctime(inode).tv_nsec); ++ di->i_ctime = cpu_to_le64(inode_get_ctime_sec(inode)); ++ di->i_ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); + ocfs2_update_inode_fsync_trans(handle, inode, 0); + + ocfs2_journal_dirty(handle, di_bh); +diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c +index aef58f1395c87..f0937902f7b46 100644 +--- a/fs/ocfs2/alloc.c ++++ b/fs/ocfs2/alloc.c +@@ -7436,10 +7436,10 @@ int ocfs2_truncate_inline(struct inode *inode, struct buffer_head *di_bh, + } + + inode->i_blocks = ocfs2_inode_sector_count(inode); +- inode->i_mtime = inode_set_ctime_current(inode); ++ inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); + +- di->i_ctime = di->i_mtime = cpu_to_le64(inode_get_ctime(inode).tv_sec); +- di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(inode_get_ctime(inode).tv_nsec); ++ di->i_ctime = di->i_mtime = cpu_to_le64(inode_get_ctime_sec(inode)); ++ di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); + + ocfs2_update_inode_fsync_trans(handle, inode, 1); + ocfs2_journal_dirty(handle, di_bh); +diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c +index 0fdba30740ab5..6ab03494fc6e7 100644 +--- a/fs/ocfs2/aops.c ++++ b/fs/ocfs2/aops.c +@@ -2048,9 +2048,9 @@ int ocfs2_write_end_nolock(struct address_space *mapping, + } + inode->i_blocks = ocfs2_inode_sector_count(inode); + di->i_size = cpu_to_le64((u64)i_size_read(inode)); +- inode->i_mtime = inode_set_ctime_current(inode); +- di->i_mtime = di->i_ctime = cpu_to_le64(inode->i_mtime.tv_sec); +- di->i_mtime_nsec = di->i_ctime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec); ++ inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); ++ di->i_mtime = di->i_ctime = cpu_to_le64(inode_get_mtime_sec(inode)); ++ di->i_mtime_nsec = di->i_ctime_nsec = cpu_to_le32(inode_get_mtime_nsec(inode)); + if (handle) + ocfs2_update_inode_fsync_trans(handle, inode, 1); + } +diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c +index 8b123d543e6e2..a14c8fee6ee5e 100644 +--- a/fs/ocfs2/dir.c ++++ b/fs/ocfs2/dir.c +@@ -1658,7 +1658,8 @@ int __ocfs2_add_entry(handle_t *handle, + offset, ocfs2_dir_trailer_blk_off(dir->i_sb)); + + if (ocfs2_dirent_would_fit(de, rec_len)) { +- dir->i_mtime = inode_set_ctime_current(dir); ++ inode_set_mtime_to_ts(dir, ++ inode_set_ctime_current(dir)); + retval = ocfs2_mark_inode_dirty(handle, dir, parent_fe_bh); + if (retval < 0) { + mlog_errno(retval); +@@ -2962,11 +2963,11 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, + ocfs2_dinode_new_extent_list(dir, di); + + i_size_write(dir, sb->s_blocksize); +- dir->i_mtime = inode_set_ctime_current(dir); ++ inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir)); + + di->i_size = cpu_to_le64(sb->s_blocksize); +- di->i_ctime = di->i_mtime = cpu_to_le64(inode_get_ctime(dir).tv_sec); +- di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(inode_get_ctime(dir).tv_nsec); ++ di->i_ctime = di->i_mtime = cpu_to_le64(inode_get_ctime_sec(dir)); ++ di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(inode_get_ctime_nsec(dir)); + ocfs2_update_inode_fsync_trans(handle, dir, 1); + + /* +diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c +index 81265123ce6ce..9b57d012fd5cf 100644 +--- a/fs/ocfs2/dlmfs/dlmfs.c ++++ b/fs/ocfs2/dlmfs/dlmfs.c +@@ -337,7 +337,7 @@ static struct inode *dlmfs_get_root_inode(struct super_block *sb) + if (inode) { + inode->i_ino = get_next_ino(); + inode_init_owner(&nop_mnt_idmap, inode, NULL, mode); +- inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode); ++ simple_inode_init_ts(inode); + inc_nlink(inode); + + inode->i_fop = &simple_dir_operations; +@@ -360,7 +360,7 @@ static struct inode *dlmfs_get_inode(struct inode *parent, + + inode->i_ino = get_next_ino(); + inode_init_owner(&nop_mnt_idmap, inode, parent, mode); +- inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode); ++ simple_inode_init_ts(inode); + + ip = DLMFS_I(inode); + ip->ip_conn = DLMFS_I(parent)->ip_conn; +diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c +index c3e2961ee5db3..64a6ef638495c 100644 +--- a/fs/ocfs2/dlmglue.c ++++ b/fs/ocfs2/dlmglue.c +@@ -2162,7 +2162,7 @@ static void __ocfs2_stuff_meta_lvb(struct inode *inode) + struct ocfs2_inode_info *oi = OCFS2_I(inode); + struct ocfs2_lock_res *lockres = &oi->ip_inode_lockres; + struct ocfs2_meta_lvb *lvb; +- struct timespec64 ctime = inode_get_ctime(inode); ++ struct timespec64 ts; + + lvb = ocfs2_dlm_lvb(&lockres->l_lksb); + +@@ -2183,12 +2183,12 @@ static void __ocfs2_stuff_meta_lvb(struct inode *inode) + lvb->lvb_igid = cpu_to_be32(i_gid_read(inode)); + lvb->lvb_imode = cpu_to_be16(inode->i_mode); + lvb->lvb_inlink = cpu_to_be16(inode->i_nlink); +- lvb->lvb_iatime_packed = +- cpu_to_be64(ocfs2_pack_timespec(&inode->i_atime)); +- lvb->lvb_ictime_packed = +- cpu_to_be64(ocfs2_pack_timespec(&ctime)); +- lvb->lvb_imtime_packed = +- cpu_to_be64(ocfs2_pack_timespec(&inode->i_mtime)); ++ ts = inode_get_atime(inode); ++ lvb->lvb_iatime_packed = cpu_to_be64(ocfs2_pack_timespec(&ts)); ++ ts = inode_get_ctime(inode); ++ lvb->lvb_ictime_packed = cpu_to_be64(ocfs2_pack_timespec(&ts)); ++ ts = inode_get_mtime(inode); ++ lvb->lvb_imtime_packed = cpu_to_be64(ocfs2_pack_timespec(&ts)); + lvb->lvb_iattr = cpu_to_be32(oi->ip_attr); + lvb->lvb_idynfeatures = cpu_to_be16(oi->ip_dyn_features); + lvb->lvb_igeneration = cpu_to_be32(inode->i_generation); +@@ -2209,7 +2209,7 @@ static int ocfs2_refresh_inode_from_lvb(struct inode *inode) + struct ocfs2_inode_info *oi = OCFS2_I(inode); + struct ocfs2_lock_res *lockres = &oi->ip_inode_lockres; + struct ocfs2_meta_lvb *lvb; +- struct timespec64 ctime; ++ struct timespec64 ts; + + mlog_meta_lvb(0, lockres); + +@@ -2236,13 +2236,12 @@ static int ocfs2_refresh_inode_from_lvb(struct inode *inode) + i_gid_write(inode, be32_to_cpu(lvb->lvb_igid)); + inode->i_mode = be16_to_cpu(lvb->lvb_imode); + set_nlink(inode, be16_to_cpu(lvb->lvb_inlink)); +- ocfs2_unpack_timespec(&inode->i_atime, +- be64_to_cpu(lvb->lvb_iatime_packed)); +- ocfs2_unpack_timespec(&inode->i_mtime, +- be64_to_cpu(lvb->lvb_imtime_packed)); +- ocfs2_unpack_timespec(&ctime, +- be64_to_cpu(lvb->lvb_ictime_packed)); +- inode_set_ctime_to_ts(inode, ctime); ++ ocfs2_unpack_timespec(&ts, be64_to_cpu(lvb->lvb_iatime_packed)); ++ inode_set_atime_to_ts(inode, ts); ++ ocfs2_unpack_timespec(&ts, be64_to_cpu(lvb->lvb_imtime_packed)); ++ inode_set_mtime_to_ts(inode, ts); ++ ocfs2_unpack_timespec(&ts, be64_to_cpu(lvb->lvb_ictime_packed)); ++ inode_set_ctime_to_ts(inode, ts); + spin_unlock(&oi->ip_lock); + return 0; + } +diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c +index f861b8c345e86..8bbe4a2b48a2a 100644 +--- a/fs/ocfs2/file.c ++++ b/fs/ocfs2/file.c +@@ -233,16 +233,18 @@ int ocfs2_should_update_atime(struct inode *inode, + + if (vfsmnt->mnt_flags & MNT_RELATIME) { + struct timespec64 ctime = inode_get_ctime(inode); ++ struct timespec64 atime = inode_get_atime(inode); ++ struct timespec64 mtime = inode_get_mtime(inode); + +- if ((timespec64_compare(&inode->i_atime, &inode->i_mtime) <= 0) || +- (timespec64_compare(&inode->i_atime, &ctime) <= 0)) ++ if ((timespec64_compare(&atime, &mtime) <= 0) || ++ (timespec64_compare(&atime, &ctime) <= 0)) + return 1; + + return 0; + } + + now = current_time(inode); +- if ((now.tv_sec - inode->i_atime.tv_sec <= osb->s_atime_quantum)) ++ if ((now.tv_sec - inode_get_atime_sec(inode) <= osb->s_atime_quantum)) + return 0; + else + return 1; +@@ -275,9 +277,9 @@ int ocfs2_update_inode_atime(struct inode *inode, + * have i_rwsem to guard against concurrent changes to other + * inode fields. + */ +- inode->i_atime = current_time(inode); +- di->i_atime = cpu_to_le64(inode->i_atime.tv_sec); +- di->i_atime_nsec = cpu_to_le32(inode->i_atime.tv_nsec); ++ inode_set_atime_to_ts(inode, current_time(inode)); ++ di->i_atime = cpu_to_le64(inode_get_atime_sec(inode)); ++ di->i_atime_nsec = cpu_to_le32(inode_get_atime_nsec(inode)); + ocfs2_update_inode_fsync_trans(handle, inode, 0); + ocfs2_journal_dirty(handle, bh); + +@@ -296,7 +298,7 @@ int ocfs2_set_inode_size(handle_t *handle, + + i_size_write(inode, new_i_size); + inode->i_blocks = ocfs2_inode_sector_count(inode); +- inode->i_mtime = inode_set_ctime_current(inode); ++ inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); + + status = ocfs2_mark_inode_dirty(handle, inode, fe_bh); + if (status < 0) { +@@ -417,12 +419,12 @@ static int ocfs2_orphan_for_truncate(struct ocfs2_super *osb, + } + + i_size_write(inode, new_i_size); +- inode->i_mtime = inode_set_ctime_current(inode); ++ inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); + + di = (struct ocfs2_dinode *) fe_bh->b_data; + di->i_size = cpu_to_le64(new_i_size); +- di->i_ctime = di->i_mtime = cpu_to_le64(inode_get_ctime(inode).tv_sec); +- di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(inode_get_ctime(inode).tv_nsec); ++ di->i_ctime = di->i_mtime = cpu_to_le64(inode_get_ctime_sec(inode)); ++ di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); + ocfs2_update_inode_fsync_trans(handle, inode, 0); + + ocfs2_journal_dirty(handle, fe_bh); +@@ -821,9 +823,9 @@ static int ocfs2_write_zero_page(struct inode *inode, u64 abs_from, + i_size_write(inode, abs_to); + inode->i_blocks = ocfs2_inode_sector_count(inode); + di->i_size = cpu_to_le64((u64)i_size_read(inode)); +- inode->i_mtime = inode_set_ctime_current(inode); +- di->i_mtime = di->i_ctime = cpu_to_le64(inode->i_mtime.tv_sec); +- di->i_ctime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec); ++ inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); ++ di->i_mtime = di->i_ctime = cpu_to_le64(inode_get_mtime_sec(inode)); ++ di->i_ctime_nsec = cpu_to_le32(inode_get_mtime_nsec(inode)); + di->i_mtime_nsec = di->i_ctime_nsec; + if (handle) { + ocfs2_journal_dirty(handle, di_bh); +@@ -2042,7 +2044,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, + goto out_inode_unlock; + } + +- inode->i_mtime = inode_set_ctime_current(inode); ++ inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); + ret = ocfs2_mark_inode_dirty(handle, inode, di_bh); + if (ret < 0) + mlog_errno(ret); +diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c +index e8771600b9304..999111bfc2717 100644 +--- a/fs/ocfs2/inode.c ++++ b/fs/ocfs2/inode.c +@@ -302,10 +302,10 @@ void ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, + inode->i_blocks = ocfs2_inode_sector_count(inode); + inode->i_mapping->a_ops = &ocfs2_aops; + } +- inode->i_atime.tv_sec = le64_to_cpu(fe->i_atime); +- inode->i_atime.tv_nsec = le32_to_cpu(fe->i_atime_nsec); +- inode->i_mtime.tv_sec = le64_to_cpu(fe->i_mtime); +- inode->i_mtime.tv_nsec = le32_to_cpu(fe->i_mtime_nsec); ++ inode_set_atime(inode, le64_to_cpu(fe->i_atime), ++ le32_to_cpu(fe->i_atime_nsec)); ++ inode_set_mtime(inode, le64_to_cpu(fe->i_mtime), ++ le32_to_cpu(fe->i_mtime_nsec)); + inode_set_ctime(inode, le64_to_cpu(fe->i_ctime), + le32_to_cpu(fe->i_ctime_nsec)); + +@@ -1312,12 +1312,12 @@ int ocfs2_mark_inode_dirty(handle_t *handle, + fe->i_uid = cpu_to_le32(i_uid_read(inode)); + fe->i_gid = cpu_to_le32(i_gid_read(inode)); + fe->i_mode = cpu_to_le16(inode->i_mode); +- fe->i_atime = cpu_to_le64(inode->i_atime.tv_sec); +- fe->i_atime_nsec = cpu_to_le32(inode->i_atime.tv_nsec); +- fe->i_ctime = cpu_to_le64(inode_get_ctime(inode).tv_sec); +- fe->i_ctime_nsec = cpu_to_le32(inode_get_ctime(inode).tv_nsec); +- fe->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec); +- fe->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec); ++ fe->i_atime = cpu_to_le64(inode_get_atime_sec(inode)); ++ fe->i_atime_nsec = cpu_to_le32(inode_get_atime_nsec(inode)); ++ fe->i_ctime = cpu_to_le64(inode_get_ctime_sec(inode)); ++ fe->i_ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); ++ fe->i_mtime = cpu_to_le64(inode_get_mtime_sec(inode)); ++ fe->i_mtime_nsec = cpu_to_le32(inode_get_mtime_nsec(inode)); + + ocfs2_journal_dirty(handle, bh); + ocfs2_update_inode_fsync_trans(handle, inode, 1); +@@ -1348,10 +1348,10 @@ void ocfs2_refresh_inode(struct inode *inode, + inode->i_blocks = 0; + else + inode->i_blocks = ocfs2_inode_sector_count(inode); +- inode->i_atime.tv_sec = le64_to_cpu(fe->i_atime); +- inode->i_atime.tv_nsec = le32_to_cpu(fe->i_atime_nsec); +- inode->i_mtime.tv_sec = le64_to_cpu(fe->i_mtime); +- inode->i_mtime.tv_nsec = le32_to_cpu(fe->i_mtime_nsec); ++ inode_set_atime(inode, le64_to_cpu(fe->i_atime), ++ le32_to_cpu(fe->i_atime_nsec)); ++ inode_set_mtime(inode, le64_to_cpu(fe->i_mtime), ++ le32_to_cpu(fe->i_mtime_nsec)); + inode_set_ctime(inode, le64_to_cpu(fe->i_ctime), + le32_to_cpu(fe->i_ctime_nsec)); + +diff --git a/fs/ocfs2/move_extents.c b/fs/ocfs2/move_extents.c +index 05d67968a3a9e..1f9ed117e78b6 100644 +--- a/fs/ocfs2/move_extents.c ++++ b/fs/ocfs2/move_extents.c +@@ -951,8 +951,8 @@ static int ocfs2_move_extents(struct ocfs2_move_extents_context *context) + + di = (struct ocfs2_dinode *)di_bh->b_data; + inode_set_ctime_current(inode); +- di->i_ctime = cpu_to_le64(inode_get_ctime(inode).tv_sec); +- di->i_ctime_nsec = cpu_to_le32(inode_get_ctime(inode).tv_nsec); ++ di->i_ctime = cpu_to_le64(inode_get_ctime_sec(inode)); ++ di->i_ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); + ocfs2_update_inode_fsync_trans(handle, inode, 0); + + ocfs2_journal_dirty(handle, di_bh); +diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c +index 8e648073bf712..791fc5050e46b 100644 +--- a/fs/ocfs2/namei.c ++++ b/fs/ocfs2/namei.c +@@ -795,8 +795,8 @@ static int ocfs2_link(struct dentry *old_dentry, + inc_nlink(inode); + inode_set_ctime_current(inode); + ocfs2_set_links_count(fe, inode->i_nlink); +- fe->i_ctime = cpu_to_le64(inode_get_ctime(inode).tv_sec); +- fe->i_ctime_nsec = cpu_to_le32(inode_get_ctime(inode).tv_nsec); ++ fe->i_ctime = cpu_to_le64(inode_get_ctime_sec(inode)); ++ fe->i_ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); + ocfs2_journal_dirty(handle, fe_bh); + + err = ocfs2_add_entry(handle, dentry, inode, +@@ -995,7 +995,7 @@ static int ocfs2_unlink(struct inode *dir, + ocfs2_set_links_count(fe, inode->i_nlink); + ocfs2_journal_dirty(handle, fe_bh); + +- dir->i_mtime = inode_set_ctime_current(dir); ++ inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir)); + if (S_ISDIR(inode->i_mode)) + drop_nlink(dir); + +@@ -1550,8 +1550,8 @@ static int ocfs2_rename(struct mnt_idmap *idmap, + if (status >= 0) { + old_di = (struct ocfs2_dinode *) old_inode_bh->b_data; + +- old_di->i_ctime = cpu_to_le64(inode_get_ctime(old_inode).tv_sec); +- old_di->i_ctime_nsec = cpu_to_le32(inode_get_ctime(old_inode).tv_nsec); ++ old_di->i_ctime = cpu_to_le64(inode_get_ctime_sec(old_inode)); ++ old_di->i_ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(old_inode)); + ocfs2_journal_dirty(handle, old_inode_bh); + } else + mlog_errno(status); +@@ -1592,7 +1592,7 @@ static int ocfs2_rename(struct mnt_idmap *idmap, + drop_nlink(new_inode); + inode_set_ctime_current(new_inode); + } +- old_dir->i_mtime = inode_set_ctime_current(old_dir); ++ inode_set_mtime_to_ts(old_dir, inode_set_ctime_current(old_dir)); + + if (update_dot_dot) { + status = ocfs2_update_entry(old_inode, handle, +@@ -1614,8 +1614,8 @@ static int ocfs2_rename(struct mnt_idmap *idmap, + + if (old_dir != new_dir) { + /* Keep the same times on both directories.*/ +- new_dir->i_mtime = inode_set_ctime_to_ts(new_dir, +- inode_get_ctime(old_dir)); ++ inode_set_mtime_to_ts(new_dir, ++ inode_set_ctime_to_ts(new_dir, inode_get_ctime(old_dir))); + + /* + * This will also pick up the i_nlink change from the +diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c +index 25c8ec3c8c3a5..3f80a56d0d603 100644 +--- a/fs/ocfs2/refcounttree.c ++++ b/fs/ocfs2/refcounttree.c +@@ -3751,8 +3751,8 @@ static int ocfs2_change_ctime(struct inode *inode, + } + + inode_set_ctime_current(inode); +- di->i_ctime = cpu_to_le64(inode_get_ctime(inode).tv_sec); +- di->i_ctime_nsec = cpu_to_le32(inode_get_ctime(inode).tv_nsec); ++ di->i_ctime = cpu_to_le64(inode_get_ctime_sec(inode)); ++ di->i_ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); + + ocfs2_journal_dirty(handle, di_bh); + +@@ -4075,10 +4075,10 @@ static int ocfs2_complete_reflink(struct inode *s_inode, + */ + inode_set_ctime_current(t_inode); + +- di->i_ctime = cpu_to_le64(inode_get_ctime(t_inode).tv_sec); +- di->i_ctime_nsec = cpu_to_le32(inode_get_ctime(t_inode).tv_nsec); ++ di->i_ctime = cpu_to_le64(inode_get_ctime_sec(t_inode)); ++ di->i_ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(t_inode)); + +- t_inode->i_mtime = s_inode->i_mtime; ++ inode_set_mtime_to_ts(t_inode, inode_get_mtime(s_inode)); + di->i_mtime = s_di->i_mtime; + di->i_mtime_nsec = s_di->i_mtime_nsec; + } +@@ -4456,7 +4456,7 @@ int ocfs2_reflink_update_dest(struct inode *dest, + if (newlen > i_size_read(dest)) + i_size_write(dest, newlen); + spin_unlock(&OCFS2_I(dest)->ip_lock); +- dest->i_mtime = inode_set_ctime_current(dest); ++ inode_set_mtime_to_ts(dest, inode_set_ctime_current(dest)); + + ret = ocfs2_mark_inode_dirty(handle, dest, d_bh); + if (ret) { +diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c +index 6510ad783c912..b562cfef888ad 100644 +--- a/fs/ocfs2/xattr.c ++++ b/fs/ocfs2/xattr.c +@@ -3422,8 +3422,8 @@ static int __ocfs2_xattr_set_handle(struct inode *inode, + } + + inode_set_ctime_current(inode); +- di->i_ctime = cpu_to_le64(inode_get_ctime(inode).tv_sec); +- di->i_ctime_nsec = cpu_to_le32(inode_get_ctime(inode).tv_nsec); ++ di->i_ctime = cpu_to_le64(inode_get_ctime_sec(inode)); ++ di->i_ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); + ocfs2_journal_dirty(ctxt->handle, xis->inode_bh); + } + out: +-- +2.43.0 + diff --git a/queue-6.6/ocfs2-update-inode-fsync-transaction-id-in-ocfs2_unl.patch b/queue-6.6/ocfs2-update-inode-fsync-transaction-id-in-ocfs2_unl.patch new file mode 100644 index 00000000000..6d82c24f489 --- /dev/null +++ b/queue-6.6/ocfs2-update-inode-fsync-transaction-id-in-ocfs2_unl.patch @@ -0,0 +1,63 @@ +From cdbf6cb63b590cb2bd66935e386ca0b0e88b31f8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Apr 2024 16:20:40 +0800 +Subject: ocfs2: update inode fsync transaction id in ocfs2_unlink and + ocfs2_link + +From: Su Yue + +[ Upstream commit 8c40984eeb8804cffcd28640f427f4fe829243fc ] + +transaction id should be updated in ocfs2_unlink and ocfs2_link. +Otherwise, inode link will be wrong after journal replay even fsync was +called before power failure: +======================================================================= +$ touch testdir/bar +$ ln testdir/bar testdir/bar_link +$ fsync testdir/bar +$ stat -c %h $SCRATCH_MNT/testdir/bar +1 +$ stat -c %h $SCRATCH_MNT/testdir/bar +1 +======================================================================= + +Link: https://lkml.kernel.org/r/20240408082041.20925-4-glass.su@suse.com +Fixes: ccd979bdbce9 ("[PATCH] OCFS2: The Second Oracle Cluster Filesystem") +Signed-off-by: Su Yue +Reviewed-by: Joseph Qi +Cc: Changwei Ge +Cc: Gang He +Cc: Joel Becker +Cc: Jun Piao +Cc: Junxiao Bi +Cc: Mark Fasheh +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + fs/ocfs2/namei.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c +index 791fc5050e46b..21b3d5b9be603 100644 +--- a/fs/ocfs2/namei.c ++++ b/fs/ocfs2/namei.c +@@ -797,6 +797,7 @@ static int ocfs2_link(struct dentry *old_dentry, + ocfs2_set_links_count(fe, inode->i_nlink); + fe->i_ctime = cpu_to_le64(inode_get_ctime_sec(inode)); + fe->i_ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); ++ ocfs2_update_inode_fsync_trans(handle, inode, 0); + ocfs2_journal_dirty(handle, fe_bh); + + err = ocfs2_add_entry(handle, dentry, inode, +@@ -993,6 +994,7 @@ static int ocfs2_unlink(struct inode *dir, + drop_nlink(inode); + drop_nlink(inode); + ocfs2_set_links_count(fe, inode->i_nlink); ++ ocfs2_update_inode_fsync_trans(handle, inode, 0); + ocfs2_journal_dirty(handle, fe_bh); + + inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir)); +-- +2.43.0 + diff --git a/queue-6.6/perf-script-add-raw-disasm-arguments-to-insn-trace-o.patch b/queue-6.6/perf-script-add-raw-disasm-arguments-to-insn-trace-o.patch new file mode 100644 index 00000000000..00fdebe8bc4 --- /dev/null +++ b/queue-6.6/perf-script-add-raw-disasm-arguments-to-insn-trace-o.patch @@ -0,0 +1,102 @@ +From a2db02744c1efbe7bf2593565094500d6a7ad667 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 17 Feb 2024 15:40:45 +0800 +Subject: perf: script: add raw|disasm arguments to --insn-trace option + +From: Changbin Du + +[ Upstream commit 6750ba4b6442fa5ea4bf5c0e4b4ff8b0249ef71d ] + +Now '--insn-trace' accept a argument to specify the output format: + - raw: display raw instructions. + - disasm: display mnemonic instructions (if capstone is installed). + +$ sudo perf script --insn-trace=raw + ls 1443864 [006] 2275506.209908875: 7f216b426100 _start+0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) insn: 48 89 e7 + ls 1443864 [006] 2275506.209908875: 7f216b426103 _start+0x3 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) insn: e8 e8 0c 00 00 + ls 1443864 [006] 2275506.209908875: 7f216b426df0 _dl_start+0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) insn: f3 0f 1e fa + +$ sudo perf script --insn-trace=disasm + ls 1443864 [006] 2275506.209908875: 7f216b426100 _start+0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) movq %rsp, %rdi + ls 1443864 [006] 2275506.209908875: 7f216b426103 _start+0x3 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) callq _dl_start+0x0 + ls 1443864 [006] 2275506.209908875: 7f216b426df0 _dl_start+0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) illegal instruction + ls 1443864 [006] 2275506.209908875: 7f216b426df4 _dl_start+0x4 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) pushq %rbp + ls 1443864 [006] 2275506.209908875: 7f216b426df5 _dl_start+0x5 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) movq %rsp, %rbp + ls 1443864 [006] 2275506.209908875: 7f216b426df8 _dl_start+0x8 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) pushq %r15 + +Signed-off-by: Changbin Du +Reviewed-by: Adrian Hunter +Cc: changbin.du@gmail.com +Cc: Thomas Richter +Cc: Andi Kleen +Signed-off-by: Namhyung Kim +Link: https://lore.kernel.org/r/20240217074046.4100789-5-changbin.du@huawei.com +Stable-dep-of: d4a98b45fbe6 ("perf script: Show also errors for --insn-trace option") +Signed-off-by: Sasha Levin +--- + tools/perf/Documentation/perf-script.txt | 7 ++++--- + tools/perf/builtin-script.c | 22 ++++++++++++++++++---- + 2 files changed, 22 insertions(+), 7 deletions(-) + +diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt +index ff9a52e446884..66b633f3c6d26 100644 +--- a/tools/perf/Documentation/perf-script.txt ++++ b/tools/perf/Documentation/perf-script.txt +@@ -441,9 +441,10 @@ include::itrace.txt[] + will be printed. Each entry has function name and file/line. Enabled by + default, disable with --no-inline. + +---insn-trace:: +- Show instruction stream for intel_pt traces. Combine with --xed to +- show disassembly. ++--insn-trace[=]:: ++ Show instruction stream in bytes (raw) or disassembled (disasm) ++ for intel_pt traces. The default is 'raw'. To use xed, combine ++ 'raw' with --xed to show disassembly done by xed. + + --xed:: + Run xed disassembler on output. Requires installing the xed disassembler. +diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c +index 517bf25750c8b..c38e988c2a6d8 100644 +--- a/tools/perf/builtin-script.c ++++ b/tools/perf/builtin-script.c +@@ -3765,10 +3765,24 @@ static int perf_script__process_auxtrace_info(struct perf_session *session, + #endif + + static int parse_insn_trace(const struct option *opt __maybe_unused, +- const char *str __maybe_unused, +- int unset __maybe_unused) ++ const char *str, int unset __maybe_unused) + { +- parse_output_fields(NULL, "+insn,-event,-period", 0); ++ const char *fields = "+insn,-event,-period"; ++ int ret; ++ ++ if (str) { ++ if (strcmp(str, "disasm") == 0) ++ fields = "+disasm,-event,-period"; ++ else if (strlen(str) != 0 && strcmp(str, "raw") != 0) { ++ fprintf(stderr, "Only accept raw|disasm\n"); ++ return -EINVAL; ++ } ++ } ++ ++ ret = parse_output_fields(NULL, fields, 0); ++ if (ret < 0) ++ return ret; ++ + itrace_parse_synth_opts(opt, "i0ns", 0); + symbol_conf.nanosecs = true; + return 0; +@@ -3914,7 +3928,7 @@ int cmd_script(int argc, const char **argv) + "only consider these symbols"), + OPT_INTEGER(0, "addr-range", &symbol_conf.addr_range, + "Use with -S to list traced records within address range"), +- OPT_CALLBACK_OPTARG(0, "insn-trace", &itrace_synth_opts, NULL, NULL, ++ OPT_CALLBACK_OPTARG(0, "insn-trace", &itrace_synth_opts, NULL, "raw|disasm", + "Decode instructions from itrace", parse_insn_trace), + OPT_CALLBACK_OPTARG(0, "xed", NULL, NULL, NULL, + "Run xed disassembler on output", parse_xed), +-- +2.43.0 + diff --git a/queue-6.6/perf-script-show-also-errors-for-insn-trace-option.patch b/queue-6.6/perf-script-show-also-errors-for-insn-trace-option.patch new file mode 100644 index 00000000000..40dc9335721 --- /dev/null +++ b/queue-6.6/perf-script-show-also-errors-for-insn-trace-option.patch @@ -0,0 +1,46 @@ +From ae53c91d7a78899bb2348fe4146d25a2629ecbf7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Mar 2024 09:13:33 +0200 +Subject: perf script: Show also errors for --insn-trace option + +From: Adrian Hunter + +[ Upstream commit d4a98b45fbe6d06f4b79ed90d0bb05ced8674c23 ] + +The trace could be misleading if trace errors are not taken into +account, so display them also by adding the itrace "e" option. + +Note --call-trace and --call-ret-trace already add the itrace "e" +option. + +Fixes: b585ebdb5912cf14 ("perf script: Add --insn-trace for instruction decoding") +Reviewed-by: Andi Kleen +Signed-off-by: Adrian Hunter +Cc: Andi Kleen +Cc: Ian Rogers +Cc: Jiri Olsa +Cc: Namhyung Kim +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20240315071334.3478-1-adrian.hunter@intel.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/builtin-script.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c +index c38e988c2a6d8..f4f3ef90a4629 100644 +--- a/tools/perf/builtin-script.c ++++ b/tools/perf/builtin-script.c +@@ -3783,7 +3783,7 @@ static int parse_insn_trace(const struct option *opt __maybe_unused, + if (ret < 0) + return ret; + +- itrace_parse_synth_opts(opt, "i0ns", 0); ++ itrace_parse_synth_opts(opt, "i0nse", 0); + symbol_conf.nanosecs = true; + return 0; + } +-- +2.43.0 + diff --git a/queue-6.6/riscv-don-t-use-pgd-entries-for-the-linear-mapping.patch b/queue-6.6/riscv-don-t-use-pgd-entries-for-the-linear-mapping.patch new file mode 100644 index 00000000000..acf097c7328 --- /dev/null +++ b/queue-6.6/riscv-don-t-use-pgd-entries-for-the-linear-mapping.patch @@ -0,0 +1,55 @@ +From 7439b31cb004e1055fdb3861a74e41823e4b075f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Nov 2023 08:59:29 +0100 +Subject: riscv: Don't use PGD entries for the linear mapping + +From: Alexandre Ghiti + +[ Upstream commit 629db01c64ff6cea08fc61b52426362689ef8618 ] + +Propagating changes at this level is cumbersome as we need to go through +all the page tables when that happens (either when changing the +permissions or when splitting the mapping). + +Note that this prevents the use of 4MB mapping for sv32 and 1GB mapping for +sv39 in the linear mapping. + +Signed-off-by: Alexandre Ghiti +Link: https://lore.kernel.org/r/20231108075930.7157-2-alexghiti@rivosinc.com +Signed-off-by: Palmer Dabbelt +Stable-dep-of: c67ddf59ac44 ("riscv: force PAGE_SIZE linear mapping if debug_pagealloc is enabled") +Signed-off-by: Sasha Levin +--- + arch/riscv/mm/init.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c +index 83ac1eb8e7e68..4d62f54698b99 100644 +--- a/arch/riscv/mm/init.c ++++ b/arch/riscv/mm/init.c +@@ -668,16 +668,16 @@ void __init create_pgd_mapping(pgd_t *pgdp, + static uintptr_t __init best_map_size(phys_addr_t pa, uintptr_t va, + phys_addr_t size) + { +- if (!(pa & (PGDIR_SIZE - 1)) && !(va & (PGDIR_SIZE - 1)) && size >= PGDIR_SIZE) +- return PGDIR_SIZE; +- +- if (!(pa & (P4D_SIZE - 1)) && !(va & (P4D_SIZE - 1)) && size >= P4D_SIZE) ++ if (pgtable_l5_enabled && ++ !(pa & (P4D_SIZE - 1)) && !(va & (P4D_SIZE - 1)) && size >= P4D_SIZE) + return P4D_SIZE; + +- if (!(pa & (PUD_SIZE - 1)) && !(va & (PUD_SIZE - 1)) && size >= PUD_SIZE) ++ if (pgtable_l4_enabled && ++ !(pa & (PUD_SIZE - 1)) && !(va & (PUD_SIZE - 1)) && size >= PUD_SIZE) + return PUD_SIZE; + +- if (!(pa & (PMD_SIZE - 1)) && !(va & (PMD_SIZE - 1)) && size >= PMD_SIZE) ++ if (IS_ENABLED(CONFIG_64BIT) && ++ !(pa & (PMD_SIZE - 1)) && !(va & (PMD_SIZE - 1)) && size >= PMD_SIZE) + return PMD_SIZE; + + return PAGE_SIZE; +-- +2.43.0 + diff --git a/queue-6.6/riscv-force-page_size-linear-mapping-if-debug_pageal.patch b/queue-6.6/riscv-force-page_size-linear-mapping-if-debug_pageal.patch new file mode 100644 index 00000000000..145ec1921a9 --- /dev/null +++ b/queue-6.6/riscv-force-page_size-linear-mapping-if-debug_pageal.patch @@ -0,0 +1,53 @@ +From 4ba20a44587da91fc9d0b0e578d81ff2ea21e602 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 May 2024 07:50:39 +0200 +Subject: riscv: force PAGE_SIZE linear mapping if debug_pagealloc is enabled + +From: Nam Cao + +[ Upstream commit c67ddf59ac44adc60649730bf8347e37c516b001 ] + +debug_pagealloc is a debug feature which clears the valid bit in page table +entry for freed pages to detect illegal accesses to freed memory. + +For this feature to work, virtual mapping must have PAGE_SIZE resolution. +(No, we cannot map with huge pages and split them only when needed; because +pages can be allocated/freed in atomic context and page splitting cannot be +done in atomic context) + +Force linear mapping to use small pages if debug_pagealloc is enabled. + +Note that it is not necessary to force the entire linear mapping, but only +those that are given to memory allocator. Some parts of memory can keep +using huge page mapping (for example, kernel's executable code). But these +parts are minority, so keep it simple. This is just a debug feature, some +extra overhead should be acceptable. + +Fixes: 5fde3db5eb02 ("riscv: add ARCH_SUPPORTS_DEBUG_PAGEALLOC support") +Signed-off-by: Nam Cao +Cc: stable@vger.kernel.org +Reviewed-by: Alexandre Ghiti +Link: https://lore.kernel.org/r/2e391fa6c6f9b3fcf1b41cefbace02ee4ab4bf59.1715750938.git.namcao@linutronix.de +Signed-off-by: Palmer Dabbelt +Signed-off-by: Sasha Levin +--- + arch/riscv/mm/init.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c +index 4d62f54698b99..8adcb9419ad50 100644 +--- a/arch/riscv/mm/init.c ++++ b/arch/riscv/mm/init.c +@@ -668,6 +668,9 @@ void __init create_pgd_mapping(pgd_t *pgdp, + static uintptr_t __init best_map_size(phys_addr_t pa, uintptr_t va, + phys_addr_t size) + { ++ if (debug_pagealloc_enabled()) ++ return PAGE_SIZE; ++ + if (pgtable_l5_enabled && + !(pa & (P4D_SIZE - 1)) && !(va & (P4D_SIZE - 1)) && size >= P4D_SIZE) + return P4D_SIZE; +-- +2.43.0 + diff --git a/queue-6.6/series b/queue-6.6/series index 9981d2fd5dd..c8a12a11867 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -175,3 +175,19 @@ dt-bindings-i2c-google-cros-ec-i2c-tunnel-correct-path-to-i2c-controller-schema. spi-stm32-qspi-fix-dual-flash-mode-sanity-test-in-stm32_qspi_setup.patch arm64-dts-imx8qm-mek-fix-gpio-number-for-reg_usdhc2_vmmc.patch spi-stm32-qspi-clamp-stm32_qspi_get_mode-output-to-ccr_buswidth_4.patch +perf-script-add-raw-disasm-arguments-to-insn-trace-o.patch +perf-script-show-also-errors-for-insn-trace-option.patch +wifi-rtl8xxxu-enable-mfp-support-with-security-flag-.patch +ocfs2-convert-to-new-timestamp-accessors.patch +ocfs2-update-inode-fsync-transaction-id-in-ocfs2_unl.patch +nbd-improve-the-documentation-of-the-locking-assumpt.patch +nbd-fix-signal-handling.patch +tracing-add-module_description-to-preemptirq_delay_t.patch +x86-cpu-vfm-add-new-macros-to-work-with-vendor-famil.patch +x86-cpu-fix-x86_match_cpu-to-match-just-x86_vendor_i.patch +riscv-don-t-use-pgd-entries-for-the-linear-mapping.patch +riscv-force-page_size-linear-mapping-if-debug_pageal.patch +vgacon-rework-screen_info-ifdef-checks.patch +efi-move-screen_info-into-efi-init-code.patch +efi-loongarch-directly-position-the-loaded-image-fil.patch +loongarch-fix-entry-point-in-kernel-image-header.patch diff --git a/queue-6.6/tracing-add-module_description-to-preemptirq_delay_t.patch b/queue-6.6/tracing-add-module_description-to-preemptirq_delay_t.patch new file mode 100644 index 00000000000..65966e6128b --- /dev/null +++ b/queue-6.6/tracing-add-module_description-to-preemptirq_delay_t.patch @@ -0,0 +1,39 @@ +From 2023fdf271d4d4455bcc6a9b973dd59248fd6c00 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 18 May 2024 15:54:49 -0700 +Subject: tracing: Add MODULE_DESCRIPTION() to preemptirq_delay_test + +From: Jeff Johnson + +[ Upstream commit 23748e3e0fbfe471eff5ce439921629f6a427828 ] + +Fix the 'make W=1' warning: + +WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/trace/preemptirq_delay_test.o + +Link: https://lore.kernel.org/linux-trace-kernel/20240518-md-preemptirq_delay_test-v1-1-387d11b30d85@quicinc.com + +Cc: stable@vger.kernel.org +Cc: Mathieu Desnoyers +Fixes: f96e8577da10 ("lib: Add module for testing preemptoff/irqsoff latency tracers") +Acked-by: Masami Hiramatsu (Google) +Signed-off-by: Jeff Johnson +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + kernel/trace/preemptirq_delay_test.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/kernel/trace/preemptirq_delay_test.c b/kernel/trace/preemptirq_delay_test.c +index 8c4ffd0761624..cb0871fbdb07f 100644 +--- a/kernel/trace/preemptirq_delay_test.c ++++ b/kernel/trace/preemptirq_delay_test.c +@@ -215,4 +215,5 @@ static void __exit preemptirq_delay_exit(void) + + module_init(preemptirq_delay_init) + module_exit(preemptirq_delay_exit) ++MODULE_DESCRIPTION("Preempt / IRQ disable delay thread to test latency tracers"); + MODULE_LICENSE("GPL v2"); +-- +2.43.0 + diff --git a/queue-6.6/vgacon-rework-screen_info-ifdef-checks.patch b/queue-6.6/vgacon-rework-screen_info-ifdef-checks.patch new file mode 100644 index 00000000000..8ffcb730718 --- /dev/null +++ b/queue-6.6/vgacon-rework-screen_info-ifdef-checks.patch @@ -0,0 +1,193 @@ +From 2308335c9e67c59eaab288cdd7198dabe939c268 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 9 Oct 2023 23:18:38 +0200 +Subject: vgacon: rework screen_info #ifdef checks + +From: Arnd Bergmann + +[ Upstream commit 8a736ddfc861b2a217c935c2f461a8004add8247 ] + +On non-x86 architectures, the screen_info variable is generally only +used for the VGA console where supported, and in some cases the EFI +framebuffer or vga16fb. + +Now that we have a definite list of which architectures actually use it +for what, use consistent #ifdef checks so the global variable is only +defined when it is actually used on those architectures. + +Loongarch and riscv have no support for vgacon or vga16fb, but +they support EFI firmware, so only that needs to be checked, and the +initialization can be removed because that is handled by EFI. +IA64 has both vgacon and EFI, though EFI apparently never uses +a framebuffer here. + +Reviewed-by: Javier Martinez Canillas +Reviewed-by: Thomas Zimmermann +Reviewed-by: Khalid Aziz +Acked-by: Helge Deller +Signed-off-by: Arnd Bergmann +Link: https://lore.kernel.org/r/20231009211845.3136536-3-arnd@kernel.org +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: beb2800074c1 ("LoongArch: Fix entry point in kernel image header") +Signed-off-by: Sasha Levin +--- + arch/alpha/kernel/setup.c | 2 ++ + arch/alpha/kernel/sys_sio.c | 2 ++ + arch/ia64/kernel/setup.c | 6 ++++++ + arch/loongarch/kernel/setup.c | 2 ++ + arch/mips/kernel/setup.c | 2 +- + arch/mips/sibyte/swarm/setup.c | 2 +- + arch/mips/sni/setup.c | 2 +- + arch/riscv/kernel/setup.c | 11 ++--------- + 8 files changed, 17 insertions(+), 12 deletions(-) + +diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c +index c80258ec332ff..85a679ce061c2 100644 +--- a/arch/alpha/kernel/setup.c ++++ b/arch/alpha/kernel/setup.c +@@ -131,6 +131,7 @@ static void determine_cpu_caches (unsigned int); + + static char __initdata command_line[COMMAND_LINE_SIZE]; + ++#ifdef CONFIG_VGA_CONSOLE + /* + * The format of "screen_info" is strange, and due to early + * i386-setup code. This is just enough to make the console +@@ -147,6 +148,7 @@ struct screen_info screen_info = { + }; + + EXPORT_SYMBOL(screen_info); ++#endif + + /* + * The direct map I/O window, if any. This should be the same +diff --git a/arch/alpha/kernel/sys_sio.c b/arch/alpha/kernel/sys_sio.c +index 7c420d8dac53d..7de8a5d2d2066 100644 +--- a/arch/alpha/kernel/sys_sio.c ++++ b/arch/alpha/kernel/sys_sio.c +@@ -57,11 +57,13 @@ sio_init_irq(void) + static inline void __init + alphabook1_init_arch(void) + { ++#ifdef CONFIG_VGA_CONSOLE + /* The AlphaBook1 has LCD video fixed at 800x600, + 37 rows and 100 cols. */ + screen_info.orig_y = 37; + screen_info.orig_video_cols = 100; + screen_info.orig_video_lines = 37; ++#endif + + lca_init_arch(); + } +diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c +index 5a55ac82c13a4..d2c66efdde560 100644 +--- a/arch/ia64/kernel/setup.c ++++ b/arch/ia64/kernel/setup.c +@@ -86,9 +86,13 @@ EXPORT_SYMBOL(local_per_cpu_offset); + #endif + unsigned long ia64_cycles_per_usec; + struct ia64_boot_param *ia64_boot_param; ++#if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_EFI) + struct screen_info screen_info; ++#endif ++#ifdef CONFIG_VGA_CONSOLE + unsigned long vga_console_iobase; + unsigned long vga_console_membase; ++#endif + + static struct resource data_resource = { + .name = "Kernel data", +@@ -497,6 +501,7 @@ early_console_setup (char *cmdline) + static void __init + screen_info_setup(void) + { ++#ifdef CONFIG_VGA_CONSOLE + unsigned int orig_x, orig_y, num_cols, num_rows, font_height; + + memset(&screen_info, 0, sizeof(screen_info)); +@@ -525,6 +530,7 @@ screen_info_setup(void) + screen_info.orig_video_mode = 3; /* XXX fake */ + screen_info.orig_video_isVGA = 1; /* XXX fake */ + screen_info.orig_video_ega_bx = 3; /* XXX fake */ ++#endif + } + + static inline void +diff --git a/arch/loongarch/kernel/setup.c b/arch/loongarch/kernel/setup.c +index d7409a3e67a53..6748d7f3f2219 100644 +--- a/arch/loongarch/kernel/setup.c ++++ b/arch/loongarch/kernel/setup.c +@@ -57,7 +57,9 @@ + #define SMBIOS_CORE_PACKAGE_OFFSET 0x23 + #define LOONGSON_EFI_ENABLE (1 << 3) + ++#ifdef CONFIG_EFI + struct screen_info screen_info __section(".data"); ++#endif + + unsigned long fw_arg0, fw_arg1, fw_arg2; + DEFINE_PER_CPU(unsigned long, kernelsp); +diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c +index f88a2f83c5eac..3f45b72561db9 100644 +--- a/arch/mips/kernel/setup.c ++++ b/arch/mips/kernel/setup.c +@@ -54,7 +54,7 @@ struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly; + + EXPORT_SYMBOL(cpu_data); + +-#ifdef CONFIG_VT ++#ifdef CONFIG_VGA_CONSOLE + struct screen_info screen_info; + #endif + +diff --git a/arch/mips/sibyte/swarm/setup.c b/arch/mips/sibyte/swarm/setup.c +index 76683993cdd3a..37df504d3ecbb 100644 +--- a/arch/mips/sibyte/swarm/setup.c ++++ b/arch/mips/sibyte/swarm/setup.c +@@ -129,7 +129,7 @@ void __init plat_mem_setup(void) + if (m41t81_probe()) + swarm_rtc_type = RTC_M41T81; + +-#ifdef CONFIG_VT ++#ifdef CONFIG_VGA_CONSOLE + screen_info = (struct screen_info) { + .orig_video_page = 52, + .orig_video_mode = 3, +diff --git a/arch/mips/sni/setup.c b/arch/mips/sni/setup.c +index efad85c8c823b..9984cf91be7d0 100644 +--- a/arch/mips/sni/setup.c ++++ b/arch/mips/sni/setup.c +@@ -38,7 +38,7 @@ extern void sni_machine_power_off(void); + + static void __init sni_display_setup(void) + { +-#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE) && defined(CONFIG_FW_ARC) ++#if defined(CONFIG_VGA_CONSOLE) && defined(CONFIG_FW_ARC) + struct screen_info *si = &screen_info; + DISPLAY_STATUS *di; + +diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c +index e600aab116a40..ddadee6621f0d 100644 +--- a/arch/riscv/kernel/setup.c ++++ b/arch/riscv/kernel/setup.c +@@ -40,15 +40,8 @@ + + #include "head.h" + +-#if defined(CONFIG_DUMMY_CONSOLE) || defined(CONFIG_EFI) +-struct screen_info screen_info __section(".data") = { +- .orig_video_lines = 30, +- .orig_video_cols = 80, +- .orig_video_mode = 0, +- .orig_video_ega_bx = 0, +- .orig_video_isVGA = 1, +- .orig_video_points = 8 +-}; ++#if defined(CONFIG_EFI) ++struct screen_info screen_info __section(".data"); + #endif + + /* +-- +2.43.0 + diff --git a/queue-6.6/wifi-rtl8xxxu-enable-mfp-support-with-security-flag-.patch b/queue-6.6/wifi-rtl8xxxu-enable-mfp-support-with-security-flag-.patch new file mode 100644 index 00000000000..2dd6169cbc8 --- /dev/null +++ b/queue-6.6/wifi-rtl8xxxu-enable-mfp-support-with-security-flag-.patch @@ -0,0 +1,85 @@ +From 99f449e09d5d13bd3e6597b24e57e64c3e65c8e3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 18 Apr 2024 09:18:13 +0200 +Subject: wifi: rtl8xxxu: enable MFP support with security flag of RX + descriptor + +From: Martin Kaistra + +[ Upstream commit cbfbb4ddbc8503478e0a138f9a31f61686cc5f11 ] + +In order to connect to networks which require 802.11w, add the +MFP_CAPABLE flag and let mac80211 do the actual crypto in software. + +When a robust management frame is received, rx_dec->swdec is not set, +even though the HW did not decrypt it. Extend the check and don't set +RX_FLAG_DECRYPTED for these frames in order to use SW decryption. + +Use the security flag in the RX descriptor for this purpose, like it is +done in the rtw88 driver. + +Cc: stable@vger.kernel.org +Signed-off-by: Martin Kaistra +Signed-off-by: Ping-Ke Shih +Link: https://msgid.link/20240418071813.1883174-3-martin.kaistra@linutronix.de +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 9 +++++++++ + drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 7 +++++-- + 2 files changed, 14 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h +index 4695fb4e2d2db..af541e52e683b 100644 +--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h ++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h +@@ -121,6 +121,15 @@ enum rtl8xxxu_rx_type { + RX_TYPE_ERROR = -1 + }; + ++enum rtl8xxxu_rx_desc_enc { ++ RX_DESC_ENC_NONE = 0, ++ RX_DESC_ENC_WEP40 = 1, ++ RX_DESC_ENC_TKIP_WO_MIC = 2, ++ RX_DESC_ENC_TKIP_MIC = 3, ++ RX_DESC_ENC_AES = 4, ++ RX_DESC_ENC_WEP104 = 5, ++}; ++ + struct rtl8xxxu_rxdesc16 { + #ifdef __LITTLE_ENDIAN + u32 pktlen:14; +diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +index 5422f8da29e61..6e47dde938909 100644 +--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c ++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +@@ -6319,7 +6319,8 @@ int rtl8xxxu_parse_rxdesc16(struct rtl8xxxu_priv *priv, struct sk_buff *skb) + rx_status->mactime = rx_desc->tsfl; + rx_status->flag |= RX_FLAG_MACTIME_START; + +- if (!rx_desc->swdec) ++ if (!rx_desc->swdec && ++ rx_desc->security != RX_DESC_ENC_NONE) + rx_status->flag |= RX_FLAG_DECRYPTED; + if (rx_desc->crc32) + rx_status->flag |= RX_FLAG_FAILED_FCS_CRC; +@@ -6419,7 +6420,8 @@ int rtl8xxxu_parse_rxdesc24(struct rtl8xxxu_priv *priv, struct sk_buff *skb) + rx_status->mactime = rx_desc->tsfl; + rx_status->flag |= RX_FLAG_MACTIME_START; + +- if (!rx_desc->swdec) ++ if (!rx_desc->swdec && ++ rx_desc->security != RX_DESC_ENC_NONE) + rx_status->flag |= RX_FLAG_DECRYPTED; + if (rx_desc->crc32) + rx_status->flag |= RX_FLAG_FAILED_FCS_CRC; +@@ -7654,6 +7656,7 @@ static int rtl8xxxu_probe(struct usb_interface *interface, + ieee80211_hw_set(hw, HAS_RATE_CONTROL); + ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); + ieee80211_hw_set(hw, AMPDU_AGGREGATION); ++ ieee80211_hw_set(hw, MFP_CAPABLE); + + wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); + +-- +2.43.0 + diff --git a/queue-6.6/x86-cpu-fix-x86_match_cpu-to-match-just-x86_vendor_i.patch b/queue-6.6/x86-cpu-fix-x86_match_cpu-to-match-just-x86_vendor_i.patch new file mode 100644 index 00000000000..f9d1372ba1c --- /dev/null +++ b/queue-6.6/x86-cpu-fix-x86_match_cpu-to-match-just-x86_vendor_i.patch @@ -0,0 +1,175 @@ +From 481b1aa9e330c2936260bb9d8681aa1b891eacd2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 May 2024 15:45:33 -0700 +Subject: x86/cpu: Fix x86_match_cpu() to match just X86_VENDOR_INTEL + +From: Tony Luck + +[ Upstream commit 93022482b2948a9a7e9b5a2bb685f2e1cb4c3348 ] + +Code in v6.9 arch/x86/kernel/smpboot.c was changed by commit + + 4db64279bc2b ("x86/cpu: Switch to new Intel CPU model defines") from: + + static const struct x86_cpu_id intel_cod_cpu[] = { + X86_MATCH_INTEL_FAM6_MODEL(HASWELL_X, 0), /* COD */ + X86_MATCH_INTEL_FAM6_MODEL(BROADWELL_X, 0), /* COD */ + X86_MATCH_INTEL_FAM6_MODEL(ANY, 1), /* SNC */ <--- 443 + {} + }; + + static bool match_llc(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) + { + const struct x86_cpu_id *id = x86_match_cpu(intel_cod_cpu); + +to: + + static const struct x86_cpu_id intel_cod_cpu[] = { + X86_MATCH_VFM(INTEL_HASWELL_X, 0), /* COD */ + X86_MATCH_VFM(INTEL_BROADWELL_X, 0), /* COD */ + X86_MATCH_VFM(INTEL_ANY, 1), /* SNC */ + {} + }; + + static bool match_llc(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) + { + const struct x86_cpu_id *id = x86_match_cpu(intel_cod_cpu); + +On an Intel CPU with SNC enabled this code previously matched the rule on line +443 to avoid printing messages about insane cache configuration. The new code +did not match any rules. + +Expanding the macros for the intel_cod_cpu[] array shows that the old is +equivalent to: + + static const struct x86_cpu_id intel_cod_cpu[] = { + [0] = { .vendor = 0, .family = 6, .model = 0x3F, .steppings = 0, .feature = 0, .driver_data = 0 }, + [1] = { .vendor = 0, .family = 6, .model = 0x4F, .steppings = 0, .feature = 0, .driver_data = 0 }, + [2] = { .vendor = 0, .family = 6, .model = 0x00, .steppings = 0, .feature = 0, .driver_data = 1 }, + [3] = { .vendor = 0, .family = 0, .model = 0x00, .steppings = 0, .feature = 0, .driver_data = 0 } + } + +while the new code expands to: + + static const struct x86_cpu_id intel_cod_cpu[] = { + [0] = { .vendor = 0, .family = 6, .model = 0x3F, .steppings = 0, .feature = 0, .driver_data = 0 }, + [1] = { .vendor = 0, .family = 6, .model = 0x4F, .steppings = 0, .feature = 0, .driver_data = 0 }, + [2] = { .vendor = 0, .family = 0, .model = 0x00, .steppings = 0, .feature = 0, .driver_data = 1 }, + [3] = { .vendor = 0, .family = 0, .model = 0x00, .steppings = 0, .feature = 0, .driver_data = 0 } + } + +Looking at the code for x86_match_cpu(): + + const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match) + { + const struct x86_cpu_id *m; + struct cpuinfo_x86 *c = &boot_cpu_data; + + for (m = match; + m->vendor | m->family | m->model | m->steppings | m->feature; + m++) { + ... + } + return NULL; + +it is clear that there was no match because the ANY entry in the table (array +index 2) is now the loop termination condition (all of vendor, family, model, +steppings, and feature are zero). + +So this code was working before because the "ANY" check was looking for any +Intel CPU in family 6. But fails now because the family is a wild card. So the +root cause is that x86_match_cpu() has never been able to match on a rule with +just X86_VENDOR_INTEL and all other fields set to wildcards. + +Add a new flags field to struct x86_cpu_id that has a bit set to indicate that +this entry in the array is valid. Update X86_MATCH*() macros to set that bit. +Change the end-marker check in x86_match_cpu() to just check the flags field +for this bit. + +Backporter notes: The commit in Fixes is really the one that is broken: +you can't have m->vendor as part of the loop termination conditional in +x86_match_cpu() because it can happen - as it has happened above +- that that whole conditional is 0 albeit vendor == 0 is a valid case +- X86_VENDOR_INTEL is 0. + +However, the only case where the above happens is the SNC check added by +4db64279bc2b1 so you only need this fix if you have backported that +other commit + + 4db64279bc2b ("x86/cpu: Switch to new Intel CPU model defines") + +Fixes: 644e9cbbe3fc ("Add driver auto probing for x86 features v4") +Suggested-by: Thomas Gleixner +Suggested-by: Borislav Petkov +Signed-off-by: Tony Luck +Signed-off-by: Borislav Petkov (AMD) +Cc: # see above +Link: https://lore.kernel.org/r/20240517144312.GBZkdtAOuJZCvxhFbJ@fat_crate.local +Signed-off-by: Sasha Levin +--- + arch/x86/include/asm/cpu_device_id.h | 5 +++++ + arch/x86/kernel/cpu/match.c | 4 +--- + include/linux/mod_devicetable.h | 2 ++ + 3 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/arch/x86/include/asm/cpu_device_id.h b/arch/x86/include/asm/cpu_device_id.h +index dd7b9463696f5..e8e3dbe7f1730 100644 +--- a/arch/x86/include/asm/cpu_device_id.h ++++ b/arch/x86/include/asm/cpu_device_id.h +@@ -53,6 +53,9 @@ + #define X86_CENTAUR_FAM6_C7_D 0xd + #define X86_CENTAUR_FAM6_NANO 0xf + ++/* x86_cpu_id::flags */ ++#define X86_CPU_ID_FLAG_ENTRY_VALID BIT(0) ++ + #define X86_STEPPINGS(mins, maxs) GENMASK(maxs, mins) + /** + * X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE - Base macro for CPU matching +@@ -79,6 +82,7 @@ + .model = _model, \ + .steppings = _steppings, \ + .feature = _feature, \ ++ .flags = X86_CPU_ID_FLAG_ENTRY_VALID, \ + .driver_data = (unsigned long) _data \ + } + +@@ -89,6 +93,7 @@ + .model = _model, \ + .steppings = _steppings, \ + .feature = _feature, \ ++ .flags = X86_CPU_ID_FLAG_ENTRY_VALID, \ + .driver_data = (unsigned long) _data \ + } + +diff --git a/arch/x86/kernel/cpu/match.c b/arch/x86/kernel/cpu/match.c +index ad6776081e60d..ae71b8ef909c9 100644 +--- a/arch/x86/kernel/cpu/match.c ++++ b/arch/x86/kernel/cpu/match.c +@@ -39,9 +39,7 @@ const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match) + const struct x86_cpu_id *m; + struct cpuinfo_x86 *c = &boot_cpu_data; + +- for (m = match; +- m->vendor | m->family | m->model | m->steppings | m->feature; +- m++) { ++ for (m = match; m->flags & X86_CPU_ID_FLAG_ENTRY_VALID; m++) { + if (m->vendor != X86_VENDOR_ANY && c->x86_vendor != m->vendor) + continue; + if (m->family != X86_FAMILY_ANY && c->x86 != m->family) +diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h +index b0678b093cb27..0f51bc24ae595 100644 +--- a/include/linux/mod_devicetable.h ++++ b/include/linux/mod_devicetable.h +@@ -690,6 +690,8 @@ struct x86_cpu_id { + __u16 model; + __u16 steppings; + __u16 feature; /* bit index */ ++ /* Solely for kernel-internal use: DO NOT EXPORT to userspace! */ ++ __u16 flags; + kernel_ulong_t driver_data; + }; + +-- +2.43.0 + diff --git a/queue-6.6/x86-cpu-vfm-add-new-macros-to-work-with-vendor-famil.patch b/queue-6.6/x86-cpu-vfm-add-new-macros-to-work-with-vendor-famil.patch new file mode 100644 index 00000000000..be7d5d9b5a5 --- /dev/null +++ b/queue-6.6/x86-cpu-vfm-add-new-macros-to-work-with-vendor-famil.patch @@ -0,0 +1,146 @@ +From 3f95f52ff7aae97ab92e952b276de875c54218b7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Apr 2024 14:19:04 -0700 +Subject: x86/cpu/vfm: Add new macros to work with (vendor/family/model) values + +From: Tony Luck + +[ Upstream commit e6dfdc2e89a0adedf455814c91b977d6a584cc88 ] + +To avoid adding a slew of new macros for each new Intel CPU family +switch over from providing CPU model number #defines to a new +scheme that encodes vendor, family, and model in a single number. + + [ bp: s/casted/cast/g ] + +Signed-off-by: Tony Luck +Signed-off-by: Borislav Petkov (AMD) +Reviewed-by: Thomas Gleixner +Link: https://lore.kernel.org/r/20240416211941.9369-3-tony.luck@intel.com +Stable-dep-of: 93022482b294 ("x86/cpu: Fix x86_match_cpu() to match just X86_VENDOR_INTEL") +Signed-off-by: Sasha Levin +--- + arch/x86/include/asm/cpu_device_id.h | 93 ++++++++++++++++++++++++++++ + 1 file changed, 93 insertions(+) + +diff --git a/arch/x86/include/asm/cpu_device_id.h b/arch/x86/include/asm/cpu_device_id.h +index eb8fcede9e3bf..dd7b9463696f5 100644 +--- a/arch/x86/include/asm/cpu_device_id.h ++++ b/arch/x86/include/asm/cpu_device_id.h +@@ -2,6 +2,39 @@ + #ifndef _ASM_X86_CPU_DEVICE_ID + #define _ASM_X86_CPU_DEVICE_ID + ++/* ++ * Can't use because it generates expressions that ++ * cannot be used in structure initializers. Bitfield construction ++ * here must match the union in struct cpuinfo_86: ++ * union { ++ * struct { ++ * __u8 x86_model; ++ * __u8 x86; ++ * __u8 x86_vendor; ++ * __u8 x86_reserved; ++ * }; ++ * __u32 x86_vfm; ++ * }; ++ */ ++#define VFM_MODEL_BIT 0 ++#define VFM_FAMILY_BIT 8 ++#define VFM_VENDOR_BIT 16 ++#define VFM_RSVD_BIT 24 ++ ++#define VFM_MODEL_MASK GENMASK(VFM_FAMILY_BIT - 1, VFM_MODEL_BIT) ++#define VFM_FAMILY_MASK GENMASK(VFM_VENDOR_BIT - 1, VFM_FAMILY_BIT) ++#define VFM_VENDOR_MASK GENMASK(VFM_RSVD_BIT - 1, VFM_VENDOR_BIT) ++ ++#define VFM_MODEL(vfm) (((vfm) & VFM_MODEL_MASK) >> VFM_MODEL_BIT) ++#define VFM_FAMILY(vfm) (((vfm) & VFM_FAMILY_MASK) >> VFM_FAMILY_BIT) ++#define VFM_VENDOR(vfm) (((vfm) & VFM_VENDOR_MASK) >> VFM_VENDOR_BIT) ++ ++#define VFM_MAKE(_vendor, _family, _model) ( \ ++ ((_model) << VFM_MODEL_BIT) | \ ++ ((_family) << VFM_FAMILY_BIT) | \ ++ ((_vendor) << VFM_VENDOR_BIT) \ ++) ++ + /* + * Declare drivers belonging to specific x86 CPUs + * Similar in spirit to pci_device_id and related PCI functions +@@ -49,6 +82,16 @@ + .driver_data = (unsigned long) _data \ + } + ++#define X86_MATCH_VENDORID_FAM_MODEL_STEPPINGS_FEATURE(_vendor, _family, _model, \ ++ _steppings, _feature, _data) { \ ++ .vendor = _vendor, \ ++ .family = _family, \ ++ .model = _model, \ ++ .steppings = _steppings, \ ++ .feature = _feature, \ ++ .driver_data = (unsigned long) _data \ ++} ++ + /** + * X86_MATCH_VENDOR_FAM_MODEL_FEATURE - Macro for CPU matching + * @_vendor: The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY +@@ -164,6 +207,56 @@ + X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE(INTEL, 6, INTEL_FAM6_##model, \ + steppings, X86_FEATURE_ANY, data) + ++/** ++ * X86_MATCH_VFM - Match encoded vendor/family/model ++ * @vfm: Encoded 8-bits each for vendor, family, model ++ * @data: Driver specific data or NULL. The internal storage ++ * format is unsigned long. The supplied value, pointer ++ * etc. is cast to unsigned long internally. ++ * ++ * Stepping and feature are set to wildcards ++ */ ++#define X86_MATCH_VFM(vfm, data) \ ++ X86_MATCH_VENDORID_FAM_MODEL_STEPPINGS_FEATURE( \ ++ VFM_VENDOR(vfm), \ ++ VFM_FAMILY(vfm), \ ++ VFM_MODEL(vfm), \ ++ X86_STEPPING_ANY, X86_FEATURE_ANY, data) ++ ++/** ++ * X86_MATCH_VFM_STEPPINGS - Match encoded vendor/family/model/stepping ++ * @vfm: Encoded 8-bits each for vendor, family, model ++ * @steppings: Bitmask of steppings to match ++ * @data: Driver specific data or NULL. The internal storage ++ * format is unsigned long. The supplied value, pointer ++ * etc. is cast to unsigned long internally. ++ * ++ * feature is set to wildcard ++ */ ++#define X86_MATCH_VFM_STEPPINGS(vfm, steppings, data) \ ++ X86_MATCH_VENDORID_FAM_MODEL_STEPPINGS_FEATURE( \ ++ VFM_VENDOR(vfm), \ ++ VFM_FAMILY(vfm), \ ++ VFM_MODEL(vfm), \ ++ steppings, X86_FEATURE_ANY, data) ++ ++/** ++ * X86_MATCH_VFM_FEATURE - Match encoded vendor/family/model/feature ++ * @vfm: Encoded 8-bits each for vendor, family, model ++ * @feature: A X86_FEATURE bit ++ * @data: Driver specific data or NULL. The internal storage ++ * format is unsigned long. The supplied value, pointer ++ * etc. is cast to unsigned long internally. ++ * ++ * Steppings is set to wildcard ++ */ ++#define X86_MATCH_VFM_FEATURE(vfm, feature, data) \ ++ X86_MATCH_VENDORID_FAM_MODEL_STEPPINGS_FEATURE( \ ++ VFM_VENDOR(vfm), \ ++ VFM_FAMILY(vfm), \ ++ VFM_MODEL(vfm), \ ++ X86_STEPPING_ANY, feature, data) ++ + /* + * Match specific microcode revisions. + * +-- +2.43.0 +