Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
3.8: add (disabled) preempt-rt patchset, minus cpsw changes
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
- Loading branch information
Showing
291 changed files
with
34,307 additions
and
0 deletions.
There are no files selected for viewing
40 changes: 40 additions & 0 deletions
40
patches/preempt-rt/0001-FIX-1-2-slub-Do-not-dereference-NULL-pointer-in-node.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
From daf624096864b243c5ecd4bb700b409b77007636 Mon Sep 17 00:00:00 2001 | ||
From: Christoph Lameter <cl@linux.com> | ||
Date: Wed, 23 Jan 2013 21:45:47 +0000 | ||
Subject: [PATCH 001/291] FIX [1/2] slub: Do not dereference NULL pointer in | ||
node_match | ||
|
||
The variables accessed in slab_alloc are volatile and therefore | ||
the page pointer passed to node_match can be NULL. The processing | ||
of data in slab_alloc is tentative until either the cmpxhchg | ||
succeeds or the __slab_alloc slowpath is invoked. Both are | ||
able to perform the same allocation from the freelist. | ||
|
||
Check for the NULL pointer in node_match. | ||
|
||
A false positive will lead to a retry of the loop in __slab_alloc. | ||
|
||
Signed-off-by: Christoph Lameter <cl@linux.com> | ||
Cc: Steven Rostedt <rostedt@goodmis.org> | ||
Cc: Pekka Enberg <penberg@kernel.org> | ||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | ||
--- | ||
mm/slub.c | 2 +- | ||
1 file changed, 1 insertion(+), 1 deletion(-) | ||
|
||
diff --git a/mm/slub.c b/mm/slub.c | ||
index ba2ca53..0f270db 100644 | ||
--- a/mm/slub.c | ||
+++ b/mm/slub.c | ||
@@ -2041,7 +2041,7 @@ static void flush_all(struct kmem_cache *s) | ||
static inline int node_match(struct page *page, int node) | ||
{ | ||
#ifdef CONFIG_NUMA | ||
- if (node != NUMA_NO_NODE && page_to_nid(page) != node) | ||
+ if (!page || (node != NUMA_NO_NODE && page_to_nid(page) != node)) | ||
return 0; | ||
#endif | ||
return 1; | ||
-- | ||
1.8.1.4 | ||
|
71 changes: 71 additions & 0 deletions
71
patches/preempt-rt/0002-FIX-2-2-slub-Tid-must-be-retrieved-from-the-percpu-a.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
From e54a5937d225452ba5e9d8fe81d7fea417d7b814 Mon Sep 17 00:00:00 2001 | ||
From: Christoph Lameter <cl@linux.com> | ||
Date: Wed, 23 Jan 2013 21:45:48 +0000 | ||
Subject: [PATCH 002/291] FIX [2/2] slub: Tid must be retrieved from the percpu | ||
area of the current processor | ||
|
||
As Steven Rostedt has pointer out: Rescheduling could occur on a differnet processor | ||
after the determination of the per cpu pointer and before the tid is retrieved. | ||
This could result in allocation from the wrong node in slab_alloc. | ||
|
||
The effect is much more severe in slab_free() where we could free to the freelist | ||
of the wrong page. | ||
|
||
The window for something like that occurring is pretty small but it is possible. | ||
|
||
Signed-off-by: Christoph Lameter <cl@linux.com> | ||
Cc: Steven Rostedt <rostedt@goodmis.org> | ||
Cc: Pekka Enberg <penberg@kernel.org> | ||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | ||
--- | ||
mm/slub.c | 15 ++++++++------- | ||
1 file changed, 8 insertions(+), 7 deletions(-) | ||
|
||
diff --git a/mm/slub.c b/mm/slub.c | ||
index 0f270db..3d2308f 100644 | ||
--- a/mm/slub.c | ||
+++ b/mm/slub.c | ||
@@ -2331,13 +2331,13 @@ static __always_inline void *slab_alloc_node(struct kmem_cache *s, | ||
|
||
s = memcg_kmem_get_cache(s, gfpflags); | ||
redo: | ||
- | ||
/* | ||
- * Must read kmem_cache cpu data via this cpu ptr. Preemption is | ||
- * enabled. We may switch back and forth between cpus while | ||
- * reading from one cpu area. That does not matter as long | ||
- * as we end up on the original cpu again when doing the cmpxchg. | ||
+ * Preemption is disabled for the retrieval of the tid because that | ||
+ * must occur from the current processor. We cannot allow rescheduling | ||
+ * on a different processor between the determination of the pointer | ||
+ * and the retrieval of the tid. | ||
*/ | ||
+ preempt_disable(); | ||
c = __this_cpu_ptr(s->cpu_slab); | ||
|
||
/* | ||
@@ -2347,7 +2347,7 @@ redo: | ||
* linked list in between. | ||
*/ | ||
tid = c->tid; | ||
- barrier(); | ||
+ preempt_enable(); | ||
|
||
object = c->freelist; | ||
page = c->page; | ||
@@ -2594,10 +2594,11 @@ redo: | ||
* data is retrieved via this pointer. If we are on the same cpu | ||
* during the cmpxchg then the free will succedd. | ||
*/ | ||
+ preempt_disable(); | ||
c = __this_cpu_ptr(s->cpu_slab); | ||
|
||
tid = c->tid; | ||
- barrier(); | ||
+ preempt_enable(); | ||
|
||
if (likely(page == c->page)) { | ||
set_freepointer(s, object, c->freelist); | ||
-- | ||
1.8.1.4 | ||
|
41 changes: 41 additions & 0 deletions
41
patches/preempt-rt/0003-printk-Fix-rq-lock-vs-logbuf_lock-unlock-lock-invers.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
From 2283ae19442d594f517a6bee3febe9ac2c46331d Mon Sep 17 00:00:00 2001 | ||
From: "Bu, Yitian" <ybu@qti.qualcomm.com> | ||
Date: Mon, 18 Feb 2013 12:53:37 +0000 | ||
Subject: [PATCH 003/291] printk: Fix rq->lock vs logbuf_lock unlock lock | ||
inversion | ||
|
||
commit 07354eb1a74d1 ("locking printk: Annotate logbuf_lock as raw") | ||
reintroduced a lock inversion problem which was fixed in commit | ||
0b5e1c5255 ("printk: Release console_sem after logbuf_lock"). This | ||
happened probably when fixing up patch rejects. | ||
|
||
Restore the ordering and unlock logbuf_lock before releasing | ||
console_sem. | ||
|
||
Signed-off-by: ybu <ybu@qti.qualcomm.com> | ||
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> | ||
Cc: stable@vger.kernel.org | ||
Link: http://lkml.kernel.org/r/E807E903FE6CBE4D95E420FBFCC273B827413C@nasanexd01h.na.qualcomm.com | ||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | ||
--- | ||
kernel/printk.c | 2 +- | ||
1 file changed, 1 insertion(+), 1 deletion(-) | ||
|
||
diff --git a/kernel/printk.c b/kernel/printk.c | ||
index 0ca8ffe..725c85e 100644 | ||
--- a/kernel/printk.c | ||
+++ b/kernel/printk.c | ||
@@ -1358,9 +1358,9 @@ static int console_trylock_for_printk(unsigned int cpu) | ||
} | ||
} | ||
logbuf_cpu = UINT_MAX; | ||
+ raw_spin_unlock(&logbuf_lock); | ||
if (wake) | ||
up(&console_sem); | ||
- raw_spin_unlock(&logbuf_lock); | ||
return retval; | ||
} | ||
|
||
-- | ||
1.8.1.4 | ||
|
74 changes: 74 additions & 0 deletions
74
patches/preempt-rt/0004-genirq-Add-default-affinity-mask-command-line-option.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
From 1212bd789f06f71d86b0666e28f59c8a2f3be9b5 Mon Sep 17 00:00:00 2001 | ||
From: Thomas Gleixner <tglx@linutronix.de> | ||
Date: Fri, 25 May 2012 16:59:47 +0200 | ||
Subject: [PATCH 004/291] genirq: Add default affinity mask command line option | ||
|
||
If we isolate CPUs, then we don't want random device interrupts on | ||
them. Even w/o the user space irq balancer enabled we can end up with | ||
irqs on non boot cpus. | ||
|
||
Allow to restrict the default irq affinity mask. | ||
|
||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | ||
--- | ||
Documentation/kernel-parameters.txt | 9 +++++++++ | ||
kernel/irq/irqdesc.c | 21 +++++++++++++++++++-- | ||
2 files changed, 28 insertions(+), 2 deletions(-) | ||
|
||
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt | ||
index 986614d..1ba0afe 100644 | ||
--- a/Documentation/kernel-parameters.txt | ||
+++ b/Documentation/kernel-parameters.txt | ||
@@ -1182,6 +1182,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | ||
See comment before ip2_setup() in | ||
drivers/char/ip2/ip2base.c. | ||
|
||
+ irqaffinity= [SMP] Set the default irq affinity mask | ||
+ Format: | ||
+ <cpu number>,...,<cpu number> | ||
+ or | ||
+ <cpu number>-<cpu number> | ||
+ (must be a positive range in ascending order) | ||
+ or a mixture | ||
+ <cpu number>,...,<cpu number>-<cpu number> | ||
+ | ||
irqfixup [HW] | ||
When an interrupt is not handled search all handlers | ||
for it. Intended to get systems with badly broken | ||
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c | ||
index 192a302..473b2b6 100644 | ||
--- a/kernel/irq/irqdesc.c | ||
+++ b/kernel/irq/irqdesc.c | ||
@@ -23,10 +23,27 @@ | ||
static struct lock_class_key irq_desc_lock_class; | ||
|
||
#if defined(CONFIG_SMP) | ||
+static int __init irq_affinity_setup(char *str) | ||
+{ | ||
+ zalloc_cpumask_var(&irq_default_affinity, GFP_NOWAIT); | ||
+ cpulist_parse(str, irq_default_affinity); | ||
+ /* | ||
+ * Set at least the boot cpu. We don't want to end up with | ||
+ * bugreports caused by random comandline masks | ||
+ */ | ||
+ cpumask_set_cpu(smp_processor_id(), irq_default_affinity); | ||
+ return 1; | ||
+} | ||
+__setup("irqaffinity=", irq_affinity_setup); | ||
+ | ||
static void __init init_irq_default_affinity(void) | ||
{ | ||
- alloc_cpumask_var(&irq_default_affinity, GFP_NOWAIT); | ||
- cpumask_setall(irq_default_affinity); | ||
+#ifdef CONFIG_CPUMASK_OFFSTACK | ||
+ if (!irq_default_affinity) | ||
+ zalloc_cpumask_var(&irq_default_affinity, GFP_NOWAIT); | ||
+#endif | ||
+ if (cpumask_empty(irq_default_affinity)) | ||
+ cpumask_setall(irq_default_affinity); | ||
} | ||
#else | ||
static void __init init_irq_default_affinity(void) | ||
-- | ||
1.8.1.4 | ||
|
Oops, something went wrong.