https://bugzilla.kernel.org/show_bug.cgi?id=77131

            Bug ID: 77131
           Summary: acpi reset register implemented in system memory
                    cannot be mapped from interrupt context
           Product: ACPI
           Version: 2.5
    Kernel Version: v3.15-rc7 and earlier
          Hardware: x86-64
                OS: Linux
              Tree: Mainline
            Status: NEW
          Severity: high
          Priority: P1
         Component: ACPICA-Core
          Assignee: [email protected]
          Reporter: [email protected]
        Regression: No

Created attachment 137701
  --> https://bugzilla.kernel.org/attachment.cgi?id=137701&action=edit
[PATCH] if appropriate create a virtual mapping for acpi reset register

This issue was observed on a prototype system on which the ACPI reset register
is implemented in system memory, i.e. ACPI_ADR_SPACE_SYSTEM_MEMORY.  When reset
is invoked from interrupt context, a kernel BUG will be seen and depending on
the exact kernel version and the value of certain sysctl tunables, a loop
recursively attempting reset may be entered.

Steps to Reproduce:
Here is an example triggered by NMI. The same may be observed by any call to
panic or native_machine_emergency_restart with tunables properly conditioned:

# turn off kdump so reset will occur
service boot.kdump stop

# change tunables to make nmi cause panic and panic cause reset
sysctl kernel.panic_on_io_nmi=1 kernel.panic=10 kernel.printk=9

# unload any module that might intercept nmi, for example
modprobe -r hpwdt

# now externally trigger an nmi

Actual Results:
# the interesting part begins after the line containing ACPI MEMORY or I/O
RESET_REG.

