]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4 2.6.22 patches added
authorGreg Kroah-Hartman <gregkh@suse.de>
Fri, 2 Nov 2007 17:06:31 +0000 (10:06 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 2 Nov 2007 17:06:31 +0000 (10:06 -0700)
queue-2.6.22/genirq-cleanup-mismerge-artifact.patch [new file with mode: 0644]
queue-2.6.22/genirq-mark-io_apic-level-interrupts-to-avoid-resend.patch [new file with mode: 0644]
queue-2.6.22/genirq-suppress-resend-of-level-interrupts.patch [new file with mode: 0644]
queue-2.6.22/ib-uverbs-fix-checking-of-userspace-object-ownership.patch [new file with mode: 0644]
queue-2.6.22/series [new file with mode: 0644]

diff --git a/queue-2.6.22/genirq-cleanup-mismerge-artifact.patch b/queue-2.6.22/genirq-cleanup-mismerge-artifact.patch
new file mode 100644 (file)
index 0000000..c3e8e5d
--- /dev/null
@@ -0,0 +1,39 @@
+From 496634217e5671ed876a0348e9f5b7165e830b20 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Sun, 12 Aug 2007 15:46:34 +0000
+Subject: genirq: cleanup mismerge artifact
+Message-ID: <471500E5.4060500@redhat.com>
+
+Commit 5a43a066b11ac2fe84cf67307f20b83bea390f83: "genirq: Allow fasteoi
+handler to retrigger disabled interrupts" was erroneously applied to
+handle_level_irq().  This added the irq retrigger / resend functionality
+to the level irq handler.
+
+Revert the offending bits.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Chuck Ebbert <cebbert@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ kernel/irq/chip.c |    5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+--- a/kernel/irq/chip.c
++++ b/kernel/irq/chip.c
+@@ -352,13 +352,10 @@ handle_level_irq(unsigned int irq, struc
+        * keep it masked and get out of here
+        */
+       action = desc->action;
+-      if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
+-              desc->status |= IRQ_PENDING;
++      if (unlikely(!action || (desc->status & IRQ_DISABLED)))
+               goto out_unlock;
+-      }
+       desc->status |= IRQ_INPROGRESS;
+-      desc->status &= ~IRQ_PENDING;
+       spin_unlock(&desc->lock);
+       action_ret = handle_IRQ_event(irq, action);
diff --git a/queue-2.6.22/genirq-mark-io_apic-level-interrupts-to-avoid-resend.patch b/queue-2.6.22/genirq-mark-io_apic-level-interrupts-to-avoid-resend.patch
new file mode 100644 (file)
index 0000000..1459b05
--- /dev/null
@@ -0,0 +1,62 @@
+From cc75b92d11384ba14f93828a2a0040344ae872e7 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Sun, 12 Aug 2007 15:46:36 +0000
+Subject: genirq: mark io_apic level interrupts to avoid resend
+Message-ID: <4715016A.30605@redhat.com>
+
+Level type interrupts do not need to be resent.  It was also found that
+some chipsets get confused in case of the resend.
+
+Mark the ioapic level type interrupts as such to avoid the resend
+functionality in the generic irq code.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Chuck Ebbert <cebbert@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/i386/kernel/io_apic.c   |    7 +++++--
+ arch/x86_64/kernel/io_apic.c |    7 +++++--
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+--- a/arch/i386/kernel/io_apic.c
++++ b/arch/i386/kernel/io_apic.c
+@@ -1275,12 +1275,15 @@ static struct irq_chip ioapic_chip;
+ static void ioapic_register_intr(int irq, int vector, unsigned long trigger)
+ {
+       if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
+-                      trigger == IOAPIC_LEVEL)
++          trigger == IOAPIC_LEVEL) {
++              irq_desc[irq].status |= IRQ_LEVEL;
+               set_irq_chip_and_handler_name(irq, &ioapic_chip,
+                                        handle_fasteoi_irq, "fasteoi");
+-      else
++      } else {
++              irq_desc[irq].status &= ~IRQ_LEVEL;
+               set_irq_chip_and_handler_name(irq, &ioapic_chip,
+                                        handle_edge_irq, "edge");
++      }
+       set_intr_gate(vector, interrupt[irq]);
+ }
+--- a/arch/x86_64/kernel/io_apic.c
++++ b/arch/x86_64/kernel/io_apic.c
+@@ -774,12 +774,15 @@ static struct irq_chip ioapic_chip;
+ static void ioapic_register_intr(int irq, unsigned long trigger)
+ {
+-      if (trigger)
++      if (trigger) {
++              irq_desc[irq].status |= IRQ_LEVEL;
+               set_irq_chip_and_handler_name(irq, &ioapic_chip,
+                                             handle_fasteoi_irq, "fasteoi");
+-      else
++      } else {
++              irq_desc[irq].status &= ~IRQ_LEVEL;
+               set_irq_chip_and_handler_name(irq, &ioapic_chip,
+                                             handle_edge_irq, "edge");
++      }
+ }
+ static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq,
diff --git a/queue-2.6.22/genirq-suppress-resend-of-level-interrupts.patch b/queue-2.6.22/genirq-suppress-resend-of-level-interrupts.patch
new file mode 100644 (file)
index 0000000..5e89e0e
--- /dev/null
@@ -0,0 +1,36 @@
+From 2464286ace55b3abddfb9cc30ab95e2dac1de9a6 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Sun, 12 Aug 2007 15:46:35 +0000
+Subject: genirq: suppress resend of level interrupts
+Message-ID: <47150121.2010100@redhat.com>
+
+Level type interrupts are resent by the interrupt hardware when they are
+still active at irq_enable().
+
+Suppress the resend mechanism for interrupts marked as level.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Chuck Ebbert <cebbert@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ kernel/irq/resend.c |    7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/kernel/irq/resend.c
++++ b/kernel/irq/resend.c
+@@ -62,7 +62,12 @@ void check_irq_resend(struct irq_desc *d
+        */
+       desc->chip->enable(irq);
+-      if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
++      /*
++       * We do not resend level type interrupts. Level type
++       * interrupts are resent by hardware when they are still
++       * active.
++       */
++      if ((status & (IRQ_LEVEL | IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
+               desc->status = (status & ~IRQ_PENDING) | IRQ_REPLAY;
+               if (!desc->chip || !desc->chip->retrigger ||
diff --git a/queue-2.6.22/ib-uverbs-fix-checking-of-userspace-object-ownership.patch b/queue-2.6.22/ib-uverbs-fix-checking-of-userspace-object-ownership.patch
new file mode 100644 (file)
index 0000000..d437ecd
--- /dev/null
@@ -0,0 +1,45 @@
+From stable-bounces@linux.kernel.org Sun Oct 28 10:15:04 2007
+From: Roland Dreier <rdreier@cisco.com>
+Date: Sun, 28 Oct 2007 10:14:32 -0700
+Subject: IB/uverbs: Fix checking of userspace object ownership
+To: stable@kernel.org
+Message-ID: <ada7il7xitj.fsf@cisco.com>
+
+From: Roland Dreier <rolandd@cisco.com>
+
+Upstream as cbfb50e6e2e9c580848c0f51d37c24cdfb1cb704
+
+Commit 9ead190b ("IB/uverbs: Don't serialize with ib_uverbs_idr_mutex")
+rewrote how userspace objects are looked up in the uverbs module's
+idrs, and introduced a severe bug in the process: there is no checking
+that an operation is being performed by the right process any more.
+Fix this by adding the missing check of uobj->context in __idr_get_uobj().
+
+Apparently everyone is being very careful to only touch their own
+objects, because this bug was introduced in June 2006 in 2.6.18, and
+has gone undetected until now.
+
+Signed-off-by: Roland Dreier <rolandd@cisco.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/infiniband/core/uverbs_cmd.c |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+--- a/drivers/infiniband/core/uverbs_cmd.c
++++ b/drivers/infiniband/core/uverbs_cmd.c
+@@ -147,8 +147,12 @@ static struct ib_uobject *__idr_get_uobj
+       spin_lock(&ib_uverbs_idr_lock);
+       uobj = idr_find(idr, id);
+-      if (uobj)
+-              kref_get(&uobj->ref);
++      if (uobj) {
++              if (uobj->context == context)
++                      kref_get(&uobj->ref);
++              else
++                      uobj = NULL;
++      }
+       spin_unlock(&ib_uverbs_idr_lock);
+       return uobj;
diff --git a/queue-2.6.22/series b/queue-2.6.22/series
new file mode 100644 (file)
index 0000000..2cd06c3
--- /dev/null
@@ -0,0 +1,4 @@
+genirq-cleanup-mismerge-artifact.patch
+genirq-suppress-resend-of-level-interrupts.patch
+genirq-mark-io_apic-level-interrupts-to-avoid-resend.patch
+ib-uverbs-fix-checking-of-userspace-object-ownership.patch