commit: 85da7abb9dc4fd9a0f16d42dd530a7134eba7f67 Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> AuthorDate: Sat Sep 2 09:53:56 2023 +0000 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> CommitDate: Sat Sep 2 09:53:56 2023 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=85da7abb
Linux patch 6.5.1 Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> 0000_README | 4 + 1000_linux-6.5.1.patch | 489 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 493 insertions(+) diff --git a/0000_README b/0000_README index 1efa027c..f7da0ce2 100644 --- a/0000_README +++ b/0000_README @@ -43,6 +43,10 @@ EXPERIMENTAL Individual Patch Descriptions: -------------------------------------------------------------------------- +Patch: 1000_linux-6.5.1.patch +From: https://www.kernel.org +Desc: Linux 6.5.1 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1000_linux-6.5.1.patch b/1000_linux-6.5.1.patch new file mode 100644 index 00000000..0323b844 --- /dev/null +++ b/1000_linux-6.5.1.patch @@ -0,0 +1,489 @@ +diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt +index 722b6eca2e938..23ebe34ff901e 100644 +--- a/Documentation/admin-guide/kernel-parameters.txt ++++ b/Documentation/admin-guide/kernel-parameters.txt +@@ -6275,10 +6275,6 @@ + -1: disable all critical trip points in all thermal zones + <degrees C>: override all critical trip points + +- thermal.nocrt= [HW,ACPI] +- Set to disable actions on ACPI thermal zone +- critical and hot trip points. +- + thermal.off= [HW,ACPI] + 1: disable ACPI thermal control + +diff --git a/Makefile b/Makefile +index 2fdd8b40b7e04..062b9694e0547 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 6 + PATCHLEVEL = 5 +-SUBLEVEL = 0 ++SUBLEVEL = 1 + EXTRAVERSION = + NAME = Hurr durr I'ma ninja sloth + +diff --git a/arch/arm/kernel/module-plts.c b/arch/arm/kernel/module-plts.c +index f5a43fd8c1639..da2ee8d6ef1a7 100644 +--- a/arch/arm/kernel/module-plts.c ++++ b/arch/arm/kernel/module-plts.c +@@ -251,7 +251,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, + /* sort by type and symbol index */ + sort(rels, numrels, sizeof(Elf32_Rel), cmp_rel, NULL); + +- if (strncmp(secstrings + dstsec->sh_name, ".init", 5) != 0) ++ if (!module_init_layout_section(secstrings + dstsec->sh_name)) + core_plts += count_plts(syms, dstsec->sh_addr, rels, + numrels, s->sh_info); + else +diff --git a/arch/arm64/kernel/module-plts.c b/arch/arm64/kernel/module-plts.c +index ad02058756b50..bd69a4e7cd605 100644 +--- a/arch/arm64/kernel/module-plts.c ++++ b/arch/arm64/kernel/module-plts.c +@@ -339,7 +339,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, + if (nents) + sort(rels, nents, sizeof(Elf64_Rela), cmp_rela, NULL); + +- if (!str_has_prefix(secstrings + dstsec->sh_name, ".init")) ++ if (!module_init_layout_section(secstrings + dstsec->sh_name)) + core_plts += count_plts(syms, rels, numrels, + sechdrs[i].sh_info, dstsec); + else +diff --git a/arch/x86/include/asm/sections.h b/arch/x86/include/asm/sections.h +index a6e8373a5170f..3fa87e5e11aba 100644 +--- a/arch/x86/include/asm/sections.h ++++ b/arch/x86/include/asm/sections.h +@@ -2,8 +2,6 @@ + #ifndef _ASM_X86_SECTIONS_H + #define _ASM_X86_SECTIONS_H + +-#define arch_is_kernel_initmem_freed arch_is_kernel_initmem_freed +- + #include <asm-generic/sections.h> + #include <asm/extable.h> + +@@ -18,20 +16,4 @@ extern char __end_of_kernel_reserve[]; + + extern unsigned long _brk_start, _brk_end; + +-static inline bool arch_is_kernel_initmem_freed(unsigned long addr) +-{ +- /* +- * If _brk_start has not been cleared, brk allocation is incomplete, +- * and we can not make assumptions about its use. +- */ +- if (_brk_start) +- return 0; +- +- /* +- * After brk allocation is complete, space between _brk_end and _end +- * is available for allocation. +- */ +- return addr >= _brk_end && addr < (unsigned long)&_end; +-} +- + #endif /* _ASM_X86_SECTIONS_H */ +diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c +index f9f6ebb08fdb7..3163a40f02e30 100644 +--- a/drivers/acpi/thermal.c ++++ b/drivers/acpi/thermal.c +@@ -82,10 +82,6 @@ static int tzp; + module_param(tzp, int, 0444); + MODULE_PARM_DESC(tzp, "Thermal zone polling frequency, in 1/10 seconds."); + +-static int nocrt; +-module_param(nocrt, int, 0); +-MODULE_PARM_DESC(nocrt, "Set to take no action upon ACPI thermal zone critical trips points."); +- + static int off; + module_param(off, int, 0); + MODULE_PARM_DESC(off, "Set to disable ACPI thermal support."); +@@ -1094,7 +1090,7 @@ static int thermal_act(const struct dmi_system_id *d) { + static int thermal_nocrt(const struct dmi_system_id *d) { + pr_notice("%s detected: disabling all critical thermal trip point actions.\n", + d->ident); +- nocrt = 1; ++ crt = -1; + return 0; + } + static int thermal_tzp(const struct dmi_system_id *d) { +diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h +index 839247a4f48ea..660012997f54c 100644 +--- a/include/linux/ipv6.h ++++ b/include/linux/ipv6.h +@@ -199,14 +199,7 @@ struct inet6_cork { + u8 tclass; + }; + +-/** +- * struct ipv6_pinfo - ipv6 private area +- * +- * In the struct sock hierarchy (tcp6_sock, upd6_sock, etc) +- * this _must_ be the last member, so that inet6_sk_generic +- * is able to calculate its offset from the base struct sock +- * by using the struct proto->slab_obj_size member. -acme +- */ ++/* struct ipv6_pinfo - ipv6 private area */ + struct ipv6_pinfo { + struct in6_addr saddr; + struct in6_pktinfo sticky_pktinfo; +@@ -306,19 +299,19 @@ struct raw6_sock { + __u32 offset; /* checksum offset */ + struct icmp6_filter filter; + __u32 ip6mr_table; +- /* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */ ++ + struct ipv6_pinfo inet6; + }; + + struct udp6_sock { + struct udp_sock udp; +- /* ipv6_pinfo has to be the last member of udp6_sock, see inet6_sk_generic */ ++ + struct ipv6_pinfo inet6; + }; + + struct tcp6_sock { + struct tcp_sock tcp; +- /* ipv6_pinfo has to be the last member of tcp6_sock, see inet6_sk_generic */ ++ + struct ipv6_pinfo inet6; + }; + +diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h +index 03be088fb4396..001b2ce83832e 100644 +--- a/include/linux/moduleloader.h ++++ b/include/linux/moduleloader.h +@@ -42,6 +42,11 @@ bool module_init_section(const char *name); + */ + bool module_exit_section(const char *name); + ++/* Describes whether within_module_init() will consider this an init section ++ * or not. This behaviour changes with CONFIG_MODULE_UNLOAD. ++ */ ++bool module_init_layout_section(const char *sname); ++ + /* + * Apply the given relocation to the (simplified) ELF. Return -error + * or 0. +diff --git a/include/net/sock.h b/include/net/sock.h +index 690e22139543f..e8927f2d47a3c 100644 +--- a/include/net/sock.h ++++ b/include/net/sock.h +@@ -1340,6 +1340,7 @@ struct proto { + + struct kmem_cache *slab; + unsigned int obj_size; ++ unsigned int ipv6_pinfo_offset; + slab_flags_t slab_flags; + unsigned int useroffset; /* Usercopy region offset */ + unsigned int usersize; /* Usercopy region size */ +diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c +index 016d997131d43..e12d26c10dbab 100644 +--- a/kernel/kallsyms.c ++++ b/kernel/kallsyms.c +@@ -188,16 +188,13 @@ static bool cleanup_symbol_name(char *s) + + static int compare_symbol_name(const char *name, char *namebuf) + { +- int ret; +- +- ret = strcmp(name, namebuf); +- if (!ret) +- return ret; +- +- if (cleanup_symbol_name(namebuf) && !strcmp(name, namebuf)) +- return 0; +- +- return ret; ++ /* The kallsyms_seqs_of_names is sorted based on names after ++ * cleanup_symbol_name() (see scripts/kallsyms.c) if clang lto is enabled. ++ * To ensure correct bisection in kallsyms_lookup_names(), do ++ * cleanup_symbol_name(namebuf) before comparing name and namebuf. ++ */ ++ cleanup_symbol_name(namebuf); ++ return strcmp(name, namebuf); + } + + static unsigned int get_symbol_seq(int index) +diff --git a/kernel/kallsyms_selftest.c b/kernel/kallsyms_selftest.c +index a2e3745d15c47..e05ddc33a7529 100644 +--- a/kernel/kallsyms_selftest.c ++++ b/kernel/kallsyms_selftest.c +@@ -196,7 +196,7 @@ static bool match_cleanup_name(const char *s, const char *name) + if (!IS_ENABLED(CONFIG_LTO_CLANG)) + return false; + +- p = strchr(s, '.'); ++ p = strstr(s, ".llvm."); + if (!p) + return false; + +@@ -344,27 +344,6 @@ static int test_kallsyms_basic_function(void) + goto failed; + } + +- /* +- * The first '.' may be the initial letter, in which case the +- * entire symbol name will be truncated to an empty string in +- * cleanup_symbol_name(). Do not test these symbols. +- * +- * For example: +- * cat /proc/kallsyms | awk '{print $3}' | grep -E "^\." | head +- * .E_read_words +- * .E_leading_bytes +- * .E_trailing_bytes +- * .E_write_words +- * .E_copy +- * .str.292.llvm.12122243386960820698 +- * .str.24.llvm.12122243386960820698 +- * .str.29.llvm.12122243386960820698 +- * .str.75.llvm.12122243386960820698 +- * .str.99.llvm.12122243386960820698 +- */ +- if (IS_ENABLED(CONFIG_LTO_CLANG) && !namebuf[0]) +- continue; +- + lookup_addr = kallsyms_lookup_name(namebuf); + + memset(stat, 0, sizeof(*stat)); +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index 111607d91489c..e85b5ad3e2069 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -819,34 +819,26 @@ static int very_verbose(struct lock_class *class) + * Is this the address of a static object: + */ + #ifdef __KERNEL__ +-/* +- * Check if an address is part of freed initmem. After initmem is freed, +- * memory can be allocated from it, and such allocations would then have +- * addresses within the range [_stext, _end]. +- */ +-#ifndef arch_is_kernel_initmem_freed +-static int arch_is_kernel_initmem_freed(unsigned long addr) +-{ +- if (system_state < SYSTEM_FREEING_INITMEM) +- return 0; +- +- return init_section_contains((void *)addr, 1); +-} +-#endif +- + static int static_obj(const void *obj) + { +- unsigned long start = (unsigned long) &_stext, +- end = (unsigned long) &_end, +- addr = (unsigned long) obj; ++ unsigned long addr = (unsigned long) obj; + +- if (arch_is_kernel_initmem_freed(addr)) +- return 0; ++ if (is_kernel_core_data(addr)) ++ return 1; ++ ++ /* ++ * keys are allowed in the __ro_after_init section. ++ */ ++ if (is_kernel_rodata(addr)) ++ return 1; + + /* +- * static variable? ++ * in initdata section and used during bootup only? ++ * NOTE: On some platforms the initdata section is ++ * outside of the _stext ... _end range. + */ +- if ((addr >= start) && (addr < end)) ++ if (system_state < SYSTEM_FREEING_INITMEM && ++ init_section_contains((void *)addr, 1)) + return 1; + + /* +diff --git a/kernel/module/decompress.c b/kernel/module/decompress.c +index 8a5d6d63b06cb..87440f714c0ca 100644 +--- a/kernel/module/decompress.c ++++ b/kernel/module/decompress.c +@@ -241,7 +241,7 @@ static ssize_t module_zstd_decompress(struct load_info *info, + } + + wksp_size = zstd_dstream_workspace_bound(header.windowSize); +- wksp = kmalloc(wksp_size, GFP_KERNEL); ++ wksp = vmalloc(wksp_size); + if (!wksp) { + retval = -ENOMEM; + goto out; +@@ -284,7 +284,7 @@ static ssize_t module_zstd_decompress(struct load_info *info, + retval = new_size; + + out: +- kfree(wksp); ++ vfree(wksp); + return retval; + } + #else +diff --git a/kernel/module/main.c b/kernel/module/main.c +index 59b1d067e5289..ff7cc4e292990 100644 +--- a/kernel/module/main.c ++++ b/kernel/module/main.c +@@ -1484,7 +1484,7 @@ long module_get_offset_and_type(struct module *mod, enum mod_mem_type type, + return offset | mask; + } + +-static bool module_init_layout_section(const char *sname) ++bool module_init_layout_section(const char *sname) + { + #ifndef CONFIG_MODULE_UNLOAD + if (module_exit_section(sname)) +diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c +index d29d1163203d9..686090bc59451 100644 +--- a/net/dccp/ipv6.c ++++ b/net/dccp/ipv6.c +@@ -1056,6 +1056,7 @@ static struct proto dccp_v6_prot = { + .orphan_count = &dccp_orphan_count, + .max_header = MAX_DCCP_HEADER, + .obj_size = sizeof(struct dccp6_sock), ++ .ipv6_pinfo_offset = offsetof(struct dccp6_sock, inet6), + .slab_flags = SLAB_TYPESAFE_BY_RCU, + .rsk_prot = &dccp6_request_sock_ops, + .twsk_prot = &dccp6_timewait_sock_ops, +diff --git a/net/dccp/ipv6.h b/net/dccp/ipv6.h +index 7e4c2a3b322b5..c5d14c48def17 100644 +--- a/net/dccp/ipv6.h ++++ b/net/dccp/ipv6.h +@@ -13,10 +13,6 @@ + + struct dccp6_sock { + struct dccp_sock dccp; +- /* +- * ipv6_pinfo has to be the last member of dccp6_sock, +- * see inet6_sk_generic. +- */ + struct ipv6_pinfo inet6; + }; + +diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c +index 5d593ddc0347e..9f9c4b838664a 100644 +--- a/net/ipv6/af_inet6.c ++++ b/net/ipv6/af_inet6.c +@@ -102,9 +102,9 @@ bool ipv6_mod_enabled(void) + } + EXPORT_SYMBOL_GPL(ipv6_mod_enabled); + +-static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) ++static struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) + { +- const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo); ++ const int offset = sk->sk_prot->ipv6_pinfo_offset; + + return (struct ipv6_pinfo *)(((u8 *)sk) + offset); + } +diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c +index c2c291827a2ce..1b27728349725 100644 +--- a/net/ipv6/ping.c ++++ b/net/ipv6/ping.c +@@ -215,6 +215,7 @@ struct proto pingv6_prot = { + .get_port = ping_get_port, + .put_port = ping_unhash, + .obj_size = sizeof(struct raw6_sock), ++ .ipv6_pinfo_offset = offsetof(struct raw6_sock, inet6), + }; + EXPORT_SYMBOL_GPL(pingv6_prot); + +diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c +index 49381f35b623c..ea16734f5e1f7 100644 +--- a/net/ipv6/raw.c ++++ b/net/ipv6/raw.c +@@ -1216,6 +1216,7 @@ struct proto rawv6_prot = { + .hash = raw_hash_sk, + .unhash = raw_unhash_sk, + .obj_size = sizeof(struct raw6_sock), ++ .ipv6_pinfo_offset = offsetof(struct raw6_sock, inet6), + .useroffset = offsetof(struct raw6_sock, filter), + .usersize = sizeof_field(struct raw6_sock, filter), + .h.raw_hash = &raw_v6_hashinfo, +diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c +index 6e86721e1cdbb..3a88545a265d6 100644 +--- a/net/ipv6/tcp_ipv6.c ++++ b/net/ipv6/tcp_ipv6.c +@@ -2176,6 +2176,7 @@ struct proto tcpv6_prot = { + .sysctl_rmem_offset = offsetof(struct net, ipv4.sysctl_tcp_rmem), + .max_header = MAX_TCP_HEADER, + .obj_size = sizeof(struct tcp6_sock), ++ .ipv6_pinfo_offset = offsetof(struct tcp6_sock, inet6), + .slab_flags = SLAB_TYPESAFE_BY_RCU, + .twsk_prot = &tcp6_timewait_sock_ops, + .rsk_prot = &tcp6_request_sock_ops, +diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c +index f787e6b8424c7..486d893b8e3ca 100644 +--- a/net/ipv6/udp.c ++++ b/net/ipv6/udp.c +@@ -1802,6 +1802,7 @@ struct proto udpv6_prot = { + .sysctl_wmem_offset = offsetof(struct net, ipv4.sysctl_udp_wmem_min), + .sysctl_rmem_offset = offsetof(struct net, ipv4.sysctl_udp_rmem_min), + .obj_size = sizeof(struct udp6_sock), ++ .ipv6_pinfo_offset = offsetof(struct udp6_sock, inet6), + .h.udp_table = NULL, + .diag_destroy = udp_abort, + }; +diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c +index 8e010d07917a7..267d491e97075 100644 +--- a/net/ipv6/udplite.c ++++ b/net/ipv6/udplite.c +@@ -67,6 +67,7 @@ struct proto udplitev6_prot = { + .sysctl_wmem_offset = offsetof(struct net, ipv4.sysctl_udp_wmem_min), + .sysctl_rmem_offset = offsetof(struct net, ipv4.sysctl_udp_rmem_min), + .obj_size = sizeof(struct udp6_sock), ++ .ipv6_pinfo_offset = offsetof(struct udp6_sock, inet6), + .h.udp_table = &udplite_table, + }; + +diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c +index ff78217f0cb12..ed8ebb6f59097 100644 +--- a/net/l2tp/l2tp_ip6.c ++++ b/net/l2tp/l2tp_ip6.c +@@ -36,9 +36,6 @@ struct l2tp_ip6_sock { + u32 conn_id; + u32 peer_conn_id; + +- /* ipv6_pinfo has to be the last member of l2tp_ip6_sock, see +- * inet6_sk_generic +- */ + struct ipv6_pinfo inet6; + }; + +@@ -730,6 +727,7 @@ static struct proto l2tp_ip6_prot = { + .hash = l2tp_ip6_hash, + .unhash = l2tp_ip6_unhash, + .obj_size = sizeof(struct l2tp_ip6_sock), ++ .ipv6_pinfo_offset = offsetof(struct l2tp_ip6_sock, inet6), + }; + + static const struct proto_ops l2tp_ip6_ops = { +diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c +index d80658547836f..0efc52c640b59 100644 +--- a/net/mptcp/protocol.c ++++ b/net/mptcp/protocol.c +@@ -3987,6 +3987,7 @@ int __init mptcp_proto_v6_init(void) + strcpy(mptcp_v6_prot.name, "MPTCPv6"); + mptcp_v6_prot.slab = NULL; + mptcp_v6_prot.obj_size = sizeof(struct mptcp6_sock); ++ mptcp_v6_prot.ipv6_pinfo_offset = offsetof(struct mptcp6_sock, np); + + err = proto_register(&mptcp_v6_prot, 1); + if (err) +diff --git a/net/sctp/socket.c b/net/sctp/socket.c +index 76f1bce49a8e7..423dc400992ba 100644 +--- a/net/sctp/socket.c ++++ b/net/sctp/socket.c +@@ -9732,6 +9732,7 @@ struct proto sctpv6_prot = { + .unhash = sctp_unhash, + .no_autobind = true, + .obj_size = sizeof(struct sctp6_sock), ++ .ipv6_pinfo_offset = offsetof(struct sctp6_sock, inet6), + .useroffset = offsetof(struct sctp6_sock, sctp.subscribe), + .usersize = offsetof(struct sctp6_sock, sctp.initmsg) - + offsetof(struct sctp6_sock, sctp.subscribe) +