summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Gortmaker <paul.gortmaker@windriver.com>2013-04-05 18:54:55 -0400
committerPaul Gortmaker <paul.gortmaker@windriver.com>2013-04-05 18:54:55 -0400
commitbd1969578d5d1636501d100b2251c65718aa03be (patch)
tree643be12b4d9f47690d9a93fcf282348aade39516
parent2ea0c1b15819d8a162c1a52d93d69776ea1e5265 (diff)
download3.8-rt-patches-bd1969578d5d1636501d100b2251c65718aa03be.tar.gz
patches-3.8.4-rt2.tar.xzv3.8.4-rt2
md5sum: 5f2ea9060211d969ee2b18c397b5c610 patches-3.8.4-rt2.tar.xz Announce: ---------------- Dear RT Folks, I'm pleased to announce the 3.8.4-rt2 release. changes since v3.8.4-rt1: - build fix for i915 (reported by "Luis Claudio R. Goncalves") - build fix for fscache (reported by tglx) - build fix for !RT (kernel/softirq.c did not compile) - per-cpu rwsem fixed for RT (required only by uprobes so far) - slub: delay the execution of the ->ctor() hook for newly created objects. This lowers the worst case latencies. Known issues: - SLxB is broken on PowerPC. The delta patch against v3.8.4-rt1 is appended below and can be found here: https://www.kernel.org/pub/linux/kernel/projects/rt/3.8/incr/patch-3.8.4-rt1-rt2.patch.xz The RT patch against 3.8.4 can be found here: https://www.kernel.org/pub/linux/kernel/projects/rt/3.8/patch-3.8.4-rt2.patch.xz The split quilt queue is available at: https://www.kernel.org/pub/linux/kernel/projects/rt/3.8/patches-3.8.4-rt2.tar.xz Sebastian ---------------- http://marc.info/?l=linux-rt-users&m=136432904720493&w=2 Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
-rw-r--r--patches/fscache_compile_fix.patch34
-rw-r--r--patches/i915_compile_fix.patch48
-rw-r--r--patches/localversion.patch2
-rw-r--r--patches/percpu-rwsem-compilefix.patch19
-rw-r--r--patches/rt-add-rt-locks.patch2
-rw-r--r--patches/rwsem-add-rt-variant.patch24
-rw-r--r--patches/series4
-rw-r--r--patches/slub_delay_ctor_on_rt.patch31
-rw-r--r--patches/softirq-split-locks.patch19
9 files changed, 162 insertions, 21 deletions
diff --git a/patches/fscache_compile_fix.patch b/patches/fscache_compile_fix.patch
new file mode 100644
index 0000000..7cf833c
--- /dev/null
+++ b/patches/fscache_compile_fix.patch
@@ -0,0 +1,34 @@
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Subject: fs/fscache: done merge spin_lock() in while()
+
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+--- a/fs/fscache/page.c
++++ b/fs/fscache/page.c
+@@ -796,11 +796,13 @@ void fscache_invalidate_writes(struct fs
+
+ _enter("");
+
+- while (spin_lock(&cookie->stores_lock),
+- n = radix_tree_gang_lookup_tag(&cookie->stores, results, 0,
+- ARRAY_SIZE(results),
+- FSCACHE_COOKIE_PENDING_TAG),
+- n > 0) {
++ do {
++ spin_lock(&cookie->stores_lock);
++ n = radix_tree_gang_lookup_tag(&cookie->stores, results, 0,
++ ARRAY_SIZE(results),
++ FSCACHE_COOKIE_PENDING_TAG);
++ if (n == 0)
++ break;
+ for (i = n - 1; i >= 0; i--) {
+ page = results[i];
+ radix_tree_delete(&cookie->stores, page->index);
+@@ -810,7 +812,7 @@ void fscache_invalidate_writes(struct fs
+
+ for (i = n - 1; i >= 0; i--)
+ page_cache_release(results[i]);
+- }
++ } while (1);
+
+ spin_unlock(&cookie->stores_lock);
+ _leave("");
diff --git a/patches/i915_compile_fix.patch b/patches/i915_compile_fix.patch
new file mode 100644
index 0000000..0b20079
--- /dev/null
+++ b/patches/i915_compile_fix.patch
@@ -0,0 +1,48 @@
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Subject: gpu/i915: don't open code these things
+
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+--- a/drivers/gpu/drm/i915/i915_gem.c
++++ b/drivers/gpu/drm/i915/i915_gem.c
+@@ -91,7 +91,6 @@ i915_gem_wait_for_error(struct drm_devic
+ {
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ struct completion *x = &dev_priv->error_completion;
+- unsigned long flags;
+ int ret;
+
+ if (!atomic_read(&dev_priv->mm.wedged))
+@@ -116,9 +115,7 @@ i915_gem_wait_for_error(struct drm_devic
+ * end up waiting upon a subsequent completion event that
+ * will never happen.
+ */
+- spin_lock_irqsave(&x->wait.lock, flags);
+- x->done++;
+- spin_unlock_irqrestore(&x->wait.lock, flags);
++ complete(x);
+ }
+ return 0;
+ }
+@@ -946,12 +943,9 @@ i915_gem_check_wedge(struct drm_i915_pri
+ if (atomic_read(&dev_priv->mm.wedged)) {
+ struct completion *x = &dev_priv->error_completion;
+ bool recovery_complete;
+- unsigned long flags;
+
+ /* Give the error handler a chance to run. */
+- spin_lock_irqsave(&x->wait.lock, flags);
+- recovery_complete = x->done > 0;
+- spin_unlock_irqrestore(&x->wait.lock, flags);
++ recovery_complete = completion_done(x);
+
+ /* Non-interruptible callers can't handle -EAGAIN, hence return
+ * -EIO unconditionally for these. */
+@@ -4366,7 +4360,7 @@ static bool mutex_is_locked_by(struct mu
+ if (!mutex_is_locked(mutex))
+ return false;
+
+-#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_MUTEXES)
++#if (defined(CONFIG_SMP) || defined(CONFIG_DEBUG_MUTEXES)) && !defined(CONFIG_PREEMPT_RT_BASE)
+ return mutex->owner == task;
+ #else
+ /* Since UP may be pre-empted, we cannot assume that we own the lock */
diff --git a/patches/localversion.patch b/patches/localversion.patch
index 56edefb..2f31c4f 100644
--- a/patches/localversion.patch
+++ b/patches/localversion.patch
@@ -12,4 +12,4 @@ Link: http://lkml.kernel.org/n/tip-8vdw4bfcsds27cvox6rpb334@git.kernel.org
--- /dev/null
+++ b/localversion-rt
@@ -0,0 +1 @@
-+-rt1
++-rt2
diff --git a/patches/percpu-rwsem-compilefix.patch b/patches/percpu-rwsem-compilefix.patch
new file mode 100644
index 0000000..d6f1fd8
--- /dev/null
+++ b/patches/percpu-rwsem-compilefix.patch
@@ -0,0 +1,19 @@
+---
+ lib/percpu-rwsem.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/lib/percpu-rwsem.c
++++ b/lib/percpu-rwsem.c
+@@ -84,8 +84,12 @@ void percpu_down_read(struct percpu_rw_s
+
+ down_read(&brw->rw_sem);
+ atomic_inc(&brw->slow_read_ctr);
++#ifdef CONFIG_PREEMPT_RT_FULL
++ up_read(&brw->rw_sem);
++#else
+ /* avoid up_read()->rwsem_release() */
+ __up_read(&brw->rw_sem);
++#endif
+ }
+
+ void percpu_up_read(struct percpu_rw_semaphore *brw)
diff --git a/patches/rt-add-rt-locks.patch b/patches/rt-add-rt-locks.patch
index 072cd99..1cad15e 100644
--- a/patches/rt-add-rt-locks.patch
+++ b/patches/rt-add-rt-locks.patch
@@ -790,7 +790,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+}
+EXPORT_SYMBOL(rt_down_read_nested);
+
-+void __rt_rwsem_init(struct rw_semaphore *rwsem, char *name,
++void __rt_rwsem_init(struct rw_semaphore *rwsem, const char *name,
+ struct lock_class_key *key)
+{
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
diff --git a/patches/rwsem-add-rt-variant.patch b/patches/rwsem-add-rt-variant.patch
index 04e16dc..79c0dfb 100644
--- a/patches/rwsem-add-rt-variant.patch
+++ b/patches/rwsem-add-rt-variant.patch
@@ -5,9 +5,9 @@ Date: Wed, 29 Jun 2011 21:02:53 +0200
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/rwsem.h | 6 ++
- include/linux/rwsem_rt.h | 121 +++++++++++++++++++++++++++++++++++++++++++++++
+ include/linux/rwsem_rt.h | 128 +++++++++++++++++++++++++++++++++++++++++++++++
lib/Makefile | 3 +
- 3 files changed, 130 insertions(+)
+ 3 files changed, 137 insertions(+)
--- a/include/linux/rwsem.h
+++ b/include/linux/rwsem.h
@@ -31,7 +31,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
#endif /* _LINUX_RWSEM_H */
--- /dev/null
+++ b/include/linux/rwsem_rt.h
-@@ -0,0 +1,121 @@
+@@ -0,0 +1,128 @@
+#ifndef _LINUX_RWSEM_RT_H
+#define _LINUX_RWSEM_RT_H
+
@@ -67,15 +67,22 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+#define DECLARE_RWSEM(lockname) \
+ struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname)
+
-+extern void __rt_rwsem_init(struct rw_semaphore *rwsem, char *name,
++extern void __rt_rwsem_init(struct rw_semaphore *rwsem, const char *name,
+ struct lock_class_key *key);
+
++#define __rt_init_rwsem(sem, name, key) \
++ do { \
++ rt_mutex_init(&(sem)->lock); \
++ __rt_rwsem_init((sem), (name), (key));\
++ } while (0)
++
++#define __init_rwsem(sem, name, key) __rt_init_rwsem(sem, name, key)
++
+# define rt_init_rwsem(sem) \
+do { \
+ static struct lock_class_key __key; \
+ \
-+ rt_mutex_init(&(sem)->lock); \
-+ __rt_rwsem_init((sem), #sem, &__key); \
++ __rt_init_rwsem((sem), #sem, &__key); \
+} while (0)
+
+extern void rt_down_write(struct rw_semaphore *rwsem);
@@ -155,7 +162,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+#endif
--- a/lib/Makefile
+++ b/lib/Makefile
-@@ -38,9 +38,12 @@ obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o
+@@ -38,8 +38,11 @@ obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o
obj-$(CONFIG_CHECK_SIGNATURE) += check_signature.o
obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o
obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o
@@ -163,8 +170,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+ifneq ($(CONFIG_PREEMPT_RT_FULL),y)
lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
- lib-$(CONFIG_PERCPU_RWSEM) += percpu-rwsem.o
+endif
+ lib-$(CONFIG_PERCPU_RWSEM) += percpu-rwsem.o
CFLAGS_hweight.o = $(subst $(quote),,$(CONFIG_ARCH_HWEIGHT_CFLAGS))
- obj-$(CONFIG_GENERIC_HWEIGHT) += hweight.o
diff --git a/patches/series b/patches/series
index 068b68b..b72d275 100644
--- a/patches/series
+++ b/patches/series
@@ -398,6 +398,7 @@ rt-add-rt-spinlock-to-headers.patch
rt-add-rt-to-mutex-headers.patch
rwsem-add-rt-variant.patch
rt-add-rt-locks.patch
+percpu-rwsem-compilefix.patch
# RTMUTEX Fallout
tasklist-lock-fix-section-conflict.patch
@@ -580,6 +581,8 @@ powerpc-fsl-msi-use-a-different-locklcass-for-the-ca.patch
i2c-omap-drop-the-lock-hard-irq-context.patch
spi-omap-mcspi-check-condition-also-after-timeout.patch
HACK-printk-drop-the-logbuf_lock-more-often.patch
+fscache_compile_fix.patch
+i915_compile_fix.patch
# Enable full RT
powerpc-preempt-lazy-support.patch
@@ -594,6 +597,7 @@ block-use-cpu-chill.patch
mm-bounce-local-irq-save-nort.patch
mmci-remove-bogus-irq-save.patch
slub-enable-irqs-for-no-wait.patch
+slub_delay_ctor_on_rt.patch
idle-state.patch
might-sleep-check-for-idle.patch
wait-simple-rework-for-completions.patch
diff --git a/patches/slub_delay_ctor_on_rt.patch b/patches/slub_delay_ctor_on_rt.patch
new file mode 100644
index 0000000..1b6a420
--- /dev/null
+++ b/patches/slub_delay_ctor_on_rt.patch
@@ -0,0 +1,31 @@
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Subject: slub: delay ctor until the object is requested
+
+It seems that allocation of plenty objects causes latency on ARM since that
+code can not be preempted
+
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+--- a/mm/slub.c
++++ b/mm/slub.c
+@@ -1346,8 +1346,10 @@ static void setup_object(struct kmem_cac
+ void *object)
+ {
+ setup_object_debug(s, page, object);
++#ifndef CONFIG_PREEMPT_RT_FULL
+ if (unlikely(s->ctor))
+ s->ctor(object);
++#endif
+ }
+
+ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)
+@@ -2437,6 +2439,10 @@ redo:
+
+ if (unlikely(gfpflags & __GFP_ZERO) && object)
+ memset(object, 0, s->object_size);
++#ifdef CONFIG_PREEMPT_RT_FULL
++ if (unlikely(s->ctor) && object)
++ s->ctor(object);
++#endif
+
+ slab_post_alloc_hook(s, gfpflags, object);
+
diff --git a/patches/softirq-split-locks.patch b/patches/softirq-split-locks.patch
index 905f673..3947450 100644
--- a/patches/softirq-split-locks.patch
+++ b/patches/softirq-split-locks.patch
@@ -40,15 +40,20 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
# if defined CONFIG_HIGHMEM || defined CONFIG_X86_32
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
-@@ -162,6 +162,7 @@ static void handle_softirq(unsigned int
+@@ -162,6 +162,12 @@ static void handle_softirq(unsigned int
rcu_bh_qs(cpu);
}
+#ifndef CONFIG_PREEMPT_RT_FULL
++static inline int ksoftirqd_softirq_pending(void)
++{
++ return local_softirq_pending();
++}
++
static void handle_pending_softirqs(u32 pending, int cpu, int need_rcu_bh_qs)
{
unsigned int vec_nr;
-@@ -174,7 +175,19 @@ static void handle_pending_softirqs(u32
+@@ -174,7 +180,19 @@ static void handle_pending_softirqs(u32
local_irq_disable();
}
@@ -69,7 +74,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
/*
* preempt_count and SOFTIRQ_OFFSET usage:
* - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving
-@@ -367,28 +380,117 @@ asmlinkage void do_softirq(void)
+@@ -367,6 +385,32 @@ asmlinkage void do_softirq(void)
#endif
@@ -102,13 +107,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
static inline void local_bh_disable_nort(void) { local_bh_disable(); }
static inline void _local_bh_enable_nort(void) { _local_bh_enable(); }
static void ksoftirqd_set_sched_params(unsigned int cpu) { }
- static void ksoftirqd_clr_sched_params(unsigned int cpu, bool online) { }
-
-+static inline int ksoftirqd_softirq_pending(void)
-+{
-+ return local_softirq_pending();
-+}
-+
+@@ -375,20 +419,78 @@ static void ksoftirqd_clr_sched_params(u
#else /* !PREEMPT_RT_FULL */
/*