1. 16 Feb, 2018 40 commits
    • Nikolay Borisov's avatar
      btrfs: Handle btrfs_set_extent_delalloc failure in fixup worker · 4063cd56
      Nikolay Borisov authored
      commit f3038ee3 upstream.
      
      This function was introduced by 247e743c ("Btrfs: Use async helpers
      to deal with pages that have been improperly dirtied") and it didn't do
      any error handling then. This function might very well fail in ENOMEM
      situation, yet it's not handled, this could lead to inconsistent state.
      So let's handle the failure by setting the mapping error bit.
      Signed-off-by: default avatarNikolay Borisov <nborisov@suse.com>
      Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
      Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      
      4063cd56
    • Andrey Ryabinin's avatar
      lib/ubsan: add type mismatch handler for new GCC/Clang · 2617e62c
      Andrey Ryabinin authored
      commit 42440c1f upstream.
      
      UBSAN=y fails to build with new GCC/clang:
      
          arch/x86/kernel/head64.o: In function `sanitize_boot_params':
          arch/x86/include/asm/bootparam_utils.h:37: undefined reference to `__ubsan_handle_type_mismatch_v1'
      
      because Clang and GCC 8 slightly changed ABI for 'type mismatch' errors.
      Compiler now uses new __ubsan_handle_type_mismatch_v1() function with
      slightly modified 'struct type_mismatch_data'.
      
      Let's add new 'struct type_mismatch_data_common' which is independent from
      compiler's layout of 'struct type_mismatch_data'.  And make
      __ubsan_handle_type_mismatch[_v1]() functions transform compiler-dependent
      type mismatch data to our internal representation.  This way, we can
      support both old and new compilers with minimal amount of change.
      
      Link: http://lkml.kernel.org/r/20180119152853.16806-1-aryabinin@virtuozzo.comSigned-off-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Reported-by: default avatarSodagudi Prasad <psodagud@codeaurora.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2617e62c
    • Andrew Morton's avatar
      lib/ubsan.c: s/missaligned/misaligned/ · 5a5df777
      Andrew Morton authored
      commit b8fe1120 upstream.
      
      A vist from the spelling fairy.
      
      Cc: David Laight <David.Laight@ACULAB.COM>
      Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5a5df777
    • Daniel Lezcano's avatar
      clocksource/drivers/stm32: Fix kernel panic with multiple timers · c87806a8
      Daniel Lezcano authored
      commit e0aeca3d upstream.
      
      The current code hides a couple of bugs:
      
       - The global variable 'clock_event_ddata' is overwritten each time the
         init function is invoked.
      
      This is fixed with a kmemdup() instead of assigning the global variable. That
      prevents a memory corruption when several timers are defined in the DT.
      
       - The clockevent's event_handler is NULL if the time framework does
         not select the clockevent when registering it, this is fine but the init
         code generates in any case an interrupt leading to dereference this
         NULL pointer.
      
      The stm32 timer works with shadow registers, a mechanism to cache the
      registers. When a change is done in one buffered register, we need to
      artificially generate an event to force the timer to copy the content
      of the register to the shadowed register.
      
      The auto-reload register (ARR) is one of the shadowed register as well as
      the prescaler register (PSC), so in order to force the copy, we issue an
      event which in turn leads to an interrupt and the NULL dereference.
      
      This is fixed by inverting two lines where we clear the status register
      before enabling the update event interrupt.
      
      As this kernel crash is resulting from the combination of these two bugs,
      the fixes are grouped into a single patch.
      Tested-by: default avatarBenjamin Gaignard <benjamin.gaignard@st.com>
      Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
      Acked-by: default avatarBenjamin Gaignard <benjamin.gaignard@st.com>
      Cc: Alexandre Torgue <alexandre.torgue@st.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Link: http://lkml.kernel.org/r/1515418139-23276-11-git-send-email-daniel.lezcano@linaro.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c87806a8
    • Ming Lei's avatar
      blk-mq: quiesce queue before freeing queue · 392640fd
      Ming Lei authored
      commit c2856ae2 upstream.
      
      After queue is frozen, dispatch still may happen, for example:
      
      1) requests are submitted from several contexts
      2) requests from all these contexts are inserted to queue, but may dispatch
      to LLD in one of these paths, but other paths sill need to move on even all
      these requests are completed(that means blk_mq_freeze_queue_wait() returns
      at that time)
      3) dispatch after queue freezing still moves on and causes use-after-free,
      because request queue is freed
      
      This patch quiesces queue after it is frozen, and makes sure all
      in-progress dispatch are completed.
      
      This patch fixes the following kernel crash when running heavy IOs vs.
      deleting device:
      
      [   36.719251] BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
      [   36.720318] IP: kyber_has_work+0x14/0x40
      [   36.720847] PGD 254bf5067 P4D 254bf5067 PUD 255e6a067 PMD 0
      [   36.721584] Oops: 0000 [#1] PREEMPT SMP
      [   36.722105] Dumping ftrace buffer:
      [   36.722570]    (ftrace buffer empty)
      [   36.723057] Modules linked in: scsi_debug ebtable_filter ebtables ip6table_filter ip6_tables tcm_loop iscsi_target_mod target_core_file target_core_iblock target_core_pscsi target_core_mod xt_CHECKSUM iptable_mangle ipt_MASQUERADE nf_nat_masquerade_ipv4 iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack libcrc32c bridge stp llc fuse iptable_filter ip_tables sd_mod sg btrfs xor zstd_decompress zstd_compress xxhash raid6_pq mptsas mptscsih bcache crc32c_intel ahci mptbase libahci serio_raw scsi_transport_sas nvme libata shpchp lpc_ich virtio_scsi nvme_core binfmt_misc dm_mod iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi null_blk configs
      [   36.733438] CPU: 2 PID: 2374 Comm: fio Not tainted 4.15.0-rc2.blk_mq_quiesce+ #714
      [   36.735143] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.9.3-1.fc25 04/01/2014
      [   36.736688] RIP: 0010:kyber_has_work+0x14/0x40
      [   36.737515] RSP: 0018:ffffc9000209bca0 EFLAGS: 00010202
      [   36.738431] RAX: 0000000000000008 RBX: ffff88025578bfc8 RCX: ffff880257bf4ed0
      [   36.739581] RDX: 0000000000000038 RSI: ffffffff81a98c6d RDI: ffff88025578bfc8
      [   36.740730] RBP: ffff880253cebfc8 R08: ffffc9000209bda0 R09: ffff8802554f3480
      [   36.741885] R10: ffffc9000209be60 R11: ffff880263f72538 R12: ffff88025573e9e8
      [   36.743036] R13: ffff88025578bfd0 R14: 0000000000000001 R15: 0000000000000000
      [   36.744189] FS:  00007f9b9bee67c0(0000) GS:ffff88027fc80000(0000) knlGS:0000000000000000
      [   36.746617] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [   36.748483] CR2: 0000000000000008 CR3: 0000000254bf4001 CR4: 00000000003606e0
      [   36.750164] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [   36.751455] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      [   36.752796] Call Trace:
      [   36.753992]  blk_mq_do_dispatch_sched+0x7f/0xe0
      [   36.755110]  blk_mq_sched_dispatch_requests+0x119/0x190
      [   36.756179]  __blk_mq_run_hw_queue+0x83/0x90
      [   36.757144]  __blk_mq_delay_run_hw_queue+0xaf/0x110
      [   36.758046]  blk_mq_run_hw_queue+0x24/0x70
      [   36.758845]  blk_mq_flush_plug_list+0x1e7/0x270
      [   36.759676]  blk_flush_plug_list+0xd6/0x240
      [   36.760463]  blk_finish_plug+0x27/0x40
      [   36.761195]  do_io_submit+0x19b/0x780
      [   36.761921]  ? entry_SYSCALL_64_fastpath+0x1a/0x7d
      [   36.762788]  entry_SYSCALL_64_fastpath+0x1a/0x7d
      [   36.763639] RIP: 0033:0x7f9b9699f697
      [   36.764352] RSP: 002b:00007ffc10f991b8 EFLAGS: 00000206 ORIG_RAX: 00000000000000d1
      [   36.765773] RAX: ffffffffffffffda RBX: 00000000008f6f00 RCX: 00007f9b9699f697
      [   36.766965] RDX: 0000000000a5e6c0 RSI: 0000000000000001 RDI: 00007f9b8462a000
      [   36.768377] RBP: 0000000000000000 R08: 0000000000000001 R09: 00000000008f6420
      [   36.769649] R10: 00007f9b846e5000 R11: 0000000000000206 R12: 00007f9b795d6a70
      [   36.770807] R13: 00007f9b795e4140 R14: 00007f9b795e3fe0 R15: 0000000100000000
      [   36.771955] Code: 83 c7 10 e9 3f 68 d1 ff 0f 1f 44 00 00 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 8b 97 b0 00 00 00 48 8d 42 08 48 83 c2 38 <48> 3b 00 74 06 b8 01 00 00 00 c3 48 3b 40 08 75 f4 48 83 c0 10
      [   36.775004] RIP: kyber_has_work+0x14/0x40 RSP: ffffc9000209bca0
      [   36.776012] CR2: 0000000000000008
      [   36.776690] ---[ end trace 4045cbce364ff2a4 ]---
      [   36.777527] Kernel panic - not syncing: Fatal exception
      [   36.778526] Dumping ftrace buffer:
      [   36.779313]    (ftrace buffer empty)
      [   36.780081] Kernel Offset: disabled
      [   36.780877] ---[ end Kernel panic - not syncing: Fatal exception
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Tested-by: default avatarYi Zhang <yi.zhang@redhat.com>
      Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      392640fd
    • Bart Van Assche's avatar
      pktcdvd: Fix a recently introduced NULL pointer dereference · c8468680
      Bart Van Assche authored
      commit 882d4171 upstream.
      
      Call bdev_get_queue(bdev) after bdev->bd_disk has been initialized
      instead of just before that pointer has been initialized. This patch
      avoids that the following command
      
      pktsetup 1 /dev/sr0
      
      triggers the following kernel crash:
      
      BUG: unable to handle kernel NULL pointer dereference at 0000000000000548
      IP: pkt_setup_dev+0x2db/0x670 [pktcdvd]
      CPU: 2 PID: 724 Comm: pktsetup Not tainted 4.15.0-rc4-dbg+ #1
      Call Trace:
       pkt_ctl_ioctl+0xce/0x1c0 [pktcdvd]
       do_vfs_ioctl+0x8e/0x670
       SyS_ioctl+0x3c/0x70
       entry_SYSCALL_64_fastpath+0x23/0x9a
      Reported-by: default avatarMaciej S. Szmigiero <mail@maciej.szmigiero.name>
      Fixes: commit ca18d6f7 ("block: Make most scsi_req_init() calls implicit")
      Signed-off-by: default avatarBart Van Assche <bart.vanassche@wdc.com>
      Tested-by: default avatarMaciej S. Szmigiero <mail@maciej.szmigiero.name>
      Cc: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c8468680
    • Bart Van Assche's avatar
      pktcdvd: Fix pkt_setup_dev() error path · 030dcf7d
      Bart Van Assche authored
      commit 5a0ec388 upstream.
      
      Commit 523e1d39 ("block: make gendisk hold a reference to its queue")
      modified add_disk() and disk_release() but did not update any of the
      error paths that trigger a put_disk() call after disk->queue has been
      assigned. That introduced the following behavior in the pktcdvd driver
      if pkt_new_dev() fails:
      
      Kernel BUG at 00000000e98fd882 [verbose debug info unavailable]
      
      Since disk_release() calls blk_put_queue() anyway if disk->queue != NULL,
      fix this by removing the blk_cleanup_queue() call from the pkt_setup_dev()
      error path.
      
      Fixes: commit 523e1d39 ("block: make gendisk hold a reference to its queue")
      Signed-off-by: default avatarBart Van Assche <bart.vanassche@wdc.com>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      030dcf7d
    • Peter Rosin's avatar
      pinctrl: sx150x: Add a static gpio/pinctrl pin range mapping · f04fe119
      Peter Rosin authored
      commit b930151e upstream.
      
      Without such a range, gpiolib fails with -EPROBE_DEFER, pending the
      addition of the range. So, without a range, gpiolib will keep
      deferring indefinitely.
      
      Fixes: 9e80f906 ("pinctrl: Add SX150X GPIO Extender Pinctrl Driver")
      Fixes: e10f72bf ("gpio: gpiolib: Generalise state persistence beyond sleep")
      Suggested-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarPeter Rosin <peda@axentia.se>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f04fe119
    • Peter Rosin's avatar
      pinctrl: sx150x: Register pinctrl before adding the gpiochip · 5219eedf
      Peter Rosin authored
      commit 1a1d39e1 upstream.
      
      Various gpiolib activity depend on the pinctrl to be up and kicking.
      Therefore, register the pinctrl before adding a gpiochip.
      Suggested-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarPeter Rosin <peda@axentia.se>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5219eedf
    • Peter Rosin's avatar
      pinctrl: sx150x: Unregister the pinctrl on release · 89cad3fa
      Peter Rosin authored
      commit 0657cb50 upstream.
      
      There is no matching call to pinctrl_unregister, so switch to the
      managed devm_pinctrl_register to clean up properly when done.
      
      Fixes: 9e80f906 ("pinctrl: Add SX150X GPIO Extender Pinctrl Driver")
      Signed-off-by: default avatarPeter Rosin <peda@axentia.se>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      89cad3fa
    • Dmitry Mastykin's avatar
      pinctrl: mcp23s08: fix irq setup order · 688d1b8c
      Dmitry Mastykin authored
      commit 02e389e6 upstream.
      
      When using mcp23s08 module with gpio-keys, often (50% of boots)
      it fails to get irq numbers with message:
      "gpio-keys keys: Unable to get irq number for GPIO 0, error -6".
      Seems that irqs must be setup before devm_gpiochip_add_data().
      Signed-off-by: default avatarDmitry Mastykin <mastichi@gmail.com>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      688d1b8c
    • Mika Westerberg's avatar
      pinctrl: intel: Initialize GPIO properly when used through irqchip · 05c9297f
      Mika Westerberg authored
      commit f5a26acf upstream.
      
      When a GPIO is requested using gpiod_get_* APIs the intel pinctrl driver
      switches the pin to GPIO mode and makes sure interrupts are routed to
      the GPIO hardware instead of IOAPIC. However, if the GPIO is used
      directly through irqchip, as is the case with many I2C-HID devices where
      I2C core automatically configures interrupt for the device, the pin is
      not initialized as GPIO. Instead we rely that the BIOS configures the
      pin accordingly which seems not to be the case at least in Asus X540NA
      SKU3 with Focaltech touchpad.
      
      When the pin is not properly configured it might result weird behaviour
      like interrupts suddenly stop firing completely and the touchpad stops
      responding to user input.
      
      Fix this by properly initializing the pin to GPIO mode also when it is
      used directly through irqchip.
      
      Fixes: 7981c001 ("pinctrl: intel: Add Intel Sunrisepoint pin controller and GPIO support")
      Reported-by: default avatarDaniel Drake <drake@endlessm.com>
      Reported-and-tested-by: default avatarChris Chiu <chiu@endlessm.com>
      Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      05c9297f
    • James Hogan's avatar
      EDAC, octeon: Fix an uninitialized variable warning · bed938ba
      James Hogan authored
      commit 544e9258 upstream.
      
      Fix an uninitialized variable warning in the Octeon EDAC driver, as seen
      in MIPS cavium_octeon_defconfig builds since v4.14 with Codescape GNU
      Tools 2016.05-03:
      
        drivers/edac/octeon_edac-lmc.c In function ‘octeon_lmc_edac_poll_o2’:
        drivers/edac/octeon_edac-lmc.c:87:24: warning: ‘((long unsigned int*)&int_reg)[1]’ may \
          be used uninitialized in this function [-Wmaybe-uninitialized]
          if (int_reg.s.sec_err || int_reg.s.ded_err) {
                              ^
      Iinitialise the whole int_reg variable to zero before the conditional
      assignments in the error injection case.
      Signed-off-by: default avatarJames Hogan <jhogan@kernel.org>
      Acked-by: default avatarDavid Daney <david.daney@cavium.com>
      Cc: linux-edac <linux-edac@vger.kernel.org>
      Cc: linux-mips@linux-mips.org
      Fixes: 1bc021e8 ("EDAC: Octeon: Add error injection support")
      Link: http://lkml.kernel.org/r/20171113161206.20990-1-james.hogan@mips.comSigned-off-by: default avatarBorislav Petkov <bp@suse.de>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bed938ba
    • Max Filippov's avatar
      xtensa: fix futex_atomic_cmpxchg_inatomic · e68d638e
      Max Filippov authored
      commit ca474809 upstream.
      
      Return 0 if the operation was successful, not the userspace memory
      value. Check that userspace value equals passed oldval, not itself.
      Don't update *uval if the value wasn't read from userspace memory.
      
      This fixes process hang due to infinite loop in futex_lock_pi.
      It also fixes a bunch of glibc tests nptl/tst-mutexpi*.
      Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e68d638e
    • Mikulas Patocka's avatar
      alpha: fix formating of stack content · 12ab9e1e
      Mikulas Patocka authored
      commit 4b01abdb upstream.
      
      Since version 4.9, the kernel automatically breaks printk calls into
      multiple newlines unless pr_cont is used. Fix the alpha stacktrace code,
      so that it prints stack trace in four columns, as it was initially
      intended.
      Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: default avatarMatt Turner <mattst88@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      12ab9e1e
    • Mikulas Patocka's avatar
      alpha: fix reboot on Avanti platform · bef0563f
      Mikulas Patocka authored
      commit 55fc633c upstream.
      
      We need to define NEED_SRM_SAVE_RESTORE on the Avanti, otherwise we get
      machine check exception when attempting to reboot the machine.
      Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: default avatarMatt Turner <mattst88@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bef0563f
    • Michael Cree's avatar
      alpha: Fix mixed up args in EXC macro in futex operations · 371c5ada
      Michael Cree authored
      commit 84e45536 upstream.
      
      Fix the typo (mixed up arguments) in the EXC macro in the futex
      definitions introduced by commit ca282f69 (alpha: add a
      helper for emitting exception table entries).
      Signed-off-by: default avatarMichael Cree <mcree@orcon.net.nz>
      Signed-off-by: default avatarMatt Turner <mattst88@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      371c5ada
    • Arnd Bergmann's avatar
      alpha: osf_sys.c: fix put_tv32 regression · 90d17505
      Arnd Bergmann authored
      commit 47669fb6 upstream.
      
      There was a typo in the new version of put_tv32() that caused an unguarded
      access of a user space pointer, and failed to return the correct result in
      gettimeofday(), wait4(), usleep_thread() and old_adjtimex().
      
      This fixes it to give the correct behavior again.
      
      Fixes: 1cc6c463 ("osf_sys.c: switch handling of timeval32/itimerval32 to copy_{to,from}_user()")
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      90d17505
    • Mikulas Patocka's avatar
      alpha: fix crash if pthread_create races with signal delivery · 632a537b
      Mikulas Patocka authored
      commit 21ffceda upstream.
      
      On alpha, a process will crash if it attempts to start a thread and a
      signal is delivered at the same time. The crash can be reproduced with
      this program: https://cygwin.com/ml/cygwin/2014-11/msg00473.html
      
      The reason for the crash is this:
      * we call the clone syscall
      * we go to the function copy_process
      * copy process calls copy_thread_tls, it is a wrapper around copy_thread
      * copy_thread sets the tls pointer: childti->pcb.unique = regs->r20
      * copy_thread sets regs->r20 to zero
      * we go back to copy_process
      * copy process checks "if (signal_pending(current))" and returns
        -ERESTARTNOINTR
      * the clone syscall is restarted, but this time, regs->r20 is zero, so
        the new thread is created with zero tls pointer
      * the new thread crashes in start_thread when attempting to access tls
      
      The comment in the code says that setting the register r20 is some
      compatibility with OSF/1. But OSF/1 doesn't use the CLONE_SETTLS flag, so
      we don't have to zero r20 if CLONE_SETTLS is set. This patch fixes the bug
      by zeroing regs->r20 only if CLONE_SETTLS is not set.
      Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: default avatarMatt Turner <mattst88@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      632a537b
    • Eric W. Biederman's avatar
      signal/sh: Ensure si_signo is initialized in do_divide_error · 16256f26
      Eric W. Biederman authored
      commit 0e88bb00 upstream.
      
      Set si_signo.
      
      Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
      Cc: Rich Felker <dalias@libc.org>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: linux-sh@vger.kernel.org
      Fixes: 0983b318 ("sh: Wire up division and address error exceptions on SH-2A.")
      Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      16256f26
    • Eric W. Biederman's avatar
      signal/openrisc: Fix do_unaligned_access to send the proper signal · 34ad5909
      Eric W. Biederman authored
      commit 500d5830 upstream.
      
      While reviewing the signal sending on openrisc the do_unaligned_access
      function stood out because it is obviously wrong.  A comment about an
      si_code set above when actually si_code is never set.  Leading to a
      random si_code being sent to userspace in the event of an unaligned
      access.
      
      Looking further SIGBUS BUS_ADRALN is the proper pair of signal and
      si_code to send for an unaligned access. That is what other
      architectures do and what is required by posix.
      
      Given that do_unaligned_access is broken in a way that no one can be
      relying on it on openrisc fix the code to just do the right thing.
      
      Fixes: 769a8a96 ("OpenRISC: Traps")
      Cc: Jonas Bonn <jonas@southpole.se>
      Cc: Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
      Cc: Stafford Horne <shorne@gmail.com>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Cc: openrisc@lists.librecores.org
      Acked-by: default avatarStafford Horne <shorne@gmail.com>
      Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      34ad5909
    • John Garry's avatar
      ipmi: use dynamic memory for DMI driver override · 765ae618
      John Garry authored
      commit 5516e21a upstream.
      
      Currently a crash can be seen if we reach the "err"
      label in dmi_add_platform_ipmi(), calling
      platform_device_put(), like here:
      [    7.270584]  (null): ipmi:dmi: Unable to add resources: -16
      [    7.330229] ------------[ cut here ]------------
      [    7.334889] kernel BUG at mm/slub.c:3894!
      [    7.338936] Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
      [    7.344475] Modules linked in:
      [    7.347556] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 4.15.0-rc2-00004-gbe9cb7b-dirty #114
      [    7.355907] Hardware name: Huawei Taishan 2280 /D05, BIOS Hisilicon D05 IT17 Nemo 2.0 RC0 11/29/2017
      [    7.365137] task: 00000000c211f6d3 task.stack: 00000000f276e9af
      [    7.371116] pstate: 60000005 (nZCv daif -PAN -UAO)
      [    7.375957] pc : kfree+0x194/0x1b4
      [    7.379389] lr : platform_device_release+0xcc/0xd8
      [    7.384225] sp : ffff0000092dba90
      [    7.387567] x29: ffff0000092dba90 x28: ffff000008a83000
      [    7.392933] x27: ffff0000092dbc10 x26: 00000000000000e6
      [    7.398297] x25: 0000000000000003 x24: ffff0000085b51e8
      [    7.403662] x23: 0000000000000100 x22: ffff7e0000234cc0
      [    7.409027] x21: ffff000008af3660 x20: ffff8017d21acc10
      [    7.414392] x19: ffff8017d21acc00 x18: 0000000000000002
      [    7.419757] x17: 0000000000000001 x16: 0000000000000008
      [    7.425121] x15: 0000000000000001 x14: 6666666678303d65
      [    7.430486] x13: 6469727265766f5f x12: 7265766972642e76
      [    7.435850] x11: 6564703e2d617020 x10: 6530326435373638
      [    7.441215] x9 : 3030303030303030 x8 : 3d76656420657361
      [    7.446580] x7 : ffff000008f59df8 x6 : ffff8017fbe0ea50
      [    7.451945] x5 : 0000000000000000 x4 : 0000000000000000
      [    7.457309] x3 : ffffffffffffffff x2 : 0000000000000000
      [    7.462674] x1 : 0fffc00000000800 x0 : ffff7e0000234ce0
      [    7.468039] Process swapper/0 (pid: 1, stack limit = 0x00000000f276e9af)
      [    7.474809] Call trace:
      [    7.477272]  kfree+0x194/0x1b4
      [    7.480351]  platform_device_release+0xcc/0xd8
      [    7.484837]  device_release+0x34/0x90
      [    7.488531]  kobject_put+0x70/0xcc
      [    7.491961]  put_device+0x14/0x1c
      [    7.495304]  platform_device_put+0x14/0x1c
      [    7.499439]  dmi_add_platform_ipmi+0x348/0x3ac
      [    7.503923]  scan_for_dmi_ipmi+0xfc/0x10c
      [    7.507970]  do_one_initcall+0x38/0x124
      [    7.511840]  kernel_init_freeable+0x188/0x228
      [    7.516238]  kernel_init+0x10/0x100
      [    7.519756]  ret_from_fork+0x10/0x18
      [    7.523362] Code: f94002c0 37780080 f94012c0 37000040 (d4210000)
      [    7.529552] ---[ end trace 11750e4787deef9e ]---
      [    7.534228] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
      [    7.534228]
      
      This is because when the device is released in
      platform_device_release(), we try to free
      pdev.driver_override. This is a const string, hence
      the crash.
      Fix by using dynamic memory for pdev->driver_override.
      Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
      [Removed the free of driver_override from ipmi_si_remove_by_dev().  The
       free is done in platform_device_release(), and would result in a double
       free, and ipmi_si_remove_by_dev() is called by non-platform devices.]
      Signed-off-by: default avatarCorey Minyard <cminyard@mvista.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      765ae618
    • Hans de Goede's avatar
      Bluetooth: btusb: Restore QCA Rome suspend/resume fix with a "rewritten" version · fed016a7
      Hans de Goede authored
      commit 61f5acea upstream.
      
      Commit 7d06d589 ("Revert "Bluetooth: btusb: fix QCA...suspend/resume"")
      removed the setting of the BTUSB_RESET_RESUME quirk for QCA Rome devices,
      instead favoring adding USB_QUIRK_RESET_RESUME quirks in usb/core/quirks.c.
      
      This was done because the DIY BTUSB_RESET_RESUME reset-resume handling
      has several issues (see the original commit message). An added advantage
      of moving over to the USB-core reset-resume handling is that it also
      disables autosuspend for these devices, which is similarly broken on these.
      
      But there are 2 issues with this approach:
      1) It leaves the broken DIY BTUSB_RESET_RESUME code in place for Realtek
         devices.
      2) Sofar only 2 of the 10 QCA devices known to the btusb code have been
         added to usb/core/quirks.c and if we fix the Realtek case the same way
         we need to add an additional 14 entries. So in essence we need to
         duplicate a large part of the usb_device_id table in btusb.c in
         usb/core/quirks.c and manually keep them in sync.
      
      This commit instead restores setting a reset-resume quirk for QCA devices
      in the btusb.c code, avoiding the duplicate usb_device_id table problem.
      
      This commit avoids the problems with the original DIY BTUSB_RESET_RESUME
      code by simply setting the USB_QUIRK_RESET_RESUME quirk directly on the
      usb_device.
      
      This commit also moves the BTUSB_REALTEK case over to directly setting the
      USB_QUIRK_RESET_RESUME on the usb_device and removes the now unused
      BTUSB_RESET_RESUME code.
      
      BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1514836
      Fixes: 7d06d589 ("Revert "Bluetooth: btusb: fix QCA...suspend/resume"")
      Cc: Leif Liddy <leif.linux@gmail.com>
      Cc: Matthias Kaehlcke <mka@chromium.org>
      Cc: Brian Norris <briannorris@chromium.org>
      Cc: Daniel Drake <drake@endlessm.com>
      Cc: Kai-Heng Feng <kai.heng.feng@canonical.com>
      Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      fed016a7
    • Kai-Heng Feng's avatar
      Revert "Bluetooth: btusb: fix QCA Rome suspend/resume" · 2a2ee0c1
      Kai-Heng Feng authored
      commit 7d06d589 upstream.
      
      This reverts commit fd865802.
      
      This commit causes a regression on some QCA ROME chips. The USB device
      reset happens in btusb_open(), hence firmware loading gets interrupted.
      
      Furthermore, this commit stops working after commit
      ("a0085f25 Bluetooth: btusb: driver to
      enable the usb-wakeup feature"). Reset-resume quirk only gets enabled in
      btusb_suspend() when it's not a wakeup source.
      
      If we really want to reset the USB device, we need to do it before
      btusb_open(). Let's handle it in drivers/usb/core/quirks.c.
      
      Cc: Leif Liddy <leif.linux@gmail.com>
      Cc: Matthias Kaehlcke <mka@chromium.org>
      Cc: Brian Norris <briannorris@chromium.org>
      Cc: Daniel Drake <drake@endlessm.com>
      Signed-off-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
      Reviewed-by: default avatarBrian Norris <briannorris@chromium.org>
      Tested-by: default avatarBrian Norris <briannorris@chromium.org>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2a2ee0c1
    • Hans de Goede's avatar
      Bluetooth: btsdio: Do not bind to non-removable BCM43341 · ed72fcf6
      Hans de Goede authored
      commit b4cdaba2 upstream.
      
      BCM43341 devices soldered onto the PCB (non-removable) always (AFAICT)
      use an UART connection for bluetooth. But they also advertise btsdio
      support on their 3th sdio function, this causes 2 problems:
      
      1) A non functioning BT HCI getting registered
      
      2) Since the btsdio driver does not have suspend/resume callbacks,
      mmc_sdio_pre_suspend will return -ENOSYS, causing mmc_pm_notify()
      to react as if the SDIO-card is removed and since the slot is
      marked as non-removable it will never get detected as inserted again.
      Which results in wifi no longer working after a suspend/resume.
      
      This commit fixes both by making btsdio ignore BCM43341 devices
      when connected to a slot which is marked non-removable.
      Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ed72fcf6
    • Hans de Goede's avatar
      HID: quirks: Fix keyboard + touchpad on Toshiba Click Mini not working · 0e4ac4ae
      Hans de Goede authored
      commit edfc3722 upstream.
      
      The Toshiba Click Mini uses an i2c attached keyboard/touchpad combo
      (single i2c_hid device for both) which has a vid:pid of 04F3:0401,
      which is also used by a bunch of Elan touchpads which are handled by the
      drivers/input/mouse/elan_i2c driver, but that driver deals with pure
      touchpads and does not work for a combo device such as the one on the
      Toshiba Click Mini.
      
      The combo on the Mini has an ACPI id of ELAN0800, which is not claimed
      by the elan_i2c driver, so check for that and if it is found do not ignore
      the device. This fixes the keyboard/touchpad combo on the Mini not working
      (although with the touchpad in mouse emulation mode).
      Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0e4ac4ae
    • Eric Biggers's avatar
      pipe: fix off-by-one error when checking buffer limits · 703b37d8
      Eric Biggers authored
      commit 9903a91c upstream.
      
      With pipe-user-pages-hard set to 'N', users were actually only allowed up
      to 'N - 1' buffers; and likewise for pipe-user-pages-soft.
      
      Fix this to allow up to 'N' buffers, as would be expected.
      
      Link: http://lkml.kernel.org/r/20180111052902.14409-5-ebiggers3@gmail.com
      Fixes: b0b91d18 ("pipe: fix limit checking in pipe_set_size()")
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Acked-by: default avatarWilly Tarreau <w@1wt.eu>
      Acked-by: default avatarKees Cook <keescook@chromium.org>
      Acked-by: default avatarJoe Lawrence <joe.lawrence@redhat.com>
      Cc: Alexander Viro <viro@zeniv.linux.org.uk>
      Cc: "Luis R . Rodriguez" <mcgrof@kernel.org>
      Cc: Michael Kerrisk <mtk.manpages@gmail.com>
      Cc: Mikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      703b37d8
    • Eric Biggers's avatar
      pipe: actually allow root to exceed the pipe buffer limits · a125e9a4
      Eric Biggers authored
      commit 85c2dd54 upstream.
      
      pipe-user-pages-hard and pipe-user-pages-soft are only supposed to apply
      to unprivileged users, as documented in both Documentation/sysctl/fs.txt
      and the pipe(7) man page.
      
      However, the capabilities are actually only checked when increasing a
      pipe's size using F_SETPIPE_SZ, not when creating a new pipe.  Therefore,
      if pipe-user-pages-hard has been set, the root user can run into it and be
      unable to create pipes.  Similarly, if pipe-user-pages-soft has been set,
      the root user can run into it and have their pipes limited to 1 page each.
      
      Fix this by allowing the privileged override in both cases.
      
      Link: http://lkml.kernel.org/r/20180111052902.14409-4-ebiggers3@gmail.com
      Fixes: 759c0114 ("pipe: limit the per-user amount of pages allocated in pipes")
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Acked-by: default avatarKees Cook <keescook@chromium.org>
      Acked-by: default avatarJoe Lawrence <joe.lawrence@redhat.com>
      Cc: Alexander Viro <viro@zeniv.linux.org.uk>
      Cc: "Luis R . Rodriguez" <mcgrof@kernel.org>
      Cc: Michael Kerrisk <mtk.manpages@gmail.com>
      Cc: Mikulas Patocka <mpatocka@redhat.com>
      Cc: Willy Tarreau <w@1wt.eu>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a125e9a4
    • Eric Biggers's avatar
      kernel/relay.c: revert "kernel/relay.c: fix potential memory leak" · 75526a9b
      Eric Biggers authored
      commit a1be1f39 upstream.
      
      This reverts commit ba62bafe ("kernel/relay.c: fix potential memory leak").
      
      This commit introduced a double free bug, because 'chan' is already
      freed by the line:
      
          kref_put(&chan->kref, relay_destroy_channel);
      
      This bug was found by syzkaller, using the BLKTRACESETUP ioctl.
      
      Link: http://lkml.kernel.org/r/20180127004759.101823-1-ebiggers3@gmail.com
      Fixes: ba62bafe ("kernel/relay.c: fix potential memory leak")
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
      Reviewed-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Cc: Zhouyi Zhou <yizhouzhou@ict.ac.cn>
      Cc: Jens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      75526a9b
    • Rasmus Villemoes's avatar
      kernel/async.c: revert "async: simplify lowest_in_progress()" · 838f9cc9
      Rasmus Villemoes authored
      commit 4f7e988e upstream.
      
      This reverts commit 92266d6e ("async: simplify lowest_in_progress()")
      which was simply wrong: In the case where domain is NULL, we now use the
      wrong offsetof() in the list_first_entry macro, so we don't actually
      fetch the ->cookie value, but rather the eight bytes located
      sizeof(struct list_head) further into the struct async_entry.
      
      On 64 bit, that's the data member, while on 32 bit, that's a u64 built
      from func and data in some order.
      
      I think the bug happens to be harmless in practice: It obviously only
      affects callers which pass a NULL domain, and AFAICT the only such
      caller is
      
        async_synchronize_full() ->
        async_synchronize_full_domain(NULL) ->
        async_synchronize_cookie_domain(ASYNC_COOKIE_MAX, NULL)
      
      and the ASYNC_COOKIE_MAX means that in practice we end up waiting for
      the async_global_pending list to be empty - but it would break if
      somebody happened to pass (void*)-1 as the data element to
      async_schedule, and of course also if somebody ever does a
      async_synchronize_cookie_domain(, NULL) with a "finite" cookie value.
      
      Maybe the "harmless in practice" means this isn't -stable material.  But
      I'm not completely confident my quick git grep'ing is enough, and there
      might be affected code in one of the earlier kernels that has since been
      removed, so I'll leave the decision to the stable guys.
      
      Link: http://lkml.kernel.org/r/20171128104938.3921-1-linux@rasmusvillemoes.dk
      Fixes: 92266d6e "async: simplify lowest_in_progress()"
      Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
      Acked-by: default avatarTejun Heo <tj@kernel.org>
      Cc: Arjan van de Ven <arjan@linux.intel.com>
      Cc: Adam Wallis <awallis@codeaurora.org>
      Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      838f9cc9
    • Heiko Carstens's avatar
      fs/proc/kcore.c: use probe_kernel_read() instead of memcpy() · 7e54b582
      Heiko Carstens authored
      commit d0290bc2 upstream.
      
      Commit df04abfd ("fs/proc/kcore.c: Add bounce buffer for ktext
      data") added a bounce buffer to avoid hardened usercopy checks.  Copying
      to the bounce buffer was implemented with a simple memcpy() assuming
      that it is always valid to read from kernel memory iff the
      kern_addr_valid() check passed.
      
      A simple, but pointless, test case like "dd if=/proc/kcore of=/dev/null"
      now can easily crash the kernel, since the former execption handling on
      invalid kernel addresses now doesn't work anymore.
      
      Also adding a kern_addr_valid() implementation wouldn't help here.  Most
      architectures simply return 1 here, while a couple implemented a page
      table walk to figure out if something is mapped at the address in
      question.
      
      With DEBUG_PAGEALLOC active mappings are established and removed all the
      time, so that relying on the result of kern_addr_valid() before
      executing the memcpy() also doesn't work.
      
      Therefore simply use probe_kernel_read() to copy to the bounce buffer.
      This also allows to simplify read_kcore().
      
      At least on s390 this fixes the observed crashes and doesn't introduce
      warnings that were removed with df04abfd ("fs/proc/kcore.c: Add
      bounce buffer for ktext data"), even though the generic
      probe_kernel_read() implementation uses uaccess functions.
      
      While looking into this I'm also wondering if kern_addr_valid() could be
      completely removed...(?)
      
      Link: http://lkml.kernel.org/r/20171202132739.99971-1-heiko.carstens@de.ibm.com
      Fixes: df04abfd ("fs/proc/kcore.c: Add bounce buffer for ktext data")
      Fixes: f5509cc1 ("mm: Hardened usercopy")
      Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
      Acked-by: default avatarKees Cook <keescook@chromium.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Al Viro <viro@ZenIV.linux.org.uk>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7e54b582
    • Mauro Carvalho Chehab's avatar
      media: cxusb, dib0700: ignore XC2028_I2C_FLUSH · ebe2ba53
      Mauro Carvalho Chehab authored
      commit 9893b905 upstream.
      
      The XC2028_I2C_FLUSH only needs to be implemented on a few
      devices. Others can safely ignore it.
      
      That prevents filling the dmesg with lots of messages like:
      
      	dib0700: stk7700ph_xc3028_callback: unknown command 2, arg 0
      
      Fixes: 4d37ece7 ("[media] tuner/xc2028: Add I2C flush callback")
      Reported-by: default avatarEnrico Mioso <mrkiko.rs@gmail.com>
      Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ebe2ba53
    • Mauro Carvalho Chehab's avatar
      media: ts2020: avoid integer overflows on 32 bit machines · 7a401e25
      Mauro Carvalho Chehab authored
      commit 81742be1 upstream.
      
      Before this patch, when compiled for arm32, the signal strength
      were reported as:
      
      Lock   (0x1f) Signal= 4294908.66dBm C/N= 12.79dB
      
      Because of a 32 bit integer overflow. After it, it is properly
      reported as:
      
      	Lock   (0x1f) Signal= -58.64dBm C/N= 12.79dB
      
      Fixes: 0f91c9d6 ("[media] TS2020: Calculate tuner gain correctly")
      Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7a401e25
    • Arnd Bergmann's avatar
      media: dvb-frontends: fix i2c access helpers for KASAN · ad91b2e3
      Arnd Bergmann authored
      commit 3cd890db upstream.
      
      A typical code fragment was copied across many dvb-frontend drivers and
      causes large stack frames when built with with CONFIG_KASAN on gcc-5/6/7:
      
      drivers/media/dvb-frontends/cxd2841er.c:3225:1: error: the frame size of 3992 bytes is larger than 3072 bytes [-Werror=frame-larger-than=]
      drivers/media/dvb-frontends/cxd2841er.c:3404:1: error: the frame size of 3136 bytes is larger than 3072 bytes [-Werror=frame-larger-than=]
      drivers/media/dvb-frontends/stv0367.c:3143:1: error: the frame size of 4016 bytes is larger than 3072 bytes [-Werror=frame-larger-than=]
      drivers/media/dvb-frontends/stv090x.c:3430:1: error: the frame size of 5312 bytes is larger than 3072 bytes [-Werror=frame-larger-than=]
      drivers/media/dvb-frontends/stv090x.c:4248:1: error: the frame size of 4872 bytes is larger than 3072 bytes [-Werror=frame-larger-than=]
      
      gcc-8 now solves this by consolidating the stack slots for the argument
      variables, but on older compilers we can get the same behavior by taking
      the pointer of a local variable rather than the inline function argument.
      
      Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81715Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ad91b2e3
    • Arnd Bergmann's avatar
      kasan: rework Kconfig settings · 062cd346
      Arnd Bergmann authored
      commit e7c52b84 upstream.
      
      We get a lot of very large stack frames using gcc-7.0.1 with the default
      -fsanitize-address-use-after-scope --param asan-stack=1 options, which can
      easily cause an overflow of the kernel stack, e.g.
      
        drivers/gpu/drm/i915/gvt/handlers.c:2434:1: warning: the frame size of 46176 bytes is larger than 3072 bytes
        drivers/net/wireless/ralink/rt2x00/rt2800lib.c:5650:1: warning: the frame size of 23632 bytes is larger than 3072 bytes
        lib/atomic64_test.c:250:1: warning: the frame size of 11200 bytes is larger than 3072 bytes
        drivers/gpu/drm/i915/gvt/handlers.c:2621:1: warning: the frame size of 9208 bytes is larger than 3072 bytes
        drivers/media/dvb-frontends/stv090x.c:3431:1: warning: the frame size of 6816 bytes is larger than 3072 bytes
        fs/fscache/stats.c:287:1: warning: the frame size of 6536 bytes is larger than 3072 bytes
      
      To reduce this risk, -fsanitize-address-use-after-scope is now split out
      into a separate CONFIG_KASAN_EXTRA Kconfig option, leading to stack
      frames that are smaller than 2 kilobytes most of the time on x86_64.  An
      earlier version of this patch also prevented combining KASAN_EXTRA with
      KASAN_INLINE, but that is no longer necessary with gcc-7.0.1.
      
      All patches to get the frame size below 2048 bytes with CONFIG_KASAN=y
      and CONFIG_KASAN_EXTRA=n have been merged by maintainers now, so we can
      bring back that default now.  KASAN_EXTRA=y still causes lots of
      warnings but now defaults to !COMPILE_TEST to disable it in
      allmodconfig, and it remains disabled in all other defconfigs since it
      is a new option.  I arbitrarily raise the warning limit for KASAN_EXTRA
      to 3072 to reduce the noise, but an allmodconfig kernel still has around
      50 warnings on gcc-7.
      
      I experimented a bit more with smaller stack frames and have another
      follow-up series that reduces the warning limit for 64-bit architectures
      to 1280 bytes (without CONFIG_KASAN).
      
      With earlier versions of this patch series, I also had patches to address
      the warnings we get with KASAN and/or KASAN_EXTRA, using a
      "noinline_if_stackbloat" annotation.
      
      That annotation now got replaced with a gcc-8 bugfix (see
      https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81715) and a workaround for
      older compilers, which means that KASAN_EXTRA is now just as bad as
      before and will lead to an instant stack overflow in a few extreme
      cases.
      
      This reverts parts of commit 3f181b4d ("lib/Kconfig.debug: disable
      -Wframe-larger-than warnings with KASAN=y").  Two patches in linux-next
      should be merged first to avoid introducing warnings in an allmodconfig
      build:
        3cd890db ("media: dvb-frontends: fix i2c access helpers for KASAN")
        16c3ada8 ("media: r820t: fix r820t_write_reg for KASAN")
      
      Do we really need to backport this?
      
      I think we do: without this patch, enabling KASAN will lead to
      unavoidable kernel stack overflow in certain device drivers when built
      with gcc-7 or higher on linux-4.10+ or any version that contains a
      backport of commit c5caf21a.  Most people are probably still on
      older compilers, but it will get worse over time as they upgrade their
      distros.
      
      The warnings we get on kernels older than this should all be for code
      that uses dangerously large stack frames, though most of them do not
      cause an actual stack overflow by themselves.The asan-stack option was
      added in linux-4.0, and commit 3f181b4d ("lib/Kconfig.debug:
      disable -Wframe-larger-than warnings with KASAN=y") effectively turned
      off the warning for allmodconfig kernels, so I would like to see this
      fix backported to any kernels later than 4.0.
      
      I have done dozens of fixes for individual functions with stack frames
      larger than 2048 bytes with asan-stack, and I plan to make sure that
      all those fixes make it into the stable kernels as well (most are
      already there).
      
      Part of the complication here is that asan-stack (from 4.0) was
      originally assumed to always require much larger stacks, but that
      turned out to be a combination of multiple gcc bugs that we have now
      worked around and fixed, but sanitize-address-use-after-scope (from
      v4.10) has a much higher inherent stack usage and also suffers from at
      least three other problems that we have analyzed but not yet fixed
      upstream, each of them makes the stack usage more severe than it should
      be.
      
      Link: http://lkml.kernel.org/r/20171221134744.2295529-1-arnd@arndb.deSigned-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Acked-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
      Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Alexander Potapenko <glider@google.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Cc: Andrey Konovalov <andreyknvl@google.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      062cd346
    • Andrey Konovalov's avatar
      kasan: don't emit builtin calls when sanitization is off · e186d8bf
      Andrey Konovalov authored
      commit 0e410e15 upstream.
      
      With KASAN enabled the kernel has two different memset() functions, one
      with KASAN checks (memset) and one without (__memset).  KASAN uses some
      macro tricks to use the proper version where required.  For example
      memset() calls in mm/slub.c are without KASAN checks, since they operate
      on poisoned slab object metadata.
      
      The issue is that clang emits memset() calls even when there is no
      memset() in the source code.  They get linked with improper memset()
      implementation and the kernel fails to boot due to a huge amount of KASAN
      reports during early boot stages.
      
      The solution is to add -fno-builtin flag for files with KASAN_SANITIZE :=
      n marker.
      
      Link: http://lkml.kernel.org/r/8ffecfffe04088c52c42b92739c2bd8a0bcb3f5e.1516384594.git.andreyknvl@google.comSigned-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
      Acked-by: default avatarNick Desaulniers <ndesaulniers@google.com>
      Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
      Cc: Michal Marek <michal.lkml@markovi.net>
      Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Alexander Potapenko <glider@google.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e186d8bf
    • Liu Bo's avatar
      Btrfs: raid56: iterate raid56 internal bio with bio_for_each_segment_all · d16919a3
      Liu Bo authored
      commit 0198e5b7 upstream.
      
      Bio iterated by set_bio_pages_uptodate() is raid56 internal one, so it
      will never be a BIO_CLONED bio, and since this is called by end_io
      functions, bio->bi_iter.bi_size is zero, we mustn't use
      bio_for_each_segment() as that is a no-op if bi_size is zero.
      
      Fixes: 6592e58c ("Btrfs: fix write corruption due to bio cloning on raid5/6")
      Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
      Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d16919a3
    • Martin Kaiser's avatar
      watchdog: imx2_wdt: restore previous timeout after suspend+resume · e06f7b68
      Martin Kaiser authored
      commit 0be26725 upstream.
      
      When the watchdog device is suspended, its timeout is set to the maximum
      value. During resume, the previously set timeout should be restored.
      This does not work at the moment.
      
      The suspend function calls
      
      imx2_wdt_set_timeout(wdog, IMX2_WDT_MAX_TIME);
      
      and resume reverts this by calling
      
      imx2_wdt_set_timeout(wdog, wdog->timeout);
      
      However, imx2_wdt_set_timeout() updates wdog->timeout. Therefore,
      wdog->timeout is set to IMX2_WDT_MAX_TIME when we enter the resume
      function.
      
      Fix this by adding a new function __imx2_wdt_set_timeout() which
      only updates the hardware settings. imx2_wdt_set_timeout() now calls
      __imx2_wdt_set_timeout() and then saves the new timeout to
      wdog->timeout.
      
      During suspend, we call __imx2_wdt_set_timeout() directly so that
      wdog->timeout won't be updated and we can restore the previous value
      during resume. This approach makes wdog->timeout different from the
      actual setting in the hardware which is usually not a good thing.
      However, the two differ only while we're suspended and no kernel code is
      running, so it should be ok in this case.
      Signed-off-by: default avatarMartin Kaiser <martin@kaiser.cx>
      Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e06f7b68
    • Takashi Iwai's avatar
      ASoC: skl: Fix kernel warning due to zero NHTL entry · b897f1dc
      Takashi Iwai authored
      commit 20a1ea22 upstream.
      
      I got the following kernel warning when loading snd-soc-skl module on
      Dell Latitude 7270 laptop:
       memremap attempted on mixed range 0x0000000000000000 size: 0x0
       WARNING: CPU: 0 PID: 484 at kernel/memremap.c:98 memremap+0x8a/0x180
       Call Trace:
        skl_nhlt_init+0x82/0xf0 [snd_soc_skl]
        skl_probe+0x2ee/0x7c0 [snd_soc_skl]
        ....
      
      It seems that the machine doesn't support the SKL DSP gives the empty
      NHLT entry, and it triggers the warning.  For avoiding it, let do the
      zero check before calling memremap().
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b897f1dc
    • John Keeping's avatar
      ASoC: rockchip: i2s: fix playback after runtime resume · 4562bfde
      John Keeping authored
      commit c66234cf upstream.
      
      When restoring registers during runtime resume, we must not write to
      I2S_TXDR which is the transmit FIFO as this queues up a sample to be
      output and pushes all of the output channels down by one.
      
      This can be demonstrated with the speaker-test utility:
      
      	for i in a b c; do speaker-test -c 2 -s 1; done
      
      which should play a test through the left speaker three times but if the
      I2S hardware starts runtime suspended the first sample will be played
      through the right speaker.
      
      Fix this by marking I2S_TXDR as volatile (which also requires marking it
      as readble, even though it technically isn't).  This seems to be the
      most robust fix, the alternative of giving I2S_TXDR a default value is
      more fragile since it does not prevent regcache writing to the register
      in all circumstances.
      
      While here, also fix the configuration of I2S_RXDR and I2S_FIFOLR; these
      are not writable so they do not suffer from the same problem as I2S_TXDR
      but reading from I2S_RXDR does suffer from a similar problem.
      
      Fixes: f0447f6c ("ASoC: rockchip: i2s: restore register during runtime_suspend/resume cycle", 2016-09-07)
      Signed-off-by: default avatarJohn Keeping <john@metanate.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4562bfde