# git rev-parse -q --verify 516e35080656576b66ca844f32293adb8ecec230^{commit} 516e35080656576b66ca844f32293adb8ecec230 already have revision, skipping fetch # git checkout -q -f -B kisskb 516e35080656576b66ca844f32293adb8ecec230 # git clean -qxdf # git log -1 commit 516e35080656576b66ca844f32293adb8ecec230 Author: Paul Mackerras Date: Fri Oct 21 20:04:17 2016 +1100 powerpc/64: Fix race condition in setting lock bit in idle/wakeup code This fixes a race condition where one thread that is entering or leaving a power-saving state can inadvertently ignore the lock bit that was set by another thread, and potentially also clear it. The core_idle_lock_held function is called when the lock bit is seen to be set. It polls the lock bit until it is clear, then does a lwarx to load the word containing the lock bit and thread idle bits so it can be updated. However, it is possible that the value loaded with the lwarx has the lock bit set, even though an immediately preceding lwz loaded a value with the lock bit clear. If this happens then we go ahead and update the word despite the lock bit being set, and when called from pnv_enter_arch207_idle_mode, we will subsequently clear the lock bit. No identifiable misbehaviour has been attributed to this race. This fixes it by checking the lock bit in the value loaded by the lwarx. If it is set then we just go back and keep on polling. Fixes: b32aadc1a8ed Signed-off-by: Paul Mackerras Signed-off-by: Michael Ellerman # < /opt/cross/kisskb/gcc-5.3.0-nolibc/powerpc64-linux/bin/powerpc64-linux-gcc --version # < git log --format=%s --max-count=1 516e35080656576b66ca844f32293adb8ecec230 # < make -j 10 ARCH=powerpc O=/home/kisskb/slave/build/powerpc-fixes_powerpc-allnoconfig_powerpc-5.3 CROSS_COMPILE=/opt/cross/kisskb/gcc-5.3.0-nolibc/powerpc64-linux/bin/powerpc64-linux- allnoconfig # make -j 10 ARCH=powerpc O=/home/kisskb/slave/build/powerpc-fixes_powerpc-allnoconfig_powerpc-5.3 CROSS_COMPILE=/opt/cross/kisskb/gcc-5.3.0-nolibc/powerpc64-linux/bin/powerpc64-linux- make[1]: Entering directory '/home/kisskb/slave/build/powerpc-fixes_powerpc-allnoconfig_powerpc-5.3' GEN ./Makefile scripts/kconfig/conf --silentoldconfig Kconfig CHK include/config/kernel.release GEN ./Makefile UPD include/config/kernel.release WRAP arch/powerpc/include/generated/asm/clkdev.h WRAP arch/powerpc/include/generated/asm/div64.h WRAP arch/powerpc/include/generated/asm/export.h WRAP arch/powerpc/include/generated/asm/irq_regs.h WRAP arch/powerpc/include/generated/asm/irq_work.h WRAP arch/powerpc/include/generated/asm/local64.h WRAP arch/powerpc/include/generated/asm/mcs_spinlock.h WRAP arch/powerpc/include/generated/asm/preempt.h WRAP arch/powerpc/include/generated/asm/rwsem.h WRAP arch/powerpc/include/generated/asm/vtime.h CHK include/generated/uapi/linux/version.h UPD include/generated/uapi/linux/version.h CHK include/generated/utsrelease.h UPD include/generated/utsrelease.h Using /home/kisskb/slave/src as source for kernel HOSTCC scripts/dtc/dtc.o HOSTCC scripts/dtc/flattree.o HOSTCC scripts/dtc/fstree.o CC scripts/mod/empty.o HOSTCC scripts/mod/mk_elfconfig HOSTCC scripts/dtc/data.o HOSTCC scripts/dtc/livetree.o HOSTCC scripts/dtc/treesource.o CC scripts/mod/devicetable-offsets.s HOSTCC scripts/dtc/srcpos.o HOSTCC scripts/dtc/checks.o HOSTCC scripts/dtc/util.o GEN scripts/mod/devicetable-offsets.h SHIPPED scripts/dtc/dtc-lexer.lex.c SHIPPED scripts/dtc/dtc-parser.tab.h MKELF scripts/mod/elfconfig.h SHIPPED scripts/dtc/dtc-parser.tab.c HOSTCC scripts/mod/modpost.o HOSTCC scripts/mod/file2alias.o HOSTCC scripts/dtc/dtc-lexer.lex.o HOSTCC scripts/dtc/dtc-parser.tab.o HOSTCC scripts/mod/sumversion.o HOSTLD scripts/dtc/dtc HOSTLD scripts/mod/modpost 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/powerpc/kernel/asm-offsets.s CHK include/generated/asm-offsets.h UPD include/generated/asm-offsets.h CALL /home/kisskb/slave/src/scripts/checksyscalls.sh CC init/main.o CHK include/generated/compile.h LD usr/built-in.o CC init/do_mounts.o CC init/noinitramfs.o CC init/init_task.o UPD include/generated/compile.h CC init/version.o CC arch/powerpc/mm/fault.o LD arch/powerpc/sysdev/built-in.o AS arch/powerpc/lib/string.o LD arch/powerpc/platforms/built-in.o CC arch/powerpc/kernel/cputable.o CC arch/powerpc/mm/mem.o LD arch/powerpc/math-emu/built-in.o CC arch/powerpc/lib/alloc.o CC arch/powerpc/kernel/ptrace.o CC arch/powerpc/kernel/syscalls.o AS arch/powerpc/lib/crtsavres.o CC arch/powerpc/lib/code-patching.o CC arch/powerpc/lib/feature-fixups.o CC arch/powerpc/mm/pgtable.o CC arch/powerpc/mm/mmap.o CC arch/powerpc/mm/init_32.o CC arch/powerpc/mm/pgtable_32.o AS arch/powerpc/lib/div64.o AS arch/powerpc/lib/copy_32.o AS arch/powerpc/lib/checksum_32.o CC arch/powerpc/lib/checksum_wrappers.o CC arch/powerpc/kernel/irq.o LD arch/powerpc/crypto/built-in.o CC arch/powerpc/kernel/align.o CC arch/powerpc/mm/ppc_mmu_32.o LD arch/powerpc/net/built-in.o AS arch/powerpc/mm/hash_low_32.o LD certs/built-in.o LD init/mounts.o CC kernel/fork.o CC arch/powerpc/kernel/signal_32.o LD init/built-in.o CC kernel/exec_domain.o CC mm/filemap.o CC arch/powerpc/kernel/pmc.o LD arch/powerpc/lib/built-in.o CC arch/powerpc/mm/mmu_context_hash32.o CC kernel/panic.o CC arch/powerpc/mm/tlb_hash32.o CC arch/powerpc/mm/hugetlbpage.o CC arch/powerpc/kernel/vdso.o CC kernel/cpu.o CC fs/open.o LD ipc/built-in.o CC security/commoncap.o CC arch/powerpc/kernel/process.o CPP arch/powerpc/kernel/systbl_chk.i CC arch/powerpc/kernel/idle.o CC arch/powerpc/kernel/signal.o LD arch/powerpc/mm/built-in.o CC kernel/exit.o CC arch/powerpc/kernel/sysfs.o CC arch/powerpc/kernel/cacheinfo.o CC kernel/softirq.o CC kernel/resource.o CC arch/powerpc/kernel/time.o CC security/min_addr.o CC kernel/sysctl.o CC fs/read_write.o CC kernel/sysctl_binary.o LD crypto/built-in.o CC mm/mempool.o LD security/built-in.o LD block/built-in.o CC mm/oom_kill.o LD sound/built-in.o CC arch/powerpc/kernel/prom.o LD drivers/amba/built-in.o LD drivers/auxdisplay/built-in.o CC drivers/base/component.o LD firmware/built-in.o CC fs/file_table.o CC kernel/capability.o LD net/built-in.o CC drivers/base/core.o LD drivers/block/built-in.o CC arch/powerpc/kernel/traps.o CC arch/powerpc/kernel/setup-common.o CC kernel/ptrace.o CC drivers/base/bus.o CC drivers/base/dd.o CC mm/maccess.o CC kernel/user.o LD drivers/bus/built-in.o LD drivers/cdrom/built-in.o CC drivers/char/mem.o CC fs/super.o CC kernel/signal.o CC mm/page_alloc.o CC arch/powerpc/kernel/udbg.o CC drivers/base/syscore.o LD drivers/clk/bcm/built-in.o LD drivers/clk/mvebu/built-in.o LD drivers/clk/ti/built-in.o LD drivers/clk/built-in.o CC kernel/sys.o CC kernel/kmod.o CC mm/page-writeback.o AS arch/powerpc/kernel/misc.o CC arch/powerpc/kernel/io.o CC drivers/char/random.o CC mm/readahead.o CC drivers/base/driver.o CC fs/char_dev.o CC arch/powerpc/kernel/dma.o CC drivers/base/class.o AS arch/powerpc/kernel/misc_32.o CC lib/lockref.o CC lib/bcd.o CC lib/div64.o CC drivers/char/misc.o CC fs/stat.o CC arch/powerpc/kernel/of_platform.o CC drivers/base/platform.o CC arch/powerpc/kernel/prom_parse.o LDS arch/powerpc/kernel/vdso32/vdso32.lds VDSO32A arch/powerpc/kernel/vdso32/sigtramp.o CC lib/sort.o VDSO32A arch/powerpc/kernel/vdso32/gettimeofday.o VDSO32A arch/powerpc/kernel/vdso32/datapage.o CC lib/parser.o VDSO32A arch/powerpc/kernel/vdso32/cacheflush.o VDSO32A arch/powerpc/kernel/vdso32/note.o LD drivers/char/agp/built-in.o LD drivers/char/built-in.o VDSO32L arch/powerpc/kernel/vdso32/vdso32.so.dbg AS arch/powerpc/kernel/idle_6xx.o OBJCOPY arch/powerpc/kernel/vdso32/vdso32.so AS arch/powerpc/kernel/vdso32/vdso32_wrapper.o CC kernel/workqueue.o LD arch/powerpc/kernel/vdso32/built-in.o CC kernel/pid.o CC kernel/task_work.o CC fs/exec.o CC lib/halfmd4.o CC mm/swap.o CC fs/pipe.o AS arch/powerpc/kernel/l2cr_6xx.o CC lib/debug_locks.o AS arch/powerpc/kernel/cpu_setup_6xx.o AS arch/powerpc/kernel/entry_32.o CC arch/powerpc/kernel/setup_32.o CC lib/random32.o CC drivers/base/cpu.o CC lib/bust_spinlocks.o CC lib/kasprintf.o CC lib/bitmap.o CC lib/scatterlist.o CC arch/powerpc/kernel/pci_32.o CC arch/powerpc/kernel/pci-common.o CC drivers/base/firmware.o CC arch/powerpc/kernel/pci_of_scan.o CC arch/powerpc/kernel/iomap.o CC drivers/base/init.o CC fs/namei.o CC mm/truncate.o CC kernel/extable.o AS arch/powerpc/kernel/head_32.o CC lib/gcd.o CC drivers/base/map.o CC fs/fcntl.o CC fs/ioctl.o CC lib/lcm.o CC lib/list_sort.o CC drivers/base/devres.o CC lib/uuid.o CC lib/flex_array.o LDS arch/powerpc/kernel/vmlinux.lds CC drivers/base/attribute_container.o CC kernel/params.o CC lib/iov_iter.o CC mm/vmscan.o AS arch/powerpc/kernel/fpu.o CALL /home/kisskb/slave/src/arch/powerpc/kernel/systbl_chk.sh AS arch/powerpc/kernel/systbl.o LD arch/powerpc/kernel/built-in.o CC lib/clz_ctz.o CC lib/bsearch.o LD drivers/clocksource/built-in.o CC lib/find_bit.o LD virt/lib/built-in.o LD virt/built-in.o CC fs/readdir.o CC fs/select.o CC mm/shmem.o CC lib/llist.o CC lib/memweight.o CC drivers/base/transport_class.o CC lib/kfifo.o CC lib/percpu-refcount.o CC kernel/kthread.o CC drivers/base/topology.o CC kernel/sys_ni.o CC mm/util.o CC kernel/nsproxy.o CC kernel/notifier.o CC drivers/base/container.o CC lib/percpu_ida.o CC lib/rhashtable.o CC drivers/base/property.o CC drivers/base/cacheinfo.o CC lib/reciprocal_div.o CC kernel/ksysfs.o CC lib/once.o CC mm/mmzone.o CC mm/vmstat.o CC mm/backing-dev.o CC mm/mm_init.o CC kernel/cred.o CC mm/mmu_context.o CC fs/dcache.o CC lib/string_helpers.o CC lib/hexdump.o CC lib/kstrtox.o CC lib/pci_iomap.o CC lib/iomap_copy.o CC mm/percpu.o CC mm/slab_common.o CC mm/compaction.o CC lib/devres.o CC kernel/reboot.o LD drivers/base/power/built-in.o CC drivers/base/dma-mapping.o LD drivers/firewire/built-in.o LD drivers/firmware/broadcom/built-in.o LD drivers/firmware/meson/built-in.o LD drivers/firmware/built-in.o CC lib/hweight.o CC kernel/async.o LD drivers/gpu/drm/bridge/built-in.o LD drivers/gpu/drm/hisilicon/built-in.o LD drivers/gpu/vga/built-in.o LD drivers/gpu/drm/i2c/built-in.o CC lib/bitrev.o LD drivers/gpu/drm/omapdrm/displays/built-in.o LD drivers/gpu/drm/omapdrm/dss/built-in.o LD drivers/gpu/drm/omapdrm/built-in.o LD drivers/hwtracing/intel_th/built-in.o LD drivers/gpu/drm/panel/built-in.o LD drivers/gpu/drm/tilcdc/built-in.o LD drivers/i2c/algos/built-in.o LD drivers/gpu/drm/built-in.o LD drivers/i2c/busses/built-in.o LD drivers/gpu/built-in.o LD drivers/i2c/muxes/built-in.o LD drivers/i2c/built-in.o LD drivers/idle/built-in.o HOSTCC lib/gen_crc32table CC drivers/irqchip/irqchip.o CC lib/syscall.o CC mm/vmacache.o CC lib/atomic64.o CC lib/strncpy_from_user.o LD drivers/base/built-in.o CC lib/strnlen_user.o CC kernel/range.o CC kernel/smpboot.o CC kernel/ucount.o LD drivers/irqchip/built-in.o LD drivers/lguest/built-in.o LD drivers/macintosh/built-in.o CC kernel/irq/irqdesc.o LD drivers/media/common/b2c2/built-in.o CC mm/interval_tree.o LD drivers/media/common/saa7146/built-in.o CC fs/inode.o LD drivers/media/common/siano/built-in.o LD drivers/media/common/v4l2-tpg/built-in.o CC lib/argv_split.o LD drivers/media/common/built-in.o LD drivers/media/firewire/built-in.o LD drivers/media/i2c/soc_camera/built-in.o LD drivers/media/i2c/built-in.o LD drivers/media/mmc/siano/built-in.o LD drivers/media/mmc/built-in.o LD drivers/mfd/built-in.o CC fs/attr.o LD drivers/media/platform/omap/built-in.o LD drivers/media/platform/built-in.o LD drivers/media/pci/b2c2/built-in.o LD drivers/media/rc/keymaps/built-in.o LD drivers/media/pci/ddbridge/built-in.o LD drivers/media/rc/built-in.o LD drivers/media/pci/dm1105/built-in.o LD drivers/media/spi/built-in.o LD drivers/media/pci/mantis/built-in.o LD drivers/media/tuners/built-in.o LD drivers/media/pci/netup_unidvb/built-in.o LD drivers/media/pci/ngene/built-in.o LD drivers/media/pci/pluto2/built-in.o LD drivers/media/usb/b2c2/built-in.o LD drivers/media/pci/pt1/built-in.o LD kernel/livepatch/built-in.o LD drivers/media/usb/dvb-usb/built-in.o LD drivers/media/pci/pt3/built-in.o CC fs/bad_inode.o CC fs/file.o LD drivers/media/usb/dvb-usb-v2/built-in.o LD drivers/media/pci/saa7146/built-in.o LD drivers/media/usb/s2255/built-in.o LD drivers/media/pci/smipcie/built-in.o LD drivers/media/usb/siano/built-in.o LD drivers/media/pci/ttpci/built-in.o LD drivers/media/pci/built-in.o LD drivers/media/usb/stkwebcam/built-in.o LD drivers/media/usb/ttusb-budget/built-in.o CC kernel/irq/handle.o LD drivers/media/usb/ttusb-dec/built-in.o CC kernel/irq/manage.o LD drivers/media/usb/zr364xx/built-in.o LD drivers/media/usb/built-in.o LD drivers/media/built-in.o CC lib/chacha20.o LD drivers/misc/cb710/built-in.o LD drivers/misc/eeprom/built-in.o LD drivers/misc/lis3lv02d/built-in.o LD drivers/misc/mic/bus/built-in.o LD drivers/misc/mic/built-in.o LD drivers/misc/ti-st/built-in.o LD drivers/mmc/built-in.o LD drivers/misc/built-in.o CC fs/filesystems.o LD drivers/net/built-in.o LD drivers/nfc/built-in.o LD drivers/nvme/host/built-in.o LD drivers/nvme/target/built-in.o LD drivers/nvme/built-in.o CC mm/list_lru.o CC fs/namespace.o CC drivers/of/base.o CC drivers/of/device.o CC lib/cmdline.o CC lib/ctype.o CC lib/dec_and_lock.o CC kernel/irq/spurious.o CC lib/decompress.o CC lib/dma-noop.o CC kernel/irq/resend.o CC mm/workingset.o CC fs/seq_file.o CC fs/xattr.o CC kernel/irq/chip.o CC lib/dump_stack.o CC kernel/irq/dummychip.o CC kernel/irq/devres.o CC kernel/locking/mutex.o CC lib/earlycpio.o CC mm/debug.o CC fs/libfs.o CC lib/extable.o CC fs/fs-writeback.o CC drivers/of/platform.o CC kernel/locking/semaphore.o CC lib/fdt.o CC kernel/irq/irqdomain.o CC mm/gup.o CC lib/fdt_empty_tree.o CC lib/fdt_ro.o LD drivers/platform/built-in.o CC drivers/of/fdt.o CC drivers/pci/access.o CC lib/fdt_rw.o CC kernel/locking/rwsem.o CC kernel/locking/percpu-rwsem.o CC kernel/power/qos.o CC lib/fdt_strerror.o CC kernel/printk/printk.o LD kernel/irq/built-in.o CC lib/fdt_sw.o CC drivers/of/fdt_address.o CC lib/fdt_wip.o CC fs/pnode.o CC drivers/of/address.o CC kernel/locking/rwsem-xadd.o CC lib/flex_proportions.o CC mm/highmem.o LD drivers/power/built-in.o CC lib/idr.o CC kernel/rcu/update.o CC kernel/rcu/sync.o CC drivers/pci/bus.o LD kernel/locking/built-in.o CC kernel/sched/core.o CC fs/splice.o LD kernel/power/built-in.o CC mm/memory.o CC mm/mincore.o CC kernel/rcu/tiny.o LD kernel/printk/built-in.o CC kernel/sched/loadavg.o CC kernel/time/time.o CC drivers/of/irq.o CC lib/int_sqrt.o CC lib/ioremap.o CC drivers/pci/probe.o CC drivers/pci/host-bridge.o LD kernel/rcu/built-in.o CC lib/irq_regs.o CC kernel/dma.o CC kernel/up.o CC lib/is_single_threaded.o CC kernel/sched/clock.o CC drivers/pci/remove.o CC kernel/time/timer.o CC lib/klist.o CC drivers/of/of_pci.o LD drivers/pwm/built-in.o CC mm/mlock.o CC fs/sync.o CC kernel/sched/cputime.o CC lib/kobject.o CC mm/mmap.o CC drivers/of/of_pci_irq.o CC mm/mprotect.o CC drivers/pci/pci.o CC fs/utimes.o CC drivers/pci/pci-driver.o CC kernel/time/hrtimer.o CC kernel/sched/idle_task.o CC kernel/time/itimer.o CC lib/kobject_uevent.o CC drivers/of/of_reserved_mem.o CC kernel/sched/fair.o CC fs/stack.o CC kernel/elfcore.o CC kernel/memremap.o CC drivers/pci/search.o CC fs/fs_struct.o LD drivers/of/built-in.o CC drivers/pci/pci-sysfs.o CC drivers/pci/rom.o CC kernel/time/posix-timers.o CC lib/md5.o CC lib/nmi_backtrace.o CC fs/statfs.o CC lib/nodemask.o CC kernel/sched/rt.o CC drivers/pci/setup-res.o CC mm/mremap.o CC kernel/sched/deadline.o CC fs/fs_pin.o CC lib/plist.o CC lib/radix-tree.o CC fs/nsfs.o CC drivers/pci/irq.o CC drivers/pci/vpd.o CC kernel/sched/stop_task.o CC fs/no-block.o CC kernel/time/posix-cpu-timers.o CC mm/msync.o LD fs/devpts/built-in.o CC kernel/sched/wait.o CC kernel/sched/swait.o LD fs/exofs/built-in.o LD fs/notify/dnotify/built-in.o LD fs/notify/fanotify/built-in.o LD fs/notify/inotify/built-in.o LD fs/notify/built-in.o LD fs/quota/built-in.o CC mm/rmap.o CC mm/vmalloc.o CC fs/ramfs/inode.o CC fs/ramfs/file-mmu.o CC drivers/pci/setup-bus.o CC lib/ratelimit.o CC fs/binfmt_elf.o CC kernel/sched/completion.o CC lib/rbtree.o CC kernel/sched/idle.o CC kernel/time/timekeeping.o LD fs/ramfs/ramfs.o LD fs/ramfs/built-in.o CC lib/seq_buf.o CC kernel/time/ntp.o CC kernel/time/clocksource.o CC kernel/time/jiffies.o CC lib/sha1.o LD kernel/sched/built-in.o CC mm/pagewalk.o CC mm/pgtable-generic.o LD fs/built-in.o CC lib/show_mem.o CC kernel/time/timer_list.o CC mm/init-mm.o CC drivers/pci/vc.o CC mm/nobootmem.o CC kernel/time/timeconv.o CC lib/string.o CC lib/timerqueue.o CC mm/memblock.o CC lib/vsprintf.o CC mm/dmapool.o CC lib/win_minmax.o CC kernel/time/timecounter.o CC kernel/time/posix-clock.o CC kernel/time/alarmtimer.o CC kernel/time/clockevents.o CC kernel/time/tick-common.o CC drivers/pci/syscall.o LD drivers/soc/bcm/built-in.o LD drivers/soc/fsl/built-in.o LD drivers/soc/built-in.o LD drivers/tty/ipwireless/built-in.o LD drivers/tty/serial/built-in.o LD drivers/tty/vt/built-in.o LD drivers/tty/built-in.o LD drivers/usb/host/built-in.o LD drivers/usb/built-in.o LD drivers/video/backlight/built-in.o CC mm/slub.o LD drivers/video/fbdev/core/built-in.o LD drivers/video/fbdev/omap2/omapfb/displays/built-in.o LD drivers/video/fbdev/omap2/omapfb/dss/built-in.o LD drivers/video/fbdev/omap2/omapfb/built-in.o LD drivers/video/fbdev/omap2/built-in.o LD drivers/video/fbdev/built-in.o LD drivers/video/built-in.o CC drivers/pci/of.o LD drivers/pci/host/built-in.o GEN lib/crc32table.h CC lib/crc32.o LD kernel/time/built-in.o LD kernel/built-in.o LD drivers/pci/built-in.o LD drivers/built-in.o AR lib/lib.a EXPORTS lib/lib-ksyms.o LD lib/built-in.o LD mm/built-in.o LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o LD init/built-in.o LD vmlinux SYSMAP System.map /opt/cross/kisskb/gcc-5.3.0-nolibc/powerpc64-linux/bin/powerpc64-linux-strip -s -R .comment vmlinux -o arch/powerpc/boot/vmlinux.strip make[1]: Leaving directory '/home/kisskb/slave/build/powerpc-fixes_powerpc-allnoconfig_powerpc-5.3' Completed OK # rm -rf /home/kisskb/slave/build/powerpc-fixes_powerpc-allnoconfig_powerpc-5.3 # Build took: 0:00:26.222148