# git rev-parse -q --verify 751e5f5c753e8d447bcf89f9e96b9616ac081628^{commit} 751e5f5c753e8d447bcf89f9e96b9616ac081628 already have revision, skipping fetch # git checkout -q -f -B kisskb 751e5f5c753e8d447bcf89f9e96b9616ac081628 # git clean -qxdf # git log -1 commit 751e5f5c753e8d447bcf89f9e96b9616ac081628 Author: Michal Hocko Date: Fri Jan 8 11:18:29 2016 +0100 vmstat: allocate vmstat_wq before it is used kernel test robot has reported the following crash: BUG: unable to handle kernel NULL pointer dereference at 00000100 IP: [] __queue_work+0x26/0x390 *pdpt = 0000000000000000 *pde = f000ff53f000ff53 *pde = f000ff53f000ff53 Oops: 0000 [#1] PREEMPT PREEMPT SMP SMP CPU: 0 PID: 24 Comm: kworker/0:1 Not tainted 4.4.0-rc4-00139-g373ccbe #1 Workqueue: events vmstat_shepherd task: cb684600 ti: cb7ba000 task.ti: cb7ba000 EIP: 0060:[] EFLAGS: 00010046 CPU: 0 EIP is at __queue_work+0x26/0x390 EAX: 00000046 EBX: cbb37800 ECX: cbb37800 EDX: 00000000 ESI: 00000000 EDI: 00000000 EBP: cb7bbe68 ESP: cb7bbe38 DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 CR0: 8005003b CR2: 00000100 CR3: 01fd5000 CR4: 000006b0 Stack: Call Trace: __queue_delayed_work+0xa1/0x160 queue_delayed_work_on+0x36/0x60 vmstat_shepherd+0xad/0xf0 process_one_work+0x1aa/0x4c0 worker_thread+0x41/0x440 kthread+0xb0/0xd0 ret_from_kernel_thread+0x21/0x40 The reason is that start_shepherd_timer schedules the shepherd work item which uses vmstat_wq (vmstat_shepherd) before setup_vmstat allocates that workqueue so if the further initialization takes more than HZ we might end up scheduling on a NULL vmstat_wq. This is really unlikely but not impossible. Fixes: 373ccbe59270 ("mm, vmstat: allow WQ concurrency to discover memory reclaim doesn't make any progress") Reported-by: kernel test robot Signed-off-by: Michal Hocko Tested-by: Tetsuo Handa Cc: stable@vger.kernel.org Cc: Andrew Morton Signed-off-by: Linus Torvalds # < /opt/cross/gcc-4.6.3-nolibc/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc --version # < git log --format=%s --max-count=1 751e5f5c753e8d447bcf89f9e96b9616ac081628 # < make -j 240 ARCH=arm O=/home/kisskb/slave/build/linus_arm-randconfig_arm CROSS_COMPILE=/opt/cross/gcc-4.6.3-nolibc/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- randconfig KCONFIG_SEED=0xE86CEF50 warning: (ARCH_INTEGRATOR && ARCH_MULTIPLATFORM && ARCH_EP93XX) selects ARM_PATCH_PHYS_VIRT which has unmet direct dependencies (!XIP_KERNEL && MMU && (!ARCH_REALVIEW || !SPARSEMEM)) # make -j 240 ARCH=arm O=/home/kisskb/slave/build/linus_arm-randconfig_arm CROSS_COMPILE=/opt/cross/gcc-4.6.3-nolibc/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- make[1]: Entering directory `/home/kisskb/slave/build/linus_arm-randconfig_arm' GEN ./Makefile scripts/kconfig/conf --silentoldconfig Kconfig .config:330:warning: symbol value '' invalid for PAGE_OFFSET warning: (ARCH_INTEGRATOR && ARCH_MULTIPLATFORM && ARCH_EP93XX) selects ARM_PATCH_PHYS_VIRT which has unmet direct dependencies (!XIP_KERNEL && MMU && (!ARCH_REALVIEW || !SPARSEMEM)) warning: (ARCH_INTEGRATOR && ARCH_MULTIPLATFORM && ARCH_EP93XX) selects ARM_PATCH_PHYS_VIRT which has unmet direct dependencies (!XIP_KERNEL && MMU && (!ARCH_REALVIEW || !SPARSEMEM)) # # configuration written to .config # make[1]: Leaving directory `/home/kisskb/slave/build/linus_arm-randconfig_arm' make[1]: Entering directory `/home/kisskb/slave/build/linus_arm-randconfig_arm' CHK include/config/kernel.release GEN ./Makefile WRAP arch/arm/include/generated/asm/bitsperlong.h WRAP arch/arm/include/generated/asm/cputime.h WRAP arch/arm/include/generated/asm/current.h WRAP arch/arm/include/generated/asm/emergency-restart.h WRAP arch/arm/include/generated/asm/errno.h WRAP arch/arm/include/generated/asm/exec.h WRAP arch/arm/include/generated/asm/ioctl.h WRAP arch/arm/include/generated/asm/ipcbuf.h WRAP arch/arm/include/generated/asm/irq_regs.h CHK include/generated/uapi/linux/version.h WRAP arch/arm/include/generated/asm/kdebug.h WRAP arch/arm/include/generated/asm/local.h WRAP arch/arm/include/generated/asm/local64.h WRAP arch/arm/include/generated/asm/mm-arch-hooks.h WRAP arch/arm/include/generated/asm/msgbuf.h UPD include/generated/uapi/linux/version.h WRAP arch/arm/include/generated/asm/msi.h WRAP arch/arm/include/generated/asm/param.h WRAP arch/arm/include/generated/asm/parport.h WRAP arch/arm/include/generated/asm/poll.h WRAP arch/arm/include/generated/asm/preempt.h WRAP arch/arm/include/generated/asm/resource.h WRAP arch/arm/include/generated/asm/rwsem.h WRAP arch/arm/include/generated/asm/seccomp.h WRAP arch/arm/include/generated/asm/sections.h WRAP arch/arm/include/generated/asm/segment.h WRAP arch/arm/include/generated/asm/sembuf.h WRAP arch/arm/include/generated/asm/serial.h WRAP arch/arm/include/generated/asm/shmbuf.h WRAP arch/arm/include/generated/asm/siginfo.h WRAP arch/arm/include/generated/asm/sizes.h WRAP arch/arm/include/generated/asm/simd.h WRAP arch/arm/include/generated/asm/socket.h WRAP arch/arm/include/generated/asm/sockios.h UPD include/config/kernel.release WRAP arch/arm/include/generated/asm/termbits.h WRAP arch/arm/include/generated/asm/termios.h WRAP arch/arm/include/generated/asm/timex.h WRAP arch/arm/include/generated/asm/trace_clock.h WRAP arch/arm/include/generated/asm/unaligned.h HOSTCC scripts/basic/bin2c Using /home/kisskb/slave/src as source for kernel CHK include/generated/utsrelease.h UPD include/generated/utsrelease.h Generating include/generated/mach-types.h HOSTCC scripts/kallsyms HOSTCC scripts/pnmtologo HOSTCC scripts/conmakehash CC scripts/mod/empty.o HOSTCC scripts/mod/mk_elfconfig CC scripts/mod/devicetable-offsets.s CHK include/generated/timeconst.h CC kernel/bounds.s UPD include/generated/timeconst.h CHK include/generated/bounds.h UPD include/generated/bounds.h CC arch/arm/kernel/asm-offsets.s MKELF scripts/mod/elfconfig.h HOSTCC scripts/mod/modpost.o HOSTCC scripts/mod/sumversion.o GEN scripts/mod/devicetable-offsets.h HOSTCC scripts/mod/file2alias.o In file included from /home/kisskb/slave/src/arch/arm/kernel/asm-offsets.c:15:0: /home/kisskb/slave/src/include/linux/mm.h: In function 'virt_to_head_page': /home/kisskb/slave/src/include/linux/mm.h:502:1: error: invalid suffix "xUL" on integer constant In file included from /home/kisskb/slave/src/include/linux/dma-mapping.h:10:0, from /home/kisskb/slave/src/arch/arm/kernel/asm-offsets.c:16: /home/kisskb/slave/src/include/linux/scatterlist.h: In function 'sg_set_buf': /home/kisskb/slave/src/include/linux/scatterlist.h:140:1: error: invalid suffix "xUL" on integer constant /home/kisskb/slave/src/include/linux/scatterlist.h:140:1: error: invalid suffix "xUL" on integer constant /home/kisskb/slave/src/include/linux/scatterlist.h:142:1: error: invalid suffix "xUL" on integer constant In file included from /home/kisskb/slave/src/arch/arm/include/asm/dma-mapping.h:49:0, from /home/kisskb/slave/src/include/linux/dma-mapping.h:87, from /home/kisskb/slave/src/arch/arm/kernel/asm-offsets.c:16: /home/kisskb/slave/src/include/asm-generic/dma-mapping-common.h: In function 'dma_map_single_attrs': /home/kisskb/slave/src/include/asm-generic/dma-mapping-common.h:21:1: error: invalid suffix "xUL" on integer constant /home/kisskb/slave/src/include/asm-generic/dma-mapping-common.h:24:1: error: invalid suffix "xUL" on integer constant In file included from /home/kisskb/slave/src/include/linux/dma-mapping.h:87:0, from /home/kisskb/slave/src/arch/arm/kernel/asm-offsets.c:16: /home/kisskb/slave/src/arch/arm/include/asm/dma-mapping.h: In function 'virt_to_dma': /home/kisskb/slave/src/arch/arm/include/asm/dma-mapping.h:92:1: error: invalid suffix "xUL" on integer constant make[2]: *** [arch/arm/kernel/asm-offsets.s] Error 1 make[1]: *** [prepare0] Error 2 make[1]: *** Waiting for unfinished jobs.... HOSTLD scripts/mod/modpost make[1]: Leaving directory `/home/kisskb/slave/build/linus_arm-randconfig_arm' make: *** [sub-make] Error 2 Command 'make -j 240 ARCH=arm O=/home/kisskb/slave/build/linus_arm-randconfig_arm CROSS_COMPILE=/opt/cross/gcc-4.6.3-nolibc/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- ' returned non-zero exit status 2 # rm -rf /home/kisskb/slave/build/linus_arm-randconfig_arm # Build took: 0:00:05.081485