All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH][RFC]  pv-ops: fix shared irq device passthrough
@ 2009-10-23 11:39 Han, Weidong
  2009-10-26 20:27 ` Jeremy Fitzhardinge
  0 siblings, 1 reply; 17+ messages in thread
From: Han, Weidong @ 2009-10-23 11:39 UTC (permalink / raw)
  To: 'xen-devel@lists.xensource.com'
  Cc: 'Jeremy Fitzhardinge',
	'keir.fraser@eu.citrix.com'

[-- Attachment #1: Type: text/plain, Size: 2204 bytes --]

>From 9c91f23076c555690488cbd81f889f279d4cf2fa Mon Sep 17 00:00:00 2001
From: Weidong Han <weidong.han@intel.com>
Date: Sat, 24 Oct 2009 03:18:30 +0800
Subject: [PATCH] pv-ops: fix shared irq device passthrough

In driver/xen/events.c, whether bind_pirq is shareable or not is
determined by desc->action is NULL or not. But in __setup_irq,
startup(irq) is invoked before desc->action is assigned with
new action. So desc->action in startup_irq is alwasy NULL, and
bind_pirq is always not shareable. This results in pt_irq_create_bind
failure when passthrough a device which shares irq to other devices.

This patch move desc->action before startup(irq), therefore fix
the problem.

Signed-off-by: Weidong Han <weidong.han@intel.com>
---
 kernel/irq/manage.c |   14 ++++++++++----
 1 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 07a11dc..3b85b72 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -565,6 +565,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 {
 	struct irqaction *old, **old_ptr;
 	const char *old_name = NULL;
+	int old_irq;
 	unsigned long flags;
 	int shared = 0;
 	int ret;
@@ -644,6 +645,11 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 		shared = 1;
 	}
 
+	old = *old_ptr;
+	old_irq = new->irq;
+	new->irq = irq;
+	*old_ptr = new;
+
 	if (!shared) {
 		irq_chip_set_defaults(desc->chip);
 
@@ -654,8 +660,11 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 			ret = __irq_set_trigger(desc, irq,
 					new->flags & IRQF_TRIGGER_MASK);
 
-			if (ret)
+			if (ret) {
+				new->irq = old_irq;
+				*old_ptr = old;
 				goto out_thread;
+			}
 		} else
 			compat_irq_chip_set_default_handler(desc);
 #if defined(CONFIG_IRQ_PER_CPU)
@@ -690,9 +699,6 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 				(int)(new->flags & IRQF_TRIGGER_MASK));
 	}
 
-	new->irq = irq;
-	*old_ptr = new;
-
 	/* Reset broken irq detection when installing new handler */
 	desc->irq_count = 0;
 	desc->irqs_unhandled = 0;
-- 
1.6.0.4

[-- Attachment #2: 0001-pv-ops-fix-shared-irq-device-passthrough.patch --]
[-- Type: application/octet-stream, Size: 2135 bytes --]

From 9c91f23076c555690488cbd81f889f279d4cf2fa Mon Sep 17 00:00:00 2001
From: Weidong Han <weidong.han@intel.com>
Date: Sat, 24 Oct 2009 03:18:30 +0800
Subject: [PATCH] pv-ops: fix shared irq device passthrough

In driver/xen/events.c, whether bind_pirq is shareable or not is
determined by desc->action is NULL or not. But in __setup_irq,
startup(irq) is invoked before desc->action is assigned with
new action. So desc->action in startup_irq is alwasy NULL, and
bind_pirq is always not shareable. This results in pt_irq_create_bind
failure when passthrough a device which shares irq to other devices.

This patch move desc->action before startup(irq), therefore fix
the problem.

Signed-off-by: Weidong Han <weidong.han@intel.com>
---
 kernel/irq/manage.c |   14 ++++++++++----
 1 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 07a11dc..3b85b72 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -565,6 +565,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 {
 	struct irqaction *old, **old_ptr;
 	const char *old_name = NULL;
+	int old_irq;
 	unsigned long flags;
 	int shared = 0;
 	int ret;
@@ -644,6 +645,11 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 		shared = 1;
 	}
 
+	old = *old_ptr;
+	old_irq = new->irq;
+	new->irq = irq;
+	*old_ptr = new;
+
 	if (!shared) {
 		irq_chip_set_defaults(desc->chip);
 
@@ -654,8 +660,11 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 			ret = __irq_set_trigger(desc, irq,
 					new->flags & IRQF_TRIGGER_MASK);
 
-			if (ret)
+			if (ret) {
+				new->irq = old_irq;
+				*old_ptr = old;
 				goto out_thread;
+			}
 		} else
 			compat_irq_chip_set_default_handler(desc);
 #if defined(CONFIG_IRQ_PER_CPU)
@@ -690,9 +699,6 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 				(int)(new->flags & IRQF_TRIGGER_MASK));
 	}
 
-	new->irq = irq;
-	*old_ptr = new;
-
 	/* Reset broken irq detection when installing new handler */
 	desc->irq_count = 0;
 	desc->irqs_unhandled = 0;
-- 
1.6.0.4


[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply related	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2009-11-12  7:15 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-23 11:39 [PATCH][RFC] pv-ops: fix shared irq device passthrough Han, Weidong
2009-10-26 20:27 ` Jeremy Fitzhardinge
2009-10-27  1:32   ` Han, Weidong
2009-10-29 22:56     ` Jeremy Fitzhardinge
2009-10-30  9:29       ` Han, Weidong
2009-10-30 21:34         ` Jeremy Fitzhardinge
2009-10-31 13:50           ` Han, Weidong
     [not found]           ` <715D42877B251141A38726ABF5CABF2C055064A406@pdsmsx503.ccr.corp.intel.com>
2009-11-02 10:12             ` Han, Weidong
2009-11-10  6:12               ` Han, Weidong
2009-11-10  6:30                 ` Mr. Teo En Ming (Zhang Enming)
2009-11-10  6:59                   ` Han, Weidong
2009-11-10 16:30                 ` Konrad Rzeszutek Wilk
2009-11-10 17:11                   ` Kay, Allen M
2009-11-10 18:40                     ` Konrad Rzeszutek Wilk
2009-11-10 18:44                   ` Jeremy Fitzhardinge
2009-11-12  7:15                     ` Han, Weidong
2009-11-10 17:56                 ` Jeremy Fitzhardinge

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.