• Peter Zijlstra's avatar
    x86: fix lockdep warning during suspend-to-ram · e32e58a9
    Peter Zijlstra authored
    Andrew Morton wrote:
    
    > I've been seeing the below for a long time during suspend-to-ram on the Vaio.
    >
    >
    > PM: Syncing filesystems ... done.
    > PM: Preparing system for mem sleep
    > Freezing user space processes ... <4>------------[ cut here ]------------
    > WARNING: at kernel/lockdep.c:2658 check_flags+0x4c/0x127()
    > Modules linked in: i915 drm ipw2200 sonypi ipv6 autofs4 hidp l2cap bluetooth sunrpc nf_conntrack_netbios_ns ipt_REJECT nf_conntrack_ipv4 xt_state nf_conntrack xt_tcpudp iptable_filter ip_tables x_tables acpi_cpufreq nvram ohci1394 ieee1394 ehci_hcd uhci_hcd sg joydev snd_hda_intel snd_seq_dummy sr_mod snd_seq_oss cdrom snd_seq_midi_event snd_seq snd_seq_device snd_pcm_oss snd_mixer_oss ieee80211 pcspkr ieee80211_crypt snd_pcm i2c_i801 snd_timer i2c_core ide_pci_generic piix snd soundcore snd_page_alloc button ext3 jbd ide_disk ide_core [last unloaded: ipw2200]
    > Pid: 3250, comm: zsh Not tainted 2.6.26-rc5 #1
    >  [<c011c5f5>] warn_on_slowpath+0x41/0x6d
    >  [<c01080e6>] ? native_sched_clock+0x82/0x96
    >  [<c013789c>] ? mark_held_locks+0x41/0x5c
    >  [<c0315688>] ? _spin_unlock_irqrestore+0x36/0x58
    >  [<c0137a29>] ? trace_hardirqs_on+0xe6/0x10d
    >  [<c0138637>] ? __lock_acquire+0xae3/0xb2b
    >  [<c0313413>] ? schedule+0x39b/0x3b4
    >  [<c0135596>] check_flags+0x4c/0x127
    >  [<c01386b9>] lock_acquire+0x3a/0x86
    >  [<c0315075>] _spin_lock+0x26/0x53
    >  [<c0140660>] ? refrigerator+0x13/0xc3
    >  [<c0140660>] refrigerator+0x13/0xc3
    >  [<c012684a>] get_signal_to_deliver+0x3c/0x31e
    >  [<c0102fe7>] do_notify_resume+0x91/0x6ee
    >  [<c01359fd>] ? lock_release_holdtime+0x50/0x56
    >  [<c0315688>] ? _spin_unlock_irqrestore+0x36/0x58
    >  [<c0235d24>] ? read_chan+0x0/0x58c
    >  [<c0137a29>] ? trace_hardirqs_on+0xe6/0x10d
    >  [<c0315694>] ? _spin_unlock_irqrestore+0x42/0x58
    >  [<c0230afa>] ? tty_ldisc_deref+0x5c/0x63
    >  [<c0233104>] ? tty_read+0x66/0x98
    >  [<c014b3f0>] ? audit_syscall_exit+0x2aa/0x2c5
    >  [<c0109430>] ? do_syscall_trace+0x6b/0x16f
    >  [<c0103a9c>] work_notifysig+0x13/0x1b
    >  =======================
    > ---[ end trace 25b49fe59a25afa5 ]---
    > possible reason: unannotated irqs-off.
    > irq event stamp: 58919
    > hardirqs last  enabled at (58919): [<c0103afd>] syscall_exit_work+0x11/0x26
    
    Joy - I so love entry.S
    
    Best I can make of it:
    
    syscall_exit_work
      resume_userspace
        DISABLE_INTERRUPTS
        (no TRACE_IRQS_OFF)
          work_pending
            work_notifysig
              do_notify_resume()
                do_signal()
                  get_signal_to_deliver()
                    try_to_freeze()
                      refrigerator()
                        task_lock() -> check_flags() -> BANG
    
    The normal path is:
    
    syscall_exit_work
      resume_userspace
        DISABLE_INTERRUPTS
        restore_all
          TRACE_IRQS_IRET
          iret
    
    No idea why that would not warn..
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    e32e58a9
entry_32.S 25.9 KB