Fixup irqpoll patch to really not impact machines without ASM108x bridges (rhbz 800520)

WITH FEELING THIS TIME
This commit is contained in:
Josh Boyer 2012-03-16 07:58:36 -04:00
parent 12b6d38c8a
commit c91e32221e
2 changed files with 26 additions and 6 deletions

View File

@ -54,7 +54,7 @@ Summary: The Linux kernel
# For non-released -rc kernels, this will be appended after the rcX and
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
#
%global baserelease 3
%global baserelease 4
%global fedora_build %{baserelease}
# base_sublevel is the kernel version we're starting with and patching
@ -1567,7 +1567,7 @@ ApplyPatch sony-laptop-Enable-keyboard-backlight-by-default.patch
#Disable threading in hibernate compression
ApplyPatch disable-threading-in-compression-for-hibernate.patch
# ApplyPatch unhandled-irqs-switch-to-polling.patch
ApplyPatch unhandled-irqs-switch-to-polling.patch
ApplyPatch weird-root-dentry-name-debug.patch
@ -2392,6 +2392,9 @@ fi
# and build.
%changelog
* Fri Mar 16 2012 Josh Boyer <jwboyer@redhat.com>
- Fix irqpoll patch to really only apply for ASM108x machines (rhbz 800520)
* Thu Mar 15 2012 Justin M. Forbes <jforbes@redhat.com> - 3.2.10-3
- CVE-2012-1179 fix pmd_bad() triggering in code paths holding mmap_sem read mode (rhbz 803809)

View File

@ -174,17 +174,34 @@ Josh Boyer <jwboyer@redhat.com>
* functioning device sharing an IRQ with the failing one)
*/
static void
@@ -302,19 +332,24 @@ void note_interrupt(unsigned int irq, st
@@ -269,6 +299,8 @@ try_misrouted_irq(unsigned int irq, stru
void note_interrupt(unsigned int irq, struct irq_desc *desc,
irqreturn_t action_ret)
{
+ int unhandled_thresh = 999000;
+
if (desc->istate & IRQS_POLL_INPROGRESS)
return;
@@ -302,19 +334,31 @@ void note_interrupt(unsigned int irq, st
}
desc->irq_count++;
- if (likely(desc->irq_count < 100000))
+ if (likely(desc->irq_count < 10))
return;
- return;
+ if (!irq_poll_and_retry)
+ if (likely(desc->irq_count < 100000))
+ return;
+ else
+ if (likely(desc->irq_count < 10))
+ return;
desc->irq_count = 0;
- if (unlikely(desc->irqs_unhandled > 99900)) {
+ if (unlikely(desc->irqs_unhandled >= 9)) {
+ if (irq_poll_and_retry)
+ unhandled_thresh = 9;
+
+ if (unlikely(desc->irqs_unhandled >= unhandled_thresh)) {
/*
- * The interrupt is stuck
+ * The interrupt might be stuck