commit:     caa1d735f7c60424eed8ba2194386ce2b43542e5
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sat Sep  2 09:57:21 2023 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sat Sep  2 09:57:21 2023 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=caa1d735

Linux patch 5.15.130

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README               |   4 +
 1129_linux-5.15.130.patch | 213 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 217 insertions(+)

diff --git a/0000_README b/0000_README
index b875c3b0..7165b421 100644
--- a/0000_README
+++ b/0000_README
@@ -559,6 +559,10 @@ Patch:  1128_linux-5.15.129.patch
 From:   https://www.kernel.org
 Desc:   Linux 5.15.129
 
+Patch:  1129_linux-5.15.130.patch
+From:   https://www.kernel.org
+Desc:   Linux 5.15.130
+
 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/1129_linux-5.15.130.patch b/1129_linux-5.15.130.patch
new file mode 100644
index 00000000..27942759
--- /dev/null
+++ b/1129_linux-5.15.130.patch
@@ -0,0 +1,213 @@
+diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
+index bb78526120f3d..2cd4d66ab64c2 100644
+--- a/Documentation/admin-guide/kernel-parameters.txt
++++ b/Documentation/admin-guide/kernel-parameters.txt
+@@ -5770,10 +5770,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 96c3f014094b2..08cc0832e4d17 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 15
+-SUBLEVEL = 129
++SUBLEVEL = 130
+ EXTRAVERSION =
+ NAME = Trick or Treat
+ 
+diff --git a/arch/arm/kernel/module-plts.c b/arch/arm/kernel/module-plts.c
+index 1fc309b41f944..8d809724cde52 100644
+--- a/arch/arm/kernel/module-plts.c
++++ b/arch/arm/kernel/module-plts.c
+@@ -256,7 +256,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 e53493d8b208b..08fcbcb40d882 100644
+--- a/arch/arm64/kernel/module-plts.c
++++ b/arch/arm64/kernel/module-plts.c
+@@ -7,6 +7,7 @@
+ #include <linux/ftrace.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
++#include <linux/moduleloader.h>
+ #include <linux/sort.h>
+ 
+ static struct plt_entry __get_adrp_add_pair(u64 dst, u64 pc,
+@@ -342,7 +343,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/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
+index 155bbabcc6f5d..809e12b941235 100644
+--- a/drivers/acpi/thermal.c
++++ b/drivers/acpi/thermal.c
+@@ -59,10 +59,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.");
+@@ -1132,7 +1128,7 @@ 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/moduleloader.h b/include/linux/moduleloader.h
+index 9e09d11ffe5b3..1322652a9d0d9 100644
+--- a/include/linux/moduleloader.h
++++ b/include/linux/moduleloader.h
+@@ -39,6 +39,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/kernel/module.c b/kernel/module.c
+index 8a1766c69c6ec..ed96295cc1142 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -2407,7 +2407,7 @@ static long get_offset(struct module *mod, unsigned int 
*size,
+       return ret;
+ }
+ 
+-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/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
+index 94b8ee84bc78a..28f628c702452 100644
+--- a/kernel/rcu/tasks.h
++++ b/kernel/rcu/tasks.h
+@@ -951,7 +951,7 @@ reset_ipi:
+ static bool trc_inspect_reader(struct task_struct *t, void *arg)
+ {
+       int cpu = task_cpu(t);
+-      bool in_qs = false;
++      int nesting;
+       bool ofl = cpu_is_offline(cpu);
+ 
+       if (task_curr(t)) {
+@@ -971,18 +971,18 @@ static bool trc_inspect_reader(struct task_struct *t, 
void *arg)
+               n_heavy_reader_updates++;
+               if (ofl)
+                       n_heavy_reader_ofl_updates++;
+-              in_qs = true;
++              nesting = 0;
+       } else {
+               // The task is not running, so C-language access is safe.
+-              in_qs = likely(!t->trc_reader_nesting);
++              nesting = t->trc_reader_nesting;
+       }
+ 
+-      // Mark as checked so that the grace-period kthread will
+-      // remove it from the holdout list.
+-      t->trc_reader_checked = true;
+-
+-      if (in_qs)
+-              return true;  // Already in quiescent state, done!!!
++      // If not exiting a read-side critical section, mark as checked
++      // so that the grace-period kthread will remove it from the
++      // holdout list.
++      t->trc_reader_checked = nesting >= 0;
++      if (nesting <= 0)
++              return !nesting;  // If in QS, done, otherwise try again later.
+ 
+       // The task is in a read-side critical section, so set up its
+       // state so that it will awaken the grace-period kthread upon exit
+@@ -1041,9 +1041,11 @@ static void trc_wait_for_one_reader(struct task_struct 
*t,
+               if (smp_call_function_single(cpu, trc_read_check_handler, t, 
0)) {
+                       // Just in case there is some other reason for
+                       // failure than the target CPU being offline.
++                      WARN_ONCE(1, "%s():  smp_call_function_single() failed 
for CPU: %d\n",
++                                __func__, cpu);
+                       rcu_tasks_trace.n_ipis_fails++;
+                       per_cpu(trc_ipi_to_cpu, cpu) = false;
+-                      t->trc_ipi_to_cpu = cpu;
++                      t->trc_ipi_to_cpu = -1;
+               }
+       }
+ }
+@@ -1164,14 +1166,28 @@ static void check_all_holdout_tasks_trace(struct 
list_head *hop,
+       }
+ }
+ 
++static void rcu_tasks_trace_empty_fn(void *unused)
++{
++}
++
+ /* Wait for grace period to complete and provide ordering. */
+ static void rcu_tasks_trace_postgp(struct rcu_tasks *rtp)
+ {
++      int cpu;
+       bool firstreport;
+       struct task_struct *g, *t;
+       LIST_HEAD(holdouts);
+       long ret;
+ 
++      // Wait for any lingering IPI handlers to complete.  Note that
++      // if a CPU has gone offline or transitioned to userspace in the
++      // meantime, all IPI handlers should have been drained beforehand.
++      // Yes, this assumes that CPUs process IPIs in order.  If that ever
++      // changes, there will need to be a recheck and/or timed wait.
++      for_each_online_cpu(cpu)
++              if (smp_load_acquire(per_cpu_ptr(&trc_ipi_to_cpu, cpu)))
++                      smp_call_function_single(cpu, rcu_tasks_trace_empty_fn, 
NULL, 1);
++
+       // Remove the safety count.
+       smp_mb__before_atomic();  // Order vs. earlier atomics
+       atomic_dec(&trc_n_readers_need_end);
+diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h
+index f46c0c1a5eb35..407941a2903bc 100644
+--- a/kernel/rcu/tree_exp.h
++++ b/kernel/rcu/tree_exp.h
+@@ -507,7 +507,10 @@ static void synchronize_rcu_expedited_wait(void)
+                               if (rdp->rcu_forced_tick_exp)
+                                       continue;
+                               rdp->rcu_forced_tick_exp = true;
+-                              tick_dep_set_cpu(cpu, TICK_DEP_BIT_RCU_EXP);
++                              preempt_disable();
++                              if (cpu_online(cpu))
++                                      tick_dep_set_cpu(cpu, 
TICK_DEP_BIT_RCU_EXP);
++                              preempt_enable();
+                       }
+               }
+               j = READ_ONCE(jiffies_till_first_fqs);

Reply via email to