[rt] Update to 4.11.5-rt1 and reenable
This commit is contained in:
parent
76ed7c5f09
commit
b39658b2cf
|
@ -20,6 +20,7 @@ linux (4.11.6-1) UNRELEASED; urgency=medium
|
|||
* Set ABI to 1
|
||||
* debian/rules.real: Include rules.defs before using architecture variables
|
||||
(Closes: #862842)
|
||||
* [rt] Update to 4.11.5-rt1 and reenable
|
||||
|
||||
-- Ben Hutchings <ben@decadent.org.uk> Tue, 06 Jun 2017 20:43:11 +0100
|
||||
|
||||
|
|
|
@ -93,7 +93,7 @@ debug-info: true
|
|||
signed-modules: false
|
||||
|
||||
[featureset-rt_base]
|
||||
enabled: false
|
||||
enabled: true
|
||||
|
||||
[description]
|
||||
part-long-up: This kernel is not suitable for SMP (multi-processor,
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
From 97181f9bd57405b879403763284537e27d46963d Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Mon, 10 Apr 2017 18:03:36 +0200
|
||||
Subject: [PATCH] futex: Avoid freeing an active timer
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit 97181f9bd57405b879403763284537e27d46963d
|
||||
Subject: [PATCH 1/4] futex: Avoid freeing an active timer
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Alexander reported a hrtimer debug_object splat:
|
||||
|
||||
|
@ -39,7 +38,7 @@ Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -2734,8 +2734,10 @@ static int futex_lock_pi(u32 __user *uad
|
||||
@@ -2736,8 +2736,10 @@ static int futex_lock_pi(u32 __user *uad
|
||||
out_put_key:
|
||||
put_futex_key(&q.key);
|
||||
out:
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:48 +0100
|
||||
Subject: [PATCH] futex: Cleanup variable names for futex_top_waiter()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit 499f5aca2cdd5e958b27e2655e7e7f82524f46b1
|
||||
|
||||
|
@ -26,7 +26,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -1120,14 +1120,14 @@ static int attach_to_pi_owner(u32 uval,
|
||||
@@ -1122,14 +1122,14 @@ static int attach_to_pi_owner(u32 uval,
|
||||
static int lookup_pi_state(u32 uval, struct futex_hash_bucket *hb,
|
||||
union futex_key *key, struct futex_pi_state **ps)
|
||||
{
|
||||
|
@ -44,7 +44,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
/*
|
||||
* We are the first waiter - try to look up the owner based on
|
||||
@@ -1174,7 +1174,7 @@ static int futex_lock_pi_atomic(u32 __us
|
||||
@@ -1176,7 +1176,7 @@ static int futex_lock_pi_atomic(u32 __us
|
||||
struct task_struct *task, int set_waiters)
|
||||
{
|
||||
u32 uval, newval, vpid = task_pid_vnr(task);
|
||||
|
@ -53,7 +53,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
int ret;
|
||||
|
||||
/*
|
||||
@@ -1200,9 +1200,9 @@ static int futex_lock_pi_atomic(u32 __us
|
||||
@@ -1202,9 +1202,9 @@ static int futex_lock_pi_atomic(u32 __us
|
||||
* Lookup existing state first. If it exists, try to attach to
|
||||
* its pi_state.
|
||||
*/
|
||||
|
@ -66,7 +66,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
/*
|
||||
* No waiter and user TID is 0. We are here because the
|
||||
@@ -1292,11 +1292,11 @@ static void mark_wake_futex(struct wake_
|
||||
@@ -1294,11 +1294,11 @@ static void mark_wake_futex(struct wake_
|
||||
q->lock_ptr = NULL;
|
||||
}
|
||||
|
||||
|
@ -78,9 +78,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
- struct futex_pi_state *pi_state = this->pi_state;
|
||||
+ struct futex_pi_state *pi_state = top_waiter->pi_state;
|
||||
u32 uninitialized_var(curval), newval;
|
||||
WAKE_Q(wake_q);
|
||||
DEFINE_WAKE_Q(wake_q);
|
||||
bool deboost;
|
||||
@@ -1317,11 +1317,11 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1319,11 +1319,11 @@ static int wake_futex_pi(u32 __user *uad
|
||||
|
||||
/*
|
||||
* It is possible that the next waiter (the one that brought
|
||||
|
@ -94,7 +94,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
/*
|
||||
* We pass it to the next owner. The WAITERS bit is always
|
||||
@@ -2631,7 +2631,7 @@ static int futex_unlock_pi(u32 __user *u
|
||||
@@ -2633,7 +2633,7 @@ static int futex_unlock_pi(u32 __user *u
|
||||
u32 uninitialized_var(curval), uval, vpid = task_pid_vnr(current);
|
||||
union futex_key key = FUTEX_KEY_INIT;
|
||||
struct futex_hash_bucket *hb;
|
||||
|
@ -103,7 +103,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
int ret;
|
||||
|
||||
retry:
|
||||
@@ -2655,9 +2655,9 @@ static int futex_unlock_pi(u32 __user *u
|
||||
@@ -2657,9 +2657,9 @@ static int futex_unlock_pi(u32 __user *u
|
||||
* all and we at least want to know if user space fiddled
|
||||
* with the futex value instead of blindly unlocking.
|
||||
*/
|
||||
|
|
54
debian/patches/features/all/rt/0001-ia64-topology-Remove-cpus_allowed-manipulation.patch
vendored
Normal file
54
debian/patches/features/all/rt/0001-ia64-topology-Remove-cpus_allowed-manipulation.patch
vendored
Normal file
|
@ -0,0 +1,54 @@
|
|||
From 048c9b954e20396e0c45ee778466994d1be2e612 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 12 Apr 2017 22:07:27 +0200
|
||||
Subject: [PATCH 01/13] ia64/topology: Remove cpus_allowed manipulation
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The CPU hotplug callback fiddles with the cpus_allowed pointer to pin the
|
||||
calling thread on the plugged CPU. That's already guaranteed by the hotplug
|
||||
core code.
|
||||
|
||||
Remove it.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: linux-ia64@vger.kernel.org
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/20170412201042.174518069@linutronix.de
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/ia64/kernel/topology.c | 6 ------
|
||||
1 file changed, 6 deletions(-)
|
||||
|
||||
--- a/arch/ia64/kernel/topology.c
|
||||
+++ b/arch/ia64/kernel/topology.c
|
||||
@@ -355,18 +355,12 @@ static int cache_add_dev(unsigned int cp
|
||||
unsigned long i, j;
|
||||
struct cache_info *this_object;
|
||||
int retval = 0;
|
||||
- cpumask_t oldmask;
|
||||
|
||||
if (all_cpu_cache_info[cpu].kobj.parent)
|
||||
return 0;
|
||||
|
||||
- oldmask = current->cpus_allowed;
|
||||
- retval = set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
- if (unlikely(retval))
|
||||
- return retval;
|
||||
|
||||
retval = cpu_cache_sysfs_init(cpu);
|
||||
- set_cpus_allowed_ptr(current, &oldmask);
|
||||
if (unlikely(retval < 0))
|
||||
return retval;
|
||||
|
75
debian/patches/features/all/rt/0001-init-Pin-init-task-to-the-boot-CPU-initially.patch
vendored
Normal file
75
debian/patches/features/all/rt/0001-init-Pin-init-task-to-the-boot-CPU-initially.patch
vendored
Normal file
|
@ -0,0 +1,75 @@
|
|||
From 8fb12156b8db61af3d49f3e5e104568494581d1f Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:32 +0200
|
||||
Subject: [PATCH 01/17] init: Pin init task to the boot CPU, initially
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Some of the boot code in init_kernel_freeable() which runs before SMP
|
||||
bringup assumes (rightfully) that it runs on the boot CPU and therefore can
|
||||
use smp_processor_id() in preemptible context.
|
||||
|
||||
That works so far because the smp_processor_id() check starts to be
|
||||
effective after smp bringup. That's just wrong. Starting with SMP bringup
|
||||
and the ability to move threads around, smp_processor_id() in preemptible
|
||||
context is broken.
|
||||
|
||||
Aside of that it does not make sense to allow init to run on all CPUs
|
||||
before sched_smp_init() has been run.
|
||||
|
||||
Pin the init to the boot CPU so the existing code can continue to use
|
||||
smp_processor_id() without triggering the checks when the enabling of those
|
||||
checks starts earlier.
|
||||
|
||||
Tested-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Link: http://lkml.kernel.org/r/20170516184734.943149935@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
init/main.c | 17 ++++++++++++-----
|
||||
1 file changed, 12 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/init/main.c
|
||||
+++ b/init/main.c
|
||||
@@ -389,6 +389,7 @@ static __initdata DECLARE_COMPLETION(kth
|
||||
|
||||
static noinline void __ref rest_init(void)
|
||||
{
|
||||
+ struct task_struct *tsk;
|
||||
int pid;
|
||||
|
||||
rcu_scheduler_starting();
|
||||
@@ -397,7 +398,17 @@ static noinline void __ref rest_init(voi
|
||||
* the init task will end up wanting to create kthreads, which, if
|
||||
* we schedule it before we create kthreadd, will OOPS.
|
||||
*/
|
||||
- kernel_thread(kernel_init, NULL, CLONE_FS);
|
||||
+ pid = kernel_thread(kernel_init, NULL, CLONE_FS);
|
||||
+ /*
|
||||
+ * Pin init on the boot CPU. Task migration is not properly working
|
||||
+ * until sched_init_smp() has been run. It will set the allowed
|
||||
+ * CPUs for init to the non isolated CPUs.
|
||||
+ */
|
||||
+ rcu_read_lock();
|
||||
+ tsk = find_task_by_pid_ns(pid, &init_pid_ns);
|
||||
+ set_cpus_allowed_ptr(tsk, cpumask_of(smp_processor_id()));
|
||||
+ rcu_read_unlock();
|
||||
+
|
||||
numa_default_policy();
|
||||
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
|
||||
rcu_read_lock();
|
||||
@@ -1011,10 +1022,6 @@ static noinline void __init kernel_init_
|
||||
* init can allocate pages on any node
|
||||
*/
|
||||
set_mems_allowed(node_states[N_MEMORY]);
|
||||
- /*
|
||||
- * init can run on any cpu.
|
||||
- */
|
||||
- set_cpus_allowed_ptr(current, cpu_all_mask);
|
||||
|
||||
cad_pid = task_pid(current);
|
||||
|
|
@ -1,9 +1,8 @@
|
|||
From 2a1c6029940675abb2217b590512dbf691867ec4 Mon Sep 17 00:00:00 2001
|
||||
From: Xunlei Pang <xlpang@redhat.com>
|
||||
Date: Thu, 23 Mar 2017 15:56:07 +0100
|
||||
Subject: [PATCH] rtmutex: Deboost before waking up the top waiter
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit 2a1c6029940675abb2217b590512dbf691867ec4
|
||||
Subject: [PATCH 1/9] rtmutex: Deboost before waking up the top waiter
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
We should deboost before waking the high-priority task, such that we
|
||||
don't run two tasks with the same "state" (priority, deadline,
|
||||
|
@ -45,7 +44,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -1458,10 +1458,7 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1460,10 +1460,7 @@ static int wake_futex_pi(u32 __user *uad
|
||||
out_unlock:
|
||||
raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
|
||||
|
||||
|
@ -59,7 +58,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -371,24 +371,6 @@ static void __rt_mutex_adjust_prio(struc
|
||||
@@ -373,24 +373,6 @@ static void __rt_mutex_adjust_prio(struc
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -84,7 +83,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
* Deadlock detection is conditional:
|
||||
*
|
||||
* If CONFIG_DEBUG_RT_MUTEXES=n, deadlock detection is only conducted
|
||||
@@ -1049,6 +1031,7 @@ static void mark_wakeup_next_waiter(stru
|
||||
@@ -1051,6 +1033,7 @@ static void mark_wakeup_next_waiter(stru
|
||||
* lock->wait_lock.
|
||||
*/
|
||||
rt_mutex_dequeue_pi(current, waiter);
|
||||
|
@ -92,7 +91,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
/*
|
||||
* As we are waking up the top waiter, and the waiter stays
|
||||
@@ -1391,6 +1374,16 @@ static bool __sched rt_mutex_slowunlock(
|
||||
@@ -1393,6 +1376,16 @@ static bool __sched rt_mutex_slowunlock(
|
||||
*/
|
||||
mark_wakeup_next_waiter(wake_q, lock);
|
||||
|
||||
|
@ -109,7 +108,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
|
||||
|
||||
/* check PI boosting */
|
||||
@@ -1440,6 +1433,18 @@ rt_mutex_fasttrylock(struct rt_mutex *lo
|
||||
@@ -1442,6 +1435,18 @@ rt_mutex_fasttrylock(struct rt_mutex *lo
|
||||
return slowfn(lock);
|
||||
}
|
||||
|
||||
|
@ -128,7 +127,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
static inline void
|
||||
rt_mutex_fastunlock(struct rt_mutex *lock,
|
||||
bool (*slowfn)(struct rt_mutex *lock,
|
||||
@@ -1453,11 +1458,7 @@ rt_mutex_fastunlock(struct rt_mutex *loc
|
||||
@@ -1455,11 +1460,7 @@ rt_mutex_fastunlock(struct rt_mutex *loc
|
||||
|
||||
deboost = slowfn(lock, &wake_q);
|
||||
|
||||
|
@ -141,7 +140,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
|
||||
/**
|
||||
@@ -1570,6 +1571,13 @@ bool __sched __rt_mutex_futex_unlock(str
|
||||
@@ -1572,6 +1573,13 @@ bool __sched __rt_mutex_futex_unlock(str
|
||||
}
|
||||
|
||||
mark_wakeup_next_waiter(wake_q, lock);
|
||||
|
@ -155,7 +154,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
return true; /* deboost and wakeups */
|
||||
}
|
||||
|
||||
@@ -1582,10 +1590,7 @@ void __sched rt_mutex_futex_unlock(struc
|
||||
@@ -1584,10 +1592,7 @@ void __sched rt_mutex_futex_unlock(struc
|
||||
deboost = __rt_mutex_futex_unlock(lock, &wake_q);
|
||||
raw_spin_unlock_irq(&lock->wait_lock);
|
||||
|
||||
|
|
63
debian/patches/features/all/rt/0001-sched-clock-Fix-early-boot-preempt-assumption-in-__s.patch
vendored
Normal file
63
debian/patches/features/all/rt/0001-sched-clock-Fix-early-boot-preempt-assumption-in-__s.patch
vendored
Normal file
|
@ -0,0 +1,63 @@
|
|||
From 45aea321678856687927c53972321ebfab77759a Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 24 May 2017 08:52:02 +0200
|
||||
Subject: [PATCH] sched/clock: Fix early boot preempt assumption in
|
||||
__set_sched_clock_stable()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The more strict early boot preemption warnings found that
|
||||
__set_sched_clock_stable() was incorrectly assuming we'd still be
|
||||
running on a single CPU:
|
||||
|
||||
BUG: using smp_processor_id() in preemptible [00000000] code: swapper/0/1
|
||||
caller is debug_smp_processor_id+0x1c/0x1e
|
||||
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.12.0-rc2-00108-g1c3c5ea #1
|
||||
Call Trace:
|
||||
dump_stack+0x110/0x192
|
||||
check_preemption_disabled+0x10c/0x128
|
||||
? set_debug_rodata+0x25/0x25
|
||||
debug_smp_processor_id+0x1c/0x1e
|
||||
sched_clock_init_late+0x27/0x87
|
||||
[...]
|
||||
|
||||
Fix it by disabling IRQs.
|
||||
|
||||
Reported-by: kernel test robot <xiaolong.ye@intel.com>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Acked-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Mark Rutland <mark.rutland@arm.com>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Cc: lkp@01.org
|
||||
Cc: tipbuild@zytor.com
|
||||
Link: http://lkml.kernel.org/r/20170524065202.v25vyu7pvba5mhpd@hirez.programming.kicks-ass.net
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
kernel/sched/clock.c | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/kernel/sched/clock.c
|
||||
+++ b/kernel/sched/clock.c
|
||||
@@ -126,12 +126,19 @@ int sched_clock_stable(void)
|
||||
|
||||
static void __set_sched_clock_stable(void)
|
||||
{
|
||||
- struct sched_clock_data *scd = this_scd();
|
||||
+ struct sched_clock_data *scd;
|
||||
|
||||
/*
|
||||
+ * Since we're still unstable and the tick is already running, we have
|
||||
+ * to disable IRQs in order to get a consistent scd->tick* reading.
|
||||
+ */
|
||||
+ local_irq_disable();
|
||||
+ scd = this_scd();
|
||||
+ /*
|
||||
* Attempt to make the (initial) unstable->stable transition continuous.
|
||||
*/
|
||||
__sched_clock_offset = (scd->tick_gtod + __gtod_offset) - (scd->tick_raw);
|
||||
+ local_irq_enable();
|
||||
|
||||
printk(KERN_INFO "sched_clock: Marking stable (%lld, %lld)->(%lld, %lld)\n",
|
||||
scd->tick_gtod, __gtod_offset,
|
|
@ -0,0 +1,38 @@
|
|||
From 5976a66913a8bf42465d96776fd37fb5631edc19 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:33 +0200
|
||||
Subject: [PATCH 02/17] arm: Adjust system_state check
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state check in ipi_cpu_stop() to handle the extra states.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Mark Rutland <mark.rutland@arm.com>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Russell King <linux@armlinux.org.uk>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Cc: linux-arm-kernel@lists.infradead.org
|
||||
Link: http://lkml.kernel.org/r/20170516184735.020718977@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
arch/arm/kernel/smp.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm/kernel/smp.c
|
||||
+++ b/arch/arm/kernel/smp.c
|
||||
@@ -555,8 +555,7 @@ static DEFINE_RAW_SPINLOCK(stop_lock);
|
||||
*/
|
||||
static void ipi_cpu_stop(unsigned int cpu)
|
||||
{
|
||||
- if (system_state == SYSTEM_BOOTING ||
|
||||
- system_state == SYSTEM_RUNNING) {
|
||||
+ if (system_state <= SYSTEM_RUNNING) {
|
||||
raw_spin_lock(&stop_lock);
|
||||
pr_crit("CPU%u: stopping\n", cpu);
|
||||
dump_stack();
|
|
@ -1,9 +1,8 @@
|
|||
From 94ffac5d847cfd790bb37b7cef1cad803743985e Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Fri, 7 Apr 2017 09:04:07 +0200
|
||||
Subject: [PATCH] futex: Fix small (and harmless looking) inconsistencies
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit 94ffac5d847cfd790bb37b7cef1cad803743985e
|
||||
Subject: [PATCH 2/4] futex: Fix small (and harmless looking) inconsistencies
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
During (post-commit) review Darren spotted a few minor things. One
|
||||
(harmless AFAICT) type inconsistency and a comment that wasn't as
|
||||
|
@ -23,7 +22,7 @@ Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -1023,7 +1023,8 @@ static int attach_to_pi_state(u32 __user
|
||||
@@ -1025,7 +1025,8 @@ static int attach_to_pi_state(u32 __user
|
||||
struct futex_pi_state **ps)
|
||||
{
|
||||
pid_t pid = uval & FUTEX_TID_MASK;
|
||||
|
@ -33,7 +32,7 @@ Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
|||
|
||||
/*
|
||||
* Userspace might have messed up non-PI and PI futexes [3]
|
||||
@@ -1439,6 +1440,11 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1441,6 +1442,11 @@ static int wake_futex_pi(u32 __user *uad
|
||||
if (ret)
|
||||
goto out_unlock;
|
||||
|
||||
|
@ -45,7 +44,7 @@ Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
|||
raw_spin_lock(&pi_state->owner->pi_lock);
|
||||
WARN_ON(list_empty(&pi_state->list));
|
||||
list_del_init(&pi_state->list);
|
||||
@@ -1450,9 +1456,6 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1452,9 +1458,6 @@ static int wake_futex_pi(u32 __user *uad
|
||||
pi_state->owner = new_owner;
|
||||
raw_spin_unlock(&new_owner->pi_lock);
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:49 +0100
|
||||
Subject: [PATCH] futex: Use smp_store_release() in mark_wake_futex()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit 1b367ece0d7e696cab1c8501bab282cc6a538b3f
|
||||
|
||||
|
@ -27,7 +27,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -1288,8 +1288,7 @@ static void mark_wake_futex(struct wake_
|
||||
@@ -1290,8 +1290,7 @@ static void mark_wake_futex(struct wake_
|
||||
* memory barrier is required here to prevent the following
|
||||
* store to lock_ptr from getting ahead of the plist_del.
|
||||
*/
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
From e96a7705e7d3fef96aec9b590c63b2f6f7d2ba22 Mon Sep 17 00:00:00 2001
|
||||
From: Xunlei Pang <xlpang@redhat.com>
|
||||
Date: Thu, 23 Mar 2017 15:56:08 +0100
|
||||
Subject: [PATCH] sched/rtmutex/deadline: Fix a PI crash for deadline tasks
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit e96a7705e7d3fef96aec9b590c63b2f6f7d2ba22
|
||||
Subject: [PATCH 2/9] sched/rtmutex/deadline: Fix a PI crash for deadline tasks
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
A crash happened while I was playing with deadline PI rtmutex.
|
||||
|
||||
|
@ -61,7 +60,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/include/linux/init_task.h
|
||||
+++ b/include/linux/init_task.h
|
||||
@@ -164,6 +164,7 @@ extern struct task_group root_task_group
|
||||
@@ -181,6 +181,7 @@ extern struct cred init_cred;
|
||||
#ifdef CONFIG_RT_MUTEXES
|
||||
# define INIT_RT_MUTEXES(tsk) \
|
||||
.pi_waiters = RB_ROOT, \
|
||||
|
@ -71,18 +70,18 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
# define INIT_RT_MUTEXES(tsk)
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -1723,6 +1723,8 @@ struct task_struct {
|
||||
/* PI waiters blocked on a rt_mutex held by this task */
|
||||
struct rb_root pi_waiters;
|
||||
struct rb_node *pi_waiters_leftmost;
|
||||
@@ -779,6 +779,8 @@ struct task_struct {
|
||||
/* PI waiters blocked on a rt_mutex held by this task: */
|
||||
struct rb_root pi_waiters;
|
||||
struct rb_node *pi_waiters_leftmost;
|
||||
+ /* Updated under owner's pi_lock and rq lock */
|
||||
+ struct task_struct *pi_top_task;
|
||||
/* Deadlock detection and priority inheritance handling */
|
||||
struct rt_mutex_waiter *pi_blocked_on;
|
||||
+ struct task_struct *pi_top_task;
|
||||
/* Deadlock detection and priority inheritance handling: */
|
||||
struct rt_mutex_waiter *pi_blocked_on;
|
||||
#endif
|
||||
--- a/include/linux/sched/rt.h
|
||||
+++ b/include/linux/sched/rt.h
|
||||
@@ -19,6 +19,7 @@ static inline int rt_task(struct task_st
|
||||
@@ -21,6 +21,7 @@ static inline int rt_task(struct task_st
|
||||
extern int rt_mutex_getprio(struct task_struct *p);
|
||||
extern void rt_mutex_setprio(struct task_struct *p, int prio);
|
||||
extern int rt_mutex_get_effective_prio(struct task_struct *task, int newprio);
|
||||
|
@ -92,7 +91,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
static inline bool tsk_is_pi_blocked(struct task_struct *tsk)
|
||||
--- a/kernel/fork.c
|
||||
+++ b/kernel/fork.c
|
||||
@@ -1417,6 +1417,7 @@ static void rt_mutex_init_task(struct ta
|
||||
@@ -1438,6 +1438,7 @@ static void rt_mutex_init_task(struct ta
|
||||
#ifdef CONFIG_RT_MUTEXES
|
||||
p->pi_waiters = RB_ROOT;
|
||||
p->pi_waiters_leftmost = NULL;
|
||||
|
@ -102,7 +101,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -321,6 +321,19 @@ rt_mutex_dequeue_pi(struct task_struct *
|
||||
@@ -323,6 +323,19 @@ rt_mutex_dequeue_pi(struct task_struct *
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -122,7 +121,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
* Calculate task priority from the waiter tree priority
|
||||
*
|
||||
* Return task->normal_prio when the waiter tree is empty or when
|
||||
@@ -335,12 +348,12 @@ int rt_mutex_getprio(struct task_struct
|
||||
@@ -337,12 +350,12 @@ int rt_mutex_getprio(struct task_struct
|
||||
task->normal_prio);
|
||||
}
|
||||
|
||||
|
@ -139,7 +138,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -349,12 +362,12 @@ struct task_struct *rt_mutex_get_top_tas
|
||||
@@ -351,12 +364,12 @@ struct task_struct *rt_mutex_get_top_tas
|
||||
*/
|
||||
int rt_mutex_get_effective_prio(struct task_struct *task, int newprio)
|
||||
{
|
||||
|
@ -158,7 +157,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
/*
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -3669,6 +3669,8 @@ void rt_mutex_setprio(struct task_struct
|
||||
@@ -3712,6 +3712,8 @@ void rt_mutex_setprio(struct task_struct
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
|
|
85
debian/patches/features/all/rt/0002-workqueue-Provide-work_on_cpu_safe.patch
vendored
Normal file
85
debian/patches/features/all/rt/0002-workqueue-Provide-work_on_cpu_safe.patch
vendored
Normal file
|
@ -0,0 +1,85 @@
|
|||
From 0e8d6a9336b487a1dd6f1991ff376e669d4c87c6 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 12 Apr 2017 22:07:28 +0200
|
||||
Subject: [PATCH 02/13] workqueue: Provide work_on_cpu_safe()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
work_on_cpu() is not protected against CPU hotplug. For code which requires
|
||||
to be either executed on an online CPU or to fail if the CPU is not
|
||||
available the callsite would have to protect against CPU hotplug.
|
||||
|
||||
Provide a function which does get/put_online_cpus() around the call to
|
||||
work_on_cpu() and fails the call with -ENODEV if the target CPU is not
|
||||
online.
|
||||
|
||||
Preparatory patch to convert several racy task affinity manipulations.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: Tejun Heo <tj@kernel.org>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/20170412201042.262610721@linutronix.de
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
include/linux/workqueue.h | 5 +++++
|
||||
kernel/workqueue.c | 23 +++++++++++++++++++++++
|
||||
2 files changed, 28 insertions(+)
|
||||
|
||||
--- a/include/linux/workqueue.h
|
||||
+++ b/include/linux/workqueue.h
|
||||
@@ -608,8 +608,13 @@ static inline long work_on_cpu(int cpu,
|
||||
{
|
||||
return fn(arg);
|
||||
}
|
||||
+static inline long work_on_cpu_safe(int cpu, long (*fn)(void *), void *arg)
|
||||
+{
|
||||
+ return fn(arg);
|
||||
+}
|
||||
#else
|
||||
long work_on_cpu(int cpu, long (*fn)(void *), void *arg);
|
||||
+long work_on_cpu_safe(int cpu, long (*fn)(void *), void *arg);
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#ifdef CONFIG_FREEZER
|
||||
--- a/kernel/workqueue.c
|
||||
+++ b/kernel/workqueue.c
|
||||
@@ -4735,6 +4735,29 @@ long work_on_cpu(int cpu, long (*fn)(voi
|
||||
return wfc.ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(work_on_cpu);
|
||||
+
|
||||
+/**
|
||||
+ * work_on_cpu_safe - run a function in thread context on a particular cpu
|
||||
+ * @cpu: the cpu to run on
|
||||
+ * @fn: the function to run
|
||||
+ * @arg: the function argument
|
||||
+ *
|
||||
+ * Disables CPU hotplug and calls work_on_cpu(). The caller must not hold
|
||||
+ * any locks which would prevent @fn from completing.
|
||||
+ *
|
||||
+ * Return: The value @fn returns.
|
||||
+ */
|
||||
+long work_on_cpu_safe(int cpu, long (*fn)(void *), void *arg)
|
||||
+{
|
||||
+ long ret = -ENODEV;
|
||||
+
|
||||
+ get_online_cpus();
|
||||
+ if (cpu_online(cpu))
|
||||
+ ret = work_on_cpu(cpu, fn, arg);
|
||||
+ put_online_cpus();
|
||||
+ return ret;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(work_on_cpu_safe);
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#ifdef CONFIG_FREEZER
|
|
@ -0,0 +1,39 @@
|
|||
From ef284f5ca5f102bf855e599305c0c16d6e844635 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:34 +0200
|
||||
Subject: [PATCH 03/17] arm64: Adjust system_state check
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state check in smp_send_stop() to handle the extra states.
|
||||
|
||||
Tested-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Acked-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Cc: Will Deacon <will.deacon@arm.com>
|
||||
Link: http://lkml.kernel.org/r/20170516184735.112589728@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
arch/arm64/kernel/smp.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm64/kernel/smp.c
|
||||
+++ b/arch/arm64/kernel/smp.c
|
||||
@@ -915,8 +915,7 @@ void smp_send_stop(void)
|
||||
cpumask_copy(&mask, cpu_online_mask);
|
||||
cpumask_clear_cpu(smp_processor_id(), &mask);
|
||||
|
||||
- if (system_state == SYSTEM_BOOTING ||
|
||||
- system_state == SYSTEM_RUNNING)
|
||||
+ if (system_state <= SYSTEM_RUNNING)
|
||||
pr_crit("SMP: stopping secondary CPUs\n");
|
||||
smp_cross_call(&mask, IPI_CPU_STOP);
|
||||
}
|
|
@ -1,9 +1,8 @@
|
|||
From 38fcd06e9b7f6855db1f3ebac5e18b8fdb467ffd Mon Sep 17 00:00:00 2001
|
||||
From: "Darren Hart (VMware)" <dvhart@infradead.org>
|
||||
Date: Fri, 14 Apr 2017 15:31:38 -0700
|
||||
Subject: [PATCH] futex: Clarify mark_wake_futex memory barrier usage
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit 38fcd06e9b7f6855db1f3ebac5e18b8fdb467ffd
|
||||
Subject: [PATCH 3/4] futex: Clarify mark_wake_futex memory barrier usage
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Clarify the scenario described in mark_wake_futex requiring the
|
||||
smp_store_release(). Update the comment to explicitly refer to the
|
||||
|
@ -20,7 +19,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -1378,10 +1378,11 @@ static void mark_wake_futex(struct wake_
|
||||
@@ -1380,10 +1380,11 @@ static void mark_wake_futex(struct wake_
|
||||
wake_q_add(wake_q, p);
|
||||
__unqueue_futex(q);
|
||||
/*
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:50 +0100
|
||||
Subject: [PATCH] futex: Remove rt_mutex_deadlock_account_*()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit fffa954fb528963c2fb7b0c0084eb77e2be7ab52
|
||||
|
||||
|
@ -28,7 +28,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/locking/rtmutex-debug.c
|
||||
+++ b/kernel/locking/rtmutex-debug.c
|
||||
@@ -173,12 +173,3 @@ void debug_rt_mutex_init(struct rt_mutex
|
||||
@@ -174,12 +174,3 @@ void debug_rt_mutex_init(struct rt_mutex
|
||||
lock->name = name;
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
extern void debug_rt_mutex_init(struct rt_mutex *lock, const char *name);
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -936,8 +936,6 @@ static int try_to_take_rt_mutex(struct r
|
||||
@@ -938,8 +938,6 @@ static int try_to_take_rt_mutex(struct r
|
||||
*/
|
||||
rt_mutex_set_owner(lock, task);
|
||||
|
||||
|
@ -64,7 +64,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
return 1;
|
||||
}
|
||||
|
||||
@@ -1340,8 +1338,6 @@ static bool __sched rt_mutex_slowunlock(
|
||||
@@ -1342,8 +1340,6 @@ static bool __sched rt_mutex_slowunlock(
|
||||
|
||||
debug_rt_mutex_unlock(lock);
|
||||
|
||||
|
@ -73,7 +73,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
/*
|
||||
* We must be careful here if the fast path is enabled. If we
|
||||
* have no waiters queued we cannot set owner to NULL here
|
||||
@@ -1407,11 +1403,10 @@ rt_mutex_fastlock(struct rt_mutex *lock,
|
||||
@@ -1409,11 +1405,10 @@ rt_mutex_fastlock(struct rt_mutex *lock,
|
||||
struct hrtimer_sleeper *timeout,
|
||||
enum rtmutex_chainwalk chwalk))
|
||||
{
|
||||
|
@ -88,7 +88,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
static inline int
|
||||
@@ -1423,21 +1418,19 @@ rt_mutex_timed_fastlock(struct rt_mutex
|
||||
@@ -1425,21 +1420,19 @@ rt_mutex_timed_fastlock(struct rt_mutex
|
||||
enum rtmutex_chainwalk chwalk))
|
||||
{
|
||||
if (chwalk == RT_MUTEX_MIN_CHAINWALK &&
|
||||
|
@ -115,10 +115,10 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
return slowfn(lock);
|
||||
}
|
||||
|
||||
@@ -1447,19 +1440,18 @@ rt_mutex_fastunlock(struct rt_mutex *loc
|
||||
@@ -1449,19 +1442,18 @@ rt_mutex_fastunlock(struct rt_mutex *loc
|
||||
struct wake_q_head *wqh))
|
||||
{
|
||||
WAKE_Q(wake_q);
|
||||
DEFINE_WAKE_Q(wake_q);
|
||||
+ bool deboost;
|
||||
|
||||
- if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) {
|
||||
|
@ -143,7 +143,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
/**
|
||||
@@ -1570,10 +1562,9 @@ EXPORT_SYMBOL_GPL(rt_mutex_unlock);
|
||||
@@ -1572,10 +1564,9 @@ EXPORT_SYMBOL_GPL(rt_mutex_unlock);
|
||||
bool __sched rt_mutex_futex_unlock(struct rt_mutex *lock,
|
||||
struct wake_q_head *wqh)
|
||||
{
|
||||
|
@ -156,7 +156,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
return rt_mutex_slowunlock(lock, wqh);
|
||||
}
|
||||
|
||||
@@ -1631,7 +1622,6 @@ void rt_mutex_init_proxy_locked(struct r
|
||||
@@ -1637,7 +1628,6 @@ void rt_mutex_init_proxy_locked(struct r
|
||||
__rt_mutex_init(lock, NULL);
|
||||
debug_rt_mutex_proxy_lock(lock, proxy_owner);
|
||||
rt_mutex_set_owner(lock, proxy_owner);
|
||||
|
@ -164,7 +164,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
/**
|
||||
@@ -1647,7 +1637,6 @@ void rt_mutex_proxy_unlock(struct rt_mut
|
||||
@@ -1657,7 +1647,6 @@ void rt_mutex_proxy_unlock(struct rt_mut
|
||||
{
|
||||
debug_rt_mutex_proxy_unlock(lock);
|
||||
rt_mutex_set_owner(lock, NULL);
|
||||
|
|
130
debian/patches/features/all/rt/0003-ia64-salinfo-Replace-racy-task-affinity-logic.patch
vendored
Normal file
130
debian/patches/features/all/rt/0003-ia64-salinfo-Replace-racy-task-affinity-logic.patch
vendored
Normal file
|
@ -0,0 +1,130 @@
|
|||
From 67cb85fdcee7fbc61c09c00360d1a4ae37641db4 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 12 Apr 2017 22:07:29 +0200
|
||||
Subject: [PATCH 03/13] ia64/salinfo: Replace racy task affinity logic
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Some of the file operations in /proc/sal require to run code on the
|
||||
requested cpu. This is achieved by temporarily setting the affinity of the
|
||||
calling user space thread to the requested CPU and reset it to the original
|
||||
affinity afterwards.
|
||||
|
||||
That's racy vs. CPU hotplug and concurrent affinity settings for that
|
||||
thread resulting in code executing on the wrong CPU and overwriting the
|
||||
new affinity setting.
|
||||
|
||||
Replace it by using work_on_cpu_safe() which guarantees to run the code on
|
||||
the requested CPU or to fail in case the CPU is offline.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: linux-ia64@vger.kernel.org
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/20170412201042.341863457@linutronix.de
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/ia64/kernel/salinfo.c | 31 ++++++++++++-------------------
|
||||
1 file changed, 12 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/arch/ia64/kernel/salinfo.c
|
||||
+++ b/arch/ia64/kernel/salinfo.c
|
||||
@@ -179,14 +179,14 @@ struct salinfo_platform_oemdata_parms {
|
||||
const u8 *efi_guid;
|
||||
u8 **oemdata;
|
||||
u64 *oemdata_size;
|
||||
- int ret;
|
||||
};
|
||||
|
||||
-static void
|
||||
+static long
|
||||
salinfo_platform_oemdata_cpu(void *context)
|
||||
{
|
||||
struct salinfo_platform_oemdata_parms *parms = context;
|
||||
- parms->ret = salinfo_platform_oemdata(parms->efi_guid, parms->oemdata, parms->oemdata_size);
|
||||
+
|
||||
+ return salinfo_platform_oemdata(parms->efi_guid, parms->oemdata, parms->oemdata_size);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -380,16 +380,7 @@ salinfo_log_release(struct inode *inode,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void
|
||||
-call_on_cpu(int cpu, void (*fn)(void *), void *arg)
|
||||
-{
|
||||
- cpumask_t save_cpus_allowed = current->cpus_allowed;
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
- (*fn)(arg);
|
||||
- set_cpus_allowed_ptr(current, &save_cpus_allowed);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
+static long
|
||||
salinfo_log_read_cpu(void *context)
|
||||
{
|
||||
struct salinfo_data *data = context;
|
||||
@@ -399,6 +390,7 @@ salinfo_log_read_cpu(void *context)
|
||||
/* Clear corrected errors as they are read from SAL */
|
||||
if (rh->severity == sal_log_severity_corrected)
|
||||
ia64_sal_clear_state_info(data->type);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -430,7 +422,7 @@ salinfo_log_new_read(int cpu, struct sal
|
||||
spin_unlock_irqrestore(&data_saved_lock, flags);
|
||||
|
||||
if (!data->saved_num)
|
||||
- call_on_cpu(cpu, salinfo_log_read_cpu, data);
|
||||
+ work_on_cpu_safe(cpu, salinfo_log_read_cpu, data);
|
||||
if (!data->log_size) {
|
||||
data->state = STATE_NO_DATA;
|
||||
cpumask_clear_cpu(cpu, &data->cpu_event);
|
||||
@@ -459,11 +451,13 @@ salinfo_log_read(struct file *file, char
|
||||
return simple_read_from_buffer(buffer, count, ppos, buf, bufsize);
|
||||
}
|
||||
|
||||
-static void
|
||||
+static long
|
||||
salinfo_log_clear_cpu(void *context)
|
||||
{
|
||||
struct salinfo_data *data = context;
|
||||
+
|
||||
ia64_sal_clear_state_info(data->type);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -486,7 +480,7 @@ salinfo_log_clear(struct salinfo_data *d
|
||||
rh = (sal_log_record_header_t *)(data->log_buffer);
|
||||
/* Corrected errors have already been cleared from SAL */
|
||||
if (rh->severity != sal_log_severity_corrected)
|
||||
- call_on_cpu(cpu, salinfo_log_clear_cpu, data);
|
||||
+ work_on_cpu_safe(cpu, salinfo_log_clear_cpu, data);
|
||||
/* clearing a record may make a new record visible */
|
||||
salinfo_log_new_read(cpu, data);
|
||||
if (data->state == STATE_LOG_RECORD) {
|
||||
@@ -531,9 +525,8 @@ salinfo_log_write(struct file *file, con
|
||||
.oemdata = &data->oemdata,
|
||||
.oemdata_size = &data->oemdata_size
|
||||
};
|
||||
- call_on_cpu(cpu, salinfo_platform_oemdata_cpu, &parms);
|
||||
- if (parms.ret)
|
||||
- count = parms.ret;
|
||||
+ count = work_on_cpu_safe(cpu, salinfo_platform_oemdata_cpu,
|
||||
+ &parms);
|
||||
} else
|
||||
data->oemdata_size = 0;
|
||||
} else
|
|
@ -1,10 +1,9 @@
|
|||
From 85e2d4f992868ad78dc8bb2c077b652fcfb3661a Mon Sep 17 00:00:00 2001
|
||||
From: Xunlei Pang <xlpang@redhat.com>
|
||||
Date: Thu, 23 Mar 2017 15:56:09 +0100
|
||||
Subject: [PATCH] sched/deadline/rtmutex: Dont miss the
|
||||
Subject: [PATCH 3/9] sched/deadline/rtmutex: Dont miss the
|
||||
dl_runtime/dl_period update
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit 85e2d4f992868ad78dc8bb2c077b652fcfb3661a
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Currently dl tasks will actually return at the very beginning
|
||||
of rt_mutex_adjust_prio_chain() in !detect_deadlock cases:
|
||||
|
@ -43,7 +42,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -603,7 +603,7 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
@@ -605,7 +605,7 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
* enabled we continue, but stop the requeueing in the chain
|
||||
* walk.
|
||||
*/
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
From 59cd42c29618c45cd3c56da43402b14f611888dd Mon Sep 17 00:00:00 2001
|
||||
From: "Darren Hart (VMware)" <dvhart@infradead.org>
|
||||
Date: Fri, 14 Apr 2017 15:46:08 -0700
|
||||
Subject: [PATCH] MAINTAINERS: Add FUTEX SUBSYSTEM
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit 59cd42c29618c45cd3c56da43402b14f611888dd
|
||||
Subject: [PATCH 4/4] MAINTAINERS: Add FUTEX SUBSYSTEM
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Add a MAINTAINERS block for the FUTEX SUBSYSTEM which includes the core
|
||||
kernel code, include headers, testing code, and Documentation. Excludes
|
||||
|
@ -24,7 +23,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -5196,6 +5196,23 @@ F: fs/fuse/
|
||||
@@ -5420,6 +5420,23 @@ F: fs/fuse/
|
||||
F: include/uapi/linux/fuse.h
|
||||
F: Documentation/filesystems/fuse.txt
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:51 +0100
|
||||
Subject: [PATCH] futex,rt_mutex: Provide futex specific rt_mutex API
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit 5293c2efda37775346885c7e924d4ef7018ea60b
|
||||
|
||||
|
@ -38,7 +38,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -914,7 +914,7 @@ void exit_pi_state_list(struct task_stru
|
||||
@@ -916,7 +916,7 @@ void exit_pi_state_list(struct task_stru
|
||||
pi_state->owner = NULL;
|
||||
raw_spin_unlock_irq(&curr->pi_lock);
|
||||
|
||||
|
@ -47,7 +47,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
spin_unlock(&hb->lock);
|
||||
|
||||
@@ -1362,20 +1362,18 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1364,20 +1364,18 @@ static int wake_futex_pi(u32 __user *uad
|
||||
pi_state->owner = new_owner;
|
||||
raw_spin_unlock(&new_owner->pi_lock);
|
||||
|
||||
|
@ -76,7 +76,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
return 0;
|
||||
}
|
||||
@@ -2251,7 +2249,7 @@ static int fixup_owner(u32 __user *uaddr
|
||||
@@ -2253,7 +2251,7 @@ static int fixup_owner(u32 __user *uaddr
|
||||
* task acquired the rt_mutex after we removed ourself from the
|
||||
* rt_mutex waiters list.
|
||||
*/
|
||||
|
@ -85,7 +85,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
locked = 1;
|
||||
goto out;
|
||||
}
|
||||
@@ -2566,7 +2564,7 @@ static int futex_lock_pi(u32 __user *uad
|
||||
@@ -2568,7 +2566,7 @@ static int futex_lock_pi(u32 __user *uad
|
||||
if (!trylock) {
|
||||
ret = rt_mutex_timed_futex_lock(&q.pi_state->pi_mutex, to);
|
||||
} else {
|
||||
|
@ -94,7 +94,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
/* Fixup the trylock return value: */
|
||||
ret = ret ? 0 : -EWOULDBLOCK;
|
||||
}
|
||||
@@ -2589,7 +2587,7 @@ static int futex_lock_pi(u32 __user *uad
|
||||
@@ -2591,7 +2589,7 @@ static int futex_lock_pi(u32 __user *uad
|
||||
* it and return the fault to userspace.
|
||||
*/
|
||||
if (ret && (rt_mutex_owner(&q.pi_state->pi_mutex) == current))
|
||||
|
@ -103,7 +103,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
/* Unqueue and drop the lock */
|
||||
unqueue_me_pi(&q);
|
||||
@@ -2896,7 +2894,7 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
@@ -2898,7 +2896,7 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
spin_lock(q.lock_ptr);
|
||||
ret = fixup_pi_state_owner(uaddr2, &q, current);
|
||||
if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current)
|
||||
|
@ -112,7 +112,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
/*
|
||||
* Drop the reference to the pi state which
|
||||
* the requeue_pi() code acquired for us.
|
||||
@@ -2936,7 +2934,7 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
@@ -2938,7 +2936,7 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
* userspace.
|
||||
*/
|
||||
if (ret && rt_mutex_owner(pi_mutex) == current)
|
||||
|
@ -123,7 +123,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
unqueue_me_pi(&q);
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -1486,15 +1486,23 @@ EXPORT_SYMBOL_GPL(rt_mutex_lock_interrup
|
||||
@@ -1488,15 +1488,23 @@ EXPORT_SYMBOL_GPL(rt_mutex_lock_interrup
|
||||
|
||||
/*
|
||||
* Futex variant with full deadlock detection.
|
||||
|
@ -151,7 +151,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
/**
|
||||
@@ -1553,19 +1561,38 @@ void __sched rt_mutex_unlock(struct rt_m
|
||||
@@ -1555,19 +1563,38 @@ void __sched rt_mutex_unlock(struct rt_m
|
||||
EXPORT_SYMBOL_GPL(rt_mutex_unlock);
|
||||
|
||||
/**
|
||||
|
@ -185,7 +185,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
{
|
||||
- if (likely(rt_mutex_cmpxchg_release(lock, current, NULL)))
|
||||
- return false;
|
||||
+ WAKE_Q(wake_q);
|
||||
+ DEFINE_WAKE_Q(wake_q);
|
||||
+ bool deboost;
|
||||
|
||||
- return rt_mutex_slowunlock(lock, wqh);
|
||||
|
|
77
debian/patches/features/all/rt/0004-ia64-sn-hwperf-Replace-racy-task-affinity-logic.patch
vendored
Normal file
77
debian/patches/features/all/rt/0004-ia64-sn-hwperf-Replace-racy-task-affinity-logic.patch
vendored
Normal file
|
@ -0,0 +1,77 @@
|
|||
From 9feb42ac88b516e378b9782e82b651ca5bed95c4 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 6 Apr 2017 14:56:18 +0200
|
||||
Subject: [PATCH 04/13] ia64/sn/hwperf: Replace racy task affinity logic
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
sn_hwperf_op_cpu() which is invoked from an ioctl requires to run code on
|
||||
the requested cpu. This is achieved by temporarily setting the affinity of
|
||||
the calling user space thread to the requested CPU and reset it to the
|
||||
original affinity afterwards.
|
||||
|
||||
That's racy vs. CPU hotplug and concurrent affinity settings for that
|
||||
thread resulting in code executing on the wrong CPU and overwriting the
|
||||
new affinity setting.
|
||||
|
||||
Replace it by using work_on_cpu_safe() which guarantees to run the code on
|
||||
the requested CPU or to fail in case the CPU is offline.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: linux-ia64@vger.kernel.org
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1704122251450.2548@nanos
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/ia64/sn/kernel/sn2/sn_hwperf.c | 17 +++++++++--------
|
||||
1 file changed, 9 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/arch/ia64/sn/kernel/sn2/sn_hwperf.c
|
||||
+++ b/arch/ia64/sn/kernel/sn2/sn_hwperf.c
|
||||
@@ -598,12 +598,17 @@ static void sn_hwperf_call_sal(void *inf
|
||||
op_info->ret = r;
|
||||
}
|
||||
|
||||
+static long sn_hwperf_call_sal_work(void *info)
|
||||
+{
|
||||
+ sn_hwperf_call_sal(info);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int sn_hwperf_op_cpu(struct sn_hwperf_op_info *op_info)
|
||||
{
|
||||
u32 cpu;
|
||||
u32 use_ipi;
|
||||
int r = 0;
|
||||
- cpumask_t save_allowed;
|
||||
|
||||
cpu = (op_info->a->arg & SN_HWPERF_ARG_CPU_MASK) >> 32;
|
||||
use_ipi = op_info->a->arg & SN_HWPERF_ARG_USE_IPI_MASK;
|
||||
@@ -629,13 +634,9 @@ static int sn_hwperf_op_cpu(struct sn_hw
|
||||
/* use an interprocessor interrupt to call SAL */
|
||||
smp_call_function_single(cpu, sn_hwperf_call_sal,
|
||||
op_info, 1);
|
||||
- }
|
||||
- else {
|
||||
- /* migrate the task before calling SAL */
|
||||
- save_allowed = current->cpus_allowed;
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
- sn_hwperf_call_sal(op_info);
|
||||
- set_cpus_allowed_ptr(current, &save_allowed);
|
||||
+ } else {
|
||||
+ /* Call on the target CPU */
|
||||
+ work_on_cpu_safe(cpu, sn_hwperf_call_sal_work, op_info);
|
||||
}
|
||||
}
|
||||
r = op_info->ret;
|
|
@ -1,9 +1,8 @@
|
|||
From aa2bfe55366552cb7e93e8709d66e698d79ccc47 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Thu, 23 Mar 2017 15:56:10 +0100
|
||||
Subject: [PATCH] rtmutex: Clean up
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit aa2bfe55366552cb7e93e8709d66e698d79ccc47
|
||||
Subject: [PATCH 4/9] rtmutex: Clean up
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Previous patches changed the meaning of the return value of
|
||||
rt_mutex_slowunlock(); update comments and code to reflect this.
|
||||
|
@ -26,16 +25,16 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -1392,7 +1392,7 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1394,7 +1394,7 @@ static int wake_futex_pi(u32 __user *uad
|
||||
{
|
||||
u32 uninitialized_var(curval), newval;
|
||||
struct task_struct *new_owner;
|
||||
- bool deboost = false;
|
||||
+ bool postunlock = false;
|
||||
WAKE_Q(wake_q);
|
||||
DEFINE_WAKE_Q(wake_q);
|
||||
int ret = 0;
|
||||
|
||||
@@ -1453,12 +1453,13 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1455,12 +1455,13 @@ static int wake_futex_pi(u32 __user *uad
|
||||
/*
|
||||
* We've updated the uservalue, this unlock cannot fail.
|
||||
*/
|
||||
|
@ -53,7 +52,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -1328,7 +1328,8 @@ static inline int rt_mutex_slowtrylock(s
|
||||
@@ -1330,7 +1330,8 @@ static inline int rt_mutex_slowtrylock(s
|
||||
|
||||
/*
|
||||
* Slow path to release a rt-mutex.
|
||||
|
@ -63,7 +62,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
*/
|
||||
static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
|
||||
struct wake_q_head *wake_q)
|
||||
@@ -1399,8 +1400,7 @@ static bool __sched rt_mutex_slowunlock(
|
||||
@@ -1401,8 +1402,7 @@ static bool __sched rt_mutex_slowunlock(
|
||||
|
||||
raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
|
||||
|
||||
|
@ -73,7 +72,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -1447,15 +1447,14 @@ rt_mutex_fasttrylock(struct rt_mutex *lo
|
||||
@@ -1449,15 +1449,14 @@ rt_mutex_fasttrylock(struct rt_mutex *lo
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -92,10 +91,10 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
|
||||
static inline void
|
||||
@@ -1464,14 +1463,12 @@ rt_mutex_fastunlock(struct rt_mutex *loc
|
||||
@@ -1466,14 +1465,12 @@ rt_mutex_fastunlock(struct rt_mutex *loc
|
||||
struct wake_q_head *wqh))
|
||||
{
|
||||
WAKE_Q(wake_q);
|
||||
DEFINE_WAKE_Q(wake_q);
|
||||
- bool deboost;
|
||||
|
||||
if (likely(rt_mutex_cmpxchg_release(lock, current, NULL)))
|
||||
|
@ -109,7 +108,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
|
||||
/**
|
||||
@@ -1591,19 +1588,20 @@ bool __sched __rt_mutex_futex_unlock(str
|
||||
@@ -1593,19 +1590,20 @@ bool __sched __rt_mutex_futex_unlock(str
|
||||
*/
|
||||
preempt_disable();
|
||||
|
||||
|
@ -119,7 +118,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
void __sched rt_mutex_futex_unlock(struct rt_mutex *lock)
|
||||
{
|
||||
WAKE_Q(wake_q);
|
||||
DEFINE_WAKE_Q(wake_q);
|
||||
- bool deboost;
|
||||
+ bool postunlock;
|
||||
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
From 719b3680d1f789c1e3054e3fcb26bfff07c3c623 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:35 +0200
|
||||
Subject: [PATCH 04/17] x86/smp: Adjust system_state check
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state check in announce_cpu() to handle the extra states.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Mark Rutland <mark.rutland@arm.com>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Link: http://lkml.kernel.org/r/20170516184735.191715856@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
arch/x86/kernel/smpboot.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/x86/kernel/smpboot.c
|
||||
+++ b/arch/x86/kernel/smpboot.c
|
||||
@@ -863,7 +863,7 @@ static void announce_cpu(int cpu, int ap
|
||||
if (cpu == 1)
|
||||
printk(KERN_INFO "x86: Booting SMP configuration:\n");
|
||||
|
||||
- if (system_state == SYSTEM_BOOTING) {
|
||||
+ if (system_state < SYSTEM_RUNNING) {
|
||||
if (node != current_node) {
|
||||
if (current_node > (-1))
|
||||
pr_cont("\n");
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:52 +0100
|
||||
Subject: [PATCH] futex: Change locking rules
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit 734009e96d1983ad739e5b656e03430b3660c913
|
||||
|
||||
|
@ -38,7 +38,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -971,6 +971,39 @@ void exit_pi_state_list(struct task_stru
|
||||
@@ -973,6 +973,39 @@ void exit_pi_state_list(struct task_stru
|
||||
*
|
||||
* [10] There is no transient state which leaves owner and user space
|
||||
* TID out of sync.
|
||||
|
@ -78,7 +78,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
*/
|
||||
|
||||
/*
|
||||
@@ -978,10 +1011,12 @@ void exit_pi_state_list(struct task_stru
|
||||
@@ -980,10 +1013,12 @@ void exit_pi_state_list(struct task_stru
|
||||
* the pi_state against the user space value. If correct, attach to
|
||||
* it.
|
||||
*/
|
||||
|
@ -92,7 +92,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
/*
|
||||
* Userspace might have messed up non-PI and PI futexes [3]
|
||||
@@ -989,9 +1024,34 @@ static int attach_to_pi_state(u32 uval,
|
||||
@@ -991,9 +1026,34 @@ static int attach_to_pi_state(u32 uval,
|
||||
if (unlikely(!pi_state))
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -127,7 +127,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
* Handle the owner died case:
|
||||
*/
|
||||
if (uval & FUTEX_OWNER_DIED) {
|
||||
@@ -1006,11 +1066,11 @@ static int attach_to_pi_state(u32 uval,
|
||||
@@ -1008,11 +1068,11 @@ static int attach_to_pi_state(u32 uval,
|
||||
* is not 0. Inconsistent state. [5]
|
||||
*/
|
||||
if (pid)
|
||||
|
@ -141,7 +141,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -1022,14 +1082,14 @@ static int attach_to_pi_state(u32 uval,
|
||||
@@ -1024,14 +1084,14 @@ static int attach_to_pi_state(u32 uval,
|
||||
* Take a ref on the state and return success. [6]
|
||||
*/
|
||||
if (!pid)
|
||||
|
@ -158,7 +158,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -1038,11 +1098,29 @@ static int attach_to_pi_state(u32 uval,
|
||||
@@ -1040,11 +1100,29 @@ static int attach_to_pi_state(u32 uval,
|
||||
* user space TID. [9/10]
|
||||
*/
|
||||
if (pid != task_pid_vnr(pi_state->owner))
|
||||
|
@ -190,7 +190,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -1093,6 +1171,9 @@ static int attach_to_pi_owner(u32 uval,
|
||||
@@ -1095,6 +1173,9 @@ static int attach_to_pi_owner(u32 uval,
|
||||
|
||||
/*
|
||||
* No existing pi state. First waiter. [2]
|
||||
|
@ -200,7 +200,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
*/
|
||||
pi_state = alloc_pi_state();
|
||||
|
||||
@@ -1117,7 +1198,8 @@ static int attach_to_pi_owner(u32 uval,
|
||||
@@ -1119,7 +1200,8 @@ static int attach_to_pi_owner(u32 uval,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -210,7 +210,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
union futex_key *key, struct futex_pi_state **ps)
|
||||
{
|
||||
struct futex_q *top_waiter = futex_top_waiter(hb, key);
|
||||
@@ -1127,7 +1209,7 @@ static int lookup_pi_state(u32 uval, str
|
||||
@@ -1129,7 +1211,7 @@ static int lookup_pi_state(u32 uval, str
|
||||
* attach to the pi_state when the validation succeeds.
|
||||
*/
|
||||
if (top_waiter)
|
||||
|
@ -219,7 +219,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
/*
|
||||
* We are the first waiter - try to look up the owner based on
|
||||
@@ -1146,7 +1228,7 @@ static int lock_pi_update_atomic(u32 __u
|
||||
@@ -1148,7 +1230,7 @@ static int lock_pi_update_atomic(u32 __u
|
||||
if (unlikely(cmpxchg_futex_value_locked(&curval, uaddr, uval, newval)))
|
||||
return -EFAULT;
|
||||
|
||||
|
@ -228,7 +228,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
return curval != uval ? -EAGAIN : 0;
|
||||
}
|
||||
|
||||
@@ -1202,7 +1284,7 @@ static int futex_lock_pi_atomic(u32 __us
|
||||
@@ -1204,7 +1286,7 @@ static int futex_lock_pi_atomic(u32 __us
|
||||
*/
|
||||
top_waiter = futex_top_waiter(hb, key);
|
||||
if (top_waiter)
|
||||
|
@ -237,7 +237,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
/*
|
||||
* No waiter and user TID is 0. We are here because the
|
||||
@@ -1334,6 +1416,7 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1336,6 +1418,7 @@ static int wake_futex_pi(u32 __user *uad
|
||||
|
||||
if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval)) {
|
||||
ret = -EFAULT;
|
||||
|
@ -245,7 +245,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
} else if (curval != uval) {
|
||||
/*
|
||||
* If a unconditional UNLOCK_PI operation (user space did not
|
||||
@@ -1346,6 +1429,7 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1348,6 +1431,7 @@ static int wake_futex_pi(u32 __user *uad
|
||||
else
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
@ -253,7 +253,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
if (ret) {
|
||||
raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
|
||||
return ret;
|
||||
@@ -1821,7 +1905,7 @@ static int futex_requeue(u32 __user *uad
|
||||
@@ -1823,7 +1907,7 @@ static int futex_requeue(u32 __user *uad
|
||||
* If that call succeeds then we have pi_state and an
|
||||
* initial refcount on it.
|
||||
*/
|
||||
|
@ -262,7 +262,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
switch (ret) {
|
||||
@@ -2120,10 +2204,13 @@ static int fixup_pi_state_owner(u32 __us
|
||||
@@ -2122,10 +2206,13 @@ static int fixup_pi_state_owner(u32 __us
|
||||
{
|
||||
u32 newtid = task_pid_vnr(newowner) | FUTEX_WAITERS;
|
||||
struct futex_pi_state *pi_state = q->pi_state;
|
||||
|
@ -277,7 +277,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
/* Owner died? */
|
||||
if (!pi_state->owner)
|
||||
newtid |= FUTEX_OWNER_DIED;
|
||||
@@ -2139,11 +2226,10 @@ static int fixup_pi_state_owner(u32 __us
|
||||
@@ -2141,11 +2228,10 @@ static int fixup_pi_state_owner(u32 __us
|
||||
* because we can fault here. Imagine swapped out pages or a fork
|
||||
* that marked all the anonymous memory readonly for cow.
|
||||
*
|
||||
|
@ -293,7 +293,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
*/
|
||||
retry:
|
||||
if (get_futex_value_locked(&uval, uaddr))
|
||||
@@ -2164,47 +2250,60 @@ static int fixup_pi_state_owner(u32 __us
|
||||
@@ -2166,47 +2252,60 @@ static int fixup_pi_state_owner(u32 __us
|
||||
* itself.
|
||||
*/
|
||||
if (pi_state->owner != NULL) {
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
From dcd2e4734b428709984e2fa35ebbd6cccc246d47 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:36 +0200
|
||||
Subject: [PATCH 05/17] metag: Adjust system_state check
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state check in stop_this_cpu() to handle the extra states.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: James Hogan <james.hogan@imgtec.com>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Mark Rutland <mark.rutland@arm.com>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Link: http://lkml.kernel.org/r/20170516184735.283420315@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
arch/metag/kernel/smp.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/metag/kernel/smp.c
|
||||
+++ b/arch/metag/kernel/smp.c
|
||||
@@ -567,8 +567,7 @@ static void stop_this_cpu(void *data)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
- if (system_state == SYSTEM_BOOTING ||
|
||||
- system_state == SYSTEM_RUNNING) {
|
||||
+ if (system_state <= SYSTEM_RUNNING) {
|
||||
spin_lock(&stop_lock);
|
||||
pr_crit("CPU%u: stopping\n", cpu);
|
||||
dump_stack();
|
90
debian/patches/features/all/rt/0005-powerpc-smp-Replace-open-coded-task-affinity-logic.patch
vendored
Normal file
90
debian/patches/features/all/rt/0005-powerpc-smp-Replace-open-coded-task-affinity-logic.patch
vendored
Normal file
|
@ -0,0 +1,90 @@
|
|||
From 6d11b87d55eb75007a3721c2de5938f5bbf607fb Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 12 Apr 2017 22:07:31 +0200
|
||||
Subject: [PATCH 05/13] powerpc/smp: Replace open coded task affinity logic
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Init task invokes smp_ops->setup_cpu() from smp_cpus_done(). Init task can
|
||||
run on any online CPU at this point, but the setup_cpu() callback requires
|
||||
to be invoked on the boot CPU. This is achieved by temporarily setting the
|
||||
affinity of the calling user space thread to the requested CPU and reset it
|
||||
to the original affinity afterwards.
|
||||
|
||||
That's racy vs. CPU hotplug and concurrent affinity settings for that
|
||||
thread resulting in code executing on the wrong CPU and overwriting the
|
||||
new affinity setting.
|
||||
|
||||
That's actually not a problem in this context as neither CPU hotplug nor
|
||||
affinity settings can happen, but the access to task_struct::cpus_allowed
|
||||
is about to restricted.
|
||||
|
||||
Replace it with a call to work_on_cpu_safe() which achieves the same result.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: Paul Mackerras <paulus@samba.org>
|
||||
Cc: linuxppc-dev@lists.ozlabs.org
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/20170412201042.518053336@linutronix.de
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/powerpc/kernel/smp.c | 26 +++++++++++---------------
|
||||
1 file changed, 11 insertions(+), 15 deletions(-)
|
||||
|
||||
--- a/arch/powerpc/kernel/smp.c
|
||||
+++ b/arch/powerpc/kernel/smp.c
|
||||
@@ -787,24 +787,21 @@ static struct sched_domain_topology_leve
|
||||
{ NULL, },
|
||||
};
|
||||
|
||||
-void __init smp_cpus_done(unsigned int max_cpus)
|
||||
+static __init long smp_setup_cpu_workfn(void *data __always_unused)
|
||||
{
|
||||
- cpumask_var_t old_mask;
|
||||
+ smp_ops->setup_cpu(boot_cpuid);
|
||||
+ return 0;
|
||||
+}
|
||||
|
||||
- /* We want the setup_cpu() here to be called from CPU 0, but our
|
||||
- * init thread may have been "borrowed" by another CPU in the meantime
|
||||
- * se we pin us down to CPU 0 for a short while
|
||||
+void __init smp_cpus_done(unsigned int max_cpus)
|
||||
+{
|
||||
+ /*
|
||||
+ * We want the setup_cpu() here to be called on the boot CPU, but
|
||||
+ * init might run on any CPU, so make sure it's invoked on the boot
|
||||
+ * CPU.
|
||||
*/
|
||||
- alloc_cpumask_var(&old_mask, GFP_NOWAIT);
|
||||
- cpumask_copy(old_mask, ¤t->cpus_allowed);
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(boot_cpuid));
|
||||
-
|
||||
if (smp_ops && smp_ops->setup_cpu)
|
||||
- smp_ops->setup_cpu(boot_cpuid);
|
||||
-
|
||||
- set_cpus_allowed_ptr(current, old_mask);
|
||||
-
|
||||
- free_cpumask_var(old_mask);
|
||||
+ work_on_cpu_safe(boot_cpuid, smp_setup_cpu_workfn, NULL);
|
||||
|
||||
if (smp_ops && smp_ops->bringup_done)
|
||||
smp_ops->bringup_done();
|
||||
@@ -812,7 +809,6 @@ void __init smp_cpus_done(unsigned int m
|
||||
dump_numa_cpu_topology();
|
||||
|
||||
set_sched_topology(powerpc_topology);
|
||||
-
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
|
@ -1,9 +1,8 @@
|
|||
From acd58620e415aee4a43a808d7d2fd87259ee0001 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Thu, 23 Mar 2017 15:56:11 +0100
|
||||
Subject: [PATCH] sched/rtmutex: Refactor rt_mutex_setprio()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit acd58620e415aee4a43a808d7d2fd87259ee0001
|
||||
Subject: [PATCH 5/9] sched/rtmutex: Refactor rt_mutex_setprio()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
With the introduction of SCHED_DEADLINE the whole notion that priority
|
||||
is a single number is gone, therefore the @prio argument to
|
||||
|
@ -36,7 +35,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/include/linux/sched/rt.h
|
||||
+++ b/include/linux/sched/rt.h
|
||||
@@ -16,28 +16,20 @@ static inline int rt_task(struct task_st
|
||||
@@ -18,28 +18,20 @@ static inline int rt_task(struct task_st
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RT_MUTEXES
|
||||
|
@ -75,7 +74,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
return NULL;
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -320,67 +320,16 @@ rt_mutex_dequeue_pi(struct task_struct *
|
||||
@@ -322,67 +322,16 @@ rt_mutex_dequeue_pi(struct task_struct *
|
||||
RB_CLEAR_NODE(&waiter->pi_tree_entry);
|
||||
}
|
||||
|
||||
|
@ -149,7 +148,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -740,7 +689,7 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
@@ -742,7 +691,7 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
*/
|
||||
rt_mutex_dequeue_pi(task, prerequeue_top_waiter);
|
||||
rt_mutex_enqueue_pi(task, waiter);
|
||||
|
@ -158,7 +157,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
} else if (prerequeue_top_waiter == waiter) {
|
||||
/*
|
||||
@@ -756,7 +705,7 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
@@ -758,7 +707,7 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
rt_mutex_dequeue_pi(task, waiter);
|
||||
waiter = rt_mutex_top_waiter(lock);
|
||||
rt_mutex_enqueue_pi(task, waiter);
|
||||
|
@ -167,7 +166,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
} else {
|
||||
/*
|
||||
* Nothing changed. No need to do any priority
|
||||
@@ -964,7 +913,7 @@ static int task_blocks_on_rt_mutex(struc
|
||||
@@ -966,7 +915,7 @@ static int task_blocks_on_rt_mutex(struc
|
||||
return -EDEADLK;
|
||||
|
||||
raw_spin_lock(&task->pi_lock);
|
||||
|
@ -176,7 +175,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
waiter->task = task;
|
||||
waiter->lock = lock;
|
||||
waiter->prio = task->prio;
|
||||
@@ -986,7 +935,7 @@ static int task_blocks_on_rt_mutex(struc
|
||||
@@ -988,7 +937,7 @@ static int task_blocks_on_rt_mutex(struc
|
||||
rt_mutex_dequeue_pi(owner, top_waiter);
|
||||
rt_mutex_enqueue_pi(owner, waiter);
|
||||
|
||||
|
@ -185,7 +184,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
if (owner->pi_blocked_on)
|
||||
chain_walk = 1;
|
||||
} else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) {
|
||||
@@ -1038,13 +987,14 @@ static void mark_wakeup_next_waiter(stru
|
||||
@@ -1040,13 +989,14 @@ static void mark_wakeup_next_waiter(stru
|
||||
waiter = rt_mutex_top_waiter(lock);
|
||||
|
||||
/*
|
||||
|
@ -205,7 +204,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
/*
|
||||
* As we are waking up the top waiter, and the waiter stays
|
||||
@@ -1056,9 +1006,19 @@ static void mark_wakeup_next_waiter(stru
|
||||
@@ -1058,9 +1008,19 @@ static void mark_wakeup_next_waiter(stru
|
||||
*/
|
||||
lock->owner = (void *) RT_MUTEX_HAS_WAITERS;
|
||||
|
||||
|
@ -227,7 +226,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -1093,7 +1053,7 @@ static void remove_waiter(struct rt_mute
|
||||
@@ -1095,7 +1055,7 @@ static void remove_waiter(struct rt_mute
|
||||
if (rt_mutex_has_waiters(lock))
|
||||
rt_mutex_enqueue_pi(owner, rt_mutex_top_waiter(lock));
|
||||
|
||||
|
@ -236,7 +235,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
/* Store the lock on which owner is blocked or NULL */
|
||||
next_lock = task_blocked_on_lock(owner);
|
||||
@@ -1132,8 +1092,7 @@ void rt_mutex_adjust_pi(struct task_stru
|
||||
@@ -1134,8 +1094,7 @@ void rt_mutex_adjust_pi(struct task_stru
|
||||
raw_spin_lock_irqsave(&task->pi_lock, flags);
|
||||
|
||||
waiter = task->pi_blocked_on;
|
||||
|
@ -246,7 +245,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
raw_spin_unlock_irqrestore(&task->pi_lock, flags);
|
||||
return;
|
||||
}
|
||||
@@ -1387,17 +1346,6 @@ static bool __sched rt_mutex_slowunlock(
|
||||
@@ -1389,17 +1348,6 @@ static bool __sched rt_mutex_slowunlock(
|
||||
* Queue the next waiter for wakeup once we release the wait_lock.
|
||||
*/
|
||||
mark_wakeup_next_waiter(wake_q, lock);
|
||||
|
@ -266,7 +265,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
return true; /* call rt_mutex_postunlock() */
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -3629,10 +3629,25 @@ EXPORT_SYMBOL(default_wake_function);
|
||||
@@ -3671,10 +3671,25 @@ EXPORT_SYMBOL(default_wake_function);
|
||||
|
||||
#ifdef CONFIG_RT_MUTEXES
|
||||
|
||||
|
@ -294,7 +293,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
*
|
||||
* This function changes the 'effective' priority of a task. It does
|
||||
* not touch ->normal_prio like __setscheduler().
|
||||
@@ -3640,16 +3655,40 @@ EXPORT_SYMBOL(default_wake_function);
|
||||
@@ -3682,17 +3697,41 @@ EXPORT_SYMBOL(default_wake_function);
|
||||
* Used by the rt_mutex code to implement priority inheritance
|
||||
* logic. Call site only calls if the priority of the task changed.
|
||||
*/
|
||||
|
@ -318,6 +317,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
+ return;
|
||||
|
||||
rq = __task_rq_lock(p, &rf);
|
||||
update_rq_clock(rq);
|
||||
+ /*
|
||||
+ * Set under pi_lock && rq->lock, such that the value can be used under
|
||||
+ * either lock.
|
||||
|
@ -338,7 +338,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
/*
|
||||
* Idle task boosting is a nono in general. There is one
|
||||
@@ -3669,9 +3708,7 @@ void rt_mutex_setprio(struct task_struct
|
||||
@@ -3712,9 +3751,7 @@ void rt_mutex_setprio(struct task_struct
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
|
@ -349,7 +349,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
oldprio = p->prio;
|
||||
|
||||
if (oldprio == prio)
|
||||
@@ -3695,7 +3732,6 @@ void rt_mutex_setprio(struct task_struct
|
||||
@@ -3738,7 +3775,6 @@ void rt_mutex_setprio(struct task_struct
|
||||
* running task
|
||||
*/
|
||||
if (dl_prio(prio)) {
|
||||
|
@ -357,7 +357,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
if (!dl_prio(p->normal_prio) ||
|
||||
(pi_task && dl_entity_preempt(&pi_task->dl, &p->dl))) {
|
||||
p->dl.dl_boosted = 1;
|
||||
@@ -3732,6 +3768,11 @@ void rt_mutex_setprio(struct task_struct
|
||||
@@ -3776,6 +3812,11 @@ void rt_mutex_setprio(struct task_struct
|
||||
balance_callback(rq);
|
||||
preempt_enable();
|
||||
}
|
||||
|
@ -369,7 +369,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
#endif
|
||||
|
||||
void set_user_nice(struct task_struct *p, long nice)
|
||||
@@ -3976,10 +4017,9 @@ static void __setscheduler(struct rq *rq
|
||||
@@ -4022,10 +4063,9 @@ static void __setscheduler(struct rq *rq
|
||||
* Keep a potential priority boosting if called from
|
||||
* sched_setscheduler().
|
||||
*/
|
||||
|
@ -382,7 +382,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
if (dl_prio(p->prio))
|
||||
p->sched_class = &dl_sched_class;
|
||||
@@ -4266,7 +4306,7 @@ static int __sched_setscheduler(struct t
|
||||
@@ -4312,7 +4352,7 @@ static int __sched_setscheduler(struct t
|
||||
* the runqueue. This will be done when the task deboost
|
||||
* itself.
|
||||
*/
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:53 +0100
|
||||
Subject: [PATCH] futex: Cleanup refcounting
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit bf92cf3a5100f5a0d5f9834787b130159397cb22
|
||||
|
||||
|
@ -26,7 +26,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -800,7 +800,7 @@ static int refill_pi_state_cache(void)
|
||||
@@ -802,7 +802,7 @@ static int refill_pi_state_cache(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
{
|
||||
struct futex_pi_state *pi_state = current->pi_state_cache;
|
||||
|
||||
@@ -810,6 +810,11 @@ static struct futex_pi_state * alloc_pi_
|
||||
@@ -812,6 +812,11 @@ static struct futex_pi_state * alloc_pi_
|
||||
return pi_state;
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
/*
|
||||
* Drops a reference to the pi_state object and frees or caches it
|
||||
* when the last reference is gone.
|
||||
@@ -854,7 +859,7 @@ static void put_pi_state(struct futex_pi
|
||||
@@ -856,7 +861,7 @@ static void put_pi_state(struct futex_pi
|
||||
* Look up the task based on what TID userspace gave us.
|
||||
* We dont trust it.
|
||||
*/
|
||||
|
@ -56,7 +56,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
{
|
||||
struct task_struct *p;
|
||||
|
||||
@@ -1101,7 +1106,7 @@ static int attach_to_pi_state(u32 __user
|
||||
@@ -1103,7 +1108,7 @@ static int attach_to_pi_state(u32 __user
|
||||
goto out_einval;
|
||||
|
||||
out_attach:
|
||||
|
@ -65,7 +65,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
|
||||
*ps = pi_state;
|
||||
return 0;
|
||||
@@ -1988,7 +1993,7 @@ static int futex_requeue(u32 __user *uad
|
||||
@@ -1990,7 +1995,7 @@ static int futex_requeue(u32 __user *uad
|
||||
* refcount on the pi_state and store the pointer in
|
||||
* the futex_q object of the waiter.
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
From a8fcfc1917681ba1ccc23a429543a67aad8bfd00 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:37 +0200
|
||||
Subject: [PATCH 06/17] powerpc: Adjust system_state check
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state check in smp_generic_cpu_bootable() to handle the
|
||||
extra states.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Acked-by: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Mark Rutland <mark.rutland@arm.com>
|
||||
Cc: Paul Mackerras <paulus@samba.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Cc: linuxppc-dev@lists.ozlabs.org
|
||||
Link: http://lkml.kernel.org/r/20170516184735.359536998@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
arch/powerpc/kernel/smp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/powerpc/kernel/smp.c
|
||||
+++ b/arch/powerpc/kernel/smp.c
|
||||
@@ -98,7 +98,7 @@ int smp_generic_cpu_bootable(unsigned in
|
||||
/* Special case - we inhibit secondary thread startup
|
||||
* during boot if the user requests it.
|
||||
*/
|
||||
- if (system_state == SYSTEM_BOOTING && cpu_has_feature(CPU_FTR_SMT)) {
|
||||
+ if (system_state < SYSTEM_RUNNING && cpu_has_feature(CPU_FTR_SMT)) {
|
||||
if (!smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
|
||||
return 0;
|
||||
if (smt_enabled_at_boot
|
|
@ -1,9 +1,8 @@
|
|||
From b91473ff6e979c0028f02f90e40c844959c736d8 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Thu, 23 Mar 2017 15:56:12 +0100
|
||||
Subject: [PATCH] sched,tracing: Update trace_sched_pi_setprio()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit b91473ff6e979c0028f02f90e40c844959c736d8
|
||||
Subject: [PATCH 6/9] sched,tracing: Update trace_sched_pi_setprio()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Pass the PI donor task, instead of a numerical priority.
|
||||
|
||||
|
@ -98,7 +97,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
TP_printk("comm=%s pid=%d oldprio=%d newprio=%d",
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -3708,7 +3708,7 @@ void rt_mutex_setprio(struct task_struct
|
||||
@@ -3751,7 +3751,7 @@ void rt_mutex_setprio(struct task_struct
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
|
|
119
debian/patches/features/all/rt/0006-sparc-sysfs-Replace-racy-task-affinity-logic.patch
vendored
Normal file
119
debian/patches/features/all/rt/0006-sparc-sysfs-Replace-racy-task-affinity-logic.patch
vendored
Normal file
|
@ -0,0 +1,119 @@
|
|||
From ea875ec94eafb858990f3fe9528501f983105653 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 13 Apr 2017 10:17:07 +0200
|
||||
Subject: [PATCH 06/13] sparc/sysfs: Replace racy task affinity logic
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The mmustat_enable sysfs file accessor functions must run code on the
|
||||
target CPU. This is achieved by temporarily setting the affinity of the
|
||||
calling user space thread to the requested CPU and reset it to the original
|
||||
affinity afterwards.
|
||||
|
||||
That's racy vs. concurrent affinity settings for that thread resulting in
|
||||
code executing on the wrong CPU and overwriting the new affinity setting.
|
||||
|
||||
Replace it by using work_on_cpu() which guarantees to run the code on the
|
||||
requested CPU.
|
||||
|
||||
Protection against CPU hotplug is not required as the open sysfs file
|
||||
already prevents the removal from the CPU offline callback. Using the
|
||||
hotplug protected version would actually be wrong because it would deadlock
|
||||
against a CPU hotplug operation of the CPU associated to the sysfs file in
|
||||
progress.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: David S. Miller <davem@davemloft.net>
|
||||
Cc: fenghua.yu@intel.com
|
||||
Cc: tony.luck@intel.com
|
||||
Cc: herbert@gondor.apana.org.au
|
||||
Cc: rjw@rjwysocki.net
|
||||
Cc: peterz@infradead.org
|
||||
Cc: benh@kernel.crashing.org
|
||||
Cc: bigeasy@linutronix.de
|
||||
Cc: jiangshanlai@gmail.com
|
||||
Cc: sparclinux@vger.kernel.org
|
||||
Cc: viresh.kumar@linaro.org
|
||||
Cc: mpe@ellerman.id.au
|
||||
Cc: tj@kernel.org
|
||||
Cc: lenb@kernel.org
|
||||
Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1704131001270.2408@nanos
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/sparc/kernel/sysfs.c | 39 +++++++++++----------------------------
|
||||
1 file changed, 11 insertions(+), 28 deletions(-)
|
||||
|
||||
--- a/arch/sparc/kernel/sysfs.c
|
||||
+++ b/arch/sparc/kernel/sysfs.c
|
||||
@@ -98,27 +98,7 @@ static struct attribute_group mmu_stat_g
|
||||
.name = "mmu_stats",
|
||||
};
|
||||
|
||||
-/* XXX convert to rusty's on_one_cpu */
|
||||
-static unsigned long run_on_cpu(unsigned long cpu,
|
||||
- unsigned long (*func)(unsigned long),
|
||||
- unsigned long arg)
|
||||
-{
|
||||
- cpumask_t old_affinity;
|
||||
- unsigned long ret;
|
||||
-
|
||||
- cpumask_copy(&old_affinity, ¤t->cpus_allowed);
|
||||
- /* should return -EINVAL to userspace */
|
||||
- if (set_cpus_allowed_ptr(current, cpumask_of(cpu)))
|
||||
- return 0;
|
||||
-
|
||||
- ret = func(arg);
|
||||
-
|
||||
- set_cpus_allowed_ptr(current, &old_affinity);
|
||||
-
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
-static unsigned long read_mmustat_enable(unsigned long junk)
|
||||
+static long read_mmustat_enable(void *data __maybe_unused)
|
||||
{
|
||||
unsigned long ra = 0;
|
||||
|
||||
@@ -127,11 +107,11 @@ static unsigned long read_mmustat_enable
|
||||
return ra != 0;
|
||||
}
|
||||
|
||||
-static unsigned long write_mmustat_enable(unsigned long val)
|
||||
+static long write_mmustat_enable(void *data)
|
||||
{
|
||||
- unsigned long ra, orig_ra;
|
||||
+ unsigned long ra, orig_ra, *val = data;
|
||||
|
||||
- if (val)
|
||||
+ if (*val)
|
||||
ra = __pa(&per_cpu(mmu_stats, smp_processor_id()));
|
||||
else
|
||||
ra = 0UL;
|
||||
@@ -142,7 +122,8 @@ static unsigned long write_mmustat_enabl
|
||||
static ssize_t show_mmustat_enable(struct device *s,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
- unsigned long val = run_on_cpu(s->id, read_mmustat_enable, 0);
|
||||
+ long val = work_on_cpu(s->id, read_mmustat_enable, NULL);
|
||||
+
|
||||
return sprintf(buf, "%lx\n", val);
|
||||
}
|
||||
|
||||
@@ -150,13 +131,15 @@ static ssize_t store_mmustat_enable(stru
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
- unsigned long val, err;
|
||||
- int ret = sscanf(buf, "%lu", &val);
|
||||
+ unsigned long val;
|
||||
+ long err;
|
||||
+ int ret;
|
||||
|
||||
+ ret = sscanf(buf, "%lu", &val);
|
||||
if (ret != 1)
|
||||
return -EINVAL;
|
||||
|
||||
- err = run_on_cpu(s->id, write_mmustat_enable, val);
|
||||
+ err = work_on_cpu(s->id, write_mmustat_enable, &val);
|
||||
if (err)
|
||||
return -EIO;
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
From 9762b33dc31c67e34b36ba4e787e64084b3136ff Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:38 +0200
|
||||
Subject: [PATCH 07/17] ACPI: Adjust system_state check
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Make the decision whether a pci root is hotplugged depend on SYSTEM_RUNNING
|
||||
instead of !SYSTEM_BOOTING. It makes no sense to cover states greater than
|
||||
SYSTEM_RUNNING as there are not hotplug events on reboot and poweroff.
|
||||
|
||||
Tested-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
|
||||
Link: http://lkml.kernel.org/r/20170516184735.446455652@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
drivers/acpi/pci_root.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/acpi/pci_root.c
|
||||
+++ b/drivers/acpi/pci_root.c
|
||||
@@ -523,7 +523,7 @@ static int acpi_pci_root_add(struct acpi
|
||||
struct acpi_pci_root *root;
|
||||
acpi_handle handle = device->handle;
|
||||
int no_aspm = 0;
|
||||
- bool hotadd = system_state != SYSTEM_BOOTING;
|
||||
+ bool hotadd = system_state == SYSTEM_RUNNING;
|
||||
|
||||
root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL);
|
||||
if (!root)
|
46
debian/patches/features/all/rt/0007-ACPI-processor-Fix-error-handling-in-__acpi_processo.patch
vendored
Normal file
46
debian/patches/features/all/rt/0007-ACPI-processor-Fix-error-handling-in-__acpi_processo.patch
vendored
Normal file
|
@ -0,0 +1,46 @@
|
|||
From a5cbdf693a60d5b86d4d21dfedd90f17754eb273 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 12 Apr 2017 22:07:33 +0200
|
||||
Subject: [PATCH 07/13] ACPI/processor: Fix error handling in
|
||||
__acpi_processor_start()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
When acpi_install_notify_handler() fails the cooling device stays
|
||||
registered and the sysfs files created via acpi_pss_perf_init() are
|
||||
leaked and the function returns success.
|
||||
|
||||
Undo acpi_pss_perf_init() and return a proper error code.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: linux-acpi@vger.kernel.org
|
||||
Cc: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/20170412201042.695499645@linutronix.de
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/acpi/processor_driver.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/acpi/processor_driver.c
|
||||
+++ b/drivers/acpi/processor_driver.c
|
||||
@@ -251,6 +251,9 @@ static int __acpi_processor_start(struct
|
||||
if (ACPI_SUCCESS(status))
|
||||
return 0;
|
||||
|
||||
+ result = -ENODEV;
|
||||
+ acpi_pss_perf_exit(pr, device);
|
||||
+
|
||||
err_power_exit:
|
||||
acpi_processor_power_exit(pr);
|
||||
return result;
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:54 +0100
|
||||
Subject: [PATCH] futex: Rework inconsistent rt_mutex/futex_q state
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit 73d786bd043ebc855f349c81ea805f6b11cbf2aa
|
||||
|
||||
|
@ -59,7 +59,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -1402,12 +1402,19 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1404,12 +1404,19 @@ static int wake_futex_pi(u32 __user *uad
|
||||
new_owner = rt_mutex_next_owner(&pi_state->pi_mutex);
|
||||
|
||||
/*
|
||||
|
@ -84,7 +84,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
/*
|
||||
* We pass it to the next owner. The WAITERS bit is always
|
||||
@@ -2330,7 +2337,6 @@ static long futex_wait_restart(struct re
|
||||
@@ -2332,7 +2339,6 @@ static long futex_wait_restart(struct re
|
||||
*/
|
||||
static int fixup_owner(u32 __user *uaddr, struct futex_q *q, int locked)
|
||||
{
|
||||
|
@ -92,7 +92,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
int ret = 0;
|
||||
|
||||
if (locked) {
|
||||
@@ -2344,43 +2350,15 @@ static int fixup_owner(u32 __user *uaddr
|
||||
@@ -2346,43 +2352,15 @@ static int fixup_owner(u32 __user *uaddr
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
From e0aad5b44ff5d28ac1d6ae70cdf84ca228e889dc Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Thu, 23 Mar 2017 15:56:13 +0100
|
||||
Subject: [PATCH] rtmutex: Fix PI chain order integrity
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit e0aad5b44ff5d28ac1d6ae70cdf84ca228e889dc
|
||||
Subject: [PATCH 7/9] rtmutex: Fix PI chain order integrity
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
rt_mutex_waiter::prio is a copy of task_struct::prio which is updated
|
||||
during the PI chain walk, such that the PI chain order isn't messed up
|
||||
|
@ -38,7 +37,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -236,8 +236,7 @@ rt_mutex_waiter_less(struct rt_mutex_wai
|
||||
@@ -238,8 +238,7 @@ rt_mutex_waiter_less(struct rt_mutex_wai
|
||||
* then right waiter has a dl_prio() too.
|
||||
*/
|
||||
if (dl_prio(left->prio))
|
||||
|
@ -48,7 +47,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
return 0;
|
||||
}
|
||||
@@ -648,7 +647,26 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
@@ -650,7 +649,26 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
|
||||
/* [7] Requeue the waiter in the lock waiter tree. */
|
||||
rt_mutex_dequeue(lock, waiter);
|
||||
|
@ -75,7 +74,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
rt_mutex_enqueue(lock, waiter);
|
||||
|
||||
/* [8] Release the task */
|
||||
@@ -775,6 +793,8 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
@@ -777,6 +795,8 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task,
|
||||
struct rt_mutex_waiter *waiter)
|
||||
{
|
||||
|
@ -84,7 +83,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
/*
|
||||
* Before testing whether we can acquire @lock, we set the
|
||||
* RT_MUTEX_HAS_WAITERS bit in @lock->owner. This forces all
|
||||
@@ -900,6 +920,8 @@ static int task_blocks_on_rt_mutex(struc
|
||||
@@ -902,6 +922,8 @@ static int task_blocks_on_rt_mutex(struc
|
||||
struct rt_mutex *next_lock;
|
||||
int chain_walk = 0, res;
|
||||
|
||||
|
@ -93,7 +92,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
/*
|
||||
* Early deadlock detection. We really don't want the task to
|
||||
* enqueue on itself just to untangle the mess later. It's not
|
||||
@@ -917,6 +939,7 @@ static int task_blocks_on_rt_mutex(struc
|
||||
@@ -919,6 +941,7 @@ static int task_blocks_on_rt_mutex(struc
|
||||
waiter->task = task;
|
||||
waiter->lock = lock;
|
||||
waiter->prio = task->prio;
|
||||
|
@ -101,7 +100,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
/* Get the top priority waiter on the lock */
|
||||
if (rt_mutex_has_waiters(lock))
|
||||
@@ -1034,6 +1057,8 @@ static void remove_waiter(struct rt_mute
|
||||
@@ -1036,6 +1059,8 @@ static void remove_waiter(struct rt_mute
|
||||
struct task_struct *owner = rt_mutex_owner(lock);
|
||||
struct rt_mutex *next_lock;
|
||||
|
||||
|
@ -112,7 +111,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
current->pi_blocked_on = NULL;
|
||||
--- a/kernel/locking/rtmutex_common.h
|
||||
+++ b/kernel/locking/rtmutex_common.h
|
||||
@@ -33,6 +33,7 @@ struct rt_mutex_waiter {
|
||||
@@ -34,6 +34,7 @@ struct rt_mutex_waiter {
|
||||
struct rt_mutex *deadlock_lock;
|
||||
#endif
|
||||
int prio;
|
||||
|
|
194
debian/patches/features/all/rt/0008-ACPI-processor-Replace-racy-task-affinity-logic.patch
vendored
Normal file
194
debian/patches/features/all/rt/0008-ACPI-processor-Replace-racy-task-affinity-logic.patch
vendored
Normal file
|
@ -0,0 +1,194 @@
|
|||
From 8153f9ac43897f9f4786b30badc134fcc1a4fb11 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 12 Apr 2017 22:07:34 +0200
|
||||
Subject: [PATCH 08/13] ACPI/processor: Replace racy task affinity logic
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
acpi_processor_get_throttling() requires to invoke the getter function on
|
||||
the target CPU. This is achieved by temporarily setting the affinity of the
|
||||
calling user space thread to the requested CPU and reset it to the original
|
||||
affinity afterwards.
|
||||
|
||||
That's racy vs. CPU hotplug and concurrent affinity settings for that
|
||||
thread resulting in code executing on the wrong CPU and overwriting the
|
||||
new affinity setting.
|
||||
|
||||
acpi_processor_get_throttling() is invoked in two ways:
|
||||
|
||||
1) The CPU online callback, which is already running on the target CPU and
|
||||
obviously protected against hotplug and not affected by affinity
|
||||
settings.
|
||||
|
||||
2) The ACPI driver probe function, which is not protected against hotplug
|
||||
during modprobe.
|
||||
|
||||
Switch it over to work_on_cpu() and protect the probe function against CPU
|
||||
hotplug.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: linux-acpi@vger.kernel.org
|
||||
Cc: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/20170412201042.785920903@linutronix.de
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/acpi/processor_driver.c | 7 +++-
|
||||
drivers/acpi/processor_throttling.c | 62 ++++++++++++++++++++----------------
|
||||
2 files changed, 42 insertions(+), 27 deletions(-)
|
||||
|
||||
--- a/drivers/acpi/processor_driver.c
|
||||
+++ b/drivers/acpi/processor_driver.c
|
||||
@@ -262,11 +262,16 @@ static int __acpi_processor_start(struct
|
||||
static int acpi_processor_start(struct device *dev)
|
||||
{
|
||||
struct acpi_device *device = ACPI_COMPANION(dev);
|
||||
+ int ret;
|
||||
|
||||
if (!device)
|
||||
return -ENODEV;
|
||||
|
||||
- return __acpi_processor_start(device);
|
||||
+ /* Protect against concurrent CPU hotplug operations */
|
||||
+ get_online_cpus();
|
||||
+ ret = __acpi_processor_start(device);
|
||||
+ put_online_cpus();
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int acpi_processor_stop(struct device *dev)
|
||||
--- a/drivers/acpi/processor_throttling.c
|
||||
+++ b/drivers/acpi/processor_throttling.c
|
||||
@@ -62,8 +62,8 @@ struct acpi_processor_throttling_arg {
|
||||
#define THROTTLING_POSTCHANGE (2)
|
||||
|
||||
static int acpi_processor_get_throttling(struct acpi_processor *pr);
|
||||
-int acpi_processor_set_throttling(struct acpi_processor *pr,
|
||||
- int state, bool force);
|
||||
+static int __acpi_processor_set_throttling(struct acpi_processor *pr,
|
||||
+ int state, bool force, bool direct);
|
||||
|
||||
static int acpi_processor_update_tsd_coord(void)
|
||||
{
|
||||
@@ -891,7 +891,8 @@ static int acpi_processor_get_throttling
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Invalid throttling state, reset\n"));
|
||||
state = 0;
|
||||
- ret = acpi_processor_set_throttling(pr, state, true);
|
||||
+ ret = __acpi_processor_set_throttling(pr, state, true,
|
||||
+ true);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -901,36 +902,31 @@ static int acpi_processor_get_throttling
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int acpi_processor_get_throttling(struct acpi_processor *pr)
|
||||
+static long __acpi_processor_get_throttling(void *data)
|
||||
{
|
||||
- cpumask_var_t saved_mask;
|
||||
- int ret;
|
||||
+ struct acpi_processor *pr = data;
|
||||
+
|
||||
+ return pr->throttling.acpi_processor_get_throttling(pr);
|
||||
+}
|
||||
|
||||
+static int acpi_processor_get_throttling(struct acpi_processor *pr)
|
||||
+{
|
||||
if (!pr)
|
||||
return -EINVAL;
|
||||
|
||||
if (!pr->flags.throttling)
|
||||
return -ENODEV;
|
||||
|
||||
- if (!alloc_cpumask_var(&saved_mask, GFP_KERNEL))
|
||||
- return -ENOMEM;
|
||||
-
|
||||
/*
|
||||
- * Migrate task to the cpu pointed by pr.
|
||||
+ * This is either called from the CPU hotplug callback of
|
||||
+ * processor_driver or via the ACPI probe function. In the latter
|
||||
+ * case the CPU is not guaranteed to be online. Both call sites are
|
||||
+ * protected against CPU hotplug.
|
||||
*/
|
||||
- cpumask_copy(saved_mask, ¤t->cpus_allowed);
|
||||
- /* FIXME: use work_on_cpu() */
|
||||
- if (set_cpus_allowed_ptr(current, cpumask_of(pr->id))) {
|
||||
- /* Can't migrate to the target pr->id CPU. Exit */
|
||||
- free_cpumask_var(saved_mask);
|
||||
+ if (!cpu_online(pr->id))
|
||||
return -ENODEV;
|
||||
- }
|
||||
- ret = pr->throttling.acpi_processor_get_throttling(pr);
|
||||
- /* restore the previous state */
|
||||
- set_cpus_allowed_ptr(current, saved_mask);
|
||||
- free_cpumask_var(saved_mask);
|
||||
|
||||
- return ret;
|
||||
+ return work_on_cpu(pr->id, __acpi_processor_get_throttling, pr);
|
||||
}
|
||||
|
||||
static int acpi_processor_get_fadt_info(struct acpi_processor *pr)
|
||||
@@ -1080,8 +1076,15 @@ static long acpi_processor_throttling_fn
|
||||
arg->target_state, arg->force);
|
||||
}
|
||||
|
||||
-int acpi_processor_set_throttling(struct acpi_processor *pr,
|
||||
- int state, bool force)
|
||||
+static int call_on_cpu(int cpu, long (*fn)(void *), void *arg, bool direct)
|
||||
+{
|
||||
+ if (direct)
|
||||
+ return fn(arg);
|
||||
+ return work_on_cpu(cpu, fn, arg);
|
||||
+}
|
||||
+
|
||||
+static int __acpi_processor_set_throttling(struct acpi_processor *pr,
|
||||
+ int state, bool force, bool direct)
|
||||
{
|
||||
int ret = 0;
|
||||
unsigned int i;
|
||||
@@ -1130,7 +1133,8 @@ int acpi_processor_set_throttling(struct
|
||||
arg.pr = pr;
|
||||
arg.target_state = state;
|
||||
arg.force = force;
|
||||
- ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, &arg);
|
||||
+ ret = call_on_cpu(pr->id, acpi_processor_throttling_fn, &arg,
|
||||
+ direct);
|
||||
} else {
|
||||
/*
|
||||
* When the T-state coordination is SW_ALL or HW_ALL,
|
||||
@@ -1163,8 +1167,8 @@ int acpi_processor_set_throttling(struct
|
||||
arg.pr = match_pr;
|
||||
arg.target_state = state;
|
||||
arg.force = force;
|
||||
- ret = work_on_cpu(pr->id, acpi_processor_throttling_fn,
|
||||
- &arg);
|
||||
+ ret = call_on_cpu(pr->id, acpi_processor_throttling_fn,
|
||||
+ &arg, direct);
|
||||
}
|
||||
}
|
||||
/*
|
||||
@@ -1182,6 +1186,12 @@ int acpi_processor_set_throttling(struct
|
||||
return ret;
|
||||
}
|
||||
|
||||
+int acpi_processor_set_throttling(struct acpi_processor *pr, int state,
|
||||
+ bool force)
|
||||
+{
|
||||
+ return __acpi_processor_set_throttling(pr, state, force, false);
|
||||
+}
|
||||
+
|
||||
int acpi_processor_get_throttling_info(struct acpi_processor *pr)
|
||||
{
|
||||
int result = 0;
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:55 +0100
|
||||
Subject: [PATCH] futex: Pull rt_mutex_futex_unlock() out from under hb->lock
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit 16ffa12d742534d4ff73e8b3a4e81c1de39196f0
|
||||
|
||||
|
@ -45,7 +45,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -919,10 +919,12 @@ void exit_pi_state_list(struct task_stru
|
||||
@@ -921,10 +921,12 @@ void exit_pi_state_list(struct task_stru
|
||||
pi_state->owner = NULL;
|
||||
raw_spin_unlock_irq(&curr->pi_lock);
|
||||
|
||||
|
@ -60,7 +60,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
raw_spin_lock_irq(&curr->pi_lock);
|
||||
}
|
||||
raw_spin_unlock_irq(&curr->pi_lock);
|
||||
@@ -1035,6 +1037,11 @@ static int attach_to_pi_state(u32 __user
|
||||
@@ -1037,6 +1039,11 @@ static int attach_to_pi_state(u32 __user
|
||||
* has dropped the hb->lock in between queue_me() and unqueue_me_pi(),
|
||||
* which in turn means that futex_lock_pi() still has a reference on
|
||||
* our pi_state.
|
||||
|
@ -72,7 +72,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
*/
|
||||
WARN_ON(!atomic_read(&pi_state->refcount));
|
||||
|
||||
@@ -1378,48 +1385,40 @@ static void mark_wake_futex(struct wake_
|
||||
@@ -1380,48 +1387,40 @@ static void mark_wake_futex(struct wake_
|
||||
smp_store_release(&q->lock_ptr, NULL);
|
||||
}
|
||||
|
||||
|
@ -88,7 +88,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
u32 uninitialized_var(curval), newval;
|
||||
+ struct task_struct *new_owner;
|
||||
+ bool deboost = false;
|
||||
WAKE_Q(wake_q);
|
||||
DEFINE_WAKE_Q(wake_q);
|
||||
- bool deboost;
|
||||
int ret = 0;
|
||||
|
||||
|
@ -144,7 +144,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
*/
|
||||
newval = FUTEX_WAITERS | task_pid_vnr(new_owner);
|
||||
|
||||
@@ -1442,10 +1441,8 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1444,10 +1443,8 @@ static int wake_futex_pi(u32 __user *uad
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -157,7 +157,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
raw_spin_lock(&pi_state->owner->pi_lock);
|
||||
WARN_ON(list_empty(&pi_state->list));
|
||||
@@ -1463,15 +1460,15 @@ static int wake_futex_pi(u32 __user *uad
|
||||
@@ -1465,15 +1462,15 @@ static int wake_futex_pi(u32 __user *uad
|
||||
*/
|
||||
deboost = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q);
|
||||
|
||||
|
@ -175,7 +175,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -2230,7 +2227,8 @@ static int fixup_pi_state_owner(u32 __us
|
||||
@@ -2232,7 +2229,8 @@ static int fixup_pi_state_owner(u32 __us
|
||||
/*
|
||||
* We are here either because we stole the rtmutex from the
|
||||
* previous highest priority waiter or we are the highest priority
|
||||
|
@ -185,7 +185,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
* We have to replace the newowner TID in the user space variable.
|
||||
* This must be atomic as we have to preserve the owner died bit here.
|
||||
*
|
||||
@@ -2247,7 +2245,7 @@ static int fixup_pi_state_owner(u32 __us
|
||||
@@ -2249,7 +2247,7 @@ static int fixup_pi_state_owner(u32 __us
|
||||
if (get_futex_value_locked(&uval, uaddr))
|
||||
goto handle_fault;
|
||||
|
||||
|
@ -194,7 +194,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
newval = (uval & FUTEX_OWNER_DIED) | newtid;
|
||||
|
||||
if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval))
|
||||
@@ -2343,6 +2341,10 @@ static int fixup_owner(u32 __user *uaddr
|
||||
@@ -2345,6 +2343,10 @@ static int fixup_owner(u32 __user *uaddr
|
||||
/*
|
||||
* Got the lock. We might not be the anticipated owner if we
|
||||
* did a lock-steal - fix up the PI-state in that case:
|
||||
|
@ -205,7 +205,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
*/
|
||||
if (q->pi_state->owner != current)
|
||||
ret = fixup_pi_state_owner(uaddr, q, current);
|
||||
@@ -2582,6 +2584,7 @@ static int futex_lock_pi(u32 __user *uad
|
||||
@@ -2584,6 +2586,7 @@ static int futex_lock_pi(u32 __user *uad
|
||||
ktime_t *time, int trylock)
|
||||
{
|
||||
struct hrtimer_sleeper timeout, *to = NULL;
|
||||
|
@ -213,7 +213,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
struct futex_hash_bucket *hb;
|
||||
struct futex_q q = futex_q_init;
|
||||
int res, ret;
|
||||
@@ -2668,12 +2671,19 @@ static int futex_lock_pi(u32 __user *uad
|
||||
@@ -2670,12 +2673,19 @@ static int futex_lock_pi(u32 __user *uad
|
||||
* If fixup_owner() faulted and was unable to handle the fault, unlock
|
||||
* it and return the fault to userspace.
|
||||
*/
|
||||
|
@ -235,7 +235,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
goto out_put_key;
|
||||
|
||||
out_unlock_put_key:
|
||||
@@ -2736,10 +2746,36 @@ static int futex_unlock_pi(u32 __user *u
|
||||
@@ -2738,10 +2748,36 @@ static int futex_unlock_pi(u32 __user *u
|
||||
*/
|
||||
top_waiter = futex_top_waiter(hb, &key);
|
||||
if (top_waiter) {
|
||||
|
@ -275,7 +275,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
*/
|
||||
if (!ret)
|
||||
goto out_putkey;
|
||||
@@ -2754,7 +2790,6 @@ static int futex_unlock_pi(u32 __user *u
|
||||
@@ -2756,7 +2792,6 @@ static int futex_unlock_pi(u32 __user *u
|
||||
* setting the FUTEX_WAITERS bit. Try again.
|
||||
*/
|
||||
if (ret == -EAGAIN) {
|
||||
|
@ -283,7 +283,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
put_futex_key(&key);
|
||||
goto retry;
|
||||
}
|
||||
@@ -2762,7 +2797,7 @@ static int futex_unlock_pi(u32 __user *u
|
||||
@@ -2764,7 +2799,7 @@ static int futex_unlock_pi(u32 __user *u
|
||||
* wake_futex_pi has detected invalid state. Tell user
|
||||
* space.
|
||||
*/
|
||||
|
@ -292,7 +292,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -2772,8 +2807,10 @@ static int futex_unlock_pi(u32 __user *u
|
||||
@@ -2774,8 +2809,10 @@ static int futex_unlock_pi(u32 __user *u
|
||||
* preserve the WAITERS bit not the OWNER_DIED one. We are the
|
||||
* owner.
|
||||
*/
|
||||
|
@ -304,7 +304,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
/*
|
||||
* If uval has changed, let user space handle it.
|
||||
@@ -2787,7 +2824,6 @@ static int futex_unlock_pi(u32 __user *u
|
||||
@@ -2789,7 +2826,6 @@ static int futex_unlock_pi(u32 __user *u
|
||||
return ret;
|
||||
|
||||
pi_faulted:
|
||||
|
@ -312,7 +312,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
put_futex_key(&key);
|
||||
|
||||
ret = fault_in_user_writeable(uaddr);
|
||||
@@ -2891,6 +2927,7 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
@@ -2893,6 +2929,7 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
u32 __user *uaddr2)
|
||||
{
|
||||
struct hrtimer_sleeper timeout, *to = NULL;
|
||||
|
@ -320,7 +320,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
struct rt_mutex_waiter rt_waiter;
|
||||
struct futex_hash_bucket *hb;
|
||||
union futex_key key2 = FUTEX_KEY_INIT;
|
||||
@@ -2975,8 +3012,10 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
@@ -2977,8 +3014,10 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
if (q.pi_state && (q.pi_state->owner != current)) {
|
||||
spin_lock(q.lock_ptr);
|
||||
ret = fixup_pi_state_owner(uaddr2, &q, current);
|
||||
|
@ -333,7 +333,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
/*
|
||||
* Drop the reference to the pi state which
|
||||
* the requeue_pi() code acquired for us.
|
||||
@@ -3015,13 +3054,20 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
@@ -3017,13 +3056,20 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
* the fault, unlock the rt_mutex and return the fault to
|
||||
* userspace.
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
From 8cdde385c7a33afbe13fd71351da0968540fa566 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:39 +0200
|
||||
Subject: [PATCH 08/17] mm: Adjust system_state check
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
get_nid_for_pfn() checks for system_state == BOOTING to decide whether to
|
||||
use early_pfn_to_nid() when CONFIG_DEFERRED_STRUCT_PAGE_INIT=y.
|
||||
|
||||
That check is dubious, because the switch to state RUNNING happes way after
|
||||
page_alloc_init_late() has been invoked.
|
||||
|
||||
Change the check to less than RUNNING state so it covers the new
|
||||
intermediate states as well.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Mark Rutland <mark.rutland@arm.com>
|
||||
Cc: Mel Gorman <mgorman@techsingularity.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Link: http://lkml.kernel.org/r/20170516184735.528279534@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
drivers/base/node.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/base/node.c
|
||||
+++ b/drivers/base/node.c
|
||||
@@ -377,7 +377,7 @@ static int __ref get_nid_for_pfn(unsigne
|
||||
if (!pfn_valid_within(pfn))
|
||||
return -1;
|
||||
#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
|
||||
- if (system_state == SYSTEM_BOOTING)
|
||||
+ if (system_state < SYSTEM_RUNNING)
|
||||
return early_pfn_to_nid(pfn);
|
||||
#endif
|
||||
page = pfn_to_page(pfn);
|
|
@ -1,9 +1,8 @@
|
|||
From 19830e55247cddb3f46f1bf60b8e245593491bea Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Thu, 23 Mar 2017 15:56:14 +0100
|
||||
Subject: [PATCH] rtmutex: Fix more prio comparisons
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit 19830e55247cddb3f46f1bf60b8e245593491bea
|
||||
Subject: [PATCH 8/9] rtmutex: Fix more prio comparisons
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
There was a pure ->prio comparison left in try_to_wake_rt_mutex(),
|
||||
convert it to use rt_mutex_waiter_less(), noting that greater-or-equal
|
||||
|
@ -33,7 +32,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -222,6 +222,12 @@ static inline bool unlock_rt_mutex_safe(
|
||||
@@ -224,6 +224,12 @@ static inline bool unlock_rt_mutex_safe(
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -46,7 +45,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
static inline int
|
||||
rt_mutex_waiter_less(struct rt_mutex_waiter *left,
|
||||
struct rt_mutex_waiter *right)
|
||||
@@ -241,6 +247,25 @@ rt_mutex_waiter_less(struct rt_mutex_wai
|
||||
@@ -243,6 +249,25 @@ rt_mutex_waiter_less(struct rt_mutex_wai
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -72,7 +71,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
static void
|
||||
rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter)
|
||||
{
|
||||
@@ -551,7 +576,7 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
@@ -553,7 +578,7 @@ static int rt_mutex_adjust_prio_chain(st
|
||||
* enabled we continue, but stop the requeueing in the chain
|
||||
* walk.
|
||||
*/
|
||||
|
@ -81,7 +80,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
if (!detect_deadlock)
|
||||
goto out_unlock_pi;
|
||||
else
|
||||
@@ -854,7 +879,8 @@ static int try_to_take_rt_mutex(struct r
|
||||
@@ -856,7 +881,8 @@ static int try_to_take_rt_mutex(struct r
|
||||
* the top waiter priority (kernel view),
|
||||
* @task lost.
|
||||
*/
|
||||
|
@ -91,7 +90,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
return 0;
|
||||
|
||||
/*
|
||||
@@ -1117,7 +1143,7 @@ void rt_mutex_adjust_pi(struct task_stru
|
||||
@@ -1119,7 +1145,7 @@ void rt_mutex_adjust_pi(struct task_stru
|
||||
raw_spin_lock_irqsave(&task->pi_lock, flags);
|
||||
|
||||
waiter = task->pi_blocked_on;
|
||||
|
|
210
debian/patches/features/all/rt/0009-cpufreq-ia64-Replace-racy-task-affinity-logic.patch
vendored
Normal file
210
debian/patches/features/all/rt/0009-cpufreq-ia64-Replace-racy-task-affinity-logic.patch
vendored
Normal file
|
@ -0,0 +1,210 @@
|
|||
From 38f05ed04beb276f780fcd2b5c0b78c76d0b3c0c Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 12 Apr 2017 22:55:03 +0200
|
||||
Subject: [PATCH 09/13] cpufreq/ia64: Replace racy task affinity logic
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The get() and target() callbacks must run on the affected cpu. This is
|
||||
achieved by temporarily setting the affinity of the calling thread to the
|
||||
requested CPU and reset it to the original affinity afterwards.
|
||||
|
||||
That's racy vs. concurrent affinity settings for that thread resulting in
|
||||
code executing on the wrong CPU and overwriting the new affinity setting.
|
||||
|
||||
Replace it by work_on_cpu(). All call pathes which invoke the callbacks are
|
||||
already protected against CPU hotplug.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: linux-pm@vger.kernel.org
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1704122231100.2548@nanos
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/cpufreq/ia64-acpi-cpufreq.c | 92 +++++++++++++++---------------------
|
||||
1 file changed, 39 insertions(+), 53 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/ia64-acpi-cpufreq.c
|
||||
+++ b/drivers/cpufreq/ia64-acpi-cpufreq.c
|
||||
@@ -34,6 +34,11 @@ struct cpufreq_acpi_io {
|
||||
unsigned int resume;
|
||||
};
|
||||
|
||||
+struct cpufreq_acpi_req {
|
||||
+ unsigned int cpu;
|
||||
+ unsigned int state;
|
||||
+};
|
||||
+
|
||||
static struct cpufreq_acpi_io *acpi_io_data[NR_CPUS];
|
||||
|
||||
static struct cpufreq_driver acpi_cpufreq_driver;
|
||||
@@ -83,8 +88,7 @@ processor_get_pstate (
|
||||
static unsigned
|
||||
extract_clock (
|
||||
struct cpufreq_acpi_io *data,
|
||||
- unsigned value,
|
||||
- unsigned int cpu)
|
||||
+ unsigned value)
|
||||
{
|
||||
unsigned long i;
|
||||
|
||||
@@ -98,60 +102,43 @@ extract_clock (
|
||||
}
|
||||
|
||||
|
||||
-static unsigned int
|
||||
+static long
|
||||
processor_get_freq (
|
||||
- struct cpufreq_acpi_io *data,
|
||||
- unsigned int cpu)
|
||||
+ void *arg)
|
||||
{
|
||||
- int ret = 0;
|
||||
- u32 value = 0;
|
||||
- cpumask_t saved_mask;
|
||||
- unsigned long clock_freq;
|
||||
+ struct cpufreq_acpi_req *req = arg;
|
||||
+ unsigned int cpu = req->cpu;
|
||||
+ struct cpufreq_acpi_io *data = acpi_io_data[cpu];
|
||||
+ u32 value;
|
||||
+ int ret;
|
||||
|
||||
pr_debug("processor_get_freq\n");
|
||||
-
|
||||
- saved_mask = current->cpus_allowed;
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
if (smp_processor_id() != cpu)
|
||||
- goto migrate_end;
|
||||
+ return -EAGAIN;
|
||||
|
||||
/* processor_get_pstate gets the instantaneous frequency */
|
||||
ret = processor_get_pstate(&value);
|
||||
-
|
||||
if (ret) {
|
||||
- set_cpus_allowed_ptr(current, &saved_mask);
|
||||
pr_warn("get performance failed with error %d\n", ret);
|
||||
- ret = 0;
|
||||
- goto migrate_end;
|
||||
+ return ret;
|
||||
}
|
||||
- clock_freq = extract_clock(data, value, cpu);
|
||||
- ret = (clock_freq*1000);
|
||||
-
|
||||
-migrate_end:
|
||||
- set_cpus_allowed_ptr(current, &saved_mask);
|
||||
- return ret;
|
||||
+ return 1000 * extract_clock(data, value);
|
||||
}
|
||||
|
||||
|
||||
-static int
|
||||
+static long
|
||||
processor_set_freq (
|
||||
- struct cpufreq_acpi_io *data,
|
||||
- struct cpufreq_policy *policy,
|
||||
- int state)
|
||||
+ void *arg)
|
||||
{
|
||||
- int ret = 0;
|
||||
- u32 value = 0;
|
||||
- cpumask_t saved_mask;
|
||||
- int retval;
|
||||
+ struct cpufreq_acpi_req *req = arg;
|
||||
+ unsigned int cpu = req->cpu;
|
||||
+ struct cpufreq_acpi_io *data = acpi_io_data[cpu];
|
||||
+ int ret, state = req->state;
|
||||
+ u32 value;
|
||||
|
||||
pr_debug("processor_set_freq\n");
|
||||
-
|
||||
- saved_mask = current->cpus_allowed;
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(policy->cpu));
|
||||
- if (smp_processor_id() != policy->cpu) {
|
||||
- retval = -EAGAIN;
|
||||
- goto migrate_end;
|
||||
- }
|
||||
+ if (smp_processor_id() != cpu)
|
||||
+ return -EAGAIN;
|
||||
|
||||
if (state == data->acpi_data.state) {
|
||||
if (unlikely(data->resume)) {
|
||||
@@ -159,8 +146,7 @@ processor_set_freq (
|
||||
data->resume = 0;
|
||||
} else {
|
||||
pr_debug("Already at target state (P%d)\n", state);
|
||||
- retval = 0;
|
||||
- goto migrate_end;
|
||||
+ return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,7 +157,6 @@ processor_set_freq (
|
||||
* First we write the target state's 'control' value to the
|
||||
* control_register.
|
||||
*/
|
||||
-
|
||||
value = (u32) data->acpi_data.states[state].control;
|
||||
|
||||
pr_debug("Transitioning to state: 0x%08x\n", value);
|
||||
@@ -179,17 +164,11 @@ processor_set_freq (
|
||||
ret = processor_set_pstate(value);
|
||||
if (ret) {
|
||||
pr_warn("Transition failed with error %d\n", ret);
|
||||
- retval = -ENODEV;
|
||||
- goto migrate_end;
|
||||
+ return -ENODEV;
|
||||
}
|
||||
|
||||
data->acpi_data.state = state;
|
||||
-
|
||||
- retval = 0;
|
||||
-
|
||||
-migrate_end:
|
||||
- set_cpus_allowed_ptr(current, &saved_mask);
|
||||
- return (retval);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -197,11 +176,13 @@ static unsigned int
|
||||
acpi_cpufreq_get (
|
||||
unsigned int cpu)
|
||||
{
|
||||
- struct cpufreq_acpi_io *data = acpi_io_data[cpu];
|
||||
+ struct cpufreq_acpi_req req;
|
||||
+ long ret;
|
||||
|
||||
- pr_debug("acpi_cpufreq_get\n");
|
||||
+ req.cpu = cpu;
|
||||
+ ret = work_on_cpu(cpu, processor_get_freq, &req);
|
||||
|
||||
- return processor_get_freq(data, cpu);
|
||||
+ return ret > 0 ? (unsigned int) ret : 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -210,7 +191,12 @@ acpi_cpufreq_target (
|
||||
struct cpufreq_policy *policy,
|
||||
unsigned int index)
|
||||
{
|
||||
- return processor_set_freq(acpi_io_data[policy->cpu], policy, index);
|
||||
+ struct cpufreq_acpi_req req;
|
||||
+
|
||||
+ req.cpu = policy->cpu;
|
||||
+ req.state = index;
|
||||
+
|
||||
+ return work_on_cpu(req.cpu, processor_set_freq, &req);
|
||||
}
|
||||
|
||||
static int
|
39
debian/patches/features/all/rt/0009-cpufreq-pasemi-Adjust-system_state-check.patch
vendored
Normal file
39
debian/patches/features/all/rt/0009-cpufreq-pasemi-Adjust-system_state-check.patch
vendored
Normal file
|
@ -0,0 +1,39 @@
|
|||
From d04e31a23c3c828456cb5613f391ce4ac4e5765f Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:40 +0200
|
||||
Subject: [PATCH 09/17] cpufreq/pasemi: Adjust system_state check
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state check in pas_cpufreq_cpu_exit() to handle the extra
|
||||
states.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Mark Rutland <mark.rutland@arm.com>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Cc: linuxppc-dev@lists.ozlabs.org
|
||||
Link: http://lkml.kernel.org/r/20170516184735.620023128@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
drivers/cpufreq/pasemi-cpufreq.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/cpufreq/pasemi-cpufreq.c
|
||||
+++ b/drivers/cpufreq/pasemi-cpufreq.c
|
||||
@@ -226,7 +226,7 @@ static int pas_cpufreq_cpu_exit(struct c
|
||||
* We don't support CPU hotplug. Don't unmap after the system
|
||||
* has already made it to a running state.
|
||||
*/
|
||||
- if (system_state != SYSTEM_BOOTING)
|
||||
+ if (system_state >= SYSTEM_RUNNING)
|
||||
return 0;
|
||||
|
||||
if (sdcasr_mapbase)
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:56 +0100
|
||||
Subject: [PATCH] futex,rt_mutex: Introduce rt_mutex_init_waiter()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit 50809358dd7199aa7ce232f6877dd09ec30ef374
|
||||
|
||||
|
@ -28,7 +28,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -2954,10 +2954,7 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
@@ -2956,10 +2956,7 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
* The waiter is allocated on our stack, manipulated by the requeue
|
||||
* code while we sleep on uaddr.
|
||||
*/
|
||||
|
@ -42,7 +42,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
if (unlikely(ret != 0))
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -1151,6 +1151,14 @@ void rt_mutex_adjust_pi(struct task_stru
|
||||
@@ -1153,6 +1153,14 @@ void rt_mutex_adjust_pi(struct task_stru
|
||||
next_lock, NULL, task);
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
/**
|
||||
* __rt_mutex_slowlock() - Perform the wait-wake-try-to-take loop
|
||||
* @lock: the rt_mutex to take
|
||||
@@ -1233,9 +1241,7 @@ rt_mutex_slowlock(struct rt_mutex *lock,
|
||||
@@ -1235,9 +1243,7 @@ rt_mutex_slowlock(struct rt_mutex *lock,
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
From def34eaae5ce04b324e48e1bfac873091d945213 Mon Sep 17 00:00:00 2001
|
||||
From: Mike Galbraith <efault@gmx.de>
|
||||
Date: Wed, 5 Apr 2017 10:08:27 +0200
|
||||
Subject: [PATCH] rtmutex: Plug preempt count leak in
|
||||
Subject: [PATCH 9/9] rtmutex: Plug preempt count leak in
|
||||
rt_mutex_futex_unlock()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
Upstream commit def34eaae5ce04b324e48e1bfac873091d945213
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
mark_wakeup_next_waiter() already disables preemption, doing so again
|
||||
leaves us with an unpaired preempt_disable().
|
||||
|
@ -22,7 +21,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -1579,13 +1579,13 @@ bool __sched __rt_mutex_futex_unlock(str
|
||||
@@ -1581,13 +1581,13 @@ bool __sched __rt_mutex_futex_unlock(str
|
||||
return false; /* done */
|
||||
}
|
||||
|
||||
|
|
121
debian/patches/features/all/rt/0010-cpufreq-sh-Replace-racy-task-affinity-logic.patch
vendored
Normal file
121
debian/patches/features/all/rt/0010-cpufreq-sh-Replace-racy-task-affinity-logic.patch
vendored
Normal file
|
@ -0,0 +1,121 @@
|
|||
From 205dcc1ecbc566cbc20acf246e68de3b080b3ecf Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 12 Apr 2017 22:07:36 +0200
|
||||
Subject: [PATCH 10/13] cpufreq/sh: Replace racy task affinity logic
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The target() callback must run on the affected cpu. This is achieved by
|
||||
temporarily setting the affinity of the calling thread to the requested CPU
|
||||
and reset it to the original affinity afterwards.
|
||||
|
||||
That's racy vs. concurrent affinity settings for that thread resulting in
|
||||
code executing on the wrong CPU.
|
||||
|
||||
Replace it by work_on_cpu(). All call pathes which invoke the callbacks are
|
||||
already protected against CPU hotplug.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: linux-pm@vger.kernel.org
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/20170412201042.958216363@linutronix.de
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/cpufreq/sh-cpufreq.c | 45 +++++++++++++++++++++++++------------------
|
||||
1 file changed, 27 insertions(+), 18 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/sh-cpufreq.c
|
||||
+++ b/drivers/cpufreq/sh-cpufreq.c
|
||||
@@ -30,54 +30,63 @@
|
||||
|
||||
static DEFINE_PER_CPU(struct clk, sh_cpuclk);
|
||||
|
||||
+struct cpufreq_target {
|
||||
+ struct cpufreq_policy *policy;
|
||||
+ unsigned int freq;
|
||||
+};
|
||||
+
|
||||
static unsigned int sh_cpufreq_get(unsigned int cpu)
|
||||
{
|
||||
return (clk_get_rate(&per_cpu(sh_cpuclk, cpu)) + 500) / 1000;
|
||||
}
|
||||
|
||||
-/*
|
||||
- * Here we notify other drivers of the proposed change and the final change.
|
||||
- */
|
||||
-static int sh_cpufreq_target(struct cpufreq_policy *policy,
|
||||
- unsigned int target_freq,
|
||||
- unsigned int relation)
|
||||
+static long __sh_cpufreq_target(void *arg)
|
||||
{
|
||||
- unsigned int cpu = policy->cpu;
|
||||
+ struct cpufreq_target *target = arg;
|
||||
+ struct cpufreq_policy *policy = target->policy;
|
||||
+ int cpu = policy->cpu;
|
||||
struct clk *cpuclk = &per_cpu(sh_cpuclk, cpu);
|
||||
- cpumask_t cpus_allowed;
|
||||
struct cpufreq_freqs freqs;
|
||||
struct device *dev;
|
||||
long freq;
|
||||
|
||||
- cpus_allowed = current->cpus_allowed;
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
-
|
||||
- BUG_ON(smp_processor_id() != cpu);
|
||||
+ if (smp_processor_id() != cpu)
|
||||
+ return -ENODEV;
|
||||
|
||||
dev = get_cpu_device(cpu);
|
||||
|
||||
/* Convert target_freq from kHz to Hz */
|
||||
- freq = clk_round_rate(cpuclk, target_freq * 1000);
|
||||
+ freq = clk_round_rate(cpuclk, target->freq * 1000);
|
||||
|
||||
if (freq < (policy->min * 1000) || freq > (policy->max * 1000))
|
||||
return -EINVAL;
|
||||
|
||||
- dev_dbg(dev, "requested frequency %u Hz\n", target_freq * 1000);
|
||||
+ dev_dbg(dev, "requested frequency %u Hz\n", target->freq * 1000);
|
||||
|
||||
freqs.old = sh_cpufreq_get(cpu);
|
||||
freqs.new = (freq + 500) / 1000;
|
||||
freqs.flags = 0;
|
||||
|
||||
- cpufreq_freq_transition_begin(policy, &freqs);
|
||||
- set_cpus_allowed_ptr(current, &cpus_allowed);
|
||||
+ cpufreq_freq_transition_begin(target->policy, &freqs);
|
||||
clk_set_rate(cpuclk, freq);
|
||||
- cpufreq_freq_transition_end(policy, &freqs, 0);
|
||||
+ cpufreq_freq_transition_end(target->policy, &freqs, 0);
|
||||
|
||||
dev_dbg(dev, "set frequency %lu Hz\n", freq);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Here we notify other drivers of the proposed change and the final change.
|
||||
+ */
|
||||
+static int sh_cpufreq_target(struct cpufreq_policy *policy,
|
||||
+ unsigned int target_freq,
|
||||
+ unsigned int relation)
|
||||
+{
|
||||
+ struct cpufreq_target data = { .policy = policy, .freq = target_freq };
|
||||
+
|
||||
+ return work_on_cpu(policy->cpu, __sh_cpufreq_target, &data);
|
||||
+}
|
||||
+
|
||||
static int sh_cpufreq_verify(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct clk *cpuclk = &per_cpu(sh_cpuclk, policy->cpu);
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:57 +0100
|
||||
Subject: [PATCH] futex,rt_mutex: Restructure rt_mutex_finish_proxy_lock()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit 38d589f2fd08f1296aea3ce62bebd185125c6d81
|
||||
|
||||
|
@ -41,7 +41,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -3030,10 +3030,13 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
@@ -3032,10 +3032,13 @@ static int futex_wait_requeue_pi(u32 __u
|
||||
*/
|
||||
WARN_ON(!q.pi_state);
|
||||
pi_mutex = &q.pi_state->pi_mutex;
|
||||
|
@ -59,7 +59,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
* haven't already.
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -1743,21 +1743,23 @@ struct task_struct *rt_mutex_next_owner(
|
||||
@@ -1753,21 +1753,23 @@ struct task_struct *rt_mutex_next_owner(
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -87,7 +87,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
struct hrtimer_sleeper *to,
|
||||
struct rt_mutex_waiter *waiter)
|
||||
{
|
||||
@@ -1770,9 +1772,6 @@ int rt_mutex_finish_proxy_lock(struct rt
|
||||
@@ -1780,9 +1782,6 @@ int rt_mutex_finish_proxy_lock(struct rt
|
||||
/* sleep on the mutex */
|
||||
ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter);
|
||||
|
||||
|
@ -97,7 +97,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
/*
|
||||
* try_to_take_rt_mutex() sets the waiter bit unconditionally. We might
|
||||
* have to fix that up.
|
||||
@@ -1783,3 +1782,42 @@ int rt_mutex_finish_proxy_lock(struct rt
|
||||
@@ -1793,3 +1792,42 @@ int rt_mutex_finish_proxy_lock(struct rt
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
48
debian/patches/features/all/rt/0010-iommu-vt-d-Adjust-system_state-checks.patch
vendored
Normal file
48
debian/patches/features/all/rt/0010-iommu-vt-d-Adjust-system_state-checks.patch
vendored
Normal file
|
@ -0,0 +1,48 @@
|
|||
From b608fe356fe8328665445a26ec75dfac918c8c5d Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:41 +0200
|
||||
Subject: [PATCH 10/17] iommu/vt-d: Adjust system_state checks
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state checks in dmar_parse_one_atsr() and
|
||||
dmar_iommu_notify_scope_dev() to handle the extra states.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Acked-by: Joerg Roedel <joro@8bytes.org>
|
||||
Cc: David Woodhouse <dwmw2@infradead.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Mark Rutland <mark.rutland@arm.com>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Cc: iommu@lists.linux-foundation.org
|
||||
Link: http://lkml.kernel.org/r/20170516184735.712365947@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
drivers/iommu/intel-iommu.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/iommu/intel-iommu.c
|
||||
+++ b/drivers/iommu/intel-iommu.c
|
||||
@@ -4310,7 +4310,7 @@ int dmar_parse_one_atsr(struct acpi_dmar
|
||||
struct acpi_dmar_atsr *atsr;
|
||||
struct dmar_atsr_unit *atsru;
|
||||
|
||||
- if (system_state != SYSTEM_BOOTING && !intel_iommu_enabled)
|
||||
+ if (system_state >= SYSTEM_RUNNING && !intel_iommu_enabled)
|
||||
return 0;
|
||||
|
||||
atsr = container_of(hdr, struct acpi_dmar_atsr, header);
|
||||
@@ -4560,7 +4560,7 @@ int dmar_iommu_notify_scope_dev(struct d
|
||||
struct acpi_dmar_atsr *atsr;
|
||||
struct acpi_dmar_reserved_memory *rmrr;
|
||||
|
||||
- if (!intel_iommu_enabled && system_state != SYSTEM_BOOTING)
|
||||
+ if (!intel_iommu_enabled && system_state >= SYSTEM_RUNNING)
|
||||
return 0;
|
||||
|
||||
list_for_each_entry(rmrru, &dmar_rmrr_units, list) {
|
125
debian/patches/features/all/rt/0011-cpufreq-sparc-us3-Replace-racy-task-affinity-logic.patch
vendored
Normal file
125
debian/patches/features/all/rt/0011-cpufreq-sparc-us3-Replace-racy-task-affinity-logic.patch
vendored
Normal file
|
@ -0,0 +1,125 @@
|
|||
From 9fe24c4e92d3963d92d7d383e28ed098bd5689d8 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 12 Apr 2017 22:07:37 +0200
|
||||
Subject: [PATCH 11/13] cpufreq/sparc-us3: Replace racy task affinity logic
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The access to the safari config register in the CPU frequency functions
|
||||
must be executed on the target CPU. This is achieved by temporarily setting
|
||||
the affinity of the calling user space thread to the requested CPU and
|
||||
reset it to the original affinity afterwards.
|
||||
|
||||
That's racy vs. CPU hotplug and concurrent affinity settings for that
|
||||
thread resulting in code executing on the wrong CPU and overwriting the
|
||||
new affinity setting.
|
||||
|
||||
Replace it by a straight forward smp function call.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: linux-pm@vger.kernel.org
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/20170412201043.047558840@linutronix.de
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/cpufreq/sparc-us3-cpufreq.c | 46 ++++++++++++------------------------
|
||||
1 file changed, 16 insertions(+), 30 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/sparc-us3-cpufreq.c
|
||||
+++ b/drivers/cpufreq/sparc-us3-cpufreq.c
|
||||
@@ -35,22 +35,28 @@ static struct us3_freq_percpu_info *us3_
|
||||
#define SAFARI_CFG_DIV_32 0x0000000080000000UL
|
||||
#define SAFARI_CFG_DIV_MASK 0x00000000C0000000UL
|
||||
|
||||
-static unsigned long read_safari_cfg(void)
|
||||
+static void read_safari_cfg(void *arg)
|
||||
{
|
||||
- unsigned long ret;
|
||||
+ unsigned long ret, *val = arg;
|
||||
|
||||
__asm__ __volatile__("ldxa [%%g0] %1, %0"
|
||||
: "=&r" (ret)
|
||||
: "i" (ASI_SAFARI_CONFIG));
|
||||
- return ret;
|
||||
+ *val = ret;
|
||||
}
|
||||
|
||||
-static void write_safari_cfg(unsigned long val)
|
||||
+static void update_safari_cfg(void *arg)
|
||||
{
|
||||
+ unsigned long reg, *new_bits = arg;
|
||||
+
|
||||
+ read_safari_cfg(®);
|
||||
+ reg &= ~SAFARI_CFG_DIV_MASK;
|
||||
+ reg |= *new_bits;
|
||||
+
|
||||
__asm__ __volatile__("stxa %0, [%%g0] %1\n\t"
|
||||
"membar #Sync"
|
||||
: /* no outputs */
|
||||
- : "r" (val), "i" (ASI_SAFARI_CONFIG)
|
||||
+ : "r" (reg), "i" (ASI_SAFARI_CONFIG)
|
||||
: "memory");
|
||||
}
|
||||
|
||||
@@ -78,29 +84,17 @@ static unsigned long get_current_freq(un
|
||||
|
||||
static unsigned int us3_freq_get(unsigned int cpu)
|
||||
{
|
||||
- cpumask_t cpus_allowed;
|
||||
unsigned long reg;
|
||||
- unsigned int ret;
|
||||
-
|
||||
- cpumask_copy(&cpus_allowed, ¤t->cpus_allowed);
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
-
|
||||
- reg = read_safari_cfg();
|
||||
- ret = get_current_freq(cpu, reg);
|
||||
|
||||
- set_cpus_allowed_ptr(current, &cpus_allowed);
|
||||
-
|
||||
- return ret;
|
||||
+ if (smp_call_function_single(cpu, read_safari_cfg, ®, 1))
|
||||
+ return 0;
|
||||
+ return get_current_freq(cpu, reg);
|
||||
}
|
||||
|
||||
static int us3_freq_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
{
|
||||
unsigned int cpu = policy->cpu;
|
||||
- unsigned long new_bits, new_freq, reg;
|
||||
- cpumask_t cpus_allowed;
|
||||
-
|
||||
- cpumask_copy(&cpus_allowed, ¤t->cpus_allowed);
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
+ unsigned long new_bits, new_freq;
|
||||
|
||||
new_freq = sparc64_get_clock_tick(cpu) / 1000;
|
||||
switch (index) {
|
||||
@@ -121,15 +115,7 @@ static int us3_freq_target(struct cpufre
|
||||
BUG();
|
||||
}
|
||||
|
||||
- reg = read_safari_cfg();
|
||||
-
|
||||
- reg &= ~SAFARI_CFG_DIV_MASK;
|
||||
- reg |= new_bits;
|
||||
- write_safari_cfg(reg);
|
||||
-
|
||||
- set_cpus_allowed_ptr(current, &cpus_allowed);
|
||||
-
|
||||
- return 0;
|
||||
+ return smp_call_function_single(cpu, update_safari_cfg, &new_bits, 1);
|
||||
}
|
||||
|
||||
static int __init us3_freq_cpu_init(struct cpufreq_policy *policy)
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:58 +0100
|
||||
Subject: [PATCH] futex: Rework futex_lock_pi() to use rt_mutex_*_proxy_lock()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit cfafcd117da0216520568c195cb2f6cd1980c4bb
|
||||
|
||||
|
@ -90,7 +90,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -2097,20 +2097,7 @@ queue_unlock(struct futex_hash_bucket *h
|
||||
@@ -2099,20 +2099,7 @@ queue_unlock(struct futex_hash_bucket *h
|
||||
hb_waiters_dec(hb);
|
||||
}
|
||||
|
||||
|
@ -112,7 +112,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
{
|
||||
int prio;
|
||||
|
||||
@@ -2127,6 +2114,24 @@ static inline void queue_me(struct futex
|
||||
@@ -2129,6 +2116,24 @@ static inline void queue_me(struct futex
|
||||
plist_node_init(&q->list, prio);
|
||||
plist_add(&q->list, &hb->chain);
|
||||
q->task = current;
|
||||
|
@ -137,7 +137,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
spin_unlock(&hb->lock);
|
||||
}
|
||||
|
||||
@@ -2585,6 +2590,7 @@ static int futex_lock_pi(u32 __user *uad
|
||||
@@ -2587,6 +2592,7 @@ static int futex_lock_pi(u32 __user *uad
|
||||
{
|
||||
struct hrtimer_sleeper timeout, *to = NULL;
|
||||
struct futex_pi_state *pi_state = NULL;
|
||||
|
@ -145,7 +145,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
struct futex_hash_bucket *hb;
|
||||
struct futex_q q = futex_q_init;
|
||||
int res, ret;
|
||||
@@ -2637,25 +2643,52 @@ static int futex_lock_pi(u32 __user *uad
|
||||
@@ -2639,25 +2645,52 @@ static int futex_lock_pi(u32 __user *uad
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -208,7 +208,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
*/
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -1491,19 +1491,6 @@ int __sched rt_mutex_lock_interruptible(
|
||||
@@ -1493,19 +1493,6 @@ int __sched rt_mutex_lock_interruptible(
|
||||
EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible);
|
||||
|
||||
/*
|
||||
|
@ -228,7 +228,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
* Futex variant, must not use fastpath.
|
||||
*/
|
||||
int __sched rt_mutex_futex_trylock(struct rt_mutex *lock)
|
||||
@@ -1772,12 +1759,6 @@ int rt_mutex_wait_proxy_lock(struct rt_m
|
||||
@@ -1782,12 +1769,6 @@ int rt_mutex_wait_proxy_lock(struct rt_m
|
||||
/* sleep on the mutex */
|
||||
ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter);
|
||||
|
||||
|
@ -241,7 +241,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
raw_spin_unlock_irq(&lock->wait_lock);
|
||||
|
||||
return ret;
|
||||
@@ -1817,6 +1798,13 @@ bool rt_mutex_cleanup_proxy_lock(struct
|
||||
@@ -1827,6 +1808,13 @@ bool rt_mutex_cleanup_proxy_lock(struct
|
||||
fixup_rt_mutex_waiters(lock);
|
||||
cleanup = true;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
From b4def42724594cd399cfee365221f5b38639711d Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:43 +0200
|
||||
Subject: [PATCH 12/17] async: Adjust system_state checks
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state check in async_run_entry_fn() and
|
||||
async_synchronize_cookie_domain() to handle the extra states.
|
||||
|
||||
Tested-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Acked-by: Arjan van de Ven <arjan@linux.intel.com>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Link: http://lkml.kernel.org/r/20170516184735.865155020@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
kernel/async.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/kernel/async.c
|
||||
+++ b/kernel/async.c
|
||||
@@ -114,14 +114,14 @@ static void async_run_entry_fn(struct wo
|
||||
ktime_t uninitialized_var(calltime), delta, rettime;
|
||||
|
||||
/* 1) run (and print duration) */
|
||||
- if (initcall_debug && system_state == SYSTEM_BOOTING) {
|
||||
+ if (initcall_debug && system_state < SYSTEM_RUNNING) {
|
||||
pr_debug("calling %lli_%pF @ %i\n",
|
||||
(long long)entry->cookie,
|
||||
entry->func, task_pid_nr(current));
|
||||
calltime = ktime_get();
|
||||
}
|
||||
entry->func(entry->data, entry->cookie);
|
||||
- if (initcall_debug && system_state == SYSTEM_BOOTING) {
|
||||
+ if (initcall_debug && system_state < SYSTEM_RUNNING) {
|
||||
rettime = ktime_get();
|
||||
delta = ktime_sub(rettime, calltime);
|
||||
pr_debug("initcall %lli_%pF returned 0 after %lld usecs\n",
|
||||
@@ -284,14 +284,14 @@ void async_synchronize_cookie_domain(asy
|
||||
{
|
||||
ktime_t uninitialized_var(starttime), delta, endtime;
|
||||
|
||||
- if (initcall_debug && system_state == SYSTEM_BOOTING) {
|
||||
+ if (initcall_debug && system_state < SYSTEM_RUNNING) {
|
||||
pr_debug("async_waiting @ %i\n", task_pid_nr(current));
|
||||
starttime = ktime_get();
|
||||
}
|
||||
|
||||
wait_event(async_done, lowest_in_progress(domain) >= cookie);
|
||||
|
||||
- if (initcall_debug && system_state == SYSTEM_BOOTING) {
|
||||
+ if (initcall_debug && system_state < SYSTEM_RUNNING) {
|
||||
endtime = ktime_get();
|
||||
delta = ktime_sub(endtime, starttime);
|
||||
|
130
debian/patches/features/all/rt/0012-cpufreq-sparc-us2e-Replace-racy-task-affinity-logic.patch
vendored
Normal file
130
debian/patches/features/all/rt/0012-cpufreq-sparc-us2e-Replace-racy-task-affinity-logic.patch
vendored
Normal file
|
@ -0,0 +1,130 @@
|
|||
From 12699ac53a2e5fbd1fd7c164b11685d55c8aa28b Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 13 Apr 2017 10:22:43 +0200
|
||||
Subject: [PATCH 12/13] cpufreq/sparc-us2e: Replace racy task affinity logic
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The access to the HBIRD_ESTAR_MODE register in the cpu frequency control
|
||||
functions must happen on the target CPU. This is achieved by temporarily
|
||||
setting the affinity of the calling user space thread to the requested CPU
|
||||
and reset it to the original affinity afterwards.
|
||||
|
||||
That's racy vs. CPU hotplug and concurrent affinity settings for that
|
||||
thread resulting in code executing on the wrong CPU and overwriting the
|
||||
new affinity setting.
|
||||
|
||||
Replace it by a straight forward smp function call.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: linux-pm@vger.kernel.org
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1704131020280.2408@nanos
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/cpufreq/sparc-us2e-cpufreq.c | 45 ++++++++++++++++-------------------
|
||||
1 file changed, 21 insertions(+), 24 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/sparc-us2e-cpufreq.c
|
||||
+++ b/drivers/cpufreq/sparc-us2e-cpufreq.c
|
||||
@@ -118,10 +118,6 @@ static void us2e_transition(unsigned lon
|
||||
unsigned long clock_tick,
|
||||
unsigned long old_divisor, unsigned long divisor)
|
||||
{
|
||||
- unsigned long flags;
|
||||
-
|
||||
- local_irq_save(flags);
|
||||
-
|
||||
estar &= ~ESTAR_MODE_DIV_MASK;
|
||||
|
||||
/* This is based upon the state transition diagram in the IIe manual. */
|
||||
@@ -152,8 +148,6 @@ static void us2e_transition(unsigned lon
|
||||
} else {
|
||||
BUG();
|
||||
}
|
||||
-
|
||||
- local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static unsigned long index_to_estar_mode(unsigned int index)
|
||||
@@ -229,48 +223,51 @@ static unsigned long estar_to_divisor(un
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void __us2e_freq_get(void *arg)
|
||||
+{
|
||||
+ unsigned long *estar = arg;
|
||||
+
|
||||
+ *estar = read_hbreg(HBIRD_ESTAR_MODE_ADDR);
|
||||
+}
|
||||
+
|
||||
static unsigned int us2e_freq_get(unsigned int cpu)
|
||||
{
|
||||
- cpumask_t cpus_allowed;
|
||||
unsigned long clock_tick, estar;
|
||||
|
||||
- cpumask_copy(&cpus_allowed, ¤t->cpus_allowed);
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
-
|
||||
clock_tick = sparc64_get_clock_tick(cpu) / 1000;
|
||||
- estar = read_hbreg(HBIRD_ESTAR_MODE_ADDR);
|
||||
-
|
||||
- set_cpus_allowed_ptr(current, &cpus_allowed);
|
||||
+ if (smp_call_function_single(cpu, __us2e_freq_get, &estar, 1))
|
||||
+ return 0;
|
||||
|
||||
return clock_tick / estar_to_divisor(estar);
|
||||
}
|
||||
|
||||
-static int us2e_freq_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
+static void __us2e_freq_target(void *arg)
|
||||
{
|
||||
- unsigned int cpu = policy->cpu;
|
||||
+ unsigned int cpu = smp_processor_id();
|
||||
+ unsigned int *index = arg;
|
||||
unsigned long new_bits, new_freq;
|
||||
unsigned long clock_tick, divisor, old_divisor, estar;
|
||||
- cpumask_t cpus_allowed;
|
||||
-
|
||||
- cpumask_copy(&cpus_allowed, ¤t->cpus_allowed);
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
|
||||
new_freq = clock_tick = sparc64_get_clock_tick(cpu) / 1000;
|
||||
- new_bits = index_to_estar_mode(index);
|
||||
- divisor = index_to_divisor(index);
|
||||
+ new_bits = index_to_estar_mode(*index);
|
||||
+ divisor = index_to_divisor(*index);
|
||||
new_freq /= divisor;
|
||||
|
||||
estar = read_hbreg(HBIRD_ESTAR_MODE_ADDR);
|
||||
|
||||
old_divisor = estar_to_divisor(estar);
|
||||
|
||||
- if (old_divisor != divisor)
|
||||
+ if (old_divisor != divisor) {
|
||||
us2e_transition(estar, new_bits, clock_tick * 1000,
|
||||
old_divisor, divisor);
|
||||
+ }
|
||||
+}
|
||||
|
||||
- set_cpus_allowed_ptr(current, &cpus_allowed);
|
||||
+static int us2e_freq_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
+{
|
||||
+ unsigned int cpu = policy->cpu;
|
||||
|
||||
- return 0;
|
||||
+ return smp_call_function_single(cpu, __us2e_freq_target, &index, 1);
|
||||
}
|
||||
|
||||
static int __init us2e_freq_cpu_init(struct cpufreq_policy *policy)
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:35:59 +0100
|
||||
Subject: [PATCH] futex: Futex_unlock_pi() determinism
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit bebe5b514345f09be2c15e414d076b02ecb9cce8
|
||||
|
||||
|
@ -36,8 +36,8 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -1396,15 +1396,10 @@ static int wake_futex_pi(u32 __user *uad
|
||||
WAKE_Q(wake_q);
|
||||
@@ -1398,15 +1398,10 @@ static int wake_futex_pi(u32 __user *uad
|
||||
DEFINE_WAKE_Q(wake_q);
|
||||
int ret = 0;
|
||||
|
||||
- raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
|
||||
|
@ -54,7 +54,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
*
|
||||
* When this happens, give up our locks and try again, giving
|
||||
* the futex_lock_pi() instance time to complete, either by
|
||||
@@ -2792,15 +2787,18 @@ static int futex_unlock_pi(u32 __user *u
|
||||
@@ -2794,15 +2789,18 @@ static int futex_unlock_pi(u32 __user *u
|
||||
if (pi_state->owner != current)
|
||||
goto out_unlock;
|
||||
|
||||
|
|
96
debian/patches/features/all/rt/0013-crypto-N2-Replace-racy-task-affinity-logic.patch
vendored
Normal file
96
debian/patches/features/all/rt/0013-crypto-N2-Replace-racy-task-affinity-logic.patch
vendored
Normal file
|
@ -0,0 +1,96 @@
|
|||
From 73810a069120aa831debb4d967310ab900f628ad Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 13 Apr 2017 10:20:23 +0200
|
||||
Subject: [PATCH 13/13] crypto: N2 - Replace racy task affinity logic
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
spu_queue_register() needs to invoke setup functions on a particular
|
||||
CPU. This is achieved by temporarily setting the affinity of the
|
||||
calling user space thread to the requested CPU and reset it to the original
|
||||
affinity afterwards.
|
||||
|
||||
That's racy vs. CPU hotplug and concurrent affinity settings for that
|
||||
thread resulting in code executing on the wrong CPU and overwriting the
|
||||
new affinity setting.
|
||||
|
||||
Replace it by using work_on_cpu_safe() which guarantees to run the code on
|
||||
the requested CPU or to fail in case the CPU is offline.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Acked-by: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: Fenghua Yu <fenghua.yu@intel.com>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Cc: Sebastian Siewior <bigeasy@linutronix.de>
|
||||
Cc: Lai Jiangshan <jiangshanlai@gmail.com>
|
||||
Cc: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: linux-crypto@vger.kernel.org
|
||||
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: Len Brown <lenb@kernel.org>
|
||||
Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1704131019420.2408@nanos
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/crypto/n2_core.c | 31 ++++++++++++++++---------------
|
||||
1 file changed, 16 insertions(+), 15 deletions(-)
|
||||
|
||||
--- a/drivers/crypto/n2_core.c
|
||||
+++ b/drivers/crypto/n2_core.c
|
||||
@@ -65,6 +65,11 @@ struct spu_queue {
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
+struct spu_qreg {
|
||||
+ struct spu_queue *queue;
|
||||
+ unsigned long type;
|
||||
+};
|
||||
+
|
||||
static struct spu_queue **cpu_to_cwq;
|
||||
static struct spu_queue **cpu_to_mau;
|
||||
|
||||
@@ -1631,31 +1636,27 @@ static void queue_cache_destroy(void)
|
||||
kmem_cache_destroy(queue_cache[HV_NCS_QTYPE_CWQ - 1]);
|
||||
}
|
||||
|
||||
-static int spu_queue_register(struct spu_queue *p, unsigned long q_type)
|
||||
+static long spu_queue_register_workfn(void *arg)
|
||||
{
|
||||
- cpumask_var_t old_allowed;
|
||||
+ struct spu_qreg *qr = arg;
|
||||
+ struct spu_queue *p = qr->queue;
|
||||
+ unsigned long q_type = qr->type;
|
||||
unsigned long hv_ret;
|
||||
|
||||
- if (cpumask_empty(&p->sharing))
|
||||
- return -EINVAL;
|
||||
-
|
||||
- if (!alloc_cpumask_var(&old_allowed, GFP_KERNEL))
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- cpumask_copy(old_allowed, ¤t->cpus_allowed);
|
||||
-
|
||||
- set_cpus_allowed_ptr(current, &p->sharing);
|
||||
-
|
||||
hv_ret = sun4v_ncs_qconf(q_type, __pa(p->q),
|
||||
CWQ_NUM_ENTRIES, &p->qhandle);
|
||||
if (!hv_ret)
|
||||
sun4v_ncs_sethead_marker(p->qhandle, 0);
|
||||
|
||||
- set_cpus_allowed_ptr(current, old_allowed);
|
||||
+ return hv_ret ? -EINVAL : 0;
|
||||
+}
|
||||
|
||||
- free_cpumask_var(old_allowed);
|
||||
+static int spu_queue_register(struct spu_queue *p, unsigned long q_type)
|
||||
+{
|
||||
+ int cpu = cpumask_any_and(&p->sharing, cpu_online_mask);
|
||||
+ struct spu_qreg qr = { .queue = p, .type = q_type };
|
||||
|
||||
- return (hv_ret ? -EINVAL : 0);
|
||||
+ return work_on_cpu_safe(cpu, spu_queue_register_workfn, &qr);
|
||||
}
|
||||
|
||||
static int spu_queue_setup(struct spu_queue *p)
|
37
debian/patches/features/all/rt/0013-extable-Adjust-system_state-checks.patch
vendored
Normal file
37
debian/patches/features/all/rt/0013-extable-Adjust-system_state-checks.patch
vendored
Normal file
|
@ -0,0 +1,37 @@
|
|||
From 0594729c24d846889408a07057b5cc9e8d931419 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:44 +0200
|
||||
Subject: [PATCH 13/17] extable: Adjust system_state checks
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state check in core_kernel_text() to handle the extra
|
||||
states, i.e. to cover init text up to the point where the system switches
|
||||
to state RUNNING.
|
||||
|
||||
Tested-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Link: http://lkml.kernel.org/r/20170516184735.949992741@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
kernel/extable.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/kernel/extable.c
|
||||
+++ b/kernel/extable.c
|
||||
@@ -75,7 +75,7 @@ int core_kernel_text(unsigned long addr)
|
||||
addr < (unsigned long)_etext)
|
||||
return 1;
|
||||
|
||||
- if (system_state == SYSTEM_BOOTING &&
|
||||
+ if (system_state < SYSTEM_RUNNING &&
|
||||
init_kernel_text(addr))
|
||||
return 1;
|
||||
return 0;
|
|
@ -1,7 +1,7 @@
|
|||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Wed, 22 Mar 2017 11:36:00 +0100
|
||||
Subject: [PATCH] futex: Drop hb->lock before enqueueing on the rtmutex
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Upstream commit 56222b212e8edb1cf51f5dd73ff645809b082b40
|
||||
|
||||
|
@ -55,7 +55,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -2652,20 +2652,33 @@ static int futex_lock_pi(u32 __user *uad
|
||||
@@ -2654,20 +2654,33 @@ static int futex_lock_pi(u32 __user *uad
|
||||
goto no_block;
|
||||
}
|
||||
|
||||
|
@ -94,7 +94,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
if (unlikely(to))
|
||||
hrtimer_start_expires(&to->timer, HRTIMER_MODE_ABS);
|
||||
@@ -2678,6 +2691,9 @@ static int futex_lock_pi(u32 __user *uad
|
||||
@@ -2680,6 +2693,9 @@ static int futex_lock_pi(u32 __user *uad
|
||||
* first acquire the hb->lock before removing the lock from the
|
||||
* rt_mutex waitqueue, such that we can keep the hb and rt_mutex
|
||||
* wait lists consistent.
|
||||
|
@ -104,7 +104,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
*/
|
||||
if (ret && !rt_mutex_cleanup_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter))
|
||||
ret = 0;
|
||||
@@ -2789,10 +2805,6 @@ static int futex_unlock_pi(u32 __user *u
|
||||
@@ -2791,10 +2807,6 @@ static int futex_unlock_pi(u32 __user *u
|
||||
|
||||
get_pi_state(pi_state);
|
||||
/*
|
||||
|
@ -117,7 +117,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
* wake_futex_pi() must observe a state consistent with what we
|
||||
--- a/kernel/locking/rtmutex.c
|
||||
+++ b/kernel/locking/rtmutex.c
|
||||
@@ -1659,31 +1659,14 @@ void rt_mutex_proxy_unlock(struct rt_mut
|
||||
@@ -1669,31 +1669,14 @@ void rt_mutex_proxy_unlock(struct rt_mut
|
||||
rt_mutex_set_owner(lock, NULL);
|
||||
}
|
||||
|
||||
|
@ -151,7 +151,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
/* We enforce deadlock detection for futexes */
|
||||
ret = task_blocks_on_rt_mutex(lock, waiter, task,
|
||||
@@ -1702,12 +1685,36 @@ int rt_mutex_start_proxy_lock(struct rt_
|
||||
@@ -1712,12 +1695,36 @@ int rt_mutex_start_proxy_lock(struct rt_
|
||||
if (unlikely(ret))
|
||||
remove_waiter(lock, waiter);
|
||||
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
From ff48cd26fc4889b9deb5f9333d3c61746e450b7f Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:45 +0200
|
||||
Subject: [PATCH 14/17] printk: Adjust system_state checks
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state check in boot_delay_msec() to handle the extra
|
||||
states.
|
||||
|
||||
Tested-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Link: http://lkml.kernel.org/r/20170516184736.027534895@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
kernel/printk/printk.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/kernel/printk/printk.c
|
||||
+++ b/kernel/printk/printk.c
|
||||
@@ -1176,7 +1176,7 @@ static void boot_delay_msec(int level)
|
||||
unsigned long long k;
|
||||
unsigned long timeout;
|
||||
|
||||
- if ((boot_delay == 0 || system_state != SYSTEM_BOOTING)
|
||||
+ if ((boot_delay == 0 || system_state >= SYSTEM_RUNNING)
|
||||
|| suppress_message_printing(level)) {
|
||||
return;
|
||||
}
|
40
debian/patches/features/all/rt/0015-mm-vmscan-Adjust-system_state-checks.patch
vendored
Normal file
40
debian/patches/features/all/rt/0015-mm-vmscan-Adjust-system_state-checks.patch
vendored
Normal file
|
@ -0,0 +1,40 @@
|
|||
From c6202adf3a0969514299cf10ff07376a84ad09bb Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:46 +0200
|
||||
Subject: [PATCH 15/17] mm/vmscan: Adjust system_state checks
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To enable smp_processor_id() and might_sleep() debug checks earlier, it's
|
||||
required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.
|
||||
|
||||
Adjust the system_state check in kswapd_run() to handle the extra states.
|
||||
|
||||
Tested-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
|
||||
Acked-by: Vlastimil Babka <vbabka@suse.cz>
|
||||
Cc: Andrew Morton <akpm@linux-foundation.org>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Johannes Weiner <hannes@cmpxchg.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Mel Gorman <mgorman@techsingularity.net>
|
||||
Cc: Michal Hocko <mhocko@suse.com>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Link: http://lkml.kernel.org/r/20170516184736.119158930@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
mm/vmscan.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/mm/vmscan.c
|
||||
+++ b/mm/vmscan.c
|
||||
@@ -3654,7 +3654,7 @@ int kswapd_run(int nid)
|
||||
pgdat->kswapd = kthread_run(kswapd, pgdat, "kswapd%d", nid);
|
||||
if (IS_ERR(pgdat->kswapd)) {
|
||||
/* failure at boot is fatal */
|
||||
- BUG_ON(system_state == SYSTEM_BOOTING);
|
||||
+ BUG_ON(system_state < SYSTEM_RUNNING);
|
||||
pr_err("Failed to start kswapd on node %d\n", nid);
|
||||
ret = PTR_ERR(pgdat->kswapd);
|
||||
pgdat->kswapd = NULL;
|
61
debian/patches/features/all/rt/0016-init-Introduce-SYSTEM_SCHEDULING-state.patch
vendored
Normal file
61
debian/patches/features/all/rt/0016-init-Introduce-SYSTEM_SCHEDULING-state.patch
vendored
Normal file
|
@ -0,0 +1,61 @@
|
|||
From 69a78ff226fe0241ab6cb9dd961667be477e3cf7 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:47 +0200
|
||||
Subject: [PATCH 16/17] init: Introduce SYSTEM_SCHEDULING state
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
might_sleep() debugging and smp_processor_id() debugging should be active
|
||||
right after the scheduler starts working. The init task can invoke
|
||||
smp_processor_id() from preemptible context as it is pinned on the boot cpu
|
||||
until sched_smp_init() removes the pinning and lets it schedule on all non
|
||||
isolated cpus.
|
||||
|
||||
Add a new state which allows to enable those checks earlier and add it to
|
||||
the xen do_poweroff() function.
|
||||
|
||||
No functional change.
|
||||
|
||||
Tested-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
|
||||
Acked-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Juergen Gross <jgross@suse.com>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Link: http://lkml.kernel.org/r/20170516184736.196214622@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
drivers/xen/manage.c | 1 +
|
||||
include/linux/kernel.h | 6 +++++-
|
||||
2 files changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/xen/manage.c
|
||||
+++ b/drivers/xen/manage.c
|
||||
@@ -190,6 +190,7 @@ static void do_poweroff(void)
|
||||
{
|
||||
switch (system_state) {
|
||||
case SYSTEM_BOOTING:
|
||||
+ case SYSTEM_SCHEDULING:
|
||||
orderly_poweroff(true);
|
||||
break;
|
||||
case SYSTEM_RUNNING:
|
||||
--- a/include/linux/kernel.h
|
||||
+++ b/include/linux/kernel.h
|
||||
@@ -488,9 +488,13 @@ extern int root_mountflags;
|
||||
|
||||
extern bool early_boot_irqs_disabled;
|
||||
|
||||
-/* Values used for system_state */
|
||||
+/*
|
||||
+ * Values used for system_state. Ordering of the states must not be changed
|
||||
+ * as code checks for <, <=, >, >= STATE.
|
||||
+ */
|
||||
extern enum system_states {
|
||||
SYSTEM_BOOTING,
|
||||
+ SYSTEM_SCHEDULING,
|
||||
SYSTEM_RUNNING,
|
||||
SYSTEM_HALT,
|
||||
SYSTEM_POWER_OFF,
|
75
debian/patches/features/all/rt/0017-sched-core-Enable-might_sleep-and-smp_processor_id-c.patch
vendored
Normal file
75
debian/patches/features/all/rt/0017-sched-core-Enable-might_sleep-and-smp_processor_id-c.patch
vendored
Normal file
|
@ -0,0 +1,75 @@
|
|||
From 1c3c5eab171590f86edd8d31389d61dd1efe3037 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 16 May 2017 20:42:48 +0200
|
||||
Subject: [PATCH 17/17] sched/core: Enable might_sleep() and smp_processor_id()
|
||||
checks early
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
might_sleep() and smp_processor_id() checks are enabled after the boot
|
||||
process is done. That hides bugs in the SMP bringup and driver
|
||||
initialization code.
|
||||
|
||||
Enable it right when the scheduler starts working, i.e. when init task and
|
||||
kthreadd have been created and right before the idle task enables
|
||||
preemption.
|
||||
|
||||
Tested-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
||||
Acked-by: Mark Rutland <mark.rutland@arm.com>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Link: http://lkml.kernel.org/r/20170516184736.272225698@linutronix.de
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
init/main.c | 10 ++++++++++
|
||||
kernel/sched/core.c | 4 +++-
|
||||
lib/smp_processor_id.c | 2 +-
|
||||
3 files changed, 14 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/init/main.c
|
||||
+++ b/init/main.c
|
||||
@@ -414,6 +414,16 @@ static noinline void __ref rest_init(voi
|
||||
rcu_read_lock();
|
||||
kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
|
||||
rcu_read_unlock();
|
||||
+
|
||||
+ /*
|
||||
+ * Enable might_sleep() and smp_processor_id() checks.
|
||||
+ * They cannot be enabled earlier because with CONFIG_PRREMPT=y
|
||||
+ * kernel_thread() would trigger might_sleep() splats. With
|
||||
+ * CONFIG_PREEMPT_VOLUNTARY=y the init task might have scheduled
|
||||
+ * already, but it's stuck on the kthreadd_done completion.
|
||||
+ */
|
||||
+ system_state = SYSTEM_SCHEDULING;
|
||||
+
|
||||
complete(&kthreadd_done);
|
||||
|
||||
/*
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -6223,8 +6223,10 @@ void ___might_sleep(const char *file, in
|
||||
|
||||
if ((preempt_count_equals(preempt_offset) && !irqs_disabled() &&
|
||||
!is_idle_task(current)) ||
|
||||
- system_state != SYSTEM_RUNNING || oops_in_progress)
|
||||
+ system_state == SYSTEM_BOOTING || system_state > SYSTEM_RUNNING ||
|
||||
+ oops_in_progress)
|
||||
return;
|
||||
+
|
||||
if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy)
|
||||
return;
|
||||
prev_jiffy = jiffies;
|
||||
--- a/lib/smp_processor_id.c
|
||||
+++ b/lib/smp_processor_id.c
|
||||
@@ -28,7 +28,7 @@ notrace static unsigned int check_preemp
|
||||
/*
|
||||
* It is valid to assume CPU-locality during early bootup:
|
||||
*/
|
||||
- if (system_state != SYSTEM_RUNNING)
|
||||
+ if (system_state < SYSTEM_SCHEDULING)
|
||||
goto out;
|
||||
|
||||
/*
|
|
@ -1,7 +1,7 @@
|
|||
From: "Yadi.hu" <yadi.hu@windriver.com>
|
||||
Date: Wed, 10 Dec 2014 10:32:09 +0800
|
||||
Subject: ARM: enable irq in translation/section permission fault handlers
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Probably happens on all ARM, with
|
||||
CONFIG_PREEMPT_RT_FULL
|
||||
|
@ -64,7 +64,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/arch/arm/mm/fault.c
|
||||
+++ b/arch/arm/mm/fault.c
|
||||
@@ -430,6 +430,9 @@ do_translation_fault(unsigned long addr,
|
||||
@@ -431,6 +431,9 @@ do_translation_fault(unsigned long addr,
|
||||
if (addr < TASK_SIZE)
|
||||
return do_page_fault(addr, fsr, regs);
|
||||
|
||||
|
@ -74,7 +74,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
if (user_mode(regs))
|
||||
goto bad_area;
|
||||
|
||||
@@ -497,6 +500,9 @@ do_translation_fault(unsigned long addr,
|
||||
@@ -498,6 +501,9 @@ do_translation_fault(unsigned long addr,
|
||||
static int
|
||||
do_sect_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
{
|
||||
|
|
44
debian/patches/features/all/rt/CPUFREQ-Loongson2-drop-set_cpus_allowed_ptr.patch
vendored
Normal file
44
debian/patches/features/all/rt/CPUFREQ-Loongson2-drop-set_cpus_allowed_ptr.patch
vendored
Normal file
|
@ -0,0 +1,44 @@
|
|||
From 5ffb5cace8448c787c9f44e16a7b12f8c2866848 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Tue, 4 Apr 2017 17:43:55 +0200
|
||||
Subject: [PATCH] CPUFREQ: Loongson2: drop set_cpus_allowed_ptr()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
It is pure mystery to me why we need to be on a specific CPU while
|
||||
looking up a value in an array.
|
||||
My best shot at this is that before commit d4019f0a92ab ("cpufreq: move
|
||||
freq change notifications to cpufreq core") it was required to invoke
|
||||
cpufreq_notify_transition() on a special CPU.
|
||||
|
||||
Since it looks like a waste, remove it.
|
||||
|
||||
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Cc: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Cc: linux-pm@vger.kernel.org
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/cpufreq/loongson2_cpufreq.c | 7 -------
|
||||
1 file changed, 7 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/loongson2_cpufreq.c
|
||||
+++ b/drivers/cpufreq/loongson2_cpufreq.c
|
||||
@@ -51,19 +51,12 @@ static int loongson2_cpu_freq_notifier(s
|
||||
static int loongson2_cpufreq_target(struct cpufreq_policy *policy,
|
||||
unsigned int index)
|
||||
{
|
||||
- unsigned int cpu = policy->cpu;
|
||||
- cpumask_t cpus_allowed;
|
||||
unsigned int freq;
|
||||
|
||||
- cpus_allowed = current->cpus_allowed;
|
||||
- set_cpus_allowed_ptr(current, cpumask_of(cpu));
|
||||
-
|
||||
freq =
|
||||
((cpu_clock_freq / 1000) *
|
||||
loongson2_clockmod_table[index].driver_data) / 8;
|
||||
|
||||
- set_cpus_allowed_ptr(current, &cpus_allowed);
|
||||
-
|
||||
/* setting the cpu frequency */
|
||||
clk_set_rate(policy->clk, freq * 1000);
|
||||
|
|
@ -1,31 +1,31 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 21 Mar 2013 19:01:05 +0100
|
||||
Subject: printk: Drop the logbuf_lock more often
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The lock is hold with irgs off. The latency drops 500us+ on my arm bugs
|
||||
with a "full" buffer after executing "dmesg" on the shell.
|
||||
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
kernel/printk/printk.c | 26 ++++++++++++++++++++++++++
|
||||
1 file changed, 26 insertions(+)
|
||||
kernel/printk/printk.c | 27 +++++++++++++++++++++++++++
|
||||
1 file changed, 27 insertions(+)
|
||||
|
||||
--- a/kernel/printk/printk.c
|
||||
+++ b/kernel/printk/printk.c
|
||||
@@ -1396,6 +1396,7 @@ static int syslog_print_all(char __user
|
||||
@@ -1409,6 +1409,8 @@ static int syslog_print_all(char __user
|
||||
{
|
||||
char *text;
|
||||
int len = 0;
|
||||
+ int attempts = 0;
|
||||
+ int num_msg;
|
||||
|
||||
text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
|
||||
if (!text)
|
||||
@@ -1407,6 +1408,14 @@ static int syslog_print_all(char __user
|
||||
@@ -1420,6 +1422,14 @@ static int syslog_print_all(char __user
|
||||
u64 seq;
|
||||
u32 idx;
|
||||
enum log_flags prev;
|
||||
+ int num_msg;
|
||||
|
||||
+try_again:
|
||||
+ attempts++;
|
||||
+ if (attempts > 10) {
|
||||
|
@ -33,44 +33,45 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
+ goto out;
|
||||
+ }
|
||||
+ num_msg = 0;
|
||||
|
||||
+
|
||||
/*
|
||||
* Find first record that fits, including all following records,
|
||||
@@ -1422,6 +1431,14 @@ static int syslog_print_all(char __user
|
||||
prev = msg->flags;
|
||||
* into the user-provided buffer for this dump.
|
||||
@@ -1432,6 +1442,14 @@ static int syslog_print_all(char __user
|
||||
len += msg_print_text(msg, true, NULL, 0);
|
||||
idx = log_next(idx);
|
||||
seq++;
|
||||
+ num_msg++;
|
||||
+ if (num_msg > 5) {
|
||||
+ num_msg = 0;
|
||||
+ raw_spin_unlock_irq(&logbuf_lock);
|
||||
+ raw_spin_lock_irq(&logbuf_lock);
|
||||
+ logbuf_unlock_irq();
|
||||
+ logbuf_lock_irq();
|
||||
+ if (clear_seq < log_first_seq)
|
||||
+ goto try_again;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* move first record forward until length fits into the buffer */
|
||||
@@ -1435,6 +1452,14 @@ static int syslog_print_all(char __user
|
||||
prev = msg->flags;
|
||||
@@ -1443,6 +1461,14 @@ static int syslog_print_all(char __user
|
||||
len -= msg_print_text(msg, true, NULL, 0);
|
||||
idx = log_next(idx);
|
||||
seq++;
|
||||
+ num_msg++;
|
||||
+ if (num_msg > 5) {
|
||||
+ num_msg = 0;
|
||||
+ raw_spin_unlock_irq(&logbuf_lock);
|
||||
+ raw_spin_lock_irq(&logbuf_lock);
|
||||
+ logbuf_unlock_irq();
|
||||
+ logbuf_lock_irq();
|
||||
+ if (clear_seq < log_first_seq)
|
||||
+ goto try_again;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* last message fitting into this dump */
|
||||
@@ -1475,6 +1500,7 @@ static int syslog_print_all(char __user
|
||||
@@ -1481,6 +1507,7 @@ static int syslog_print_all(char __user
|
||||
clear_seq = log_next_seq;
|
||||
clear_idx = log_next_idx;
|
||||
}
|
||||
+out:
|
||||
raw_spin_unlock_irq(&logbuf_lock);
|
||||
logbuf_unlock_irq();
|
||||
|
||||
kfree(text);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Josh Cartwright <joshc@ni.com>
|
||||
Date: Thu, 11 Feb 2016 11:54:01 -0600
|
||||
Subject: KVM: arm/arm64: downgrade preempt_disable()d region to migrate_disable()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
kvm_arch_vcpu_ioctl_run() disables the use of preemption when updating
|
||||
the vgic and timer states to prevent the calling task from migrating to
|
||||
|
@ -23,7 +23,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/arch/arm/kvm/arm.c
|
||||
+++ b/arch/arm/kvm/arm.c
|
||||
@@ -619,7 +619,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
|
||||
@@ -632,7 +632,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
|
||||
* involves poking the GIC, which must be done in a
|
||||
* non-preemptible context.
|
||||
*/
|
||||
|
@ -32,7 +32,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
kvm_pmu_flush_hwstate(vcpu);
|
||||
kvm_timer_flush_hwstate(vcpu);
|
||||
kvm_vgic_flush_hwstate(vcpu);
|
||||
@@ -640,7 +640,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
|
||||
@@ -653,7 +653,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
|
||||
kvm_pmu_sync_hwstate(vcpu);
|
||||
kvm_timer_sync_hwstate(vcpu);
|
||||
kvm_vgic_sync_hwstate(vcpu);
|
||||
|
@ -41,7 +41,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
continue;
|
||||
}
|
||||
|
||||
@@ -696,7 +696,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
|
||||
@@ -709,7 +709,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v
|
||||
|
||||
kvm_vgic_sync_hwstate(vcpu);
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Marcelo Tosatti <mtosatti@redhat.com>
|
||||
Date: Wed, 8 Apr 2015 20:33:25 -0300
|
||||
Subject: KVM: lapic: mark LAPIC timer handler as irqsafe
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Since lapic timer handler only wakes up a simple waitqueue,
|
||||
it can be executed from hardirq context.
|
||||
|
@ -16,7 +16,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/arch/x86/kvm/lapic.c
|
||||
+++ b/arch/x86/kvm/lapic.c
|
||||
@@ -1939,6 +1939,7 @@ int kvm_create_lapic(struct kvm_vcpu *vc
|
||||
@@ -2062,6 +2062,7 @@ int kvm_create_lapic(struct kvm_vcpu *vc
|
||||
hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC,
|
||||
HRTIMER_MODE_ABS_PINNED);
|
||||
apic->lapic_timer.timer.function = apic_timer_fn;
|
||||
|
|
|
@ -5,7 +5,7 @@ Cc: Anna Schumaker <anna.schumaker@netapp.com>,
|
|||
linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org,
|
||||
tglx@linutronix.de
|
||||
Subject: NFSv4: replace seqcount_t with a seqlock_t
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The raw_write_seqcount_begin() in nfs4_reclaim_open_state() bugs me
|
||||
because it maps to preempt_disable() in -RT which I can't have at this
|
||||
|
@ -58,7 +58,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/fs/nfs/nfs4proc.c
|
||||
+++ b/fs/nfs/nfs4proc.c
|
||||
@@ -2697,7 +2697,7 @@ static int _nfs4_open_and_get_state(stru
|
||||
@@ -2607,7 +2607,7 @@ static int _nfs4_open_and_get_state(stru
|
||||
unsigned int seq;
|
||||
int ret;
|
||||
|
||||
|
@ -67,7 +67,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
ret = _nfs4_proc_open(opendata);
|
||||
if (ret != 0)
|
||||
@@ -2735,7 +2735,7 @@ static int _nfs4_open_and_get_state(stru
|
||||
@@ -2645,7 +2645,7 @@ static int _nfs4_open_and_get_state(stru
|
||||
|
||||
if (d_inode(dentry) == state->inode) {
|
||||
nfs_inode_attach_open_context(ctx);
|
||||
|
@ -87,7 +87,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
mutex_init(&sp->so_delegreturn_mutex);
|
||||
return sp;
|
||||
}
|
||||
@@ -1497,8 +1497,12 @@ static int nfs4_reclaim_open_state(struc
|
||||
@@ -1510,8 +1510,12 @@ static int nfs4_reclaim_open_state(struc
|
||||
* recovering after a network partition or a reboot from a
|
||||
* server that doesn't support a grace period.
|
||||
*/
|
||||
|
@ -101,7 +101,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
restart:
|
||||
list_for_each_entry(state, &sp->so_states, open_states) {
|
||||
if (!test_and_clear_bit(ops->state_flag_bit, &state->flags))
|
||||
@@ -1567,14 +1571,20 @@ static int nfs4_reclaim_open_state(struc
|
||||
@@ -1580,14 +1584,20 @@ static int nfs4_reclaim_open_state(struc
|
||||
spin_lock(&sp->so_lock);
|
||||
goto restart;
|
||||
}
|
||||
|
|
162
debian/patches/features/all/rt/Revert-random-invalidate-batched-entropy-after-crng-.patch
vendored
Normal file
162
debian/patches/features/all/rt/Revert-random-invalidate-batched-entropy-after-crng-.patch
vendored
Normal file
|
@ -0,0 +1,162 @@
|
|||
From 8adeebf2a94f4625c39c25ec461d0d2ab623b3ad Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Wed, 14 Jun 2017 21:29:16 +0200
|
||||
Subject: [PATCH] Revert "random: invalidate batched entropy after crng init"
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
This reverts commit 86f95e53ed76fec2579e00351c6050ab398a7730.
|
||||
|
||||
In -RT lockdep complains with
|
||||
| -> #1 (primary_crng.lock){+.+...}:
|
||||
| lock_acquire+0xb5/0x2b0
|
||||
| rt_spin_lock+0x46/0x50
|
||||
| _extract_crng+0x39/0xa0
|
||||
| extract_crng+0x3a/0x40
|
||||
| get_random_u64+0x17a/0x200
|
||||
| cache_random_seq_create+0x51/0x100
|
||||
| init_cache_random_seq+0x35/0x90
|
||||
| __kmem_cache_create+0xd3/0x560
|
||||
| create_boot_cache+0x8c/0xb2
|
||||
| create_kmalloc_cache+0x54/0x9f
|
||||
| create_kmalloc_caches+0xe3/0xfd
|
||||
| kmem_cache_init+0x14f/0x1f0
|
||||
| start_kernel+0x1e7/0x3b3
|
||||
| x86_64_start_reservations+0x2a/0x2c
|
||||
| x86_64_start_kernel+0x13d/0x14c
|
||||
| verify_cpu+0x0/0xfc
|
||||
|
|
||||
| -> #0 (batched_entropy_reset_lock){+.+...}:
|
||||
| __lock_acquire+0x11b4/0x1320
|
||||
| lock_acquire+0xb5/0x2b0
|
||||
| rt_write_lock+0x26/0x40
|
||||
| rt_write_lock_irqsave+0x9/0x10
|
||||
| invalidate_batched_entropy+0x28/0xb0
|
||||
| crng_fast_load+0xb5/0xe0
|
||||
| add_interrupt_randomness+0x16c/0x1a0
|
||||
| irq_thread+0x15c/0x1e0
|
||||
| kthread+0x112/0x150
|
||||
| ret_from_fork+0x31/0x40
|
||||
|
||||
so revert this for now and check later with upstream.
|
||||
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/char/random.c | 37 -------------------------------------
|
||||
1 file changed, 37 deletions(-)
|
||||
|
||||
--- a/drivers/char/random.c
|
||||
+++ b/drivers/char/random.c
|
||||
@@ -1,9 +1,6 @@
|
||||
/*
|
||||
* random.c -- A strong random number generator
|
||||
*
|
||||
- * Copyright (C) 2017 Jason A. Donenfeld <Jason@zx2c4.com>. All
|
||||
- * Rights Reserved.
|
||||
- *
|
||||
* Copyright Matt Mackall <mpm@selenic.com>, 2003, 2004, 2005
|
||||
*
|
||||
* Copyright Theodore Ts'o, 1994, 1995, 1996, 1997, 1998, 1999. All
|
||||
@@ -765,8 +762,6 @@ static DECLARE_WAIT_QUEUE_HEAD(crng_init
|
||||
static struct crng_state **crng_node_pool __read_mostly;
|
||||
#endif
|
||||
|
||||
-static void invalidate_batched_entropy(void);
|
||||
-
|
||||
static void crng_initialize(struct crng_state *crng)
|
||||
{
|
||||
int i;
|
||||
@@ -804,7 +799,6 @@ static int crng_fast_load(const char *cp
|
||||
cp++; crng_init_cnt++; len--;
|
||||
}
|
||||
if (crng_init_cnt >= CRNG_INIT_CNT_THRESH) {
|
||||
- invalidate_batched_entropy();
|
||||
crng_init = 1;
|
||||
wake_up_interruptible(&crng_init_wait);
|
||||
pr_notice("random: fast init done\n");
|
||||
@@ -842,7 +836,6 @@ static void crng_reseed(struct crng_stat
|
||||
memzero_explicit(&buf, sizeof(buf));
|
||||
crng->init_time = jiffies;
|
||||
if (crng == &primary_crng && crng_init < 2) {
|
||||
- invalidate_batched_entropy();
|
||||
crng_init = 2;
|
||||
process_random_ready_list();
|
||||
wake_up_interruptible(&crng_init_wait);
|
||||
@@ -2023,7 +2016,6 @@ struct batched_entropy {
|
||||
};
|
||||
unsigned int position;
|
||||
};
|
||||
-static rwlock_t batched_entropy_reset_lock = __RW_LOCK_UNLOCKED(batched_entropy_reset_lock);
|
||||
|
||||
/*
|
||||
* Get a random word for internal kernel use only. The quality of the random
|
||||
@@ -2034,8 +2026,6 @@ static DEFINE_PER_CPU(struct batched_ent
|
||||
u64 get_random_u64(void)
|
||||
{
|
||||
u64 ret;
|
||||
- bool use_lock = crng_init < 2;
|
||||
- unsigned long flags;
|
||||
struct batched_entropy *batch;
|
||||
|
||||
#if BITS_PER_LONG == 64
|
||||
@@ -2048,15 +2038,11 @@ u64 get_random_u64(void)
|
||||
#endif
|
||||
|
||||
batch = &get_cpu_var(batched_entropy_u64);
|
||||
- if (use_lock)
|
||||
- read_lock_irqsave(&batched_entropy_reset_lock, flags);
|
||||
if (batch->position % ARRAY_SIZE(batch->entropy_u64) == 0) {
|
||||
extract_crng((u8 *)batch->entropy_u64);
|
||||
batch->position = 0;
|
||||
}
|
||||
ret = batch->entropy_u64[batch->position++];
|
||||
- if (use_lock)
|
||||
- read_unlock_irqrestore(&batched_entropy_reset_lock, flags);
|
||||
put_cpu_var(batched_entropy_u64);
|
||||
return ret;
|
||||
}
|
||||
@@ -2066,45 +2052,22 @@ static DEFINE_PER_CPU(struct batched_ent
|
||||
u32 get_random_u32(void)
|
||||
{
|
||||
u32 ret;
|
||||
- bool use_lock = crng_init < 2;
|
||||
- unsigned long flags;
|
||||
struct batched_entropy *batch;
|
||||
|
||||
if (arch_get_random_int(&ret))
|
||||
return ret;
|
||||
|
||||
batch = &get_cpu_var(batched_entropy_u32);
|
||||
- if (use_lock)
|
||||
- read_lock_irqsave(&batched_entropy_reset_lock, flags);
|
||||
if (batch->position % ARRAY_SIZE(batch->entropy_u32) == 0) {
|
||||
extract_crng((u8 *)batch->entropy_u32);
|
||||
batch->position = 0;
|
||||
}
|
||||
ret = batch->entropy_u32[batch->position++];
|
||||
- if (use_lock)
|
||||
- read_unlock_irqrestore(&batched_entropy_reset_lock, flags);
|
||||
put_cpu_var(batched_entropy_u32);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(get_random_u32);
|
||||
|
||||
-/* It's important to invalidate all potential batched entropy that might
|
||||
- * be stored before the crng is initialized, which we can do lazily by
|
||||
- * simply resetting the counter to zero so that it's re-extracted on the
|
||||
- * next usage. */
|
||||
-static void invalidate_batched_entropy(void)
|
||||
-{
|
||||
- int cpu;
|
||||
- unsigned long flags;
|
||||
-
|
||||
- write_lock_irqsave(&batched_entropy_reset_lock, flags);
|
||||
- for_each_possible_cpu (cpu) {
|
||||
- per_cpu_ptr(&batched_entropy_u32, cpu)->position = 0;
|
||||
- per_cpu_ptr(&batched_entropy_u64, cpu)->position = 0;
|
||||
- }
|
||||
- write_unlock_irqrestore(&batched_entropy_reset_lock, flags);
|
||||
-}
|
||||
-
|
||||
/**
|
||||
* randomize_page - Generate a random, page aligned address
|
||||
* @start: The smallest acceptable address the caller will take.
|
|
@ -1,218 +0,0 @@
|
|||
From 16145f9c01a2e671aceb731050de9fbf977d31d0 Mon Sep 17 00:00:00 2001
|
||||
From: Anna-Maria Gleixner <anna-maria@linutronix.de>
|
||||
Date: Fri, 26 May 2017 19:16:07 +0200
|
||||
Subject: [PATCH] Revert "timers: Don't wake ktimersoftd on every tick"
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
|
||||
This reverts commit 032f93cae150a ("timers: Don't wake ktimersoftd on
|
||||
every tick").
|
||||
|
||||
The problem is that the look ahead optimization from the tick timer
|
||||
interrupt context can race with the softirq thread expiring timer. As
|
||||
a consequence the temporary hlist heads which hold the to expire
|
||||
timers are overwritten and the timers which are already removed from
|
||||
the wheel bucket for expiry are now dangling w/o a list head.
|
||||
|
||||
That means those timers never get expired. If one of those timers is
|
||||
canceled the removal operation will result in a hlist corruption.
|
||||
|
||||
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
kernel/time/timer.c | 96 +++++++++++++++-------------------------------------
|
||||
1 file changed, 29 insertions(+), 67 deletions(-)
|
||||
|
||||
--- a/kernel/time/timer.c
|
||||
+++ b/kernel/time/timer.c
|
||||
@@ -206,8 +206,6 @@ struct timer_base {
|
||||
bool is_idle;
|
||||
DECLARE_BITMAP(pending_map, WHEEL_SIZE);
|
||||
struct hlist_head vectors[WHEEL_SIZE];
|
||||
- struct hlist_head expired_lists[LVL_DEPTH];
|
||||
- int expired_count;
|
||||
} ____cacheline_aligned;
|
||||
|
||||
static DEFINE_PER_CPU(struct timer_base, timer_bases[NR_BASES]);
|
||||
@@ -1355,8 +1353,7 @@ static void call_timer_fn(struct timer_l
|
||||
}
|
||||
}
|
||||
|
||||
-static inline void __expire_timers(struct timer_base *base,
|
||||
- struct hlist_head *head)
|
||||
+static void expire_timers(struct timer_base *base, struct hlist_head *head)
|
||||
{
|
||||
while (!hlist_empty(head)) {
|
||||
struct timer_list *timer;
|
||||
@@ -1387,38 +1384,21 @@ static inline void __expire_timers(struc
|
||||
}
|
||||
}
|
||||
|
||||
-static void expire_timers(struct timer_base *base)
|
||||
-{
|
||||
- struct hlist_head *head;
|
||||
-
|
||||
- while (base->expired_count--) {
|
||||
- head = base->expired_lists + base->expired_count;
|
||||
- __expire_timers(base, head);
|
||||
- }
|
||||
- base->expired_count = 0;
|
||||
-}
|
||||
-
|
||||
-static void __collect_expired_timers(struct timer_base *base)
|
||||
+static int __collect_expired_timers(struct timer_base *base,
|
||||
+ struct hlist_head *heads)
|
||||
{
|
||||
unsigned long clk = base->clk;
|
||||
struct hlist_head *vec;
|
||||
- int i;
|
||||
+ int i, levels = 0;
|
||||
unsigned int idx;
|
||||
|
||||
- /*
|
||||
- * expire_timers() must be called at least once before we can
|
||||
- * collect more timers
|
||||
- */
|
||||
- if (WARN_ON(base->expired_count))
|
||||
- return;
|
||||
-
|
||||
for (i = 0; i < LVL_DEPTH; i++) {
|
||||
idx = (clk & LVL_MASK) + i * LVL_SIZE;
|
||||
|
||||
if (__test_and_clear_bit(idx, base->pending_map)) {
|
||||
vec = base->vectors + idx;
|
||||
- hlist_move_list(vec,
|
||||
- &base->expired_lists[base->expired_count++]);
|
||||
+ hlist_move_list(vec, heads++);
|
||||
+ levels++;
|
||||
}
|
||||
/* Is it time to look at the next level? */
|
||||
if (clk & LVL_CLK_MASK)
|
||||
@@ -1426,6 +1406,7 @@ static void __collect_expired_timers(str
|
||||
/* Shift clock for the next level granularity */
|
||||
clk >>= LVL_CLK_SHIFT;
|
||||
}
|
||||
+ return levels;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NO_HZ_COMMON
|
||||
@@ -1618,7 +1599,8 @@ void timer_clear_idle(void)
|
||||
base->is_idle = false;
|
||||
}
|
||||
|
||||
-static void collect_expired_timers(struct timer_base *base)
|
||||
+static int collect_expired_timers(struct timer_base *base,
|
||||
+ struct hlist_head *heads)
|
||||
{
|
||||
/*
|
||||
* NOHZ optimization. After a long idle sleep we need to forward the
|
||||
@@ -1635,49 +1617,20 @@ static void collect_expired_timers(struc
|
||||
if (time_after(next, jiffies)) {
|
||||
/* The call site will increment clock! */
|
||||
base->clk = jiffies - 1;
|
||||
- return;
|
||||
+ return 0;
|
||||
}
|
||||
base->clk = next;
|
||||
}
|
||||
- __collect_expired_timers(base);
|
||||
+ return __collect_expired_timers(base, heads);
|
||||
}
|
||||
#else
|
||||
-static inline void collect_expired_timers(struct timer_base *base)
|
||||
+static inline int collect_expired_timers(struct timer_base *base,
|
||||
+ struct hlist_head *heads)
|
||||
{
|
||||
- __collect_expired_timers(base);
|
||||
+ return __collect_expired_timers(base, heads);
|
||||
}
|
||||
#endif
|
||||
|
||||
-static int find_expired_timers(struct timer_base *base)
|
||||
-{
|
||||
- const unsigned long int end_clk = jiffies;
|
||||
-
|
||||
- while (!base->expired_count && time_after_eq(end_clk, base->clk)) {
|
||||
- collect_expired_timers(base);
|
||||
- base->clk++;
|
||||
- }
|
||||
-
|
||||
- return base->expired_count;
|
||||
-}
|
||||
-
|
||||
-/* Called from CPU tick routine to quickly collect expired timers */
|
||||
-static int tick_find_expired(struct timer_base *base)
|
||||
-{
|
||||
- int count;
|
||||
-
|
||||
- raw_spin_lock(&base->lock);
|
||||
-
|
||||
- if (unlikely(time_after(jiffies, base->clk + HZ))) {
|
||||
- /* defer to ktimersoftd; don't spend too long in irq context */
|
||||
- count = -1;
|
||||
- } else
|
||||
- count = find_expired_timers(base);
|
||||
-
|
||||
- raw_spin_unlock(&base->lock);
|
||||
-
|
||||
- return count;
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* Called from the timer interrupt handler to charge one tick to the current
|
||||
* process. user_tick is 1 if the tick is user time, 0 for system.
|
||||
@@ -1704,11 +1657,22 @@ void update_process_times(int user_tick)
|
||||
*/
|
||||
static inline void __run_timers(struct timer_base *base)
|
||||
{
|
||||
+ struct hlist_head heads[LVL_DEPTH];
|
||||
+ int levels;
|
||||
+
|
||||
+ if (!time_after_eq(jiffies, base->clk))
|
||||
+ return;
|
||||
+
|
||||
raw_spin_lock_irq(&base->lock);
|
||||
|
||||
- while (find_expired_timers(base))
|
||||
- expire_timers(base);
|
||||
+ while (time_after_eq(jiffies, base->clk)) {
|
||||
+
|
||||
+ levels = collect_expired_timers(base, heads);
|
||||
+ base->clk++;
|
||||
|
||||
+ while (levels--)
|
||||
+ expire_timers(base, heads + levels);
|
||||
+ }
|
||||
raw_spin_unlock_irq(&base->lock);
|
||||
wakeup_timer_waiters(base);
|
||||
}
|
||||
@@ -1734,12 +1698,12 @@ void run_local_timers(void)
|
||||
|
||||
hrtimer_run_queues();
|
||||
/* Raise the softirq only if required. */
|
||||
- if (time_before(jiffies, base->clk) || !tick_find_expired(base)) {
|
||||
+ if (time_before(jiffies, base->clk)) {
|
||||
if (!IS_ENABLED(CONFIG_NO_HZ_COMMON) || !base->nohz_active)
|
||||
return;
|
||||
/* CPU is awake, so check the deferrable base. */
|
||||
base++;
|
||||
- if (time_before(jiffies, base->clk) || !tick_find_expired(base))
|
||||
+ if (time_before(jiffies, base->clk))
|
||||
return;
|
||||
}
|
||||
raise_softirq(TIMER_SOFTIRQ);
|
||||
@@ -1909,7 +1873,6 @@ int timers_dead_cpu(unsigned int cpu)
|
||||
raw_spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
|
||||
|
||||
BUG_ON(old_base->running_timer);
|
||||
- BUG_ON(old_base->expired_count);
|
||||
|
||||
for (i = 0; i < WHEEL_SIZE; i++)
|
||||
migrate_timer_list(new_base, old_base->vectors + i);
|
||||
@@ -1936,7 +1899,6 @@ static void __init init_timer_cpu(int cp
|
||||
#ifdef CONFIG_PREEMPT_RT_FULL
|
||||
init_swait_queue_head(&base->wait_for_running_timer);
|
||||
#endif
|
||||
- base->expired_count = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From: Steven Rostedt <rostedt@goodmis.org>
|
||||
Date: Wed, 13 Feb 2013 09:26:05 -0500
|
||||
Subject: acpi/rt: Convert acpi_gbl_hardware lock back to a raw_spinlock_t
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
We hit the following bug with 3.6-rt:
|
||||
|
||||
|
@ -84,7 +84,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
/* Mutex for _OSI support */
|
||||
--- a/drivers/acpi/acpica/hwregs.c
|
||||
+++ b/drivers/acpi/acpica/hwregs.c
|
||||
@@ -363,14 +363,14 @@ acpi_status acpi_hw_clear_acpi_status(vo
|
||||
@@ -428,14 +428,14 @@ acpi_status acpi_hw_clear_acpi_status(vo
|
||||
ACPI_BITMASK_ALL_FIXED_STATUS,
|
||||
ACPI_FORMAT_UINT64(acpi_gbl_xpm1a_status.address)));
|
||||
|
||||
|
|
|
@ -0,0 +1,256 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Sat, 27 May 2017 19:02:06 +0200
|
||||
Subject: kernel/sched/core: add migrate_disable()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
---
|
||||
include/linux/preempt.h | 23 ++++++++
|
||||
include/linux/sched.h | 7 ++
|
||||
include/linux/smp.h | 3 +
|
||||
kernel/sched/core.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
kernel/sched/debug.c | 4 +
|
||||
5 files changed, 169 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/include/linux/preempt.h
|
||||
+++ b/include/linux/preempt.h
|
||||
@@ -184,6 +184,22 @@ do { \
|
||||
|
||||
#define preemptible() (preempt_count() == 0 && !irqs_disabled())
|
||||
|
||||
+#ifdef CONFIG_SMP
|
||||
+
|
||||
+extern void migrate_disable(void);
|
||||
+extern void migrate_enable(void);
|
||||
+
|
||||
+int __migrate_disabled(struct task_struct *p);
|
||||
+
|
||||
+#else
|
||||
+#define migrate_disable() barrier()
|
||||
+#define migrate_enable() barrier()
|
||||
+static inline int __migrate_disabled(struct task_struct *p)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
#ifdef CONFIG_PREEMPT
|
||||
#define preempt_enable() \
|
||||
do { \
|
||||
@@ -252,6 +268,13 @@ do { \
|
||||
#define preempt_enable_notrace() barrier()
|
||||
#define preemptible() 0
|
||||
|
||||
+#define migrate_disable() barrier()
|
||||
+#define migrate_enable() barrier()
|
||||
+
|
||||
+static inline int __migrate_disabled(struct task_struct *p)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
#endif /* CONFIG_PREEMPT_COUNT */
|
||||
|
||||
#ifdef MODULE
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -537,6 +537,13 @@ struct task_struct {
|
||||
int nr_cpus_allowed;
|
||||
const cpumask_t *cpus_ptr;
|
||||
cpumask_t cpus_mask;
|
||||
+#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP)
|
||||
+ int migrate_disable;
|
||||
+ int migrate_disable_update;
|
||||
+# ifdef CONFIG_SCHED_DEBUG
|
||||
+ int migrate_disable_atomic;
|
||||
+# endif
|
||||
+#endif
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RCU
|
||||
int rcu_read_lock_nesting;
|
||||
--- a/include/linux/smp.h
|
||||
+++ b/include/linux/smp.h
|
||||
@@ -197,6 +197,9 @@ static inline int get_boot_cpu_id(void)
|
||||
#define get_cpu() ({ preempt_disable(); smp_processor_id(); })
|
||||
#define put_cpu() preempt_enable()
|
||||
|
||||
+#define get_cpu_light() ({ migrate_disable(); smp_processor_id(); })
|
||||
+#define put_cpu_light() migrate_enable()
|
||||
+
|
||||
/*
|
||||
* Callback to arch code if there's nosmp or maxcpus=0 on the
|
||||
* boot command line:
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -1047,7 +1047,15 @@ void set_cpus_allowed_common(struct task
|
||||
p->nr_cpus_allowed = cpumask_weight(new_mask);
|
||||
}
|
||||
|
||||
-void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask)
|
||||
+#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP)
|
||||
+int __migrate_disabled(struct task_struct *p)
|
||||
+{
|
||||
+ return p->migrate_disable;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+static void __do_set_cpus_allowed_tail(struct task_struct *p,
|
||||
+ const struct cpumask *new_mask)
|
||||
{
|
||||
struct rq *rq = task_rq(p);
|
||||
bool queued, running;
|
||||
@@ -1076,6 +1084,20 @@ void do_set_cpus_allowed(struct task_str
|
||||
set_curr_task(rq, p);
|
||||
}
|
||||
|
||||
+void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask)
|
||||
+{
|
||||
+#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP)
|
||||
+ if (__migrate_disabled(p)) {
|
||||
+ lockdep_assert_held(&p->pi_lock);
|
||||
+
|
||||
+ cpumask_copy(&p->cpus_mask, new_mask);
|
||||
+ p->migrate_disable_update = 1;
|
||||
+ return;
|
||||
+ }
|
||||
+#endif
|
||||
+ __do_set_cpus_allowed_tail(p, new_mask);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Change a given task's CPU affinity. Migrate the thread to a
|
||||
* proper CPU and schedule it away if the CPU it's executing on
|
||||
@@ -1134,9 +1156,16 @@ static int __set_cpus_allowed_ptr(struct
|
||||
}
|
||||
|
||||
/* Can the task run on the task's current CPU? If so, we're done */
|
||||
- if (cpumask_test_cpu(task_cpu(p), new_mask))
|
||||
+ if (cpumask_test_cpu(task_cpu(p), new_mask) || __migrate_disabled(p))
|
||||
goto out;
|
||||
|
||||
+#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP)
|
||||
+ if (__migrate_disabled(p)) {
|
||||
+ p->migrate_disable_update = 1;
|
||||
+ goto out;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
dest_cpu = cpumask_any_and(cpu_valid_mask, new_mask);
|
||||
if (task_running(rq, p) || p->state == TASK_WAKING) {
|
||||
struct migration_arg arg = { p, dest_cpu };
|
||||
@@ -7357,3 +7386,104 @@ const u32 sched_prio_to_wmult[40] = {
|
||||
/* 10 */ 39045157, 49367440, 61356676, 76695844, 95443717,
|
||||
/* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153,
|
||||
};
|
||||
+
|
||||
+#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP)
|
||||
+
|
||||
+void migrate_disable(void)
|
||||
+{
|
||||
+ struct task_struct *p = current;
|
||||
+
|
||||
+ if (in_atomic() || irqs_disabled()) {
|
||||
+#ifdef CONFIG_SCHED_DEBUG
|
||||
+ p->migrate_disable_atomic++;
|
||||
+#endif
|
||||
+ return;
|
||||
+ }
|
||||
+#ifdef CONFIG_SCHED_DEBUG
|
||||
+ WARN_ON_ONCE(p->migrate_disable_atomic);
|
||||
+#endif
|
||||
+
|
||||
+ if (p->migrate_disable) {
|
||||
+ p->migrate_disable++;
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* get_online_cpus(); */
|
||||
+
|
||||
+ preempt_disable();
|
||||
+ p->migrate_disable = 1;
|
||||
+
|
||||
+ p->cpus_ptr = cpumask_of(smp_processor_id());
|
||||
+ p->nr_cpus_allowed = 1;
|
||||
+
|
||||
+ preempt_enable();
|
||||
+}
|
||||
+EXPORT_SYMBOL(migrate_disable);
|
||||
+
|
||||
+void migrate_enable(void)
|
||||
+{
|
||||
+ struct task_struct *p = current;
|
||||
+
|
||||
+ if (in_atomic() || irqs_disabled()) {
|
||||
+#ifdef CONFIG_SCHED_DEBUG
|
||||
+ p->migrate_disable_atomic--;
|
||||
+#endif
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+#ifdef CONFIG_SCHED_DEBUG
|
||||
+ WARN_ON_ONCE(p->migrate_disable_atomic);
|
||||
+#endif
|
||||
+
|
||||
+ WARN_ON_ONCE(p->migrate_disable <= 0);
|
||||
+ if (p->migrate_disable > 1) {
|
||||
+ p->migrate_disable--;
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ preempt_disable();
|
||||
+
|
||||
+ p->cpus_ptr = &p->cpus_mask;
|
||||
+ p->nr_cpus_allowed = cpumask_weight(&p->cpus_mask);
|
||||
+ p->migrate_disable = 0;
|
||||
+
|
||||
+ if (p->migrate_disable_update) {
|
||||
+ struct rq *rq;
|
||||
+ struct rq_flags rf;
|
||||
+
|
||||
+ rq = task_rq_lock(p, &rf);
|
||||
+ update_rq_clock(rq);
|
||||
+
|
||||
+ __do_set_cpus_allowed_tail(p, &p->cpus_mask);
|
||||
+ task_rq_unlock(rq, p, &rf);
|
||||
+
|
||||
+ p->migrate_disable_update = 0;
|
||||
+
|
||||
+ WARN_ON(smp_processor_id() != task_cpu(p));
|
||||
+ if (!cpumask_test_cpu(task_cpu(p), &p->cpus_mask)) {
|
||||
+ const struct cpumask *cpu_valid_mask = cpu_active_mask;
|
||||
+ struct migration_arg arg;
|
||||
+ unsigned int dest_cpu;
|
||||
+
|
||||
+ if (p->flags & PF_KTHREAD) {
|
||||
+ /*
|
||||
+ * Kernel threads are allowed on online && !active CPUs
|
||||
+ */
|
||||
+ cpu_valid_mask = cpu_online_mask;
|
||||
+ }
|
||||
+ dest_cpu = cpumask_any_and(cpu_valid_mask, &p->cpus_mask);
|
||||
+ arg.task = p;
|
||||
+ arg.dest_cpu = dest_cpu;
|
||||
+
|
||||
+ preempt_enable();
|
||||
+ stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg);
|
||||
+ tlb_migrate_finish(p->mm);
|
||||
+ /* put_online_cpus(); */
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+ /* put_online_cpus(); */
|
||||
+ preempt_enable();
|
||||
+}
|
||||
+EXPORT_SYMBOL(migrate_enable);
|
||||
+#endif
|
||||
--- a/kernel/sched/debug.c
|
||||
+++ b/kernel/sched/debug.c
|
||||
@@ -958,6 +958,10 @@ void proc_sched_show_task(struct task_st
|
||||
P(dl.runtime);
|
||||
P(dl.deadline);
|
||||
}
|
||||
+#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP)
|
||||
+ P(migrate_disable);
|
||||
+#endif
|
||||
+ P(nr_cpus_allowed);
|
||||
#undef PN_SCHEDSTAT
|
||||
#undef PN
|
||||
#undef __PN
|
|
@ -1,7 +1,7 @@
|
|||
From: Anders Roxell <anders.roxell@linaro.org>
|
||||
Date: Thu, 14 May 2015 17:52:17 +0200
|
||||
Subject: arch/arm64: Add lazy preempt support
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
arm64 is missing support for PREEMPT_RT. The main feature which is
|
||||
lacking is support for lazy preemption. The arch-specific entry code,
|
||||
|
@ -13,15 +13,15 @@ indicate that support for full RT preemption is now available.
|
|||
Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
|
||||
---
|
||||
arch/arm64/Kconfig | 1 +
|
||||
arch/arm64/include/asm/thread_info.h | 7 ++++++-
|
||||
arch/arm64/include/asm/thread_info.h | 7 +++++--
|
||||
arch/arm64/kernel/asm-offsets.c | 1 +
|
||||
arch/arm64/kernel/entry.S | 12 +++++++++---
|
||||
arch/arm64/kernel/signal.c | 2 +-
|
||||
5 files changed, 18 insertions(+), 5 deletions(-)
|
||||
5 files changed, 17 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/arch/arm64/Kconfig
|
||||
+++ b/arch/arm64/Kconfig
|
||||
@@ -91,6 +91,7 @@ config ARM64
|
||||
@@ -96,6 +96,7 @@ config ARM64
|
||||
select HAVE_PERF_EVENTS
|
||||
select HAVE_PERF_REGS
|
||||
select HAVE_PERF_USER_STACK_DUMP
|
||||
|
@ -31,23 +31,23 @@ Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
|
|||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
--- a/arch/arm64/include/asm/thread_info.h
|
||||
+++ b/arch/arm64/include/asm/thread_info.h
|
||||
@@ -49,6 +49,7 @@ struct thread_info {
|
||||
mm_segment_t addr_limit; /* address limit */
|
||||
struct task_struct *task; /* main task structure */
|
||||
@@ -51,6 +51,7 @@ struct thread_info {
|
||||
u64 ttbr0; /* saved TTBR0_EL1 */
|
||||
#endif
|
||||
int preempt_count; /* 0 => preemptable, <0 => bug */
|
||||
+ int preempt_lazy_count; /* 0 => preemptable, <0 => bug */
|
||||
int cpu; /* cpu */
|
||||
};
|
||||
|
||||
@@ -112,6 +113,7 @@ static inline struct thread_info *curren
|
||||
#define TIF_NEED_RESCHED 1
|
||||
#define INIT_THREAD_INFO(tsk) \
|
||||
@@ -86,6 +87,7 @@ struct thread_info {
|
||||
#define TIF_NOTIFY_RESUME 2 /* callback before returning to user */
|
||||
#define TIF_FOREIGN_FPSTATE 3 /* CPU's FP state is not current's */
|
||||
+#define TIF_NEED_RESCHED_LAZY 4
|
||||
#define TIF_UPROBE 4 /* uprobe breakpoint or singlestep */
|
||||
+#define TIF_NEED_RESCHED_LAZY 5
|
||||
#define TIF_NOHZ 7
|
||||
#define TIF_SYSCALL_TRACE 8
|
||||
#define TIF_SYSCALL_AUDIT 9
|
||||
@@ -127,6 +129,7 @@ static inline struct thread_info *curren
|
||||
@@ -101,6 +103,7 @@ struct thread_info {
|
||||
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
||||
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
|
||||
#define _TIF_FOREIGN_FPSTATE (1 << TIF_FOREIGN_FPSTATE)
|
||||
|
@ -55,41 +55,41 @@ Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
|
|||
#define _TIF_NOHZ (1 << TIF_NOHZ)
|
||||
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
|
||||
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
||||
@@ -135,7 +138,9 @@ static inline struct thread_info *curren
|
||||
#define _TIF_32BIT (1 << TIF_32BIT)
|
||||
@@ -111,8 +114,8 @@ struct thread_info {
|
||||
|
||||
#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
|
||||
- _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE)
|
||||
+ _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \
|
||||
+ _TIF_NEED_RESCHED_LAZY)
|
||||
_TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \
|
||||
- _TIF_UPROBE)
|
||||
-
|
||||
+ _TIF_UPROBE | _TIF_NEED_RESCHED_LAZY)
|
||||
+#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY)
|
||||
|
||||
#define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
|
||||
_TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \
|
||||
_TIF_NOHZ)
|
||||
--- a/arch/arm64/kernel/asm-offsets.c
|
||||
+++ b/arch/arm64/kernel/asm-offsets.c
|
||||
@@ -38,6 +38,7 @@ int main(void)
|
||||
BLANK();
|
||||
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
||||
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
|
||||
+ DEFINE(TI_PREEMPT_LAZY, offsetof(struct thread_info, preempt_lazy_count));
|
||||
DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit));
|
||||
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
||||
DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
|
||||
DEFINE(TSK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags));
|
||||
DEFINE(TSK_TI_PREEMPT, offsetof(struct task_struct, thread_info.preempt_count));
|
||||
+ DEFINE(TSK_TI_PREEMPT_LAZY, offsetof(struct task_struct, thread_info.preempt_lazy_count));
|
||||
DEFINE(TSK_TI_ADDR_LIMIT, offsetof(struct task_struct, thread_info.addr_limit));
|
||||
#ifdef CONFIG_ARM64_SW_TTBR0_PAN
|
||||
DEFINE(TSK_TI_TTBR0, offsetof(struct task_struct, thread_info.ttbr0));
|
||||
--- a/arch/arm64/kernel/entry.S
|
||||
+++ b/arch/arm64/kernel/entry.S
|
||||
@@ -428,11 +428,16 @@ ENDPROC(el1_sync)
|
||||
@@ -488,11 +488,16 @@ ENDPROC(el1_sync)
|
||||
|
||||
#ifdef CONFIG_PREEMPT
|
||||
ldr w24, [tsk, #TI_PREEMPT] // get preempt count
|
||||
ldr w24, [tsk, #TSK_TI_PREEMPT] // get preempt count
|
||||
- cbnz w24, 1f // preempt count != 0
|
||||
+ cbnz w24, 2f // preempt count != 0
|
||||
ldr x0, [tsk, #TI_FLAGS] // get flags
|
||||
ldr x0, [tsk, #TSK_TI_FLAGS] // get flags
|
||||
- tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling?
|
||||
- bl el1_preempt
|
||||
+ tbnz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling?
|
||||
+
|
||||
+ ldr w24, [tsk, #TI_PREEMPT_LAZY] // get preempt lazy count
|
||||
+ ldr w24, [tsk, #TSK_TI_PREEMPT_LAZY] // get preempt lazy count
|
||||
+ cbnz w24, 2f // preempt lazy count != 0
|
||||
+ tbz x0, #TIF_NEED_RESCHED_LAZY, 2f // needs rescheduling?
|
||||
1:
|
||||
|
@ -98,9 +98,9 @@ Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
|
|||
#endif
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
bl trace_hardirqs_on
|
||||
@@ -446,6 +451,7 @@ ENDPROC(el1_irq)
|
||||
@@ -506,6 +511,7 @@ ENDPROC(el1_irq)
|
||||
1: bl preempt_schedule_irq // irq en/disable is done inside
|
||||
ldr x0, [tsk, #TI_FLAGS] // get new tasks TI_FLAGS
|
||||
ldr x0, [tsk, #TSK_TI_FLAGS] // get new tasks TI_FLAGS
|
||||
tbnz x0, #TIF_NEED_RESCHED, 1b // needs rescheduling?
|
||||
+ tbnz x0, #TIF_NEED_RESCHED_LAZY, 1b // needs rescheduling?
|
||||
ret x24
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Benedikt Spranger <b.spranger@linutronix.de>
|
||||
Date: Sat, 6 Mar 2010 17:47:10 +0100
|
||||
Subject: ARM: AT91: PIT: Remove irq handler when clock event is unused
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Setup and remove the interrupt handler in clock event mode selection.
|
||||
This avoids calling the (shared) interrupt handler when the device is
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sat, 1 May 2010 18:29:35 +0200
|
||||
Subject: ARM: at91: tclib: Default to tclib timer for RT
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
RT is not too happy about the shared timer interrupt in AT91
|
||||
devices. Default to tclib timer for RT.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Frank Rowand <frank.rowand@am.sony.com>
|
||||
Date: Mon, 19 Sep 2011 14:51:14 -0700
|
||||
Subject: arm: Convert arm boot_lock to raw
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The arm boot_lock is used by the secondary processor startup code. The locking
|
||||
task is the idle thread, which has idle->sched_class == &idle_sched_class.
|
||||
|
@ -168,7 +168,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
#endif
|
||||
--- a/arch/arm/mach-omap2/omap-smp.c
|
||||
+++ b/arch/arm/mach-omap2/omap-smp.c
|
||||
@@ -64,7 +64,7 @@ static const struct omap_smp_config omap
|
||||
@@ -69,7 +69,7 @@ static const struct omap_smp_config omap
|
||||
.startup_addr = omap5_secondary_startup,
|
||||
};
|
||||
|
||||
|
@ -177,7 +177,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
void __iomem *omap4_get_scu_base(void)
|
||||
{
|
||||
@@ -131,8 +131,8 @@ static void omap4_secondary_init(unsigne
|
||||
@@ -136,8 +136,8 @@ static void omap4_secondary_init(unsigne
|
||||
/*
|
||||
* Synchronise with the boot thread.
|
||||
*/
|
||||
|
@ -188,7 +188,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
|
||||
static int omap4_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -146,7 +146,7 @@ static int omap4_boot_secondary(unsigned
|
||||
@@ -150,7 +150,7 @@ static int omap4_boot_secondary(unsigned
|
||||
* Set synchronisation state between this boot processor
|
||||
* and the secondary one
|
||||
*/
|
||||
|
@ -197,7 +197,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
/*
|
||||
* Update the AuxCoreBoot0 with boot state for secondary core.
|
||||
@@ -223,7 +223,7 @@ static int omap4_boot_secondary(unsigned
|
||||
@@ -229,7 +229,7 @@ static int omap4_boot_secondary(unsigned
|
||||
* Now the secondary core is starting up let it run its
|
||||
* calibrations, then wait for it to finish
|
||||
*/
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Subject: arm: Enable highmem for rt
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 13 Feb 2013 11:03:11 +0100
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
fixup highmem for ARM.
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Mon, 11 Mar 2013 21:37:27 +0100
|
||||
Subject: arm/highmem: Flush tlb on unmap
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The tlb should be flushed on unmap and thus make the mapping entry
|
||||
invalid. This is only done in the non-debug case which does not look
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 22 Dec 2016 17:28:33 +0100
|
||||
Subject: [PATCH] arm: include definition for cpumask_t
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
This definition gets pulled in by other files. With the (later) split of
|
||||
RCU and spinlock.h it won't compile anymore.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Yang Shi <yang.shi@linaro.org>
|
||||
Date: Thu, 10 Nov 2016 16:17:55 -0800
|
||||
Subject: [PATCH] arm: kprobe: replace patch_lock to raw lock
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
When running kprobe on -rt kernel, the below bug is caught:
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Subject: arm: Add support for lazy preemption
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 31 Oct 2012 12:04:11 +0100
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Implement the arm pieces for lazy preempt.
|
||||
|
||||
|
@ -17,7 +17,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/arch/arm/Kconfig
|
||||
+++ b/arch/arm/Kconfig
|
||||
@@ -75,6 +75,7 @@ config ARM
|
||||
@@ -81,6 +81,7 @@ config ARM
|
||||
select HAVE_PERF_EVENTS
|
||||
select HAVE_PERF_REGS
|
||||
select HAVE_PERF_USER_STACK_DUMP
|
||||
|
@ -114,7 +114,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
__und_fault:
|
||||
--- a/arch/arm/kernel/entry-common.S
|
||||
+++ b/arch/arm/kernel/entry-common.S
|
||||
@@ -36,7 +36,9 @@
|
||||
@@ -41,7 +41,9 @@
|
||||
UNWIND(.cantunwind )
|
||||
disable_irq_notrace @ disable interrupts
|
||||
ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing
|
||||
|
@ -125,7 +125,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
bne fast_work_pending
|
||||
|
||||
/* perform architecture specific actions before user return */
|
||||
@@ -62,8 +64,11 @@ ENDPROC(ret_fast_syscall)
|
||||
@@ -67,8 +69,11 @@ ENDPROC(ret_fast_syscall)
|
||||
str r0, [sp, #S_R0 + S_OFF]! @ save returned r0
|
||||
disable_irq_notrace @ disable interrupts
|
||||
ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Fri, 20 Sep 2013 14:31:54 +0200
|
||||
Subject: arm/unwind: use a raw_spin_lock
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Mostly unwind is done with irqs enabled however SLUB may call it with
|
||||
irqs disabled while creating a new SLUB cache.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Subject: arm64/xen: Make XEN depend on !RT
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Mon, 12 Oct 2015 11:18:40 +0200
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
It's not ready and probably never will be, unless xen folks have a
|
||||
look at it.
|
||||
|
@ -13,7 +13,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/arch/arm64/Kconfig
|
||||
+++ b/arch/arm64/Kconfig
|
||||
@@ -704,7 +704,7 @@ config XEN_DOM0
|
||||
@@ -742,7 +742,7 @@ config XEN_DOM0
|
||||
|
||||
config XEN
|
||||
bool "Xen guest support on ARM64"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Wed, 09 Mar 2016 10:51:06 +0100
|
||||
Subject: arm: at91: do not disable/enable clocks in a row
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Currently the driver will disable the clock and enable it one line later
|
||||
if it is switching from periodic mode into one shot.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Steven Rostedt <srostedt@redhat.com>
|
||||
Date: Fri, 3 Jul 2009 08:44:29 -0500
|
||||
Subject: ata: Do not disable interrupts in ide code for preempt-rt
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Use the local_irq_*_nort variants.
|
||||
|
||||
|
@ -15,19 +15,19 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/drivers/ata/libata-sff.c
|
||||
+++ b/drivers/ata/libata-sff.c
|
||||
@@ -678,9 +678,9 @@ unsigned int ata_sff_data_xfer_noirq(str
|
||||
@@ -679,9 +679,9 @@ unsigned int ata_sff_data_xfer_noirq(str
|
||||
unsigned long flags;
|
||||
unsigned int consumed;
|
||||
|
||||
- local_irq_save(flags);
|
||||
+ local_irq_save_nort(flags);
|
||||
consumed = ata_sff_data_xfer32(dev, buf, buflen, rw);
|
||||
consumed = ata_sff_data_xfer32(qc, buf, buflen, rw);
|
||||
- local_irq_restore(flags);
|
||||
+ local_irq_restore_nort(flags);
|
||||
|
||||
return consumed;
|
||||
}
|
||||
@@ -719,7 +719,7 @@ static void ata_pio_sector(struct ata_qu
|
||||
@@ -720,7 +720,7 @@ static void ata_pio_sector(struct ata_qu
|
||||
unsigned long flags;
|
||||
|
||||
/* FIXME: use a bounce buffer */
|
||||
|
@ -36,7 +36,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
buf = kmap_atomic(page);
|
||||
|
||||
/* do the actual data transfer */
|
||||
@@ -727,7 +727,7 @@ static void ata_pio_sector(struct ata_qu
|
||||
@@ -728,7 +728,7 @@ static void ata_pio_sector(struct ata_qu
|
||||
do_write);
|
||||
|
||||
kunmap_atomic(buf);
|
||||
|
@ -44,8 +44,8 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
+ local_irq_restore_nort(flags);
|
||||
} else {
|
||||
buf = page_address(page);
|
||||
ap->ops->sff_data_xfer(qc->dev, buf + offset, qc->sect_size,
|
||||
@@ -864,7 +864,7 @@ static int __atapi_pio_bytes(struct ata_
|
||||
ap->ops->sff_data_xfer(qc, buf + offset, qc->sect_size,
|
||||
@@ -865,7 +865,7 @@ static int __atapi_pio_bytes(struct ata_
|
||||
unsigned long flags;
|
||||
|
||||
/* FIXME: use bounce buffer */
|
||||
|
@ -54,7 +54,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
buf = kmap_atomic(page);
|
||||
|
||||
/* do the actual data transfer */
|
||||
@@ -872,7 +872,7 @@ static int __atapi_pio_bytes(struct ata_
|
||||
@@ -873,7 +873,7 @@ static int __atapi_pio_bytes(struct ata_
|
||||
count, rw);
|
||||
|
||||
kunmap_atomic(buf);
|
||||
|
@ -62,4 +62,4 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
+ local_irq_restore_nort(flags);
|
||||
} else {
|
||||
buf = page_address(page);
|
||||
consumed = ap->ops->sff_data_xfer(dev, buf + offset,
|
||||
consumed = ap->ops->sff_data_xfer(qc, buf + offset,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Fri, 13 Feb 2015 11:01:26 +0100
|
||||
Subject: block: blk-mq: Use swait
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
| BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:914
|
||||
| in_atomic(): 1, irqs_disabled(): 0, pid: 255, name: kworker/u257:6
|
||||
|
@ -40,13 +40,13 @@ Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.
|
|||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
block/blk-core.c | 6 +++---
|
||||
block/blk-mq.c | 6 +++---
|
||||
block/blk-mq.c | 8 ++++----
|
||||
include/linux/blkdev.h | 2 +-
|
||||
3 files changed, 7 insertions(+), 7 deletions(-)
|
||||
3 files changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/block/blk-core.c
|
||||
+++ b/block/blk-core.c
|
||||
@@ -662,7 +662,7 @@ int blk_queue_enter(struct request_queue
|
||||
@@ -678,7 +678,7 @@ int blk_queue_enter(struct request_queue
|
||||
if (nowait)
|
||||
return -EBUSY;
|
||||
|
||||
|
@ -55,7 +55,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
!atomic_read(&q->mq_freeze_depth) ||
|
||||
blk_queue_dying(q));
|
||||
if (blk_queue_dying(q))
|
||||
@@ -682,7 +682,7 @@ static void blk_queue_usage_counter_rele
|
||||
@@ -698,7 +698,7 @@ static void blk_queue_usage_counter_rele
|
||||
struct request_queue *q =
|
||||
container_of(ref, struct request_queue, q_usage_counter);
|
||||
|
||||
|
@ -64,7 +64,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
static void blk_rq_timed_out_timer(unsigned long data)
|
||||
@@ -751,7 +751,7 @@ struct request_queue *blk_alloc_queue_no
|
||||
@@ -766,7 +766,7 @@ struct request_queue *blk_alloc_queue_no
|
||||
q->bypass_depth = 1;
|
||||
__set_bit(QUEUE_FLAG_BYPASS, &q->queue_flags);
|
||||
|
||||
|
@ -75,16 +75,24 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
* Init percpu_ref in atomic mode so that it's faster to shutdown.
|
||||
--- a/block/blk-mq.c
|
||||
+++ b/block/blk-mq.c
|
||||
@@ -72,7 +72,7 @@ EXPORT_SYMBOL_GPL(blk_mq_freeze_queue_st
|
||||
@@ -79,14 +79,14 @@ EXPORT_SYMBOL_GPL(blk_mq_freeze_queue_st
|
||||
|
||||
static void blk_mq_freeze_queue_wait(struct request_queue *q)
|
||||
void blk_mq_freeze_queue_wait(struct request_queue *q)
|
||||
{
|
||||
- wait_event(q->mq_freeze_wq, percpu_ref_is_zero(&q->q_usage_counter));
|
||||
+ swait_event(q->mq_freeze_wq, percpu_ref_is_zero(&q->q_usage_counter));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(blk_mq_freeze_queue_wait);
|
||||
|
||||
/*
|
||||
@@ -110,7 +110,7 @@ void blk_mq_unfreeze_queue(struct reques
|
||||
int blk_mq_freeze_queue_wait_timeout(struct request_queue *q,
|
||||
unsigned long timeout)
|
||||
{
|
||||
- return wait_event_timeout(q->mq_freeze_wq,
|
||||
+ return swait_event_timeout(q->mq_freeze_wq,
|
||||
percpu_ref_is_zero(&q->q_usage_counter),
|
||||
timeout);
|
||||
}
|
||||
@@ -127,7 +127,7 @@ void blk_mq_unfreeze_queue(struct reques
|
||||
WARN_ON_ONCE(freeze_depth < 0);
|
||||
if (!freeze_depth) {
|
||||
percpu_ref_reinit(&q->q_usage_counter);
|
||||
|
@ -93,7 +101,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(blk_mq_unfreeze_queue);
|
||||
@@ -129,7 +129,7 @@ void blk_mq_wake_waiters(struct request_
|
||||
@@ -173,7 +173,7 @@ void blk_mq_wake_waiters(struct request_
|
||||
* dying, we need to ensure that processes currently waiting on
|
||||
* the queue are notified as well.
|
||||
*/
|
||||
|
@ -104,7 +112,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
bool blk_mq_can_queue(struct blk_mq_hw_ctx *hctx)
|
||||
--- a/include/linux/blkdev.h
|
||||
+++ b/include/linux/blkdev.h
|
||||
@@ -468,7 +468,7 @@ struct request_queue {
|
||||
@@ -566,7 +566,7 @@ struct request_queue {
|
||||
struct throtl_data *td;
|
||||
#endif
|
||||
struct rcu_head rcu_head;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Thu, 29 Jan 2015 15:10:08 +0100
|
||||
Subject: block/mq: don't complete requests via IPI
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The IPI runs in hardirq context and there are sleeping locks. This patch
|
||||
moves the completion into a workqueue.
|
||||
|
@ -9,14 +9,14 @@ moves the completion into a workqueue.
|
|||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
block/blk-core.c | 3 +++
|
||||
block/blk-mq.c | 20 ++++++++++++++++++++
|
||||
block/blk-mq.c | 24 ++++++++++++++++++++++++
|
||||
include/linux/blk-mq.h | 2 +-
|
||||
include/linux/blkdev.h | 1 +
|
||||
4 files changed, 25 insertions(+), 1 deletion(-)
|
||||
include/linux/blkdev.h | 3 +++
|
||||
4 files changed, 31 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/block/blk-core.c
|
||||
+++ b/block/blk-core.c
|
||||
@@ -125,6 +125,9 @@ void blk_rq_init(struct request_queue *q
|
||||
@@ -116,6 +116,9 @@ void blk_rq_init(struct request_queue *q
|
||||
|
||||
INIT_LIST_HEAD(&rq->queuelist);
|
||||
INIT_LIST_HEAD(&rq->timeout_list);
|
||||
|
@ -28,9 +28,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
rq->__sector = (sector_t) -1;
|
||||
--- a/block/blk-mq.c
|
||||
+++ b/block/blk-mq.c
|
||||
@@ -177,6 +177,9 @@ static void blk_mq_rq_ctx_init(struct re
|
||||
rq->resid_len = 0;
|
||||
rq->sense = NULL;
|
||||
@@ -213,6 +213,9 @@ void blk_mq_rq_ctx_init(struct request_q
|
||||
rq->errors = 0;
|
||||
rq->extra_len = 0;
|
||||
|
||||
+#ifdef CONFIG_PREEMPT_RT_FULL
|
||||
+ INIT_WORK(&rq->work, __blk_mq_complete_request_remote_work);
|
||||
|
@ -38,7 +38,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
INIT_LIST_HEAD(&rq->timeout_list);
|
||||
rq->timeout = 0;
|
||||
|
||||
@@ -345,6 +348,17 @@ void blk_mq_end_request(struct request *
|
||||
@@ -395,6 +398,17 @@ void blk_mq_end_request(struct request *
|
||||
}
|
||||
EXPORT_SYMBOL(blk_mq_end_request);
|
||||
|
||||
|
@ -56,7 +56,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
static void __blk_mq_complete_request_remote(void *data)
|
||||
{
|
||||
struct request *rq = data;
|
||||
@@ -352,6 +366,8 @@ static void __blk_mq_complete_request_re
|
||||
@@ -402,6 +416,8 @@ static void __blk_mq_complete_request_re
|
||||
rq->q->softirq_done_fn(rq);
|
||||
}
|
||||
|
||||
|
@ -65,11 +65,15 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
static void blk_mq_ipi_complete_request(struct request *rq)
|
||||
{
|
||||
struct blk_mq_ctx *ctx = rq->mq_ctx;
|
||||
@@ -368,10 +384,14 @@ static void blk_mq_ipi_complete_request(
|
||||
@@ -418,10 +434,18 @@ static void blk_mq_ipi_complete_request(
|
||||
shared = cpus_share_cache(cpu, ctx->cpu);
|
||||
|
||||
if (cpu != ctx->cpu && !shared && cpu_online(ctx->cpu)) {
|
||||
+#ifdef CONFIG_PREEMPT_RT_FULL
|
||||
+ /*
|
||||
+ * We could force QUEUE_FLAG_SAME_FORCE then we would not get in
|
||||
+ * here. But we could try to invoke it one the CPU like this.
|
||||
+ */
|
||||
+ schedule_work_on(ctx->cpu, &rq->work);
|
||||
+#else
|
||||
rq->csd.func = __blk_mq_complete_request_remote;
|
||||
|
@ -82,7 +86,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
--- a/include/linux/blk-mq.h
|
||||
+++ b/include/linux/blk-mq.h
|
||||
@@ -209,7 +209,7 @@ static inline u16 blk_mq_unique_tag_to_t
|
||||
@@ -218,7 +218,7 @@ static inline u16 blk_mq_unique_tag_to_t
|
||||
return unique_tag & BLK_MQ_UNIQUE_TAG_MASK;
|
||||
}
|
||||
|
||||
|
@ -93,11 +97,13 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
void blk_mq_end_request(struct request *rq, int error);
|
||||
--- a/include/linux/blkdev.h
|
||||
+++ b/include/linux/blkdev.h
|
||||
@@ -89,6 +89,7 @@ struct request {
|
||||
@@ -128,6 +128,9 @@ typedef __u32 __bitwise req_flags_t;
|
||||
*/
|
||||
struct request {
|
||||
struct list_head queuelist;
|
||||
+#ifdef CONFIG_PREEMPT_RT_FULL
|
||||
+ struct work_struct work;
|
||||
+#endif
|
||||
union {
|
||||
struct call_single_data csd;
|
||||
+ struct work_struct work;
|
||||
u64 fifo_time;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Tue, 14 Jul 2015 14:26:34 +0200
|
||||
Subject: block/mq: do not invoke preempt_disable()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
preempt_disable() and get_cpu() don't play well together with the sleeping
|
||||
locks it tries to allocate later.
|
||||
|
@ -14,7 +14,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/block/blk-mq.c
|
||||
+++ b/block/blk-mq.c
|
||||
@@ -363,7 +363,7 @@ static void blk_mq_ipi_complete_request(
|
||||
@@ -413,7 +413,7 @@ static void blk_mq_ipi_complete_request(
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
if (!test_bit(QUEUE_FLAG_SAME_FORCE, &rq->q->queue_flags))
|
||||
shared = cpus_share_cache(cpu, ctx->cpu);
|
||||
|
||||
@@ -375,7 +375,7 @@ static void blk_mq_ipi_complete_request(
|
||||
@@ -425,7 +425,7 @@ static void blk_mq_ipi_complete_request(
|
||||
} else {
|
||||
rq->q->softirq_done_fn(rq);
|
||||
}
|
||||
|
@ -31,8 +31,8 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
+ put_cpu_light();
|
||||
}
|
||||
|
||||
static void __blk_mq_complete_request(struct request *rq)
|
||||
@@ -906,14 +906,14 @@ void blk_mq_run_hw_queue(struct blk_mq_h
|
||||
static void blk_mq_stat_add(struct request *rq)
|
||||
@@ -1143,14 +1143,14 @@ static void __blk_mq_delay_run_hw_queue(
|
||||
return;
|
||||
|
||||
if (!async && !(hctx->flags & BLK_MQ_F_BLOCKING)) {
|
||||
|
@ -49,4 +49,4 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
+ put_cpu_light();
|
||||
}
|
||||
|
||||
kblockd_schedule_work_on(blk_mq_hctx_next_cpu(hctx), &hctx->run_work);
|
||||
if (msecs == 0)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Wed, 9 Apr 2014 10:37:23 +0200
|
||||
Subject: block: mq: use cpu_light()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
there is a might sleep splat because get_cpu() disables preemption and
|
||||
later we grab a lock. As a workaround for this we use get_cpu_light().
|
||||
|
@ -13,7 +13,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/block/blk-mq.h
|
||||
+++ b/block/blk-mq.h
|
||||
@@ -72,12 +72,12 @@ static inline struct blk_mq_ctx *__blk_m
|
||||
@@ -130,12 +130,12 @@ static inline struct blk_mq_ctx *__blk_m
|
||||
*/
|
||||
static inline struct blk_mq_ctx *blk_mq_get_ctx(struct request_queue *q)
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Subject: block: Shorten interrupt disabled regions
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 22 Jun 2011 19:47:02 +0200
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Moving the blk_sched_flush_plug() call out of the interrupt/preempt
|
||||
disabled region in the scheduler allows us to replace
|
||||
|
@ -48,7 +48,7 @@ Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.de
|
|||
|
||||
--- a/block/blk-core.c
|
||||
+++ b/block/blk-core.c
|
||||
@@ -3200,7 +3200,7 @@ static void queue_unplugged(struct reque
|
||||
@@ -3186,7 +3186,7 @@ static void queue_unplugged(struct reque
|
||||
blk_run_queue_async(q);
|
||||
else
|
||||
__blk_run_queue(q);
|
||||
|
@ -57,7 +57,7 @@ Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.de
|
|||
}
|
||||
|
||||
static void flush_plug_callbacks(struct blk_plug *plug, bool from_schedule)
|
||||
@@ -3248,7 +3248,6 @@ EXPORT_SYMBOL(blk_check_plugged);
|
||||
@@ -3234,7 +3234,6 @@ EXPORT_SYMBOL(blk_check_plugged);
|
||||
void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule)
|
||||
{
|
||||
struct request_queue *q;
|
||||
|
@ -65,7 +65,7 @@ Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.de
|
|||
struct request *rq;
|
||||
LIST_HEAD(list);
|
||||
unsigned int depth;
|
||||
@@ -3268,11 +3267,6 @@ void blk_flush_plug_list(struct blk_plug
|
||||
@@ -3254,11 +3253,6 @@ void blk_flush_plug_list(struct blk_plug
|
||||
q = NULL;
|
||||
depth = 0;
|
||||
|
||||
|
@ -77,7 +77,7 @@ Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.de
|
|||
while (!list_empty(&list)) {
|
||||
rq = list_entry_rq(list.next);
|
||||
list_del_init(&rq->queuelist);
|
||||
@@ -3285,7 +3279,7 @@ void blk_flush_plug_list(struct blk_plug
|
||||
@@ -3271,7 +3265,7 @@ void blk_flush_plug_list(struct blk_plug
|
||||
queue_unplugged(q, depth, from_schedule);
|
||||
q = rq->q;
|
||||
depth = 0;
|
||||
|
@ -86,7 +86,7 @@ Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.de
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -3312,8 +3306,6 @@ void blk_flush_plug_list(struct blk_plug
|
||||
@@ -3298,8 +3292,6 @@ void blk_flush_plug_list(struct blk_plug
|
||||
*/
|
||||
if (q)
|
||||
queue_unplugged(q, depth, from_schedule);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Subject: block: Use cpu_chill() for retry loops
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 20 Dec 2012 18:28:26 +0100
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Retry loops on RT might loop forever when the modifying side was
|
||||
preempted. Steven also observed a live lock when there was a
|
||||
|
@ -18,15 +18,15 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/block/blk-ioc.c
|
||||
+++ b/block/blk-ioc.c
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <linux/bio.h>
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sched/task.h>
|
||||
+#include <linux/delay.h>
|
||||
|
||||
#include "blk.h"
|
||||
|
||||
@@ -109,7 +110,7 @@ static void ioc_release_fn(struct work_s
|
||||
@@ -117,7 +118,7 @@ static void ioc_release_fn(struct work_s
|
||||
spin_unlock(q->queue_lock);
|
||||
} else {
|
||||
spin_unlock_irqrestore(&ioc->lock, flags);
|
||||
|
@ -35,12 +35,12 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
spin_lock_irqsave_nested(&ioc->lock, flags, 1);
|
||||
}
|
||||
}
|
||||
@@ -187,7 +188,7 @@ void put_io_context_active(struct io_con
|
||||
spin_unlock(icq->q->queue_lock);
|
||||
} else {
|
||||
spin_unlock_irqrestore(&ioc->lock, flags);
|
||||
- cpu_relax();
|
||||
+ cpu_chill();
|
||||
goto retry;
|
||||
@@ -201,7 +202,7 @@ void put_io_context_active(struct io_con
|
||||
spin_unlock(icq->q->queue_lock);
|
||||
} else {
|
||||
spin_unlock_irqrestore(&ioc->lock, flags);
|
||||
- cpu_relax();
|
||||
+ cpu_chill();
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Ingo Molnar <mingo@elte.hu>
|
||||
Date: Fri, 3 Jul 2009 08:29:58 -0500
|
||||
Subject: bug: BUG_ON/WARN_ON variants dependend on RT/!RT
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Introduce RT/NON-RT WARN/BUG statements to avoid ifdefs in the code.
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Mike Galbraith <umgwanakikbuti@gmail.com>
|
||||
Date: Sat, 21 Jun 2014 10:09:48 +0200
|
||||
Subject: memcontrol: Prevent scheduling while atomic in cgroup code
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
mm, memcg: make refill_stock() use get_cpu_light()
|
||||
|
||||
|
@ -43,7 +43,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/mm/memcontrol.c
|
||||
+++ b/mm/memcontrol.c
|
||||
@@ -1695,6 +1695,7 @@ struct memcg_stock_pcp {
|
||||
@@ -1685,6 +1685,7 @@ struct memcg_stock_pcp {
|
||||
#define FLUSHING_CACHED_CHARGE 0
|
||||
};
|
||||
static DEFINE_PER_CPU(struct memcg_stock_pcp, memcg_stock);
|
||||
|
@ -51,7 +51,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
static DEFINE_MUTEX(percpu_charge_mutex);
|
||||
|
||||
/**
|
||||
@@ -1717,7 +1718,7 @@ static bool consume_stock(struct mem_cgr
|
||||
@@ -1707,7 +1708,7 @@ static bool consume_stock(struct mem_cgr
|
||||
if (nr_pages > CHARGE_BATCH)
|
||||
return ret;
|
||||
|
||||
|
@ -60,7 +60,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
stock = this_cpu_ptr(&memcg_stock);
|
||||
if (memcg == stock->cached && stock->nr_pages >= nr_pages) {
|
||||
@@ -1725,7 +1726,7 @@ static bool consume_stock(struct mem_cgr
|
||||
@@ -1715,7 +1716,7 @@ static bool consume_stock(struct mem_cgr
|
||||
ret = true;
|
||||
}
|
||||
|
||||
|
@ -69,7 +69,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
return ret;
|
||||
}
|
||||
@@ -1752,13 +1753,13 @@ static void drain_local_stock(struct wor
|
||||
@@ -1742,13 +1743,13 @@ static void drain_local_stock(struct wor
|
||||
struct memcg_stock_pcp *stock;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -85,7 +85,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -1770,7 +1771,7 @@ static void refill_stock(struct mem_cgro
|
||||
@@ -1760,7 +1761,7 @@ static void refill_stock(struct mem_cgro
|
||||
struct memcg_stock_pcp *stock;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -94,7 +94,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
stock = this_cpu_ptr(&memcg_stock);
|
||||
if (stock->cached != memcg) { /* reset if necessary */
|
||||
@@ -1779,7 +1780,7 @@ static void refill_stock(struct mem_cgro
|
||||
@@ -1769,7 +1770,7 @@ static void refill_stock(struct mem_cgro
|
||||
}
|
||||
stock->nr_pages += nr_pages;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Fri, 13 Feb 2015 15:52:24 +0100
|
||||
Subject: cgroups: use simple wait in css_release()
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
To avoid:
|
||||
|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:914
|
||||
|
@ -30,20 +30,20 @@ To avoid:
|
|||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
include/linux/cgroup-defs.h | 2 ++
|
||||
kernel/cgroup.c | 9 +++++----
|
||||
kernel/cgroup/cgroup.c | 9 +++++----
|
||||
2 files changed, 7 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/include/linux/cgroup-defs.h
|
||||
+++ b/include/linux/cgroup-defs.h
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/percpu-refcount.h>
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <linux/percpu-rwsem.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/bpf-cgroup.h>
|
||||
+#include <linux/swork.h>
|
||||
|
||||
#ifdef CONFIG_CGROUPS
|
||||
|
||||
@@ -137,6 +138,7 @@ struct cgroup_subsys_state {
|
||||
@@ -139,6 +140,7 @@ struct cgroup_subsys_state {
|
||||
/* percpu_ref killing and RCU release */
|
||||
struct rcu_head rcu_head;
|
||||
struct work_struct destroy_work;
|
||||
|
@ -51,9 +51,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
};
|
||||
|
||||
/*
|
||||
--- a/kernel/cgroup.c
|
||||
+++ b/kernel/cgroup.c
|
||||
@@ -5041,10 +5041,10 @@ static void css_free_rcu_fn(struct rcu_h
|
||||
--- a/kernel/cgroup/cgroup.c
|
||||
+++ b/kernel/cgroup/cgroup.c
|
||||
@@ -3895,10 +3895,10 @@ static void css_free_rcu_fn(struct rcu_h
|
||||
queue_work(cgroup_destroy_wq, &css->destroy_work);
|
||||
}
|
||||
|
||||
|
@ -66,7 +66,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
struct cgroup_subsys *ss = css->ss;
|
||||
struct cgroup *cgrp = css->cgroup;
|
||||
|
||||
@@ -5087,8 +5087,8 @@ static void css_release(struct percpu_re
|
||||
@@ -3943,8 +3943,8 @@ static void css_release(struct percpu_re
|
||||
struct cgroup_subsys_state *css =
|
||||
container_of(ref, struct cgroup_subsys_state, refcnt);
|
||||
|
||||
|
@ -77,11 +77,11 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
}
|
||||
|
||||
static void init_and_link_css(struct cgroup_subsys_state *css,
|
||||
@@ -5740,6 +5740,7 @@ static int __init cgroup_wq_init(void)
|
||||
@@ -4601,6 +4601,7 @@ static int __init cgroup_wq_init(void)
|
||||
*/
|
||||
cgroup_destroy_wq = alloc_workqueue("cgroup_destroy", 0, 1);
|
||||
BUG_ON(!cgroup_destroy_wq);
|
||||
+ BUG_ON(swork_get());
|
||||
|
||||
/*
|
||||
* Used to destroy pidlists and separate to serve as flush domain.
|
||||
return 0;
|
||||
}
|
||||
core_initcall(cgroup_wq_init);
|
||||
|
|
167
debian/patches/features/all/rt/char-random-don-t-print-that-the-init-is-done.patch
vendored
Normal file
167
debian/patches/features/all/rt/char-random-don-t-print-that-the-init-is-done.patch
vendored
Normal file
|
@ -0,0 +1,167 @@
|
|||
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
Date: Tue, 30 May 2017 16:39:01 +0200
|
||||
Subject: char/random: don't print that the init is done
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
On RT we run into circular locking with pendingb_lock (workqueue),
|
||||
port_lock_key (uart) and the primary_crng (random):
|
||||
|
||||
======================================================
|
||||
[ INFO: possible circular locking dependency detected ]
|
||||
-------------------------------------------------------
|
||||
irq/4-serial/512 is trying to acquire lock:
|
||||
((pendingb_lock).lock){+.+...}, at: [<ffffffff8108d48d>] queue_work_on+0x5d/0x190
|
||||
|
||||
but task is already holding lock:
|
||||
(&port_lock_key){+.+...}, at: [<ffffffff815b4bb6>] serial8250_handle_irq.part.27+0x16/0xb0
|
||||
|
||||
which lock already depends on the new lock.
|
||||
|
||||
the existing dependency chain (in reverse order) is:
|
||||
|
||||
-> #3 (&port_lock_key){+.+...}:
|
||||
lock_acquire+0xac/0x240
|
||||
rt_spin_lock+0x46/0x50
|
||||
serial8250_console_write+0x211/0x220
|
||||
univ8250_console_write+0x1c/0x20
|
||||
console_unlock+0x563/0x5c0
|
||||
vprintk_emit+0x277/0x320
|
||||
vprintk_default+0x1a/0x20
|
||||
vprintk_func+0x20/0x80
|
||||
printk+0x3e/0x46
|
||||
crng_fast_load+0xde/0xe0
|
||||
add_interrupt_randomness+0x16c/0x1a0
|
||||
irq_thread+0x15c/0x1e0
|
||||
kthread+0x112/0x150
|
||||
ret_from_fork+0x31/0x40
|
||||
|
||||
-> #2 (primary_crng.lock){+.+...}:
|
||||
lock_acquire+0xac/0x240
|
||||
rt_spin_lock+0x46/0x50
|
||||
_extract_crng+0x39/0xa0
|
||||
extract_crng+0x3a/0x40
|
||||
get_random_u32+0x120/0x190
|
||||
new_slab+0x1d6/0x7c0
|
||||
___slab_alloc+0x30b/0x6f0
|
||||
__slab_alloc.isra.78+0x6c/0xc0
|
||||
__kmalloc+0x254/0x3a0
|
||||
pcpu_mem_zalloc+0x3a/0x70
|
||||
percpu_init_late+0x4f/0x8a
|
||||
start_kernel+0x1ec/0x3b8
|
||||
x86_64_start_reservations+0x2a/0x2c
|
||||
x86_64_start_kernel+0x13d/0x14c
|
||||
verify_cpu+0x0/0xfc
|
||||
|
||||
-> #1 ((batched_entropy_u32_lock).lock){+.+...}:
|
||||
lock_acquire+0xac/0x240
|
||||
rt_spin_lock__no_mg+0x41/0x50
|
||||
get_random_u32+0x64/0x190
|
||||
new_slab+0x1d6/0x7c0
|
||||
___slab_alloc+0x30b/0x6f0
|
||||
__slab_alloc.isra.78+0x6c/0xc0
|
||||
kmem_cache_alloc+0x26a/0x370
|
||||
__debug_object_init+0x325/0x460
|
||||
debug_object_activate+0x11c/0x1f0
|
||||
__queue_work+0x2c/0x770
|
||||
queue_work_on+0x12a/0x190
|
||||
serio_queue_event+0xd3/0x140
|
||||
__serio_register_port+0x17e/0x1a0
|
||||
i8042_probe+0x623/0x687
|
||||
platform_drv_probe+0x36/0x90
|
||||
driver_probe_device+0x1f8/0x2e0
|
||||
__driver_attach+0x96/0xa0
|
||||
bus_for_each_dev+0x5d/0x90
|
||||
driver_attach+0x19/0x20
|
||||
bus_add_driver+0x125/0x220
|
||||
driver_register+0x5b/0xd0
|
||||
__platform_driver_probe+0x5b/0x120
|
||||
__platform_create_bundle+0xaa/0xd0
|
||||
i8042_init+0x3f1/0x430
|
||||
do_one_initcall+0x3e/0x180
|
||||
kernel_init_freeable+0x212/0x295
|
||||
kernel_init+0x9/0x100
|
||||
ret_from_fork+0x31/0x40
|
||||
|
||||
-> #0 ((pendingb_lock).lock){+.+...}:
|
||||
__lock_acquire+0x11b4/0x1320
|
||||
lock_acquire+0xac/0x240
|
||||
rt_spin_lock+0x46/0x50
|
||||
queue_work_on+0x5d/0x190
|
||||
tty_flip_buffer_push+0x26/0x30
|
||||
serial8250_rx_chars+0x120/0x1f0
|
||||
serial8250_handle_irq.part.27+0x58/0xb0
|
||||
serial8250_default_handle_irq+0x4b/0x60
|
||||
serial8250_interrupt+0x5f/0xd0
|
||||
irq_forced_thread_fn+0x1e/0x70
|
||||
irq_thread+0x137/0x1e0
|
||||
kthread+0x112/0x150
|
||||
ret_from_fork+0x31/0x40
|
||||
|
||||
other info that might help us debug this:
|
||||
|
||||
Chain exists of:
|
||||
(pendingb_lock).lock --> primary_crng.lock --> &port_lock_key
|
||||
|
||||
Possible unsafe locking scenario:
|
||||
|
||||
CPU0 CPU1
|
||||
---- ----
|
||||
lock(&port_lock_key);
|
||||
lock(primary_crng.lock);
|
||||
lock(&port_lock_key);
|
||||
lock((pendingb_lock).lock);
|
||||
|
||||
*** DEADLOCK ***
|
||||
|
||||
2 locks held by irq/4-serial/512:
|
||||
#0: (&i->lock){+.+...}, at: [<ffffffff815b0400>] serial8250_interrupt+0x30/0xd0
|
||||
#1: (&port_lock_key){+.+...}, at: [<ffffffff815b4bb6>] serial8250_handle_irq.part.27+0x16/0xb0
|
||||
|
||||
stack backtrace:
|
||||
CPU: 4 PID: 512 Comm: irq/4-serial Not tainted 4.11.3-rt0+ #101
|
||||
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.10.2-1 04/01/2014
|
||||
Call Trace:
|
||||
dump_stack+0x86/0xc1
|
||||
print_circular_bug+0x1be/0x210
|
||||
__lock_acquire+0x11b4/0x1320
|
||||
lock_acquire+0xac/0x240
|
||||
rt_spin_lock+0x46/0x50
|
||||
queue_work_on+0x5d/0x190
|
||||
tty_flip_buffer_push+0x26/0x30
|
||||
serial8250_rx_chars+0x120/0x1f0
|
||||
serial8250_handle_irq.part.27+0x58/0xb0
|
||||
serial8250_default_handle_irq+0x4b/0x60
|
||||
serial8250_interrupt+0x5f/0xd0
|
||||
irq_forced_thread_fn+0x1e/0x70
|
||||
irq_thread+0x137/0x1e0
|
||||
kthread+0x112/0x150
|
||||
ret_from_fork+0x31/0x40
|
||||
|
||||
It should work if we delay that printk after dropping the lock but we
|
||||
also could skip it.
|
||||
|
||||
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
---
|
||||
drivers/char/random.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/char/random.c
|
||||
+++ b/drivers/char/random.c
|
||||
@@ -802,7 +802,7 @@ static int crng_fast_load(const char *cp
|
||||
if (crng_init_cnt >= CRNG_INIT_CNT_THRESH) {
|
||||
crng_init = 1;
|
||||
wake_up_interruptible(&crng_init_wait);
|
||||
- pr_notice("random: fast init done\n");
|
||||
+ /* pr_notice("random: fast init done\n"); */
|
||||
}
|
||||
spin_unlock_irqrestore(&primary_crng.lock, flags);
|
||||
return 1;
|
||||
@@ -840,7 +840,7 @@ static void crng_reseed(struct crng_stat
|
||||
crng_init = 2;
|
||||
process_random_ready_list();
|
||||
wake_up_interruptible(&crng_init_wait);
|
||||
- pr_notice("random: crng init done\n");
|
||||
+ /* pr_notice("random: crng init done\n"); */
|
||||
}
|
||||
spin_unlock_irqrestore(&primary_crng.lock, flags);
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
From: Alexandre Belloni <alexandre.belloni@free-electrons.com>
|
||||
Date: Thu, 17 Mar 2016 21:09:43 +0100
|
||||
Subject: [PATCH] clockevents/drivers/timer-atmel-pit: fix double free_irq
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
clockevents_exchange_device() changes the state from detached to shutdown
|
||||
and so at that point the IRQ has not yet been requested.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Benedikt Spranger <b.spranger@linutronix.de>
|
||||
Date: Mon, 8 Mar 2010 18:57:04 +0100
|
||||
Subject: clocksource: TCLIB: Allow higher clock rates for clock events
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
As default the TCLIB uses the 32KiHz base clock rate for clock events.
|
||||
Add a compile time selection to allow higher clock resulution.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Subject: completion: Use simple wait queues
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 11 Jan 2013 11:23:51 +0100
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Completions have no long lasting callbacks and therefor do not need
|
||||
the complex waitqueue variant. Use simple waitqueues which reduces the
|
||||
|
@ -15,17 +15,16 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
include/linux/completion.h | 9 ++---
|
||||
include/linux/suspend.h | 6 +++
|
||||
include/linux/swait.h | 1
|
||||
include/linux/uprobes.h | 1
|
||||
kernel/power/hibernate.c | 7 ++++
|
||||
kernel/power/suspend.c | 5 +++
|
||||
kernel/sched/completion.c | 32 ++++++++++----------
|
||||
kernel/sched/core.c | 10 +++++-
|
||||
kernel/sched/swait.c | 20 ++++++++++++
|
||||
12 files changed, 72 insertions(+), 27 deletions(-)
|
||||
11 files changed, 71 insertions(+), 27 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c
|
||||
+++ b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c
|
||||
@@ -697,7 +697,7 @@ static void ezusb_req_ctx_wait(struct ez
|
||||
@@ -696,7 +696,7 @@ static void ezusb_req_ctx_wait(struct ez
|
||||
while (!ctx->done.done && msecs--)
|
||||
udelay(1000);
|
||||
} else {
|
||||
|
@ -36,7 +35,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
break;
|
||||
--- a/drivers/usb/gadget/function/f_fs.c
|
||||
+++ b/drivers/usb/gadget/function/f_fs.c
|
||||
@@ -1593,7 +1593,7 @@ static void ffs_data_put(struct ffs_data
|
||||
@@ -1594,7 +1594,7 @@ static void ffs_data_put(struct ffs_data
|
||||
pr_info("%s(): freeing\n", __func__);
|
||||
ffs_data_clear(ffs);
|
||||
BUG_ON(waitqueue_active(&ffs->ev.waitq) ||
|
||||
|
@ -47,7 +46,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
--- a/drivers/usb/gadget/legacy/inode.c
|
||||
+++ b/drivers/usb/gadget/legacy/inode.c
|
||||
@@ -346,7 +346,7 @@ ep_io (struct ep_data *epdata, void *buf
|
||||
@@ -345,7 +345,7 @@ ep_io (struct ep_data *epdata, void *buf
|
||||
spin_unlock_irq (&epdata->dev->lock);
|
||||
|
||||
if (likely (value == 0)) {
|
||||
|
@ -56,7 +55,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
if (value != 0) {
|
||||
spin_lock_irq (&epdata->dev->lock);
|
||||
if (likely (epdata->ep != NULL)) {
|
||||
@@ -355,7 +355,7 @@ ep_io (struct ep_data *epdata, void *buf
|
||||
@@ -354,7 +354,7 @@ ep_io (struct ep_data *epdata, void *buf
|
||||
usb_ep_dequeue (epdata->ep, epdata->req);
|
||||
spin_unlock_irq (&epdata->dev->lock);
|
||||
|
||||
|
@ -125,19 +124,9 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
extern void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait);
|
||||
extern void prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait, int state);
|
||||
--- a/include/linux/uprobes.h
|
||||
+++ b/include/linux/uprobes.h
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/types.h>
|
||||
+#include <linux/wait.h>
|
||||
|
||||
struct vm_area_struct;
|
||||
struct mm_struct;
|
||||
--- a/kernel/power/hibernate.c
|
||||
+++ b/kernel/power/hibernate.c
|
||||
@@ -683,6 +683,10 @@ static int load_image_and_restore(void)
|
||||
@@ -679,6 +679,10 @@ static int load_image_and_restore(void)
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -148,7 +137,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
/**
|
||||
* hibernate - Carry out system hibernation, including saving the image.
|
||||
*/
|
||||
@@ -696,6 +700,8 @@ int hibernate(void)
|
||||
@@ -692,6 +696,8 @@ int hibernate(void)
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
|
@ -157,7 +146,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
lock_system_sleep();
|
||||
/* The snapshot device should not be opened while we're running */
|
||||
if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
|
||||
@@ -773,6 +779,7 @@ int hibernate(void)
|
||||
@@ -769,6 +775,7 @@ int hibernate(void)
|
||||
atomic_inc(&snapshot_device_available);
|
||||
Unlock:
|
||||
unlock_system_sleep();
|
||||
|
@ -167,7 +156,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/kernel/power/suspend.c
|
||||
+++ b/kernel/power/suspend.c
|
||||
@@ -531,6 +531,8 @@ static int enter_state(suspend_state_t s
|
||||
@@ -546,6 +546,8 @@ static int enter_state(suspend_state_t s
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -176,7 +165,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
/**
|
||||
* pm_suspend - Externally visible function for suspending the system.
|
||||
* @state: System sleep state to enter.
|
||||
@@ -545,6 +547,8 @@ int pm_suspend(suspend_state_t state)
|
||||
@@ -560,6 +562,8 @@ int pm_suspend(suspend_state_t state)
|
||||
if (state <= PM_SUSPEND_ON || state >= PM_SUSPEND_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -185,7 +174,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
error = enter_state(state);
|
||||
if (error) {
|
||||
suspend_stats.fail++;
|
||||
@@ -552,6 +556,7 @@ int pm_suspend(suspend_state_t state)
|
||||
@@ -567,6 +571,7 @@ int pm_suspend(suspend_state_t state)
|
||||
} else {
|
||||
suspend_stats.success++;
|
||||
}
|
||||
|
@ -195,13 +184,14 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
EXPORT_SYMBOL(pm_suspend);
|
||||
--- a/kernel/sched/completion.c
|
||||
+++ b/kernel/sched/completion.c
|
||||
@@ -30,10 +30,10 @@ void complete(struct completion *x)
|
||||
@@ -31,11 +31,11 @@ void complete(struct completion *x)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&x->wait.lock, flags);
|
||||
+ raw_spin_lock_irqsave(&x->wait.lock, flags);
|
||||
x->done++;
|
||||
if (x->done != UINT_MAX)
|
||||
x->done++;
|
||||
- __wake_up_locked(&x->wait, TASK_NORMAL, 1);
|
||||
- spin_unlock_irqrestore(&x->wait.lock, flags);
|
||||
+ swake_up_locked(&x->wait);
|
||||
|
@ -209,13 +199,13 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
EXPORT_SYMBOL(complete);
|
||||
|
||||
@@ -50,10 +50,10 @@ void complete_all(struct completion *x)
|
||||
@@ -52,10 +52,10 @@ void complete_all(struct completion *x)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&x->wait.lock, flags);
|
||||
+ raw_spin_lock_irqsave(&x->wait.lock, flags);
|
||||
x->done += UINT_MAX/2;
|
||||
x->done = UINT_MAX;
|
||||
- __wake_up_locked(&x->wait, TASK_NORMAL, 0);
|
||||
- spin_unlock_irqrestore(&x->wait.lock, flags);
|
||||
+ swake_up_all_locked(&x->wait);
|
||||
|
@ -223,7 +213,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
EXPORT_SYMBOL(complete_all);
|
||||
|
||||
@@ -62,20 +62,20 @@ do_wait_for_common(struct completion *x,
|
||||
@@ -64,20 +64,20 @@ do_wait_for_common(struct completion *x,
|
||||
long (*action)(long), long timeout, int state)
|
||||
{
|
||||
if (!x->done) {
|
||||
|
@ -249,7 +239,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
if (!x->done)
|
||||
return timeout;
|
||||
}
|
||||
@@ -89,9 +89,9 @@ static inline long __sched
|
||||
@@ -92,9 +92,9 @@ static inline long __sched
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
|
@ -261,7 +251,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
return timeout;
|
||||
}
|
||||
|
||||
@@ -277,12 +277,12 @@ bool try_wait_for_completion(struct comp
|
||||
@@ -280,12 +280,12 @@ bool try_wait_for_completion(struct comp
|
||||
if (!READ_ONCE(x->done))
|
||||
return 0;
|
||||
|
||||
|
@ -269,14 +259,14 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
+ raw_spin_lock_irqsave(&x->wait.lock, flags);
|
||||
if (!x->done)
|
||||
ret = 0;
|
||||
else
|
||||
else if (x->done != UINT_MAX)
|
||||
x->done--;
|
||||
- spin_unlock_irqrestore(&x->wait.lock, flags);
|
||||
+ raw_spin_unlock_irqrestore(&x->wait.lock, flags);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(try_wait_for_completion);
|
||||
@@ -311,7 +311,7 @@ bool completion_done(struct completion *
|
||||
@@ -314,7 +314,7 @@ bool completion_done(struct completion *
|
||||
* after it's acquired the lock.
|
||||
*/
|
||||
smp_rmb();
|
||||
|
@ -287,9 +277,9 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
EXPORT_SYMBOL(completion_done);
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -3323,7 +3323,10 @@ void migrate_disable(void)
|
||||
@@ -7476,7 +7476,10 @@ void migrate_disable(void)
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SCHED_DEBUG
|
||||
- WARN_ON_ONCE(p->migrate_disable_atomic);
|
||||
+ if (unlikely(p->migrate_disable_atomic)) {
|
||||
|
@ -299,7 +289,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
#endif
|
||||
|
||||
if (p->migrate_disable) {
|
||||
@@ -3350,7 +3353,10 @@ void migrate_enable(void)
|
||||
@@ -7509,7 +7512,10 @@ void migrate_enable(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SCHED_DEBUG
|
||||
|
@ -309,12 +299,12 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
+ WARN_ON_ONCE(1);
|
||||
+ }
|
||||
#endif
|
||||
WARN_ON_ONCE(p->migrate_disable <= 0);
|
||||
|
||||
WARN_ON_ONCE(p->migrate_disable <= 0);
|
||||
--- a/kernel/sched/swait.c
|
||||
+++ b/kernel/sched/swait.c
|
||||
@@ -1,5 +1,6 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/swait.h>
|
||||
+#include <linux/suspend.h>
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Subject: sched: Use the proper LOCK_OFFSET for cond_resched()
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sun, 17 Jul 2011 22:51:33 +0200
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
RT does not increment preempt count when a 'sleeping' spinlock is
|
||||
locked. Update PREEMPT_LOCK_OFFSET for that case.
|
||||
|
@ -13,7 +13,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/include/linux/preempt.h
|
||||
+++ b/include/linux/preempt.h
|
||||
@@ -91,7 +91,11 @@
|
||||
@@ -117,7 +117,11 @@
|
||||
/*
|
||||
* The preempt_count offset after spin_lock()
|
||||
*/
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Subject: sched: Take RT softirq semantics into account in cond_resched()
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Jul 2011 09:56:44 +0200
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The softirq semantics work different on -RT. There is no SOFTIRQ_MASK in
|
||||
the preemption counter which leads to the BUG_ON() statement in
|
||||
|
@ -16,7 +16,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -3373,12 +3373,16 @@ extern int __cond_resched_lock(spinlock_
|
||||
@@ -1514,12 +1514,16 @@ extern int __cond_resched_lock(spinlock_
|
||||
__cond_resched_lock(lock); \
|
||||
})
|
||||
|
||||
|
@ -35,7 +35,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
{
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -5092,6 +5092,7 @@ int __cond_resched_lock(spinlock_t *lock
|
||||
@@ -5096,6 +5096,7 @@ int __cond_resched_lock(spinlock_t *lock
|
||||
}
|
||||
EXPORT_SYMBOL(__cond_resched_lock);
|
||||
|
||||
|
@ -43,7 +43,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
int __sched __cond_resched_softirq(void)
|
||||
{
|
||||
BUG_ON(!in_softirq());
|
||||
@@ -5105,6 +5106,7 @@ int __sched __cond_resched_softirq(void)
|
||||
@@ -5109,6 +5110,7 @@ int __sched __cond_resched_softirq(void)
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(__cond_resched_softirq);
|
||||
|
|
|
@ -2,7 +2,7 @@ From: Mike Galbraith <umgwanakikbuti@gmail.com>
|
|||
Date: Sun, 16 Oct 2016 05:11:54 +0200
|
||||
Subject: [PATCH] connector/cn_proc: Protect send_msg() with a local lock
|
||||
on RT
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:931
|
||||
|in_atomic(): 1, irqs_disabled(): 0, pid: 31807, name: sleep
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Steven Rostedt <rostedt@goodmis.org>
|
||||
Date: Thu, 5 Dec 2013 09:16:52 -0500
|
||||
Subject: cpu hotplug: Document why PREEMPT_RT uses a spinlock
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
The patch:
|
||||
|
||||
|
@ -39,7 +39,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|||
|
||||
--- a/kernel/cpu.c
|
||||
+++ b/kernel/cpu.c
|
||||
@@ -260,6 +260,14 @@ struct hotplug_pcp {
|
||||
@@ -255,6 +255,14 @@ struct hotplug_pcp {
|
||||
int grab_lock;
|
||||
struct completion synced;
|
||||
#ifdef CONFIG_PREEMPT_RT_FULL
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Subject: cpu: Make hotplug.lock a "sleeping" spinlock on RT
|
||||
From: Steven Rostedt <rostedt@goodmis.org>
|
||||
Date: Fri, 02 Mar 2012 10:36:57 -0500
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Tasks can block on hotplug.lock in pin_current_cpu(), but their state
|
||||
might be != RUNNING. So the mutex wakeup will set the state
|
||||
|
@ -25,7 +25,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/kernel/cpu.c
|
||||
+++ b/kernel/cpu.c
|
||||
@@ -210,10 +210,16 @@ static int cpu_hotplug_disabled;
|
||||
@@ -205,10 +205,16 @@ static int cpu_hotplug_disabled;
|
||||
|
||||
static struct {
|
||||
struct task_struct *active_writer;
|
||||
|
@ -42,7 +42,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
/*
|
||||
* Also blocks the new readers during
|
||||
* an ongoing cpu hotplug operation.
|
||||
@@ -226,12 +232,24 @@ static struct {
|
||||
@@ -221,12 +227,24 @@ static struct {
|
||||
} cpu_hotplug = {
|
||||
.active_writer = NULL,
|
||||
.wq = __WAIT_QUEUE_HEAD_INITIALIZER(cpu_hotplug.wq),
|
||||
|
@ -67,7 +67,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
/* Lockdep annotations for get/put_online_cpus() and cpu_hotplug_begin/end() */
|
||||
#define cpuhp_lock_acquire_read() lock_map_acquire_read(&cpu_hotplug.dep_map)
|
||||
#define cpuhp_lock_acquire_tryread() \
|
||||
@@ -268,8 +286,8 @@ void pin_current_cpu(void)
|
||||
@@ -263,8 +281,8 @@ void pin_current_cpu(void)
|
||||
return;
|
||||
}
|
||||
preempt_enable();
|
||||
|
@ -78,7 +78,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
preempt_disable();
|
||||
goto retry;
|
||||
}
|
||||
@@ -342,9 +360,9 @@ void get_online_cpus(void)
|
||||
@@ -337,9 +355,9 @@ void get_online_cpus(void)
|
||||
if (cpu_hotplug.active_writer == current)
|
||||
return;
|
||||
cpuhp_lock_acquire_read();
|
||||
|
@ -90,7 +90,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(get_online_cpus);
|
||||
|
||||
@@ -397,11 +415,11 @@ void cpu_hotplug_begin(void)
|
||||
@@ -392,11 +410,11 @@ void cpu_hotplug_begin(void)
|
||||
cpuhp_lock_acquire();
|
||||
|
||||
for (;;) {
|
||||
|
@ -104,7 +104,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
schedule();
|
||||
}
|
||||
finish_wait(&cpu_hotplug.wq, &wait);
|
||||
@@ -410,7 +428,7 @@ void cpu_hotplug_begin(void)
|
||||
@@ -405,7 +423,7 @@ void cpu_hotplug_begin(void)
|
||||
void cpu_hotplug_done(void)
|
||||
{
|
||||
cpu_hotplug.active_writer = NULL;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From: Steven Rostedt <srostedt@redhat.com>
|
||||
Date: Mon, 16 Jul 2012 08:07:43 +0000
|
||||
Subject: cpu/rt: Rework cpu down for PREEMPT_RT
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patches-4.9.30-rt20.tar.xz
|
||||
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.11/older/patches-4.11.5-rt1.tar.xz
|
||||
|
||||
Bringing a CPU down is a pain with the PREEMPT_RT kernel because
|
||||
tasks can be preempted in many more places than in non-RT. In
|
||||
|
@ -57,18 +57,18 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -2480,6 +2480,10 @@ extern void do_set_cpus_allowed(struct t
|
||||
|
||||
extern int set_cpus_allowed_ptr(struct task_struct *p,
|
||||
const struct cpumask *new_mask);
|
||||
@@ -1346,6 +1346,10 @@ extern int task_can_attach(struct task_s
|
||||
#ifdef CONFIG_SMP
|
||||
extern void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask);
|
||||
extern int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask);
|
||||
+int migrate_me(void);
|
||||
+void tell_sched_cpu_down_begin(int cpu);
|
||||
+void tell_sched_cpu_down_done(int cpu);
|
||||
+
|
||||
#else
|
||||
static inline void do_set_cpus_allowed(struct task_struct *p,
|
||||
const struct cpumask *new_mask)
|
||||
@@ -2492,6 +2496,9 @@ static inline int set_cpus_allowed_ptr(s
|
||||
static inline void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask)
|
||||
{
|
||||
@@ -1356,6 +1360,9 @@ static inline int set_cpus_allowed_ptr(s
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
@ -77,10 +77,10 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
+static inline void tell_sched_cpu_down_done(int cpu) { }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NO_HZ_COMMON
|
||||
#ifndef cpu_relax_yield
|
||||
--- a/kernel/cpu.c
|
||||
+++ b/kernel/cpu.c
|
||||
@@ -210,16 +210,10 @@ static int cpu_hotplug_disabled;
|
||||
@@ -205,16 +205,10 @@ static int cpu_hotplug_disabled;
|
||||
|
||||
static struct {
|
||||
struct task_struct *active_writer;
|
||||
|
@ -97,7 +97,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
/*
|
||||
* Also blocks the new readers during
|
||||
* an ongoing cpu hotplug operation.
|
||||
@@ -232,24 +226,12 @@ static struct {
|
||||
@@ -227,24 +221,12 @@ static struct {
|
||||
} cpu_hotplug = {
|
||||
.active_writer = NULL,
|
||||
.wq = __WAIT_QUEUE_HEAD_INITIALIZER(cpu_hotplug.wq),
|
||||
|
@ -122,7 +122,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
/* Lockdep annotations for get/put_online_cpus() and cpu_hotplug_begin/end() */
|
||||
#define cpuhp_lock_acquire_read() lock_map_acquire_read(&cpu_hotplug.dep_map)
|
||||
#define cpuhp_lock_acquire_tryread() \
|
||||
@@ -257,12 +239,42 @@ static struct {
|
||||
@@ -252,12 +234,42 @@ static struct {
|
||||
#define cpuhp_lock_acquire() lock_map_acquire(&cpu_hotplug.dep_map)
|
||||
#define cpuhp_lock_release() lock_map_release(&cpu_hotplug.dep_map)
|
||||
|
||||
|
@ -165,7 +165,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
static DEFINE_PER_CPU(struct hotplug_pcp, hotplug_pcp);
|
||||
|
||||
/**
|
||||
@@ -276,18 +288,39 @@ static DEFINE_PER_CPU(struct hotplug_pcp
|
||||
@@ -271,18 +283,39 @@ static DEFINE_PER_CPU(struct hotplug_pcp
|
||||
void pin_current_cpu(void)
|
||||
{
|
||||
struct hotplug_pcp *hp;
|
||||
|
@ -209,7 +209,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
preempt_disable();
|
||||
goto retry;
|
||||
}
|
||||
@@ -308,26 +341,84 @@ void unpin_current_cpu(void)
|
||||
@@ -303,26 +336,84 @@ void unpin_current_cpu(void)
|
||||
wake_up_process(hp->unplug);
|
||||
}
|
||||
|
||||
|
@ -301,7 +301,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
/*
|
||||
* Start the sync_unplug_thread on the target cpu and wait for it to
|
||||
* complete.
|
||||
@@ -335,23 +426,83 @@ static int sync_unplug_thread(void *data
|
||||
@@ -330,23 +421,83 @@ static int sync_unplug_thread(void *data
|
||||
static int cpu_unplug_begin(unsigned int cpu)
|
||||
{
|
||||
struct hotplug_pcp *hp = &per_cpu(hotplug_pcp, cpu);
|
||||
|
@ -392,7 +392,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
|
||||
void get_online_cpus(void)
|
||||
@@ -360,9 +511,9 @@ void get_online_cpus(void)
|
||||
@@ -355,9 +506,9 @@ void get_online_cpus(void)
|
||||
if (cpu_hotplug.active_writer == current)
|
||||
return;
|
||||
cpuhp_lock_acquire_read();
|
||||
|
@ -404,7 +404,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(get_online_cpus);
|
||||
|
||||
@@ -415,11 +566,11 @@ void cpu_hotplug_begin(void)
|
||||
@@ -410,11 +561,11 @@ void cpu_hotplug_begin(void)
|
||||
cpuhp_lock_acquire();
|
||||
|
||||
for (;;) {
|
||||
|
@ -418,7 +418,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
schedule();
|
||||
}
|
||||
finish_wait(&cpu_hotplug.wq, &wait);
|
||||
@@ -428,7 +579,7 @@ void cpu_hotplug_begin(void)
|
||||
@@ -423,7 +574,7 @@ void cpu_hotplug_begin(void)
|
||||
void cpu_hotplug_done(void)
|
||||
{
|
||||
cpu_hotplug.active_writer = NULL;
|
||||
|
@ -427,7 +427,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
cpuhp_lock_release();
|
||||
}
|
||||
|
||||
@@ -907,6 +1058,9 @@ static int takedown_cpu(unsigned int cpu
|
||||
@@ -806,6 +957,9 @@ static int takedown_cpu(unsigned int cpu
|
||||
kthread_park(per_cpu_ptr(&cpuhp_state, cpu)->thread);
|
||||
smpboot_park_threads(cpu);
|
||||
|
||||
|
@ -439,8 +439,8 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
* interrupt affinities.
|
||||
--- a/kernel/sched/core.c
|
||||
+++ b/kernel/sched/core.c
|
||||
@@ -1140,6 +1140,84 @@ void do_set_cpus_allowed(struct task_str
|
||||
set_curr_task(rq, p);
|
||||
@@ -1111,6 +1111,84 @@ void do_set_cpus_allowed(struct task_str
|
||||
__do_set_cpus_allowed_tail(p, new_mask);
|
||||
}
|
||||
|
||||
+static DEFINE_PER_CPU(struct cpumask, sched_cpumasks);
|
||||
|
@ -480,7 +480,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
+ struct task_struct *p = current;
|
||||
+ struct migration_arg arg;
|
||||
+ struct cpumask *cpumask;
|
||||
+ struct cpumask *mask;
|
||||
+ const struct cpumask *mask;
|
||||
+ unsigned int dest_cpu;
|
||||
+ struct rq_flags rf;
|
||||
+ struct rq *rq;
|
||||
|
@ -496,7 +496,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
+ rq = task_rq_lock(p, &rf);
|
||||
+
|
||||
+ cpumask = this_cpu_ptr(&sched_cpumasks);
|
||||
+ mask = &p->cpus_allowed;
|
||||
+ mask = p->cpus_ptr;
|
||||
+
|
||||
+ cpumask_andnot(cpumask, mask, &sched_down_cpumask);
|
||||
+
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue