[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] [PATCH 1/3] add flag IRQF_NO_SUSPEND in 'struct irqaction'



Hi Jeremy,

Forget to mention, this series of patches are targeting for pv_ops dom0 host S3.

We have tried the host S3 branch (xen-tip/dom0/acpi) and find host S3 will hang 
at disable_nonboot_cpus. the root cause is that suspend_device_irqs () 
unfortunately will disable the irq of XEN_CALL_FUNCTION_SINGLE_VECTOR IPI and 
xen_timer_interrupt VIRQ, which however are required by disable_nonboot_cpus. 
To fix this issue, flag IRQF_NO_SUSPEND is added to Xen IPI and IRQF_TIMER is 
added to xen_timer_interrupt VIRQ, to notify suspend_device_irqs not to disable 
these irqs when suspend.

After applying this series of patches to xen-tip/dom0/acpi branch, and rebasing 
xen-tip/dom0/acpi to xen-tip/master, the pv_ops dom0 host S3 is working in our 
side.

Best Regards
Ke

>-----Original Message-----
>From: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
>[mailto:xen-devel-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Guanqun Lu
>Sent: Tuesday, July 14, 2009 5:44 PM
>To: xen-devel@xxxxxxxxxxxxxxxxxxx
>Cc: Lu, Guanqun
>Subject: [Xen-devel] [PATCH 1/3] add flag IRQF_NO_SUSPEND in 'struct
>irqaction'
>
>We currently only bypass IRQF_TIMER in '__disable_irq',
>but Xen specific IRQs should not be disabled either.
>This commit adds a new flag to accompolish this goal
>without being mixed up with IRQF_TIMER flag.
>
>Signed-off-by: Guanqun Lu <guanqun.lu@xxxxxxxxx>
>---
> include/linux/interrupt.h |    1 +
> kernel/irq/manage.c       |    3 ++-
> 2 files changed, 3 insertions(+), 1 deletions(-)
>
>diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
>index 8a9613d..8ad2b6f 100644
>--- a/include/linux/interrupt.h
>+++ b/include/linux/interrupt.h
>@@ -58,6 +58,7 @@
> #define IRQF_PERCPU           0x00000400
> #define IRQF_NOBALANCING      0x00000800
> #define IRQF_IRQPOLL          0x00001000
>+#define IRQF_NO_SUSPEND               0x00002000
>
> typedef irqreturn_t (*irq_handler_t)(int, void *);
>
>diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
>index 1516ab7..f814678 100644
>--- a/kernel/irq/manage.c
>+++ b/kernel/irq/manage.c
>@@ -165,7 +165,8 @@ static inline int setup_affinity(unsigned int irq, struct
>irq_desc *desc)
> void __disable_irq(struct irq_desc *desc, unsigned int irq, bool suspend)
> {
>       if (suspend) {
>-              if (!desc->action || (desc->action->flags & IRQF_TIMER))
>+              if (!desc->action ||
>+                  (desc->action->flags & (IRQF_TIMER | IRQF_NO_SUSPEND)))
>                       return;
>               desc->status |= IRQ_SUSPENDED;
>       }
>--
>1.6.1.rc3
>
>
>_______________________________________________
>Xen-devel mailing list
>Xen-devel@xxxxxxxxxxxxxxxxxxx
>http://lists.xensource.com/xen-devel

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.