From ebc53a436b90c44d49edd68e96939496964629e9 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 2 Nov 2007 10:06:31 -0700 Subject: [PATCH] 4 2.6.22 patches added --- .../genirq-cleanup-mismerge-artifact.patch | 39 ++++++++++++ ...pic-level-interrupts-to-avoid-resend.patch | 62 +++++++++++++++++++ ...-suppress-resend-of-level-interrupts.patch | 36 +++++++++++ ...ecking-of-userspace-object-ownership.patch | 45 ++++++++++++++ queue-2.6.22/series | 4 ++ 5 files changed, 186 insertions(+) create mode 100644 queue-2.6.22/genirq-cleanup-mismerge-artifact.patch create mode 100644 queue-2.6.22/genirq-mark-io_apic-level-interrupts-to-avoid-resend.patch create mode 100644 queue-2.6.22/genirq-suppress-resend-of-level-interrupts.patch create mode 100644 queue-2.6.22/ib-uverbs-fix-checking-of-userspace-object-ownership.patch create mode 100644 queue-2.6.22/series 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 index 00000000000..c3e8e5d0923 --- /dev/null +++ b/queue-2.6.22/genirq-cleanup-mismerge-artifact.patch @@ -0,0 +1,39 @@ +From 496634217e5671ed876a0348e9f5b7165e830b20 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +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 +Signed-off-by: Linus Torvalds +Cc: Chuck Ebbert +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..1459b050509 --- /dev/null +++ b/queue-2.6.22/genirq-mark-io_apic-level-interrupts-to-avoid-resend.patch @@ -0,0 +1,62 @@ +From cc75b92d11384ba14f93828a2a0040344ae872e7 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +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 +Signed-off-by: Linus Torvalds +Cc: Chuck Ebbert +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..5e89e0e842a --- /dev/null +++ b/queue-2.6.22/genirq-suppress-resend-of-level-interrupts.patch @@ -0,0 +1,36 @@ +From 2464286ace55b3abddfb9cc30ab95e2dac1de9a6 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +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 +Signed-off-by: Linus Torvalds +Cc: Chuck Ebbert +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..d437ecd52c0 --- /dev/null +++ b/queue-2.6.22/ib-uverbs-fix-checking-of-userspace-object-ownership.patch @@ -0,0 +1,45 @@ +From stable-bounces@linux.kernel.org Sun Oct 28 10:15:04 2007 +From: Roland Dreier +Date: Sun, 28 Oct 2007 10:14:32 -0700 +Subject: IB/uverbs: Fix checking of userspace object ownership +To: stable@kernel.org +Message-ID: + +From: Roland Dreier + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..2cd06c3af3d --- /dev/null +++ b/queue-2.6.22/series @@ -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 -- 2.47.2