>>> On 14.02.11 at 10:30, "Wei, Gang" <gang.wei@xxxxxxxxx> wrote:
> x86: Fix S3 resume for HPET MSI IRQ case
>
> Jan Beulich found that for S3 resume on platforms without ARAT feature but
> with MSI capable HPET, request_irq() will be called in hpet_setup_msi_irq()
> for irq already setup(no release_irq() called during S3 suspend), so that
> always falling back to using legacy_hpet_event.
>
> Fix it by conditional calling request_irq() for 4.1. Planned to split the S3
> resume path from booting path post 4.1, as Jan suggested.
>
> Signed-off-by: Wei Gang <gang.wei@xxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxxxx>
> diff -r 67f2fed57034 xen/arch/x86/hpet.c
> --- a/xen/arch/x86/hpet.c Fri Feb 11 18:22:37 2011 +0000
> +++ b/xen/arch/x86/hpet.c Tue Feb 15 14:48:54 2011 +0800
> @@ -367,12 +367,20 @@ static int hpet_setup_msi_irq(unsigned i
> int ret;
> struct msi_msg msg;
> struct hpet_event_channel *ch = &hpet_events[irq_to_channel(irq)];
> -
> - irq_desc[irq].handler = &hpet_msi_type;
> - ret = request_irq(irq, hpet_interrupt_handler,
> - 0, "HPET", ch);
> - if ( ret < 0 )
> - return ret;
> + irq_desc_t *desc = irq_to_desc(irq);
> +
> + if ( desc->handler == &no_irq_type )
> + {
> + desc->handler = &hpet_msi_type;
> + ret = request_irq(irq, hpet_interrupt_handler,
> + 0, "HPET", ch);
> + if ( ret < 0 )
> + return ret;
> + }
> + else if ( desc->handler != &hpet_msi_type )
> + {
> + return -EINVAL;
> + }
>
> msi_compose_msg(NULL, irq, &msg);
> hpet_msi_write(irq, &msg);
>
> Jimmy
>
> Jan Beulich wrote on 2011-01-28:
>> Going through hpet_broadcast_init(), I see that hpet_setup_msi_irq()
>> gets called during resume, thus causing setup_irq() to be called. I'm
>> failing to spot the corresponding release_irq(), and hence I can't see
>> how this whole code path is supposed to work during resume (other than
>> always falling back to using legacy_hpet_event). Instead I'm wondering
>> whether in the resume case only msi_compose_msg()/
>> hpet_msi_write() should be called for each IRQ used rather than the
>> whole hpet_broadcast_init().
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|