Revision 85bd839983778fcd0c1c043327b14a046e979b39 authored by Gu Zheng on 10 June 2015, 18:14:43 UTC, committed by Linus Torvalds on 10 June 2015, 23:43:43 UTC
Izumi found the following oops when hot re-adding a node:

    BUG: unable to handle kernel paging request at ffffc90008963690
    IP: __wake_up_bit+0x20/0x70
    Oops: 0000 [#1] SMP
    CPU: 68 PID: 1237 Comm: rs:main Q:Reg Not tainted 4.1.0-rc5 #80
    Hardware name: FUJITSU PRIMEQUEST2800E/SB, BIOS PRIMEQUEST 2000 Series BIOS Version 1.87 04/28/2015
    task: ffff880838df8000 ti: ffff880017b94000 task.ti: ffff880017b94000
    RIP: 0010:[<ffffffff810dff80>]  [<ffffffff810dff80>] __wake_up_bit+0x20/0x70
    RSP: 0018:ffff880017b97be8  EFLAGS: 00010246
    RAX: ffffc90008963690 RBX: 00000000003c0000 RCX: 000000000000a4c9
    RDX: 0000000000000000 RSI: ffffea101bffd500 RDI: ffffc90008963648
    RBP: ffff880017b97c08 R08: 0000000002000020 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000000 R12: ffff8a0797c73800
    R13: ffffea101bffd500 R14: 0000000000000001 R15: 00000000003c0000
    FS:  00007fcc7ffff700(0000) GS:ffff880874800000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: ffffc90008963690 CR3: 0000000836761000 CR4: 00000000001407e0
    Call Trace:
      unlock_page+0x6d/0x70
      generic_write_end+0x53/0xb0
      xfs_vm_write_end+0x29/0x80 [xfs]
      generic_perform_write+0x10a/0x1e0
      xfs_file_buffered_aio_write+0x14d/0x3e0 [xfs]
      xfs_file_write_iter+0x79/0x120 [xfs]
      __vfs_write+0xd4/0x110
      vfs_write+0xac/0x1c0
      SyS_write+0x58/0xd0
      system_call_fastpath+0x12/0x76
    Code: 5d c3 66 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 e5 48 83 ec 20 65 48 8b 04 25 28 00 00 00 48 89 45 f8 31 c0 48 8d 47 48 <48> 39 47 48 48 c7 45 e8 00 00 00 00 48 c7 45 f0 00 00 00 00 48
    RIP  [<ffffffff810dff80>] __wake_up_bit+0x20/0x70
     RSP <ffff880017b97be8>
    CR2: ffffc90008963690

Reproduce method (re-add a node)::
  Hot-add nodeA --> remove nodeA --> hot-add nodeA (panic)

This seems an use-after-free problem, and the root cause is
zone->wait_table was not set to *NULL* after free it in
try_offline_node.

When hot re-add a node, we will reuse the pgdat of it, so does the zone
struct, and when add pages to the target zone, it will init the zone
first (including the wait_table) if the zone is not initialized.  The
judgement of zone initialized is based on zone->wait_table:

	static inline bool zone_is_initialized(struct zone *zone)
	{
		return !!zone->wait_table;
	}

so if we do not set the zone->wait_table to *NULL* after free it, the
memory hotplug routine will skip the init of new zone when hot re-add
the node, and the wait_table still points to the freed memory, then we
will access the invalid address when trying to wake up the waiting
people after the i/o operation with the page is done, such as mentioned
above.

Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com>
Reported-by: Taku Izumi <izumi.taku@jp.fujitsu.com>
Reviewed by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Tang Chen <tangchen@cn.fujitsu.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 5879ae5
History
File Mode Size
at91
bcm
berlin
hisilicon
keystone
mmp
mvebu
mxs
pistachio
pxa
qcom
rockchip
samsung
shmobile
sirf
socfpga
spear
st
sunxi
tegra
ti
ux500
versatile
x86
zynq
Kconfig -rw-r--r-- 4.3 KB
Makefile -rw-r--r-- 3.0 KB
clk-asm9260.c -rw-r--r-- 11.3 KB
clk-axi-clkgen.c -rw-r--r-- 13.8 KB
clk-axm5516.c -rw-r--r-- 13.3 KB
clk-bcm2835.c -rw-r--r-- 1.9 KB
clk-cdce706.c -rw-r--r-- 17.7 KB
clk-clps711x.c -rw-r--r-- 5.8 KB
clk-composite.c -rw-r--r-- 8.0 KB
clk-conf.c -rw-r--r-- 3.8 KB
clk-devres.c -rw-r--r-- 1.1 KB
clk-divider.c -rw-r--r-- 13.4 KB
clk-efm32gg.c -rw-r--r-- 3.2 KB
clk-fixed-factor.c -rw-r--r-- 3.6 KB
clk-fixed-rate.c -rw-r--r-- 4.0 KB
clk-fractional-divider.c -rw-r--r-- 3.1 KB
clk-gate.c -rw-r--r-- 4.2 KB
clk-gpio-gate.c -rw-r--r-- 5.0 KB
clk-highbank.c -rw-r--r-- 8.2 KB
clk-ls1x.c -rw-r--r-- 4.9 KB
clk-max-gen.c -rw-r--r-- 4.4 KB
clk-max-gen.h -rw-r--r-- 1.1 KB
clk-max77686.c -rw-r--r-- 2.4 KB
clk-max77802.c -rw-r--r-- 2.6 KB
clk-mb86s7x.c -rw-r--r-- 8.4 KB
clk-moxart.c -rw-r--r-- 2.4 KB
clk-mux.c -rw-r--r-- 4.6 KB
clk-nomadik.c -rw-r--r-- 13.6 KB
clk-nspire.c -rw-r--r-- 3.8 KB
clk-palmas.c -rw-r--r-- 7.7 KB
clk-pwm.c -rw-r--r-- 3.1 KB
clk-qoriq.c -rw-r--r-- 8.7 KB
clk-rk808.c -rw-r--r-- 4.4 KB
clk-s2mps11.c -rw-r--r-- 8.0 KB
clk-si5351.c -rw-r--r-- 41.0 KB
clk-si5351.h -rw-r--r-- 5.7 KB
clk-si570.c -rw-r--r-- 13.2 KB
clk-twl6040.c -rw-r--r-- 3.1 KB
clk-u300.c -rw-r--r-- 37.7 KB
clk-vt8500.c -rw-r--r-- 17.6 KB
clk-wm831x.c -rw-r--r-- 9.7 KB
clk-xgene.c -rw-r--r-- 14.0 KB
clk.c -rw-r--r-- 76.3 KB
clk.h -rw-r--r-- 1.0 KB
clkdev.c -rw-r--r-- 8.3 KB

back to top