x86, oprofile: BUG scheduling while atomic
nmi_shutdown() calls unregister_die_notifier() from an atomic context
after setting preempt_disable() via get_cpu_var():
[ 1049.404154] BUG: scheduling while atomic: oprofiled/7796/0x00000002
[ 1049.404171] INFO: lockdep is turned off.
[ 1049.404176] Modules linked in: oprofile af_packet rfcomm l2cap kvm_intel kvm i915 drm acpi_cpufreq cpufreq_userspace cpufreq_conservative cpufreq_ondemand cpufreq_powersave freq_table container sbs sbshc dm_mod arc4 ecb cryptomgr aead snd_hda_intel crypto_blkcipher snd_pcm_oss crypto_algapi snd_pcm iwlagn iwlcore snd_timer iTCO_wdt led_class btusb iTCO_vendor_support snd psmouse bluetooth mac80211 soundcore cfg80211 snd_page_alloc intel_agp video output button battery ac dcdbas evdev ext3 jbd mbcache sg sd_mod piix ata_piix libata scsi_mod dock tg3 libphy ehci_hcd uhci_hcd usbcore thermal processor fan fuse
[ 1049.404362] Pid: 7796, comm: oprofiled Not tainted 2.6.27-rc5-mm1 #30
[ 1049.404368] Call Trace:
[ 1049.404384] [<
ffffffff804769fd>] thread_return+0x4a0/0x7d3
[ 1049.404396] [<
ffffffff8026ad92>] generic_exec_single+0x52/0xe0
[ 1049.404405] [<
ffffffff8026ae1a>] generic_exec_single+0xda/0xe0
[ 1049.404414] [<
ffffffff8026aee3>] smp_call_function_single+0x73/0x150
[ 1049.404423] [<
ffffffff804770c5>] schedule_timeout+0x95/0xd0
[ 1049.404430] [<
ffffffff80476083>] wait_for_common+0x43/0x180
[ 1049.404438] [<
ffffffff80476154>] wait_for_common+0x114/0x180
[ 1049.404448] [<
ffffffff80236980>] default_wake_function+0x0/0x10
[ 1049.404457] [<
ffffffff8024f810>] synchronize_rcu+0x30/0x40
[ 1049.404463] [<
ffffffff8024f890>] wakeme_after_rcu+0x0/0x10
[ 1049.404472] [<
ffffffff80479ca0>] _spin_unlock_irqrestore+0x40/0x80
[ 1049.404482] [<
ffffffff80256def>] atomic_notifier_chain_unregister+0x3f/0x60
[ 1049.404501] [<
ffffffffa03d8801>] nmi_shutdown+0x51/0x90 [oprofile]
[ 1049.404517] [<
ffffffffa03d6134>] oprofile_shutdown+0x34/0x70 [oprofile]
[ 1049.404532] [<
ffffffffa03d721e>] event_buffer_release+0xe/0x40 [oprofile]
[ 1049.404543] [<
ffffffff802bdcdd>] __fput+0xcd/0x240
[ 1049.404551] [<
ffffffff802baa74>] filp_close+0x54/0x90
[ 1049.404560] [<
ffffffff8023e1d1>] put_files_struct+0xb1/0xd0
[ 1049.404568] [<
ffffffff8023f82f>] do_exit+0x18f/0x930
[ 1049.404576] [<
ffffffff8020be03>] restore_args+0x0/0x30
[ 1049.404584] [<
ffffffff80240006>] do_group_exit+0x36/0xa0
[ 1049.404592] [<
ffffffff8020b7cb>] system_call_fastpath+0x16/0x1b
This can be easily triggered with 'opcontrol --shutdown'.
Simply move get_cpu_var() above unregister_die_notifier().
Signed-off-by: Andrea Righi <righi.andrea@gmail.com>
Acked-by: Robert Richter <robert.richter@amd.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>