[  296.236977] NMI: IOCK error (debug interrupt?) for reason 71 on CPU 0.
[  296.244170] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G            E 3.15.0-rc7
#103
[  296.252405] Hardware name: HP Prototype
[  296.262267] task: ffffffff81a13460 ti: ffffffff81a00000 task.ti:
ffffffff81a00000
[  296.270502] RIP: 0010:[<ffffffff812ea0eb>]  [<ffffffff812ea0eb>]
intel_idle+0xbb/0x140
[  296.279234] RSP: 0018:ffffffff81a01e28  EFLAGS: 00000046
[  296.285078] RAX: 0000000000000020 RBX: 0000000000000008 RCX:
0000000000000001
[  296.292928] RDX: 0000000000000000 RSI: ffffffff81a01fd8 RDI:
0000000000000000
[  296.300778] RBP: ffffffff81a01e58 R08: 000000000002c641 R09:
00000000001c34d1
[  296.308630] R10: 000000451062b316 R11: 0000000000004506 R12:
0000000000000004
[  296.316480] R13: 0000000000000020 R14: 0000000000000004 R15:
0000000000000004
[  296.324332] FS:  0000000000000000(0000) GS:ffff88207fa00000(0000)
knlGS:0000000000000000
[  296.333233] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  296.339554] CR2: ffffffffff600400 CR3: 0000000001a0e000 CR4:
00000000001407f0
[  296.347406] Stack:
[  296.349615]  ffffffff81a01e58 00000000810b6eaf ffffffff81a01ea8
ffffe8c080201f00
[  296.357791]  ffffffff81aae820 00000044aa9e8f4b ffffffff81a01ea8
ffffffff813e2252
[  296.365967]  0000000000000001 000000002a29ff70 ffffffff81a01fd8
ffffe8c080201f00
[  296.374143] Call Trace:
[  296.376837]  [<ffffffff813e2252>] cpuidle_enter_state+0x42/0xd0
[  296.383350]  [<ffffffff813e22f2>] cpuidle_enter+0x12/0x20
[  296.389298]  [<ffffffff81096641>] cpuidle_idle_call+0x101/0x1c0
[  296.395813]  [<ffffffff810968d5>] cpu_idle_loop+0x185/0x1a0
[  296.401945]  [<ffffffff8109690e>] cpu_startup_entry+0x1e/0x20
[  296.408272]  [<ffffffff814c4412>] rest_init+0x72/0x80
[  296.413839]  [<ffffffff81b211ed>] start_kernel+0x35d/0x364
[  296.419876]  [<ffffffff81b20cae>] ? repair_env_string+0x5b/0x5b
[  296.426394]  [<ffffffff814ca5f6>] ? memblock_reserve+0x49/0x4e
[  296.432815]  [<ffffffff81b205ad>] x86_64_start_reservations+0x2a/0x2c
[  296.439905]  [<ffffffff81b206f0>] x86_64_start_kernel+0x141/0x148
[  296.446609] Code: 31 d2 65 48 8b 34 25 40 b8 00 00 48 89 d1 48 8d 86 38 e0
ff ff 0f 01 c8 48 8b 86 38 e0 ff ff a8 08 75 08 b1 01 4c 89 e8 0f 01 c9 <65> 48
8b 04 25 40 b8 00 00 83 a0 3c e0 ff ff fb 0f ae f0 48 8b 
[  296.467933] Kernel panic - not syncing: NMI IOCK error: Not continuing
[  296.475116] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G            E 3.15.0-rc7
#103
[  296.483350] Hardware name: HP Prototype
[  296.493208]  0000000000000071 ffff88207fa07df8 ffffffff814cbd14
0000000000000003
[  296.501385]  ffffffff817c3708 ffff88207fa07e78 ffffffff814cba9b
ffffffff00000008
[  296.509561]  ffff88207fa07e88 ffff88207fa07e28 00000000000013a9
0000000000000000
[  296.517736] Call Trace:
[  296.520423]  <NMI>  [<ffffffff814cbd14>] dump_stack+0x49/0x5d
[  296.526768]  [<ffffffff814cba9b>] panic+0xb6/0x1e5
[  296.532045]  [<ffffffff814d10cd>] io_check_error+0x9d/0xa0
[  296.538083]  [<ffffffff814d119c>] default_do_nmi+0xcc/0x200
[  296.544215]  [<ffffffff814d1360>] do_nmi+0x90/0xe0
[  296.549488]  [<ffffffff814d0667>] end_repeat_nmi+0x1e/0x2e
[  296.555527]  [<ffffffff812ea0eb>] ? intel_idle+0xbb/0x140
[  296.561467]  [<ffffffff812ea0eb>] ? intel_idle+0xbb/0x140
[  296.567409]  [<ffffffff812ea0eb>] ? intel_idle+0xbb/0x140
[  296.573347]  <<EOE>>  [<ffffffff813e2252>] cpuidle_enter_state+0x42/0xd0
[  296.580740]  [<ffffffff813e22f2>] cpuidle_enter+0x12/0x20
[  296.586679]  [<ffffffff81096641>] cpuidle_idle_call+0x101/0x1c0
[  296.593192]  [<ffffffff810968d5>] cpu_idle_loop+0x185/0x1a0
[  296.599324]  [<ffffffff8109690e>] cpu_startup_entry+0x1e/0x20
[  296.605646]  [<ffffffff814c4412>] rest_init+0x72/0x80
[  296.611205]  [<ffffffff81b211ed>] start_kernel+0x35d/0x364
[  296.617241]  [<ffffffff81b20cae>] ? repair_env_string+0x5b/0x5b
[  296.623757]  [<ffffffff814ca5f6>] ? memblock_reserve+0x49/0x4e
[  296.630177]  [<ffffffff81b205ad>] x86_64_start_reservations+0x2a/0x2c
[  296.637264]  [<ffffffff81b206f0>] x86_64_start_kernel+0x141/0x148
[  296.645127] Kernel Offset: 0x0 from 0xffffffff81000000 (relocation range:
0xffffffff80000000-0xffffffff9fffffff)
[  296.664050] Rebooting in 10 seconds..
[  306.601201] ACPI MEMORY or I/O RESET_REG.
[  306.605859] ------------[ cut here ]------------
[  306.610940] kernel BUG at mm/vmalloc.c:1319!
[  306.615637] invalid opcode: 0000 [#1] SMP 
[  306.620160] Modules linked in: mptctl(E) mptbase(E) af_packet(E)
cpufreq_conservative(E) cpufreq_userspace(E) cpufreq_powersave(E) fuse(E)
nls_iso8859_1(E) nls_cp437(E) vfat(E) fat(E) loop(E) ipv6(E) iTCO_wdt(E)
iTCO_vendor_support(E) ixgbe(E) ptp(E) pps_core(E) lpc_ich(E) ioatdma(E)
mdio(E) ehci_pci(E) dca(E) mfd_core(E) hpilo(E) ses(E) sg(E) pcspkr(E)
enclosure(E) ipmi_si(E) acpi_cpufreq(E) ipmi_msghandler(E) rtc_cmos(E)
button(E) ext3(E) jbd(E) mbcache(E) dm_service_time(E) dm_queue_length(E)
dm_round_robin(E) dm_multipath(E) mgag200(E) ttm(E) drm_kms_helper(E) drm(E)
i2c_algo_bit(E) sysimgblt(E) sysfillrect(E) i2c_core(E) syscopyarea(E)
sd_mod(E) crc_t10dif(E) crct10dif_common(E) uhci_hcd(E) ehci_hcd(E) qla2xxx(E)
scsi_transport_fc(E) scsi_tgt(E) usbcore(E) usb_common(E) processor(E)
thermal_sys(E) hwmon(E) scsi_dh_emc(E) scsi_dh_rdac(E) scsi_dh_hp_sw(E)
scsi_dh_alua(E) scsi_dh(E) scsi_mod(E) dm_snapshot(E) dm_bufio(E) dm_mod(E)
[last unloaded: hpwdt]
[  306.714102] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G            E 3.15.0-rc7
#103
[  306.722336] Hardware name: HP Prototype
[  306.732194] task: ffffffff81a13460 ti: ffffffff81a00000 task.ti:
ffffffff81a00000
[  306.740428] RIP: 0010:[<ffffffff81155b21>]  [<ffffffff81155b21>]
__get_vm_area_node+0x141/0x150
[  306.750020] RSP: 0018:ffff88207fa07b88  EFLAGS: 00010006
[  306.755864] RAX: 0000000080110000 RBX: 0000000000000010 RCX:
ffffc90000000000
[  306.763714] RDX: 0000000000000001 RSI: 0000000000000001 RDI:
0000000000001000
[  306.771565] RBP: ffff88207fa07bd8 R08: ffffe8ffffffffff R09:
00000000000000d0
[  306.779417] R10: ffff88207150de00 R11: 0000000000000001 R12:
0000000000000001
[  306.787267] R13: 0000000000000001 R14: 00000000ffffffff R15:
00000fe0e2140000
[  306.795119] FS:  0000000000000000(0000) GS:ffff88207fa00000(0000)
knlGS:0000000000000000
[  306.804022] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  306.810342] CR2: ffffffffff600400 CR3: 0000000001a0e000 CR4:
00000000001407f0
[  306.818193] Stack:
[  306.820402]  ffff88207fa07c40 0000000000000000 ffffe8ffffffffff
ffffc90000000000
[  306.828580]  ffff88207fa07bf8 0000000000000010 00000fe0e2140028
0000000000001000
[  306.836758]  0000000000000001 00000fe0e2140000 ffff88207fa07bf8
ffffffff81155b6b
[  306.844934] Call Trace:
[  306.847621]  <NMI> 
[  306.849734]  [<ffffffff81155b6b>] get_vm_area_caller+0x3b/0x40
[  306.856374]  [<ffffffff812eadb6>] ? acpi_os_write_memory+0x73/0xcd
[  306.863180]  [<ffffffff81041483>] __ioremap_caller+0x263/0x3a0
[  306.869601]  [<ffffffff8109b1da>] ? up+0x2a/0x50
[  306.874681]  [<ffffffff812eadb6>] ? acpi_os_write_memory+0x73/0xcd
[  306.881482]  [<ffffffff810415ef>] ioremap_cache+0xf/0x20
[  306.887329]  [<ffffffff812eadb6>] acpi_os_write_memory+0x73/0xcd
[  306.893942]  [<ffffffff81313e99>] acpi_hw_write+0x47/0xd1
[  306.899886]  [<ffffffff814cbc9b>] ? printk+0x48/0x4a
[  306.905350]  [<ffffffff81315523>] acpi_reset+0x93/0xbc
[  306.911005]  [<ffffffff812ebe30>] acpi_reboot+0xb8/0xc0
[  306.916764]  [<ffffffff8102ed8a>]
native_machine_emergency_restart+0x19a/0x220
[  306.924716]  [<ffffffff8102e9e4>] machine_emergency_restart+0x14/0x20
[  306.931809]  [<ffffffff8107ad53>] emergency_restart+0x13/0x20
[  306.938133]  [<ffffffff814cbb6e>] panic+0x189/0x1e5
[  306.943500]  [<ffffffff814d10cd>] io_check_error+0x9d/0xa0
[  306.949536]  [<ffffffff814d119c>] default_do_nmi+0xcc/0x200
[  306.955669]  [<ffffffff814d1360>] do_nmi+0x90/0xe0
[  306.960942]  [<ffffffff814d0667>] end_repeat_nmi+0x1e/0x2e
[  306.966979]  [<ffffffff812ea0eb>] ? intel_idle+0xbb/0x140
[  306.972920]  [<ffffffff812ea0eb>] ? intel_idle+0xbb/0x140
[  306.978862]  [<ffffffff812ea0eb>] ? intel_idle+0xbb/0x140
[  306.984802]  <<EOE>> 
[  306.987108]  [<ffffffff813e2252>] cpuidle_enter_state+0x42/0xd0
[  306.993836]  [<ffffffff813e22f2>] cpuidle_enter+0x12/0x20
[  306.999778]  [<ffffffff81096641>] cpuidle_idle_call+0x101/0x1c0
[  307.006291]  [<ffffffff810968d5>] cpu_idle_loop+0x185/0x1a0
[  307.012423]  [<ffffffff8109690e>] cpu_startup_entry+0x1e/0x20
[  307.018746]  [<ffffffff814c4412>] rest_init+0x72/0x80
[  307.024307]  [<ffffffff81b211ed>] start_kernel+0x35d/0x364
[  307.030344]  [<ffffffff81b20cae>] ? repair_env_string+0x5b/0x5b
[  307.036860]  [<ffffffff814ca5f6>] ? memblock_reserve+0x49/0x4e
[  307.043281]  [<ffffffff81b205ad>] x86_64_start_reservations+0x2a/0x2c
[  307.050370]  [<ffffffff81b206f0>] x86_64_start_kernel+0x141/0x148
[  307.057073] Code: 05 7c 09 cb 00 01 48 89 d8 4c 8b 65 e0 48 8b 5d d8 4c 8b
6d e8 4c 8b 75 f0 4c 8b 7d f8 c9 c3 48 89 df e8 63 8f 01 00 31 db eb db <0f> 0b
eb fe 66 66 2e 0f 1f 84 00 00 00 00 00 55 41 b9 ff ff ff 
[  307.078390] RIP  [<ffffffff81155b21>] __get_vm_area_node+0x141/0x150
[  307.085393]  RSP <ffff88207fa07b88>
[  307.089229] ---[ end trace 9e8a787fe880d053 ]---

I reported this initially in the acpica.org tracker at 
    https://bugs.acpica.org/show_bug.cgi?id=1089
The response to that intial bugzilla requested I file the issue in the
kernel.org tracker.

I am attaching a patch that I constructed to avoid this issue by creating a
virtual mapping for the reset register during ACPI initialization.  By so doing
acpi_reset is made safe from interrupt context.

-- 
You are receiving this mail because:
You are watching the assignee of the bug.

------------------------------------------------------------------------------
Time is money. Stop wasting it! Get your web API in 5 minutes.
www.restlet.com/download
http://p.sf.net/sfu/restlet
_______________________________________________
acpi-bugzilla mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/acpi-bugzilla

Reply via email to