Revision c9d398fa237882ea07167e23bcfc5e6847066518 authored by Naoya Horiguchi on 31 March 2017, 22:11:55 UTC, committed by Linus Torvalds on 01 April 2017, 00:13:30 UTC
I found the race condition which triggers the following bug when
move_pages() and soft offline are called on a single hugetlb page
concurrently.

    Soft offlining page 0x119400 at 0x700000000000
    BUG: unable to handle kernel paging request at ffffea0011943820
    IP: follow_huge_pmd+0x143/0x190
    PGD 7ffd2067
    PUD 7ffd1067
    PMD 0
        [61163.582052] Oops: 0000 [#1] SMP
    Modules linked in: binfmt_misc ppdev virtio_balloon parport_pc pcspkr i2c_piix4 parport i2c_core acpi_cpufreq ip_tables xfs libcrc32c ata_generic pata_acpi virtio_blk 8139too crc32c_intel ata_piix serio_raw libata virtio_pci 8139cp virtio_ring virtio mii floppy dm_mirror dm_region_hash dm_log dm_mod [last unloaded: cap_check]
    CPU: 0 PID: 22573 Comm: iterate_numa_mo Tainted: P           OE   4.11.0-rc2-mm1+ #2
    Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
    RIP: 0010:follow_huge_pmd+0x143/0x190
    RSP: 0018:ffffc90004bdbcd0 EFLAGS: 00010202
    RAX: 0000000465003e80 RBX: ffffea0004e34d30 RCX: 00003ffffffff000
    RDX: 0000000011943800 RSI: 0000000000080001 RDI: 0000000465003e80
    RBP: ffffc90004bdbd18 R08: 0000000000000000 R09: ffff880138d34000
    R10: ffffea0004650000 R11: 0000000000c363b0 R12: ffffea0011943800
    R13: ffff8801b8d34000 R14: ffffea0000000000 R15: 000077ff80000000
    FS:  00007fc977710740(0000) GS:ffff88007dc00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: ffffea0011943820 CR3: 000000007a746000 CR4: 00000000001406f0
    Call Trace:
     follow_page_mask+0x270/0x550
     SYSC_move_pages+0x4ea/0x8f0
     SyS_move_pages+0xe/0x10
     do_syscall_64+0x67/0x180
     entry_SYSCALL64_slow_path+0x25/0x25
    RIP: 0033:0x7fc976e03949
    RSP: 002b:00007ffe72221d88 EFLAGS: 00000246 ORIG_RAX: 0000000000000117
    RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fc976e03949
    RDX: 0000000000c22390 RSI: 0000000000001400 RDI: 0000000000005827
    RBP: 00007ffe72221e00 R08: 0000000000c2c3a0 R09: 0000000000000004
    R10: 0000000000c363b0 R11: 0000000000000246 R12: 0000000000400650
    R13: 00007ffe72221ee0 R14: 0000000000000000 R15: 0000000000000000
    Code: 81 e4 ff ff 1f 00 48 21 c2 49 c1 ec 0c 48 c1 ea 0c 4c 01 e2 49 bc 00 00 00 00 00 ea ff ff 48 c1 e2 06 49 01 d4 f6 45 bc 04 74 90 <49> 8b 7c 24 20 40 f6 c7 01 75 2b 4c 89 e7 8b 47 1c 85 c0 7e 2a
    RIP: follow_huge_pmd+0x143/0x190 RSP: ffffc90004bdbcd0
    CR2: ffffea0011943820
    ---[ end trace e4f81353a2d23232 ]---
    Kernel panic - not syncing: Fatal exception
    Kernel Offset: disabled

This bug is triggered when pmd_present() returns true for non-present
hugetlb, so fixing the present check in follow_huge_pmd() prevents it.
Using pmd_present() to determine present/non-present for hugetlb is not
correct, because pmd_present() checks multiple bits (not only
_PAGE_PRESENT) for historical reason and it can misjudge hugetlb state.

Fixes: e66f17ff7177 ("mm/hugetlb: take page table lock in follow_huge_pmd()")
Link: http://lkml.kernel.org/r/1490149898-20231-1-git-send-email-n-horiguchi@ah.jp.nec.com
Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Acked-by: Hillf Danton <hillf.zj@alibaba-inc.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Cc: <stable@vger.kernel.org>        [4.0+]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 0cefabd
History
File Mode Size
dmasound
.gitignore -rw-r--r-- 47 bytes
CHANGELOG -rw-r--r-- 13.4 KB
Kconfig -rw-r--r-- 19.1 KB
Makefile -rw-r--r-- 3.3 KB
README.FIRST -rw-r--r-- 246 bytes
ad1848.c -rw-r--r-- 74.0 KB
ad1848.h -rw-r--r-- 982 bytes
ad1848_mixer.h -rw-r--r-- 10.7 KB
aedsp16.c -rw-r--r-- 35.6 KB
audio.c -rw-r--r-- 25.0 KB
bin2hex.c -rw-r--r-- 755 bytes
coproc.h -rw-r--r-- 361 bytes
dev_table.c -rw-r--r-- 5.5 KB
dev_table.h -rw-r--r-- 10.6 KB
dmabuf.c -rw-r--r-- 34.9 KB
hex2hex.c -rw-r--r-- 1.9 KB
kahlua.c -rw-r--r-- 4.9 KB
midi_ctrl.h -rw-r--r-- 1.0 KB
midi_synth.c -rw-r--r-- 14.8 KB
midi_synth.h -rw-r--r-- 1.7 KB
midibuf.c -rw-r--r-- 8.6 KB
mpu401.c -rw-r--r-- 37.6 KB
mpu401.h -rw-r--r-- 419 bytes
msnd.c -rw-r--r-- 8.2 KB
msnd.h -rw-r--r-- 7.2 KB
msnd_classic.c -rw-r--r-- 122 bytes
msnd_classic.h -rw-r--r-- 5.3 KB
msnd_pinnacle.c -rw-r--r-- 47.5 KB
msnd_pinnacle.h -rw-r--r-- 7.4 KB
opl3.c -rw-r--r-- 27.0 KB
opl3_hw.h -rw-r--r-- 6.9 KB
os.h -rw-r--r-- 944 bytes
pas2.h -rw-r--r-- 500 bytes
pas2_card.c -rw-r--r-- 9.4 KB
pas2_midi.c -rw-r--r-- 4.9 KB
pas2_mixer.c -rw-r--r-- 7.8 KB
pas2_pcm.c -rw-r--r-- 8.7 KB
pss.c -rw-r--r-- 32.3 KB
sb.h -rw-r--r-- 5.2 KB
sb_audio.c -rw-r--r-- 26.6 KB
sb_card.c -rw-r--r-- 9.7 KB
sb_card.h -rw-r--r-- 5.7 KB
sb_common.c -rw-r--r-- 28.9 KB
sb_ess.c -rw-r--r-- 51.2 KB
sb_ess.h -rw-r--r-- 887 bytes
sb_midi.c -rw-r--r-- 4.2 KB
sb_mixer.c -rw-r--r-- 19.3 KB
sb_mixer.h -rw-r--r-- 2.1 KB
sequencer.c -rw-r--r-- 33.4 KB
sleep.h -rw-r--r-- 464 bytes
sound_calls.h -rw-r--r-- 3.4 KB
sound_config.h -rw-r--r-- 3.1 KB
sound_firmware.h -rw-r--r-- 784 bytes
sound_timer.c -rw-r--r-- 6.1 KB
soundcard.c -rw-r--r-- 16.4 KB
soundvers.h -rw-r--r-- 86 bytes
swarm_cs4297a.c -rw-r--r-- 88.4 KB
sys_timer.c -rw-r--r-- 5.2 KB
trix.c -rw-r--r-- 10.9 KB
tuning.h -rw-r--r-- 1.1 KB
uart401.c -rw-r--r-- 10.4 KB
uart6850.c -rw-r--r-- 7.1 KB
ulaw.h -rw-r--r-- 3.2 KB
v_midi.c -rw-r--r-- 6.3 KB
v_midi.h -rw-r--r-- 281 bytes
vidc.c -rw-r--r-- 12.1 KB
vidc.h -rw-r--r-- 1.8 KB
vidc_fill.S -rw-r--r-- 4.3 KB
waveartist.c -rw-r--r-- 46.5 KB
waveartist.h -rw-r--r-- 2.3 KB

README.FIRST

back to top