At Thu, 19 Apr 2012 18:29:47 +0200, Daniel Vetter wrote: > > On Thu, Apr 19, 2012 at 06:10:18PM +0200, Takashi Iwai wrote: > > The hotplug work can be still kicked off via irq during PM, and this > > may conflict with the resume procedure. For example, eDP on SNB > > machine shows WARNING like below during the resume: > > > > WARNING: at /usr/src/packages/BUILD/kernel-default-3.0.13/linux-3.0/drivers/gpu/drm/i915/intel_dp.c:332 intel_dp_check_edp+0x73/0xd0 [i915]() > > Hardware name: HP Z1 Workstation > > eDP powered off while attempting aux channel communication. > > Supported: Yes > > Pid: 3210, comm: kworker/u:49 Tainted: G C N 3.0.13-0.27-default #1 > > Call Trace: > > [<ffffffff810048b5>] dump_trace+0x75/0x300 > > [<ffffffff8143ea0f>] dump_stack+0x69/0x6f > > [<ffffffff81059e2b>] warn_slowpath_common+0x7b/0xc0 > > [<ffffffff81059f25>] warn_slowpath_fmt+0x45/0x50 > > [<ffffffffa01fa9f3>] intel_dp_check_edp+0x73/0xd0 [i915] > > [<ffffffffa01fae4b>] intel_dp_aux_native_write+0x1b/0xe0 [i915] > > [<ffffffffa01fb033>] intel_dp_set_link_train+0x73/0xa0 [i915] > > [<ffffffffa01fb58e>] intel_dp_start_link_train+0x16e/0x400 [i915] > > [<ffffffffa01fbc6c>] intel_dp_complete_link_train+0x1fc/0x3d0 [i915] > > [<ffffffffa01fcf4c>] intel_dp_check_link_status+0x12c/0x1d0 [i915] > > [<ffffffffa01cf22e>] i915_hotplug_work_func+0x6e/0xa0 [i915] > > [<ffffffff810747bc>] process_one_work+0x16c/0x350 > > [<ffffffff8107734a>] worker_thread+0x17a/0x410 > > [<ffffffff8107b676>] kthread+0x96/0xa0 > > [<ffffffff8144a7c4>] kernel_thread_helper+0x4/0x10 > > DWARF2 unwinder stuck at kernel_thread_helper+0x4/0x10 > > > > This patch adds a flag to disable the hotplug during PM operation for > > avoiding such a race. > > > > Cc: <stable at kernel.org> > > Signed-off-by: Takashi Iwai <tiwai at suse.de> > > I haven't looked to closely, but isn't cancelling the hotplug work after > we disable the irqs in the suspend path good enough? This here feels a bit > like ducttapeing over the problem. This doesn't look like a leftover work. Judging from the log I got, the hotplug event is kicked really from the irq handler in the resume phase. [ 53.424757] ehci_hcd 0000:00:1d.0: cache line size of 64 is not supported [ 53.452721] [drm:intel_enable_rc6], Sandybridge: RC6 disabled [ 53.477048] firewire_core: skipped bus generations, destroying all nodes [ 53.504839] [drm:intel_opregion_setup], graphic opregion physical addr: 0x73d1c018 [ 53.504929] [drm:intel_opregion_setup], Public ACPI methods supported [ 53.504930] [drm:intel_opregion_setup], SWSCI supported [ 53.504931] [drm:intel_opregion_setup], ASLE supported [ 53.504962] [drm:init_status_page], render ring hws offset: 0x00000000 [ 53.505047] [drm:init_status_page], gen6 bsd ring hws offset: 0x00022000 [ 53.505118] [drm:init_status_page], blt ring hws offset: 0x00043000 [ 53.505185] [drm:ironlake_init_pch_refclk], has_panel 1 has_lvds 0 has_pch_edp 1 has_cpu_edp 0 has_ck505 0 [ 53.505188] [drm:ironlake_init_pch_refclk], Using SSC on panel [ 53.505611] [drm:intel_dp_mode_fixup], Display port link bw 0a lane count 4 clock 270000 [ 53.505613] [drm:drm_crtc_helper_set_mode], [CRTC:3] [ 53.505615] [drm:ironlake_edp_backlight_off], [ 53.512832] [drm:ironlake_edp_panel_off], Turn eDP power off [ 53.512836] [drm:ironlake_wait_panel_off], Wait for panel power off time [ 53.512839] [drm:ironlake_wait_panel_status], mask b000000f value 00000000 status c0000008 control abcd0000 [ 53.652153] [drm:pch_irq_handler], PCH HDCP audio interrupt [ 53.652159] [drm:i915_hotplug_work_func], running encoder hotplug functions [ 53.653780] [drm:intel_dp_check_link_status], TMDS-6: channel EQ not ok, retraining [ 53.654188] [drm:intel_dp_start_link_train], training pattern 1 signal levels 00000000 .... [ 53.680513] [drm:intel_dp_start_link_train], too many full retries, give up ... [ 53.714791] [drm:intel_dp_start_link_train], training pattern 1 signal levels 06000000 [ 53.715198] ------------[ cut here ]------------ [ 53.715230] WARNING: at /usr/src/packages/BUILD/kernel-default-3.0.13/linux-3.0/drivers/gpu/drm/i915/intel_dp.c:332 intel_dp_check_edp+0x73/0xd0 [i915]() ... > I'm asking because we seem to have other problems with work queue items > that leak across s/r and cause havoc on resume. So extracting this > quiescenting code from module unload and also running it at suspend time > sounds more like the right thing. Yes, this should be needed anyway, I think. But the new hotplug event can be still generated, as it seems, and this would conflict with the initialization beind done in the resume. thanks, Takashi