mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
Merge branch 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull RCU updates from Ingo Molnar:
"This cycle's RCU changes were:
- A few more RCU flavor consolidation cleanups.
- Updates to RCU's list-traversal macros improving lockdep usability.
- Forward-progress improvements for no-CBs CPUs: Avoid ignoring
incoming callbacks during grace-period waits.
- Forward-progress improvements for no-CBs CPUs: Use ->cblist
structure to take advantage of others' grace periods.
- Also added a small commit that avoids needlessly inflicting
scheduler-clock ticks on callback-offloaded CPUs.
- Forward-progress improvements for no-CBs CPUs: Reduce contention on
->nocb_lock guarding ->cblist.
- Forward-progress improvements for no-CBs CPUs: Add ->nocb_bypass
list to further reduce contention on ->nocb_lock guarding ->cblist.
- Miscellaneous fixes.
- Torture-test updates.
- minor LKMM updates"
* 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (86 commits)
MAINTAINERS: Update from [email protected] to [email protected]
rcu: Don't include <linux/ktime.h> in rcutiny.h
rcu: Allow rcu_do_batch() to dynamically adjust batch sizes
rcu/nocb: Don't wake no-CBs GP kthread if timer posted under overload
rcu/nocb: Reduce __call_rcu_nocb_wake() leaf rcu_node ->lock contention
rcu/nocb: Reduce nocb_cb_wait() leaf rcu_node ->lock contention
rcu/nocb: Advance CBs after merge in rcutree_migrate_callbacks()
rcu/nocb: Avoid synchronous wakeup in __call_rcu_nocb_wake()
rcu/nocb: Print no-CBs diagnostics when rcutorture writer unduly delayed
rcu/nocb: EXP Check use and usefulness of ->nocb_lock_contended
rcu/nocb: Add bypass callback queueing
rcu/nocb: Atomic ->len field in rcu_segcblist structure
rcu/nocb: Unconditionally advance and wake for excessive CBs
rcu/nocb: Reduce ->nocb_lock contention with separate ->nocb_gp_lock
rcu/nocb: Reduce contention at no-CBs invocation-done time
rcu/nocb: Reduce contention at no-CBs registry-time CB advancement
rcu/nocb: Round down for number of no-CBs grace-period kthreads
rcu/nocb: Avoid ->nocb_lock capture by corresponding CPU
rcu/nocb: Avoid needless wakeups of no-CBs grace-period kthread
rcu/nocb: Make __call_rcu_nocb_wake() safe for many callbacks
...
This commit is contained in:
commit
94d18ee934
49 changed files with 1480 additions and 786 deletions
|
|
@ -3486,8 +3486,36 @@ void scheduler_tick(void)
|
|||
|
||||
struct tick_work {
|
||||
int cpu;
|
||||
atomic_t state;
|
||||
struct delayed_work work;
|
||||
};
|
||||
/* Values for ->state, see diagram below. */
|
||||
#define TICK_SCHED_REMOTE_OFFLINE 0
|
||||
#define TICK_SCHED_REMOTE_OFFLINING 1
|
||||
#define TICK_SCHED_REMOTE_RUNNING 2
|
||||
|
||||
/*
|
||||
* State diagram for ->state:
|
||||
*
|
||||
*
|
||||
* TICK_SCHED_REMOTE_OFFLINE
|
||||
* | ^
|
||||
* | |
|
||||
* | | sched_tick_remote()
|
||||
* | |
|
||||
* | |
|
||||
* +--TICK_SCHED_REMOTE_OFFLINING
|
||||
* | ^
|
||||
* | |
|
||||
* sched_tick_start() | | sched_tick_stop()
|
||||
* | |
|
||||
* V |
|
||||
* TICK_SCHED_REMOTE_RUNNING
|
||||
*
|
||||
*
|
||||
* Other transitions get WARN_ON_ONCE(), except that sched_tick_remote()
|
||||
* and sched_tick_start() are happy to leave the state in RUNNING.
|
||||
*/
|
||||
|
||||
static struct tick_work __percpu *tick_work_cpu;
|
||||
|
||||
|
|
@ -3500,6 +3528,7 @@ static void sched_tick_remote(struct work_struct *work)
|
|||
struct task_struct *curr;
|
||||
struct rq_flags rf;
|
||||
u64 delta;
|
||||
int os;
|
||||
|
||||
/*
|
||||
* Handle the tick only if it appears the remote CPU is running in full
|
||||
|
|
@ -3513,7 +3542,7 @@ static void sched_tick_remote(struct work_struct *work)
|
|||
|
||||
rq_lock_irq(rq, &rf);
|
||||
curr = rq->curr;
|
||||
if (is_idle_task(curr))
|
||||
if (is_idle_task(curr) || cpu_is_offline(cpu))
|
||||
goto out_unlock;
|
||||
|
||||
update_rq_clock(rq);
|
||||
|
|
@ -3533,13 +3562,18 @@ out_requeue:
|
|||
/*
|
||||
* Run the remote tick once per second (1Hz). This arbitrary
|
||||
* frequency is large enough to avoid overload but short enough
|
||||
* to keep scheduler internal stats reasonably up to date.
|
||||
* to keep scheduler internal stats reasonably up to date. But
|
||||
* first update state to reflect hotplug activity if required.
|
||||
*/
|
||||
queue_delayed_work(system_unbound_wq, dwork, HZ);
|
||||
os = atomic_fetch_add_unless(&twork->state, -1, TICK_SCHED_REMOTE_RUNNING);
|
||||
WARN_ON_ONCE(os == TICK_SCHED_REMOTE_OFFLINE);
|
||||
if (os == TICK_SCHED_REMOTE_RUNNING)
|
||||
queue_delayed_work(system_unbound_wq, dwork, HZ);
|
||||
}
|
||||
|
||||
static void sched_tick_start(int cpu)
|
||||
{
|
||||
int os;
|
||||
struct tick_work *twork;
|
||||
|
||||
if (housekeeping_cpu(cpu, HK_FLAG_TICK))
|
||||
|
|
@ -3548,15 +3582,20 @@ static void sched_tick_start(int cpu)
|
|||
WARN_ON_ONCE(!tick_work_cpu);
|
||||
|
||||
twork = per_cpu_ptr(tick_work_cpu, cpu);
|
||||
twork->cpu = cpu;
|
||||
INIT_DELAYED_WORK(&twork->work, sched_tick_remote);
|
||||
queue_delayed_work(system_unbound_wq, &twork->work, HZ);
|
||||
os = atomic_xchg(&twork->state, TICK_SCHED_REMOTE_RUNNING);
|
||||
WARN_ON_ONCE(os == TICK_SCHED_REMOTE_RUNNING);
|
||||
if (os == TICK_SCHED_REMOTE_OFFLINE) {
|
||||
twork->cpu = cpu;
|
||||
INIT_DELAYED_WORK(&twork->work, sched_tick_remote);
|
||||
queue_delayed_work(system_unbound_wq, &twork->work, HZ);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static void sched_tick_stop(int cpu)
|
||||
{
|
||||
struct tick_work *twork;
|
||||
int os;
|
||||
|
||||
if (housekeeping_cpu(cpu, HK_FLAG_TICK))
|
||||
return;
|
||||
|
|
@ -3564,7 +3603,10 @@ static void sched_tick_stop(int cpu)
|
|||
WARN_ON_ONCE(!tick_work_cpu);
|
||||
|
||||
twork = per_cpu_ptr(tick_work_cpu, cpu);
|
||||
cancel_delayed_work_sync(&twork->work);
|
||||
/* There cannot be competing actions, but don't rely on stop-machine. */
|
||||
os = atomic_xchg(&twork->state, TICK_SCHED_REMOTE_OFFLINING);
|
||||
WARN_ON_ONCE(os != TICK_SCHED_REMOTE_RUNNING);
|
||||
/* Don't cancel, as this would mess up the state machine. */
|
||||
}
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
|
|
@ -3572,7 +3614,6 @@ int __init sched_tick_offload_init(void)
|
|||
{
|
||||
tick_work_cpu = alloc_percpu(struct tick_work);
|
||||
BUG_ON(!tick_work_cpu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -241,13 +241,14 @@ static void do_idle(void)
|
|||
check_pgt_cache();
|
||||
rmb();
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
if (cpu_is_offline(cpu)) {
|
||||
tick_nohz_idle_stop_tick_protected();
|
||||
tick_nohz_idle_stop_tick();
|
||||
cpuhp_report_idle_dead();
|
||||
arch_cpu_idle_dead();
|
||||
}
|
||||
|
||||
local_irq_disable();
|
||||
arch_cpu_idle_enter();
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue