Merge 5.10.194 into android12-5.10-lts

Changes in 5.10.194
	module: Expose module_init_layout_section()
	arm64: module-plts: inline linux/moduleloader.h
	arm64: module: Use module_init_layout_section() to spot init sections
	ARM: module: Use module_init_layout_section() to spot init sections
	mhi: pci_generic: Fix implicit conversion warning
	Revert "drm/amdgpu: install stub fence into potential unused fence pointers"
	Revert "MIPS: Alchemy: fix dbdma2"
	rcu: Prevent expedited GP from enabling tick on offline CPU
	rcu-tasks: Fix IPI failure handling in trc_wait_for_one_reader
	rcu-tasks: Wait for trc_read_check_handler() IPIs
	rcu-tasks: Add trc_inspect_reader() checks for exiting critical section
	Linux 5.10.194

Change-Id: I1e4230071f3ca3c9e811aeba31446875028d7b3d
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2023-09-02 10:41:24 +00:00
9 changed files with 54 additions and 34 deletions

View File

@@ -2297,7 +2297,7 @@ void *__symbol_get(const char *symbol)
}
EXPORT_SYMBOL_GPL(__symbol_get);
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))

View File

@@ -874,7 +874,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)) {
@@ -894,18 +894,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
@@ -958,9 +958,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;
}
}
}
@@ -1081,14 +1083,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);

View File

@@ -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);