diff --git a/debian/changelog b/debian/changelog index 3d0579aca..928b692fc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -22,6 +22,7 @@ linux-2.6 (3.2.12-1) UNRELEASED; urgency=low * [x86] Disable POHMELFS; this version is obsolete * epoll: Don't limit non-nested epoll paths * CIFS: Fix a spurious error in cifs_push_posix_locks + * [rt] bump rt patch to version 3.2.11-rt20 [ Jonathan Nieder ] * [x86] Enable RTS5139 as module (Closes: #663912) diff --git a/debian/patches/features/all/rt/genirq-clear-thread-mask-for-non-oneshot.patch b/debian/patches/features/all/rt/genirq-clear-thread-mask-for-non-oneshot.patch deleted file mode 100644 index 1e41d9773..000000000 --- a/debian/patches/features/all/rt/genirq-clear-thread-mask-for-non-oneshot.patch +++ /dev/null @@ -1,93 +0,0 @@ -From: Thomas Gleixner -Date: Tue Mar 6 23:18:54 2012 +0100 -Subject: genirq: Clear action->thread_mask if IRQ_ONESHOT is not set - -commit ac5637611(genirq: Unmask oneshot irqs when thread was not woken) -fails to unmask when a !IRQ_ONESHOT threaded handler is handled by -handle_level_irq. - -This happens because thread_mask is or'ed unconditionally in -irq_wake_thread(), but for !IRQ_ONESHOT interrupts never cleared. So -the check for !desc->thread_active fails and keeps the interrupt -disabled. - -Keep the thread_mask zero for !IRQ_ONESHOT interrupts. - -Document the thread_mask magic while at it. - -[ commit 52abb700e16a9aa4cbc03f3d7f80206cbbc80680 upstream ] - -Reported-and-tested-by: Sven Joachim -Reported-and-tested-by: Stefan Lippers-Hollmann -Cc: stable@vger.kernel.org -Signed-off-by: Thomas Gleixner -Signed-off-by: Linus Torvalds - ---- - kernel/irq/manage.c | 44 ++++++++++++++++++++++++++++++++++++++------ - 1 file changed, 38 insertions(+), 6 deletions(-) - -Index: linux-3.2/kernel/irq/manage.c -=================================================================== ---- linux-3.2.orig/kernel/irq/manage.c -+++ linux-3.2/kernel/irq/manage.c -@@ -985,6 +985,11 @@ __setup_irq(unsigned int irq, struct irq - - /* add new interrupt at end of irq queue */ - do { -+ /* -+ * Or all existing action->thread_mask bits, -+ * so we can find the next zero bit for this -+ * new action. -+ */ - thread_mask |= old->thread_mask; - old_ptr = &old->next; - old = *old_ptr; -@@ -993,14 +998,41 @@ __setup_irq(unsigned int irq, struct irq - } - - /* -- * Setup the thread mask for this irqaction. Unlikely to have -- * 32 resp 64 irqs sharing one line, but who knows. -+ * Setup the thread mask for this irqaction for ONESHOT. For -+ * !ONESHOT irqs the thread mask is 0 so we can avoid a -+ * conditional in irq_wake_thread(). - */ -- if (new->flags & IRQF_ONESHOT && thread_mask == ~0UL) { -- ret = -EBUSY; -- goto out_mask; -+ if (new->flags & IRQF_ONESHOT) { -+ /* -+ * Unlikely to have 32 resp 64 irqs sharing one line, -+ * but who knows. -+ */ -+ if (thread_mask == ~0UL) { -+ ret = -EBUSY; -+ goto out_mask; -+ } -+ /* -+ * The thread_mask for the action is or'ed to -+ * desc->thread_active to indicate that the -+ * IRQF_ONESHOT thread handler has been woken, but not -+ * yet finished. The bit is cleared when a thread -+ * completes. When all threads of a shared interrupt -+ * line have completed desc->threads_active becomes -+ * zero and the interrupt line is unmasked. See -+ * handle.c:irq_wake_thread() for further information. -+ * -+ * If no thread is woken by primary (hard irq context) -+ * interrupt handlers, then desc->threads_active is -+ * also checked for zero to unmask the irq line in the -+ * affected hard irq flow handlers -+ * (handle_[fasteoi|level]_irq). -+ * -+ * The new action gets the first zero bit of -+ * thread_mask assigned. See the loop above which or's -+ * all existing action->thread_mask bits. -+ */ -+ new->thread_mask = 1 << ffz(thread_mask); - } -- new->thread_mask = 1 << ffz(thread_mask); - - if (!shared) { - init_waitqueue_head(&desc->wait_for_threads); diff --git a/debian/patches/features/all/rt/localversion.patch b/debian/patches/features/all/rt/localversion.patch index 83b8d4b72..8af1cdb2c 100644 --- a/debian/patches/features/all/rt/localversion.patch +++ b/debian/patches/features/all/rt/localversion.patch @@ -14,4 +14,4 @@ Index: linux-3.2/localversion-rt --- /dev/null +++ linux-3.2/localversion-rt @@ -0,0 +1 @@ -+-rt17 ++-rt20 diff --git a/debian/patches/features/all/rt/series b/debian/patches/features/all/rt/series index 4e9df4d4c..dd33b575a 100644 --- a/debian/patches/features/all/rt/series +++ b/debian/patches/features/all/rt/series @@ -5,7 +5,7 @@ ############################################################ # UPSTREAM changes queued for 3.3 or 3.2 ############################################################ -genirq-clear-thread-mask-for-non-oneshot.patch +x88-derandom-tsc-delay-64-bit.patch x86_64-patch-for-idle-notifiers.patch re-possible-slab-deadlock-while-doing-ifenslave-1.patch diff --git a/debian/patches/features/all/rt/softirq-preempt-fix-3-re.txt b/debian/patches/features/all/rt/softirq-preempt-fix-3-re.txt index bd68cb346..e10cffec3 100644 --- a/debian/patches/features/all/rt/softirq-preempt-fix-3-re.txt +++ b/debian/patches/features/all/rt/softirq-preempt-fix-3-re.txt @@ -16,9 +16,9 @@ Cc: stable-rt@vger.kernel.org --- block/blk-iopoll.c | 3 +++ block/blk-softirq.c | 3 +++ - include/linux/preempt.h | 2 ++ + include/linux/preempt.h | 3 +++ net/core/dev.c | 6 ++++++ - 4 files changed, 14 insertions(+) + 4 files changed, 15 insertions(+) Index: linux-3.2/block/blk-iopoll.c =================================================================== @@ -91,6 +91,14 @@ Index: linux-3.2/include/linux/preempt.h #endif #define preempt_enable() \ +@@ -105,6 +107,7 @@ do { \ + #define preempt_disable_notrace() do { } while (0) + #define preempt_enable_no_resched_notrace() do { } while (0) + #define preempt_enable_notrace() do { } while (0) ++#define preempt_check_resched_rt() do { } while (0) + + #endif /* CONFIG_PREEMPT_COUNT */ + Index: linux-3.2/net/core/dev.c =================================================================== --- linux-3.2.orig/net/core/dev.c