From: Munehisa Kamata <[email protected]> Close event channels allocated for devices which are backed by PIRQ and still active when suspending the system core. Normally, the devices are emulated legacy devices, e.g. PS/2 keyboard, floppy controller and etc.
Without this, in PM hibernation, information about the event channel remains in hibernation image, but there is no guarantee that the same event channel numbers are assigned to the devices when restoring the system. This may cause conflict like the following and prevent some devices from being restored correctly. [ 102.330821] ------------[ cut here ]------------ [ 102.333264] WARNING: CPU: 0 PID: 2324 at drivers/xen/events/events_base.c:878 bind_evtchn_to_irq+0x88/0xf0 ... [ 102.348057] Call Trace: [ 102.348057] [<ffffffff813001df>] dump_stack+0x63/0x84 [ 102.348057] [<ffffffff81071811>] __warn+0xd1/0xf0 [ 102.348057] [<ffffffff810718fd>] warn_slowpath_null+0x1d/0x20 [ 102.348057] [<ffffffff8139a1f8>] bind_evtchn_to_irq+0x88/0xf0 [ 102.348057] [<ffffffffa00cd420>] ? blkif_copy_from_grant+0xb0/0xb0 [xen_blkfront] [ 102.348057] [<ffffffff8139a307>] bind_evtchn_to_irqhandler+0x27/0x80 [ 102.348057] [<ffffffffa00cc785>] talk_to_blkback+0x425/0xcd0 [xen_blkfront] [ 102.348057] [<ffffffff811e0c8a>] ? __kmalloc+0x1ea/0x200 [ 102.348057] [<ffffffffa00ce84d>] blkfront_restore+0x2d/0x60 [xen_blkfront] [ 102.348057] [<ffffffff813a0078>] xenbus_dev_restore+0x58/0x100 [ 102.348057] [<ffffffff813a1ff0>] ? xenbus_frontend_delayed_resume+0x20/0x20 [ 102.348057] [<ffffffff813a200e>] xenbus_dev_cond_restore+0x1e/0x30 [ 102.348057] [<ffffffff813f797e>] dpm_run_callback+0x4e/0x130 [ 102.348057] [<ffffffff813f7f17>] device_resume+0xe7/0x210 [ 102.348057] [<ffffffff813f7810>] ? pm_dev_dbg+0x80/0x80 [ 102.348057] [<ffffffff813f9374>] dpm_resume+0x114/0x2f0 [ 102.348057] [<ffffffff810c00cf>] hibernation_snapshot+0x15f/0x380 [ 102.348057] [<ffffffff810c0ac3>] hibernate+0x183/0x290 [ 102.348057] [<ffffffff810be1af>] state_store+0xcf/0xe0 [ 102.348057] [<ffffffff813020bf>] kobj_attr_store+0xf/0x20 [ 102.348057] [<ffffffff8127c88a>] sysfs_kf_write+0x3a/0x50 [ 102.348057] [<ffffffff8127c3bb>] kernfs_fop_write+0x10b/0x190 [ 102.348057] [<ffffffff81200008>] __vfs_write+0x28/0x120 [ 102.348057] [<ffffffff81200c19>] ? rw_verify_area+0x49/0xb0 [ 102.348057] [<ffffffff81200e62>] vfs_write+0xb2/0x1b0 [ 102.348057] [<ffffffff81202196>] SyS_write+0x46/0xa0 [ 102.348057] [<ffffffff81520cf7>] entry_SYSCALL_64_fastpath+0x1a/0xa9 [ 102.423005] ---[ end trace b8d6718e22e2b107 ]--- [ 102.425031] genirq: Flags mismatch irq 6. 00000000 (blkif) vs. 00000000 (floppy) Note that we don't explicitly re-allocate event channels for such devices in the resume callback. Re-allocation will occur when PM core re-enable IRQs for the devices at later point. Signed-off-by: Munehisa Kamata <[email protected]> Signed-off-by: Anchal Agarwal <[email protected]> Reviewed-by: Munehisa Kamata <[email protected]> Reviewed-by: Eduardo Valentin <[email protected]> --- arch/x86/xen/suspend.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c index dae0f74..affa63d 100644 --- a/arch/x86/xen/suspend.c +++ b/arch/x86/xen/suspend.c @@ -105,6 +105,8 @@ static int xen_syscore_suspend(void) xen_save_steal_clock(cpu); } + xen_shutdown_pirqs(); + xrfp.domid = DOMID_SELF; xrfp.gpfn = __pa(HYPERVISOR_shared_info) >> PAGE_SHIFT; -- 2.7.4 _______________________________________________ Xen-devel mailing list [email protected] https://lists.xenproject.org/mailman/listinfo/xen-devel
