]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 6.6
authorSasha Levin <sashal@kernel.org>
Tue, 25 Jun 2024 03:25:02 +0000 (23:25 -0400)
committerSasha Levin <sashal@kernel.org>
Tue, 25 Jun 2024 03:25:02 +0000 (23:25 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
17 files changed:
queue-6.6/efi-loongarch-directly-position-the-loaded-image-fil.patch [new file with mode: 0644]
queue-6.6/efi-move-screen_info-into-efi-init-code.patch [new file with mode: 0644]
queue-6.6/loongarch-fix-entry-point-in-kernel-image-header.patch [new file with mode: 0644]
queue-6.6/nbd-fix-signal-handling.patch [new file with mode: 0644]
queue-6.6/nbd-improve-the-documentation-of-the-locking-assumpt.patch [new file with mode: 0644]
queue-6.6/ocfs2-convert-to-new-timestamp-accessors.patch [new file with mode: 0644]
queue-6.6/ocfs2-update-inode-fsync-transaction-id-in-ocfs2_unl.patch [new file with mode: 0644]
queue-6.6/perf-script-add-raw-disasm-arguments-to-insn-trace-o.patch [new file with mode: 0644]
queue-6.6/perf-script-show-also-errors-for-insn-trace-option.patch [new file with mode: 0644]
queue-6.6/riscv-don-t-use-pgd-entries-for-the-linear-mapping.patch [new file with mode: 0644]
queue-6.6/riscv-force-page_size-linear-mapping-if-debug_pageal.patch [new file with mode: 0644]
queue-6.6/series
queue-6.6/tracing-add-module_description-to-preemptirq_delay_t.patch [new file with mode: 0644]
queue-6.6/vgacon-rework-screen_info-ifdef-checks.patch [new file with mode: 0644]
queue-6.6/wifi-rtl8xxxu-enable-mfp-support-with-security-flag-.patch [new file with mode: 0644]
queue-6.6/x86-cpu-fix-x86_match_cpu-to-match-just-x86_vendor_i.patch [new file with mode: 0644]
queue-6.6/x86-cpu-vfm-add-new-macros-to-work-with-vendor-famil.patch [new file with mode: 0644]

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 (file)
index 0000000..401bfc7
--- /dev/null
@@ -0,0 +1,161 @@
+From 81a9374f36b5ab0bf01b63a93ff7164beedd1221 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 19 Dec 2023 17:14:05 +0800
+Subject: efi/loongarch: Directly position the loaded image file
+
+From: Wang Yao <wangyao@lemote.com>
+
+[ 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 <wangyao@lemote.com>
+Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
+Stable-dep-of: beb2800074c1 ("LoongArch: Fix entry point in kernel image header")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <asm/efi.h>
+ #include <asm/addrspace.h>
+ #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 <asm/efi.h>
+ #include <asm/addrspace.h>
+ #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 (file)
index 0000000..0ff6968
--- /dev/null
@@ -0,0 +1,228 @@
+From febffe2fbf0547a71e8f44c3a54ae7a8dd546015 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Oct 2023 11:39:46 +0200
+Subject: efi: move screen_info into efi init code
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ 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 <ardb@kernel.org>
+Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
+Acked-by: Helge Deller <deller@gmx.de>
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Link: https://lore.kernel.org/r/20231017093947.3627976-1-arnd@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Stable-dep-of: beb2800074c1 ("LoongArch: Fix entry point in kernel image header")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/dmi.h>
+ #include <linux/efi.h>
+ #include <linux/export.h>
+-#include <linux/screen_info.h>
+ #include <linux/memblock.h>
+ #include <linux/initrd.h>
+ #include <linux/ioport.h>
+@@ -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 <linux/memblock.h>
+ #include <linux/sched.h>
+ #include <linux/console.h>
+-#include <linux/screen_info.h>
+ #include <linux/of_fdt.h>
+ #include <linux/sched/task.h>
+ #include <linux/smp.h>
+@@ -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 (file)
index 0000000..569796e
--- /dev/null
@@ -0,0 +1,88 @@
+From 33de791ad3eaad2e65d3b0de88a7e8eeaa969c4a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 3 Jun 2024 15:45:53 +0800
+Subject: LoongArch: Fix entry point in kernel image header
+
+From: Jiaxun Yang <jiaxun.yang@flygoat.com>
+
+[ 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 <jiaxun.yang@flygoat.com>
+Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ca4af87
--- /dev/null
@@ -0,0 +1,159 @@
+From 69d03846368338f35f185a72b4e0d977255446e4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 10 May 2024 13:23:13 -0700
+Subject: nbd: Fix signal handling
+
+From: Bart Van Assche <bvanassche@acm.org>
+
+[ 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 <hch@lst.de>
+Cc: Josef Bacik <jbacik@fb.com>
+Cc: Yu Kuai <yukuai3@huawei.com>
+Cc: Markus Pargmann <mpa@pengutronix.de>
+Fixes: fc17b6534eb8 ("blk-mq: switch ->queue_rq return value to blk_status_t")
+Cc: stable@vger.kernel.org
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Link: https://lore.kernel.org/r/20240510202313.25209-6-bvanassche@acm.org
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6f07d2e
--- /dev/null
@@ -0,0 +1,60 @@
+From 7f49b2cf48bfdee465574d940e8e466dc4499bd6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 10 May 2024 13:23:11 -0700
+Subject: nbd: Improve the documentation of the locking assumptions
+
+From: Bart Van Assche <bvanassche@acm.org>
+
+[ 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 <hch@lst.de>
+Cc: Josef Bacik <jbacik@fb.com>
+Cc: Yu Kuai <yukuai3@huawei.com>
+Cc: Markus Pargmann <mpa@pengutronix.de>
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Link: https://lore.kernel.org/r/20240510202313.25209-4-bvanassche@acm.org
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Stable-dep-of: e56d4b633fff ("nbd: Fix signal handling")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a2be843
--- /dev/null
@@ -0,0 +1,458 @@
+From c80483d319bca2c4e738988e7a5df87cdbbc3b1b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 4 Oct 2023 14:52:41 -0400
+Subject: ocfs2: convert to new timestamp accessors
+
+From: Jeff Layton <jlayton@kernel.org>
+
+[ Upstream commit fd6acbbc4d1edb218ade7ac0ab1839f9e4fcd094 ]
+
+Convert to using the new inode timestamp accessor functions.
+
+Signed-off-by: Jeff Layton <jlayton@kernel.org>
+Link: https://lore.kernel.org/r/20231004185347.80880-54-jlayton@kernel.org
+Signed-off-by: Christian Brauner <brauner@kernel.org>
+Stable-dep-of: 8c40984eeb88 ("ocfs2: update inode fsync transaction id in ocfs2_unlink and ocfs2_link")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..6d82c24
--- /dev/null
@@ -0,0 +1,63 @@
+From cdbf6cb63b590cb2bd66935e386ca0b0e88b31f8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <glass.su@suse.com>
+
+[ 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 <glass.su@suse.com>
+Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
+Cc: Changwei Ge <gechangwei@live.cn>
+Cc: Gang He <ghe@suse.com>
+Cc: Joel Becker <jlbec@evilplan.org>
+Cc: Jun Piao <piaojun@huawei.com>
+Cc: Junxiao Bi <junxiao.bi@oracle.com>
+Cc: Mark Fasheh <mark@fasheh.com>
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..00fdebe
--- /dev/null
@@ -0,0 +1,102 @@
+From a2db02744c1efbe7bf2593565094500d6a7ad667 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 17 Feb 2024 15:40:45 +0800
+Subject: perf: script: add raw|disasm arguments to --insn-trace option
+
+From: Changbin Du <changbin.du@huawei.com>
+
+[ 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 <changbin.du@huawei.com>
+Reviewed-by: Adrian Hunter <adrian.hunter@intel.com>
+Cc: changbin.du@gmail.com
+Cc: Thomas Richter <tmricht@linux.ibm.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Signed-off-by: Namhyung Kim <namhyung@kernel.org>
+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 <sashal@kernel.org>
+---
+ 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[=<raw|disasm>]::
++      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 (file)
index 0000000..40dc933
--- /dev/null
@@ -0,0 +1,46 @@
+From ae53c91d7a78899bb2348fe4146d25a2629ecbf7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 Mar 2024 09:13:33 +0200
+Subject: perf script: Show also errors for --insn-trace option
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+[ 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 <ak@linux.intel.com>
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Ian Rogers <irogers@google.com>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: Namhyung Kim <namhyung@kernel.org>
+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 <acme@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..acf097c
--- /dev/null
@@ -0,0 +1,55 @@
+From 7439b31cb004e1055fdb3861a74e41823e4b075f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Nov 2023 08:59:29 +0100
+Subject: riscv: Don't use PGD entries for the linear mapping
+
+From: Alexandre Ghiti <alexghiti@rivosinc.com>
+
+[ 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 <alexghiti@rivosinc.com>
+Link: https://lore.kernel.org/r/20231108075930.7157-2-alexghiti@rivosinc.com
+Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
+Stable-dep-of: c67ddf59ac44 ("riscv: force PAGE_SIZE linear mapping if debug_pagealloc is enabled")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..145ec19
--- /dev/null
@@ -0,0 +1,53 @@
+From 4ba20a44587da91fc9d0b0e578d81ff2ea21e602 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 May 2024 07:50:39 +0200
+Subject: riscv: force PAGE_SIZE linear mapping if debug_pagealloc is enabled
+
+From: Nam Cao <namcao@linutronix.de>
+
+[ 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 <namcao@linutronix.de>
+Cc: stable@vger.kernel.org
+Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
+Link: https://lore.kernel.org/r/2e391fa6c6f9b3fcf1b41cefbace02ee4ab4bf59.1715750938.git.namcao@linutronix.de
+Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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
+
index 9981d2fd5dda00ef558db524d21a80d1584332eb..c8a12a11867bed4299db5d015b176d99862d6218 100644 (file)
@@ -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 (file)
index 0000000..65966e6
--- /dev/null
@@ -0,0 +1,39 @@
+From 2023fdf271d4d4455bcc6a9b973dd59248fd6c00 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 18 May 2024 15:54:49 -0700
+Subject: tracing: Add MODULE_DESCRIPTION() to preemptirq_delay_test
+
+From: Jeff Johnson <quic_jjohnson@quicinc.com>
+
+[ 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 <mathieu.desnoyers@efficios.com>
+Fixes: f96e8577da10 ("lib: Add module for testing preemptoff/irqsoff latency tracers")
+Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
+Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..8ffcb73
--- /dev/null
@@ -0,0 +1,193 @@
+From 2308335c9e67c59eaab288cdd7198dabe939c268 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 9 Oct 2023 23:18:38 +0200
+Subject: vgacon: rework screen_info #ifdef checks
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ 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 <javierm@redhat.com>
+Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
+Reviewed-by: Khalid Aziz <khalid@gonehiking.org>
+Acked-by: Helge Deller <deller@gmx.de>
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Link: https://lore.kernel.org/r/20231009211845.3136536-3-arnd@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Stable-dep-of: beb2800074c1 ("LoongArch: Fix entry point in kernel image header")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2dd6169
--- /dev/null
@@ -0,0 +1,85 @@
+From 99f449e09d5d13bd3e6597b24e57e64c3e65c8e3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 18 Apr 2024 09:18:13 +0200
+Subject: wifi: rtl8xxxu: enable MFP support with security flag of RX
+ descriptor
+
+From: Martin Kaistra <martin.kaistra@linutronix.de>
+
+[ 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 <martin.kaistra@linutronix.de>
+Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
+Link: https://msgid.link/20240418071813.1883174-3-martin.kaistra@linutronix.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..f9d1372
--- /dev/null
@@ -0,0 +1,175 @@
+From 481b1aa9e330c2936260bb9d8681aa1b891eacd2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <tony.luck@intel.com>
+
+[ 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 <tglx@linutronix.de>
+Suggested-by: Borislav Petkov <bp@alien8.de>
+Signed-off-by: Tony Luck <tony.luck@intel.com>
+Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
+Cc: <stable+noautosel@kernel.org> # see above
+Link: https://lore.kernel.org/r/20240517144312.GBZkdtAOuJZCvxhFbJ@fat_crate.local
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..be7d5d9
--- /dev/null
@@ -0,0 +1,146 @@
+From 3f95f52ff7aae97ab92e952b276de875c54218b7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <tony.luck@intel.com>
+
+[ 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 <tony.luck@intel.com>
+Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
+Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
+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 <sashal@kernel.org>
+---
+ 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 <linux/bitfield.h> 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
+