Skip to content
  1. May 02, 2020
    • Hoang Le's avatar
      tipc: Add a missing case of TIPC_DIRECT_MSG type · cb07b0e9
      Hoang Le authored
      commit 8b1e5b0a upstream.
      
      In the commit f73b1281
      ("tipc: improve throughput between nodes in netns"), we're missing a check
      to handle TIPC_DIRECT_MSG type, it's still using old sending mechanism for
      this message type. So, throughput improvement is not significant as
      expected.
      
      Besides that, when sending a large message with that type, we're also
      handle wrong receiving queue, it should be enqueued in socket receiving
      instead of multicast messages.
      
      Fix this by adding the missing case for TIPC_DIRECT_MSG.
      
      Fixes: f73b1281
      
       ("tipc: improve throughput between nodes in netns")
      Reported-by: default avatarTuong Lien <tuong.t.lien@dektech.com.au>
      Signed-off-by: default avatarHoang Le <hoang.h.le@dektech.com.au>
      Acked-by: default avatarJon Maloy <jmaloy@redhat.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      cb07b0e9
    • Eugene Syromiatnikov's avatar
      taprio: do not use BIT() in TCA_TAPRIO_ATTR_FLAG_* definitions · eea5bf6e
      Eugene Syromiatnikov authored
      commit 673040c3 upstream.
      
      BIT() macro definition is internal to the Linux kernel and is not
      to be used in UAPI headers; replace its usage with the _BITUL() macro
      that is already used elsewhere in the header.
      
      Fixes: 9c66d156
      
       ("taprio: Add support for hardware offloading")
      Signed-off-by: default avatarEugene Syromiatnikov <esyr@redhat.com>
      Acked-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      eea5bf6e
    • Jesper Dangaard Brouer's avatar
      sfc: fix XDP-redirect in this driver · 9cee6344
      Jesper Dangaard Brouer authored
      commit 86e85bf6 upstream.
      
      XDP-redirect is broken in this driver sfc. XDP_REDIRECT requires
      tailroom for skb_shared_info when creating an SKB based on the
      redirected xdp_frame (both in cpumap and veth).
      
      The fix requires some initial explaining. The driver uses RX page-split
      when possible. It reserves the top 64 bytes in the RX-page for storing
      dma_addr (struct efx_rx_page_state). It also have the XDP recommended
      headroom of XDP_PACKET_HEADROOM (256 bytes). As it doesn't reserve any
      tailroom, it can still fit two standard MTU (1500) frames into one page.
      
      The sizeof struct skb_shared_info in 320 bytes. Thus drivers like ixgbe
      and i40e, reduce their XDP headroom to 192 bytes, which allows them to
      fit two frames with max 1536 bytes into a 4K page (192+1536+320=2048).
      
      The fix is to reduce this drivers headroom to 128 bytes and add the 320
      bytes tailroom. This account for reserved top 64 bytes in the page, and
      still fit two frame in a page for normal MTUs.
      
      We must never go below 128 bytes of headroom for XDP, as one cacheline
      is for xdp_frame area and next cacheline is reserved for metadata area.
      
      Fixes: eb9a36be
      
       ("sfc: perform XDP processing on received packets")
      Signed-off-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
      Acked-by: default avatarEdward Cree <ecree@solarflare.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9cee6344
    • Sascha Hauer's avatar
      hwmon: (jc42) Fix name to have no illegal characters · 2009b204
      Sascha Hauer authored
      [ Upstream commit c843b382
      
       ]
      
      The jc42 driver passes I2C client's name as hwmon device name. In case
      of device tree probed devices this ends up being part of the compatible
      string, "jc-42.4-temp". This name contains hyphens and the hwmon core
      doesn't like this:
      
      jc42 2-0018: hwmon: 'jc-42.4-temp' is not a valid name attribute, please fix
      
      This changes the name to "jc42" which doesn't have any illegal
      characters.
      
      Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
      Link: https://lore.kernel.org/r/20200417092853.31206-1-s.hauer@pengutronix.de
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      2009b204
    • Marc Zyngier's avatar
      irqchip/meson-gpio: Fix HARDIRQ-safe -> HARDIRQ-unsafe lock order · e74eadb8
      Marc Zyngier authored
      [ Upstream commit 0a66d6f9
      
       ]
      
      Running a lockedp-enabled kernel on a vim3l board (Amlogic SM1)
      leads to the following splat:
      
      [   13.557138] WARNING: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected
      [   13.587485] ip/456 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire:
      [   13.625922] ffff000059908cf0 (&irq_desc_lock_class){-.-.}-{2:2}, at: __setup_irq+0xf8/0x8d8
      [   13.632273] which would create a new lock dependency:
      [   13.637272]  (&irq_desc_lock_class){-.-.}-{2:2} -> (&ctl->lock){+.+.}-{2:2}
      [   13.644209]
      [   13.644209] but this new dependency connects a HARDIRQ-irq-safe lock:
      [   13.654122]  (&irq_desc_lock_class){-.-.}-{2:2}
      [   13.654125]
      [   13.654125] ... which became HARDIRQ-irq-safe at:
      [   13.664759]   lock_acquire+0xec/0x368
      [   13.666926]   _raw_spin_lock+0x60/0x88
      [   13.669979]   handle_fasteoi_irq+0x30/0x178
      [   13.674082]   generic_handle_irq+0x38/0x50
      [   13.678098]   __handle_domain_irq+0x6c/0xc8
      [   13.682209]   gic_handle_irq+0x5c/0xb0
      [   13.685872]   el1_irq+0xd0/0x180
      [   13.689010]   arch_cpu_idle+0x40/0x220
      [   13.692732]   default_idle_call+0x54/0x60
      [   13.696677]   do_idle+0x23c/0x2e8
      [   13.699903]   cpu_startup_entry+0x30/0x50
      [   13.703852]   rest_init+0x1e0/0x2b4
      [   13.707301]   arch_call_rest_init+0x18/0x24
      [   13.711449]   start_kernel+0x4ec/0x51c
      [   13.715167]
      [   13.715167] to a HARDIRQ-irq-unsafe lock:
      [   13.722426]  (&ctl->lock){+.+.}-{2:2}
      [   13.722430]
      [   13.722430] ... which became HARDIRQ-irq-unsafe at:
      [   13.732319] ...
      [   13.732324]   lock_acquire+0xec/0x368
      [   13.735985]   _raw_spin_lock+0x60/0x88
      [   13.739452]   meson_gpio_irq_domain_alloc+0xcc/0x290
      [   13.744392]   irq_domain_alloc_irqs_hierarchy+0x24/0x60
      [   13.749586]   __irq_domain_alloc_irqs+0x160/0x2f0
      [   13.754254]   irq_create_fwspec_mapping+0x118/0x320
      [   13.759073]   irq_create_of_mapping+0x78/0xa0
      [   13.763360]   of_irq_get+0x6c/0x80
      [   13.766701]   of_mdiobus_register_phy+0x10c/0x238 [of_mdio]
      [   13.772227]   of_mdiobus_register+0x158/0x380 [of_mdio]
      [   13.777388]   mdio_mux_init+0x180/0x2e8 [mdio_mux]
      [   13.782128]   g12a_mdio_mux_probe+0x290/0x398 [mdio_mux_meson_g12a]
      [   13.788349]   platform_drv_probe+0x5c/0xb0
      [   13.792379]   really_probe+0xe4/0x448
      [   13.795979]   driver_probe_device+0xe8/0x140
      [   13.800189]   __device_attach_driver+0x94/0x120
      [   13.804639]   bus_for_each_drv+0x84/0xd8
      [   13.808474]   __device_attach+0xe4/0x168
      [   13.812361]   device_initial_probe+0x1c/0x28
      [   13.816592]   bus_probe_device+0xa4/0xb0
      [   13.820430]   deferred_probe_work_func+0xa8/0x100
      [   13.825064]   process_one_work+0x264/0x688
      [   13.829088]   worker_thread+0x4c/0x458
      [   13.832768]   kthread+0x154/0x158
      [   13.836018]   ret_from_fork+0x10/0x18
      [   13.839612]
      [   13.839612] other info that might help us debug this:
      [   13.839612]
      [   13.850354]  Possible interrupt unsafe locking scenario:
      [   13.850354]
      [   13.855720]        CPU0                    CPU1
      [   13.858774]        ----                    ----
      [   13.863242]   lock(&ctl->lock);
      [   13.866330]                                local_irq_disable();
      [   13.872233]                                lock(&irq_desc_lock_class);
      [   13.878705]                                lock(&ctl->lock);
      [   13.884297]   <Interrupt>
      [   13.886857]     lock(&irq_desc_lock_class);
      [   13.891014]
      [   13.891014]  *** DEADLOCK ***
      
      The issue can occur when CPU1 is doing something like irq_set_type()
      and CPU0 performing an interrupt allocation, for example. Taking
      an interrupt (like the one being reconfigured) would lead to a deadlock.
      
      A solution to this is:
      
      - Reorder the locking so that meson_gpio_irq_update_bits takes the lock
        itself at all times, instead of relying on the caller to lock or not,
        hence making the RMW sequence atomic,
      
      - Rework the critical section in meson_gpio_irq_request_channel to only
        cover the allocation itself, and let the gpio_irq_sel_pin callback
        deal with its own locking if required,
      
      - Take the private spin-lock with interrupts disabled at all times
      
      Reviewed-by: default avatarJerome Brunet <jbrunet@baylibre.com>
      Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e74eadb8
    • John Garry's avatar
      blk-mq: Put driver tag in blk_mq_dispatch_rq_list() when no budget · ad125180
      John Garry authored
      [ Upstream commit 5fe56de7
      
       ]
      
      If in blk_mq_dispatch_rq_list() we find no budget, then we break of the
      dispatch loop, but the request may keep the driver tag, evaulated
      in 'nxt' in the previous loop iteration.
      
      Fix by putting the driver tag for that request.
      
      Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
      Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      ad125180
    • Marc Zyngier's avatar
      irqchip/gic-v4.1: Add support for VPENDBASER's Dirty+Valid signaling · 610e19cc
      Marc Zyngier authored
      [ Upstream commit 96806229
      
       ]
      
      When a vPE is made resident, the GIC starts parsing the virtual pending
      table to deliver pending interrupts. This takes place asynchronously,
      and can at times take a long while. Long enough that the vcpu enters
      the guest and hits WFI before any interrupt has been signaled yet.
      The vcpu then exits, blocks, and now gets a doorbell. Rince, repeat.
      
      In order to avoid the above, a (optional on GICv4, mandatory on v4.1)
      feature allows the GIC to feedback to the hypervisor whether it is
      done parsing the VPT by clearing the GICR_VPENDBASER.Dirty bit.
      The hypervisor can then wait until the GIC is ready before actually
      running the vPE.
      
      Plug the detection code as well as polling on vPE schedule. While
      at it, tidy-up the kernel message that displays the GICv4 optional
      features.
      
      Reviewed-by: default avatarZenghui Yu <yuzenghui@huawei.com>
      Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      610e19cc
    • Theodore Ts'o's avatar
      ext4: convert BUG_ON's to WARN_ON's in mballoc.c · 5844e6d2
      Theodore Ts'o authored
      [ Upstream commit 907ea529
      
       ]
      
      If the in-core buddy bitmap gets corrupted (or out of sync with the
      block bitmap), issue a WARN_ON and try to recover.  In most cases this
      involves skipping trying to allocate out of a particular block group.
      We can end up declaring the file system corrupted, which is fair,
      since the file system probably should be checked before we proceed any
      further.
      
      Link: https://lore.kernel.org/r/20200414035649.293164-1-tytso@mit.edu
      Google-Bug-Id: 34811296
      Google-Bug-Id: 34639169
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5844e6d2
    • Theodore Ts'o's avatar
      ext4: increase wait time needed before reuse of deleted inode numbers · ed3767ff
      Theodore Ts'o authored
      [ Upstream commit a17a9d93
      
       ]
      
      Current wait times have proven to be too short to protect against inode
      reuses that lead to metadata inconsistencies.
      
      Now that we will retry the inode allocation if we can't find any
      recently deleted inodes, it's a lot safer to increase the recently
      deleted time from 5 seconds to a minute.
      
      Link: https://lore.kernel.org/r/20200414023925.273867-1-tytso@mit.edu
      Google-Bug-Id: 36602237
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      ed3767ff
    • yangerkun's avatar
      ext4: use matching invalidatepage in ext4_writepage · 19f4195b
      yangerkun authored
      [ Upstream commit c2a559bc
      
       ]
      
      Run generic/388 with journal data mode sometimes may trigger the warning
      in ext4_invalidatepage. Actually, we should use the matching invalidatepage
      in ext4_writepage.
      
      Signed-off-by: default avataryangerkun <yangerkun@huawei.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Reviewed-by: default avatarRitesh Harjani <riteshh@linux.ibm.com>
      Reviewed-by: default avatarJan Kara <jack@suse.cz>
      Link: https://lore.kernel.org/r/20200226041002.13914-1-yangerkun@huawei.com
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      19f4195b
    • Fangrui Song's avatar
      arm64: Delete the space separator in __emit_inst · 4e579d7f
      Fangrui Song authored
      [ Upstream commit c9a4ef66
      
       ]
      
      In assembly, many instances of __emit_inst(x) expand to a directive. In
      a few places __emit_inst(x) is used as an assembler macro argument. For
      example, in arch/arm64/kvm/hyp/entry.S
      
        ALTERNATIVE(nop, SET_PSTATE_PAN(1), ARM64_HAS_PAN, CONFIG_ARM64_PAN)
      
      expands to the following by the C preprocessor:
      
        alternative_insn nop, .inst (0xd500401f | ((0) << 16 | (4) << 5) | ((!!1) << 8)), 4, 1
      
      Both comma and space are separators, with an exception that content
      inside a pair of parentheses/quotes is not split, so the clang
      integrated assembler splits the arguments to:
      
         nop, .inst, (0xd500401f | ((0) << 16 | (4) << 5) | ((!!1) << 8)), 4, 1
      
      GNU as preprocesses the input with do_scrub_chars(). Its arm64 backend
      (along with many other non-x86 backends) sees:
      
        alternative_insn nop,.inst(0xd500401f|((0)<<16|(4)<<5)|((!!1)<<8)),4,1
        # .inst(...) is parsed as one argument
      
      while its x86 backend sees:
      
        alternative_insn nop,.inst (0xd500401f|((0)<<16|(4)<<5)|((!!1)<<8)),4,1
        # The extra space before '(' makes the whole .inst (...) parsed as two arguments
      
      The non-x86 backend's behavior is considered unintentional
      (https://sourceware.org/bugzilla/show_bug.cgi?id=25750).
      So drop the space separator inside `.inst (...)` to make the clang
      integrated assembler work.
      
      Suggested-by: default avatarIlie Halip <ilie.halip@gmail.com>
      Signed-off-by: default avatarFangrui Song <maskray@google.com>
      Reviewed-by: default avatarMark Rutland <mark.rutland@arm.com>
      Link: https://github.com/ClangBuiltLinux/linux/issues/939
      Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      4e579d7f
    • Borislav Petkov's avatar
      sched/vtime: Work around an unitialized variable warning · cb098622
      Borislav Petkov authored
      [ Upstream commit e0d648f9
      
       ]
      
      Work around this warning:
      
        kernel/sched/cputime.c: In function ‘kcpustat_field’:
        kernel/sched/cputime.c:1007:6: warning: ‘val’ may be used uninitialized in this function [-Wmaybe-uninitialized]
      
      because GCC can't see that val is used only when err is 0.
      
      Acked-by: default avatarPeter Zijlstra <peterz@infradead.org>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Link: https://lore.kernel.org/r/20200327214334.GF8015@zn.tnic
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      cb098622
    • Peter Xu's avatar
      sched/isolation: Allow "isolcpus=" to skip unknown sub-parameters · 7cc55e70
      Peter Xu authored
      [ Upstream commit 3662daf0
      
       ]
      
      The "isolcpus=" parameter allows sub-parameters before the cpulist is
      specified, and if the parser detects an unknown sub-parameters the whole
      parameter will be ignored.
      
      This design is incompatible with itself when new sub-parameters are added.
      An older kernel will not recognize the new sub-parameter and will
      invalidate the whole parameter so the CPU isolation will not take
      effect. It emits a warning:
      
          isolcpus: Error, unknown flag
      
      The better and compatible way is to allow "isolcpus=" to skip unknown
      sub-parameters, so that even if new sub-parameters are added an older
      kernel will still be able to behave as usual even if with the new
      sub-parameter specified on the command line.
      
      Ideally this should have been there when the first sub-parameter for
      "isolcpus=" was introduced.
      
      Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Link: https://lkml.kernel.org/r/20200403223517.406353-1-peterx@redhat.com
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      7cc55e70
    • Tamizh Chelvam Raja's avatar
      mac80211: fix channel switch trigger from unknown mesh peer · 45c2e217
      Tamizh Chelvam Raja authored
      [ Upstream commit 93e2d04a
      
       ]
      
      Previously mesh channel switch happens if beacon contains
      CSA IE without checking the mesh peer info. Due to that
      channel switch happens even if the beacon is not from
      its own mesh peer. Fixing that by checking if the CSA
      originated from the same mesh network before proceeding
      for channel switch.
      
      Signed-off-by: default avatarTamizh chelvam <tamizhr@codeaurora.org>
      Link: https://lore.kernel.org/r/1585403604-29274-1-git-send-email-tamizhr@codeaurora.org
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      45c2e217
    • Atsushi Nemoto's avatar
      net: stmmac: socfpga: Allow all RGMII modes · 9d9b3002
      Atsushi Nemoto authored
      [ Upstream commit a7a0d626
      
       ]
      
      Allow all the RGMII modes to be used.  (Not only "rgmii", "rgmii-id"
      but "rgmii-txid", "rgmii-rxid")
      
      Signed-off-by: default avatarAtsushi Nemoto <atsushi.nemoto@sord.co.jp>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      9d9b3002
    • Hui Wang's avatar
      ALSA: hda: call runtime_allow() for all hda controllers · 298cb996
      Hui Wang authored
      [ Upstream commit 9a641848
      
       ]
      
      Before the pci_driver->probe() is called, the pci subsystem calls
      runtime_forbid() and runtime_get_sync() on this pci dev, so only call
      runtime_put_autosuspend() is not enough to enable the runtime_pm on
      this device.
      
      For controllers with vgaswitcheroo feature, the pci/quirks.c will call
      runtime_allow() for this dev, then the controllers could enter
      rt_idle/suspend/resume, but for non-vgaswitcheroo controllers like
      Intel hda controllers, the runtime_pm is not enabled because the
      runtime_allow() is not called.
      
      Since it is no harm calling runtime_allow() twice, here let hda
      driver call runtime_allow() for all controllers. Then the runtime_pm
      is enabled on all controllers after the put_autosuspend() is called.
      
      Signed-off-by: default avatarHui Wang <hui.wang@canonical.com>
      Link: https://lore.kernel.org/r/20200414142725.6020-1-hui.wang@canonical.com
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      298cb996
    • Juergen Gross's avatar
      xen/xenbus: ensure xenbus_map_ring_valloc() returns proper grant status · e89104a0
      Juergen Gross authored
      [ Upstream commit 6b51fd3f
      
       ]
      
      xenbus_map_ring_valloc() maps a ring page and returns the status of the
      used grant (0 meaning success).
      
      There are Xen hypervisors which might return the value 1 for the status
      of a failed grant mapping due to a bug. Some callers of
      xenbus_map_ring_valloc() test for errors by testing the returned status
      to be less than zero, resulting in no error detected and crashing later
      due to a not available ring page.
      
      Set the return value of xenbus_map_ring_valloc() to GNTST_general_error
      in case the grant status reported by Xen is greater than zero.
      
      This is part of XSA-316.
      
      Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
      Reviewed-by: default avatarWei Liu <wl@xen.org>
      Link: https://lore.kernel.org/r/20200326080358.1018-1-jgross@suse.com
      Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e89104a0
    • Josh Poimboeuf's avatar
      objtool: Support Clang non-section symbols in ORC dump · 87aadc57
      Josh Poimboeuf authored
      [ Upstream commit 8782e7ca
      
       ]
      
      Historically, the relocation symbols for ORC entries have only been
      section symbols:
      
        .text+0: sp:sp+8 bp:(und) type:call end:0
      
      However, the Clang assembler is aggressive about stripping section
      symbols.  In that case we will need to use function symbols:
      
        freezing_slow_path+0: sp:sp+8 bp:(und) type:call end:0
      
      In preparation for the generation of such entries in "objtool orc
      generate", add support for reading them in "objtool orc dump".
      
      Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Reviewed-by: default avatarMiroslav Benes <mbenes@suse.cz>
      Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Link: https://lkml.kernel.org/r/b811b5eb1a42602c3b523576dc5efab9ad1c174d.1585761021.git.jpoimboe@redhat.com
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      87aadc57
    • Josh Poimboeuf's avatar
      objtool: Fix CONFIG_UBSAN_TRAP unreachable warnings · 99b6aff1
      Josh Poimboeuf authored
      [ Upstream commit bd841d61
      
       ]
      
      CONFIG_UBSAN_TRAP causes GCC to emit a UD2 whenever it encounters an
      unreachable code path.  This includes __builtin_unreachable().  Because
      the BUG() macro uses __builtin_unreachable() after it emits its own UD2,
      this results in a double UD2.  In this case objtool rightfully detects
      that the second UD2 is unreachable:
      
        init/main.o: warning: objtool: repair_env_string()+0x1c8: unreachable instruction
      
      We weren't able to figure out a way to get rid of the double UD2s, so
      just silence the warning.
      
      Reported-by: default avatarRandy Dunlap <rdunlap@infradead.org>
      Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Reviewed-by: default avatarKees Cook <keescook@chromium.org>
      Reviewed-by: default avatarMiroslav Benes <mbenes@suse.cz>
      Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Link: https://lkml.kernel.org/r/6653ad73c6b59c049211bd7c11ed3809c20ee9f5.1585761021.git.jpoimboe@redhat.com
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      99b6aff1
    • Bodo Stroesser's avatar
      scsi: target: tcmu: reset_ring should reset TCMU_DEV_BIT_BROKEN · 0e268da7
      Bodo Stroesser authored
      [ Upstream commit 066f79a5
      
       ]
      
      In case command ring buffer becomes inconsistent, tcmu sets device flag
      TCMU_DEV_BIT_BROKEN.  If the bit is set, tcmu rejects new commands from LIO
      core with TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, and no longer processes
      completions from the ring.  The reset_ring attribute can be used to
      completely clean up the command ring, so after reset_ring the ring no
      longer is inconsistent.
      
      Therefore reset_ring also should reset bit TCMU_DEV_BIT_BROKEN to allow
      normal processing.
      
      Link: https://lore.kernel.org/r/20200409101026.17872-1-bstroesser@ts.fujitsu.com
      Acked-by: default avatarMike Christie <mchristi@redhat.com>
      Signed-off-by: default avatarBodo Stroesser <bstroesser@ts.fujitsu.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      0e268da7
    • Bodo Stroesser's avatar
      scsi: target: fix PR IN / READ FULL STATUS for FC · d31d19b9
      Bodo Stroesser authored
      [ Upstream commit 8fed04eb
      
       ]
      
      Creation of the response to READ FULL STATUS fails for FC based
      reservations. Reason is the too high loop limit (< 24) in
      fc_get_pr_transport_id(). The string representation of FC WWPN is 23 chars
      long only ("11:22:33:44:55:66:77:88"). So when i is 23, the loop body is
      executed a last time for the ending '\0' of the string and thus hex2bin()
      reports an error.
      
      Link: https://lore.kernel.org/r/20200408132610.14623-3-bstroesser@ts.fujitsu.com
      Signed-off-by: default avatarBodo Stroesser <bstroesser@ts.fujitsu.com>
      Reviewed-by: default avatarMike Christie <mchristi@redhat.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d31d19b9
    • Evan Quan's avatar
      drm/amdgpu: fix wrong vram lost counter increment V2 · 24b48473
      Evan Quan authored
      [ Upstream commit 028cfb24
      
       ]
      
      Vram lost counter is wrongly increased by two during baco reset.
      
      V2: assumed vram lost for mode1 reset on all ASICs
      
      Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
      Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
      Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      24b48473
    • Roy Spliet's avatar
      ALSA: hda: Explicitly permit using autosuspend if runtime PM is supported · 999fe8f3
      Roy Spliet authored
      [ Upstream commit 3ba21113
      
       ]
      
      This fixes runtime PM not working after a suspend-to-RAM cycle at least for
      the codec-less HDA device found on NVIDIA GPUs.
      
      BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207043
      Signed-off-by: default avatarRoy Spliet <nouveau@spliet.org>
      Link: https://lore.kernel.org/r/20200413082034.25166-7-tiwai@suse.de
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      999fe8f3
    • Takashi Iwai's avatar
      ALSA: hda: Keep the controller initialization even if no codecs found · 07963026
      Takashi Iwai authored
      [ Upstream commit 9479e75f
      
       ]
      
      Currently, when the HD-audio controller driver doesn't detect any
      codecs, it tries to abort the probe.  But this abort happens at the
      delayed probe, i.e. the primary probe call already returned success,
      hence the driver is never unbound until user does so explicitly.
      As a result, it may leave the HD-audio device in the running state
      without the runtime PM.  More badly, if the device is a HD-audio bus
      that is tied with a GPU, GPU cannot reach to the full power down and
      consumes unnecessarily much power.
      
      This patch changes the logic after no-codec situation; it continues
      probing without the further codec initialization but keep the
      controller driver running normally.
      
      BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207043
      Tested-by: default avatarRoy Spliet <nouveau@spliet.org>
      Link: https://lore.kernel.org/r/20200413082034.25166-5-tiwai@suse.de
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      07963026
    • Takashi Iwai's avatar
      ALSA: hda: Release resources at error in delayed probe · 40a82106
      Takashi Iwai authored
      [ Upstream commit 2393e755
      
       ]
      
      snd-hda-intel driver handles the most of its probe task in the delayed
      work (either via workqueue or via firmware loader).  When an error
      happens in the later delayed probe, we can't deregister the device
      itself because the probe callback already returned success and the
      device was bound.  So, for now, we set hda->init_failed flag and make
      the rest untouched until the device gets really unbound.
      However, this leaves the device up running, keeping the resources
      without any use that prevents other operations.
      
      In this patch, we release the resources at first when a probe error
      happens in the delayed probe stage, but keeps the top-level object, so
      that the PM and other ops can still refer to the object itself.
      
      Also for simplicity, snd_hda_intel object is allocated via devm, so
      that we can get rid of the explicit kfree calls.
      
      BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207043
      Link: https://lore.kernel.org/r/20200413082034.25166-4-tiwai@suse.de
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      40a82106
    • Darrick J. Wong's avatar
      xfs: fix partially uninitialized structure in xfs_reflink_remap_extent · c3c6875d
      Darrick J. Wong authored
      [ Upstream commit c142932c
      
       ]
      
      In the reflink extent remap function, it turns out that uirec (the block
      mapping corresponding only to the part of the passed-in mapping that got
      unmapped) was not fully initialized.  Specifically, br_state was not
      being copied from the passed-in struct to the uirec.  This could lead to
      unpredictable results such as the reflinked mapping being marked
      unwritten in the destination file.
      
      Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
      Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      c3c6875d
    • David Howells's avatar
      afs: Fix length of dump of bad YFSFetchStatus record · 45b438c1
      David Howells authored
      [ Upstream commit 3efe55b0
      
       ]
      
      Fix the length of the dump of a bad YFSFetchStatus record.  The function
      was copied from the AFS version, but the YFS variant contains bigger fields
      and extra information, so expand the dump to match.
      
      Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      45b438c1
    • Zhiqiang Liu's avatar
      signal: check sig before setting info in kill_pid_usb_asyncio · f632bd49
      Zhiqiang Liu authored
      [ Upstream commit eaec2b0b
      
       ]
      
      In kill_pid_usb_asyncio, if signal is not valid, we do not need to
      set info struct.
      
      Signed-off-by: default avatarZhiqiang Liu <liuzhiqiang26@huawei.com>
      Acked-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
      Link: https://lore.kernel.org/r/f525fd08-1cf7-fb09-d20c-4359145eb940@huawei.com
      Signed-off-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f632bd49
    • Olaf Hering's avatar
      x86: hyperv: report value of misc_features · b9a04de7
      Olaf Hering authored
      [ Upstream commit 97d9f1c4
      
       ]
      
      A few kernel features depend on ms_hyperv.misc_features, but unlike its
      siblings ->features and ->hints, the value was never reported during boot.
      
      Signed-off-by: default avatarOlaf Hering <olaf@aepfle.de>
      Link: https://lore.kernel.org/r/20200407172739.31371-1-olaf@aepfle.de
      Signed-off-by: default avatarWei Liu <wei.liu@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b9a04de7
    • Martin Fuzzey's avatar
      net: fec: set GPR bit on suspend by DT configuration. · 250b1951
      Martin Fuzzey authored
      [ Upstream commit da722186
      
       ]
      
      On some SoCs, such as the i.MX6, it is necessary to set a bit
      in the SoC level GPR register before suspending for wake on lan
      to work.
      
      The fec platform callback sleep_mode_enable was intended to allow this
      but the platform implementation was NAK'd back in 2015 [1]
      
      This means that, currently, wake on lan is broken on mainline for
      the i.MX6 at least.
      
      So implement the required bit setting in the fec driver by itself
      by adding a new optional DT property indicating the GPR register
      and adding the offset and bit information to the driver.
      
      [1] https://www.spinics.net/lists/netdev/msg310922.html
      
      Signed-off-by: default avatarMartin Fuzzey <martin.fuzzey@flowbird.group>
      Signed-off-by: default avatarFugang Duan <fugang.duan@nxp.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      250b1951
    • Jeremy Cline's avatar
      libbpf: Initialize *nl_pid so gcc 10 is happy · 34f47fbf
      Jeremy Cline authored
      [ Upstream commit 4734b0fe
      
       ]
      
      Builds of Fedora's kernel-tools package started to fail with "may be
      used uninitialized" warnings for nl_pid in bpf_set_link_xdp_fd() and
      bpf_get_link_xdp_info() on the s390 architecture.
      
      Although libbpf_netlink_open() always returns a negative number when it
      does not set *nl_pid, the compiler does not determine this and thus
      believes the variable might be used uninitialized. Assuage gcc's fears
      by explicitly initializing nl_pid.
      
      Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1807781
      
      Signed-off-by: default avatarJeremy Cline <jcline@redhat.com>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Acked-by: default avatarAndrii Nakryiko <andriin@fb.com>
      Link: https://lore.kernel.org/bpf/20200404051430.698058-1-jcline@redhat.com
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      34f47fbf
    • Eric Biggers's avatar
      xfs: clear PF_MEMALLOC before exiting xfsaild thread · 133f34d3
      Eric Biggers authored
      commit 10a98cb1
      
       upstream.
      
      Leaving PF_MEMALLOC set when exiting a kthread causes it to remain set
      during do_exit().  That can confuse things.  In particular, if BSD
      process accounting is enabled, then do_exit() writes data to an
      accounting file.  If that file has FS_SYNC_FL set, then this write
      occurs synchronously and can misbehave if PF_MEMALLOC is set.
      
      For example, if the accounting file is located on an XFS filesystem,
      then a WARN_ON_ONCE() in iomap_do_writepage() is triggered and the data
      doesn't get written when it should.  Or if the accounting file is
      located on an ext4 filesystem without a journal, then a WARN_ON_ONCE()
      in ext4_write_inode() is triggered and the inode doesn't get written.
      
      Fix this in xfsaild() by using the helper functions to save and restore
      PF_MEMALLOC.
      
      This can be reproduced as follows in the kvm-xfstests test appliance
      modified to add the 'acct' Debian package, and with kvm-xfstests's
      recommended kconfig modified to add CONFIG_BSD_PROCESS_ACCT=y:
      
              mkfs.xfs -f /dev/vdb
              mount /vdb
              touch /vdb/file
              chattr +S /vdb/file
              accton /vdb/file
              mkfs.xfs -f /dev/vdc
              mount /vdc
              umount /vdc
      
      It causes:
      	WARNING: CPU: 1 PID: 336 at fs/iomap/buffered-io.c:1534
      	CPU: 1 PID: 336 Comm: xfsaild/vdc Not tainted 5.6.0-rc5 #3
      	Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20191223_100556-anatol 04/01/2014
      	RIP: 0010:iomap_do_writepage+0x16b/0x1f0 fs/iomap/buffered-io.c:1534
      	[...]
      	Call Trace:
      	 write_cache_pages+0x189/0x4d0 mm/page-writeback.c:2238
      	 iomap_writepages+0x1c/0x33 fs/iomap/buffered-io.c:1642
      	 xfs_vm_writepages+0x65/0x90 fs/xfs/xfs_aops.c:578
      	 do_writepages+0x41/0xe0 mm/page-writeback.c:2344
      	 __filemap_fdatawrite_range+0xd2/0x120 mm/filemap.c:421
      	 file_write_and_wait_range+0x71/0xc0 mm/filemap.c:760
      	 xfs_file_fsync+0x7a/0x2b0 fs/xfs/xfs_file.c:114
      	 generic_write_sync include/linux/fs.h:2867 [inline]
      	 xfs_file_buffered_aio_write+0x379/0x3b0 fs/xfs/xfs_file.c:691
      	 call_write_iter include/linux/fs.h:1901 [inline]
      	 new_sync_write+0x130/0x1d0 fs/read_write.c:483
      	 __kernel_write+0x54/0xe0 fs/read_write.c:515
      	 do_acct_process+0x122/0x170 kernel/acct.c:522
      	 slow_acct_process kernel/acct.c:581 [inline]
      	 acct_process+0x1d4/0x27c kernel/acct.c:607
      	 do_exit+0x83d/0xbc0 kernel/exit.c:791
      	 kthread+0xf1/0x140 kernel/kthread.c:257
      	 ret_from_fork+0x27/0x50 arch/x86/entry/entry_64.S:352
      
      This bug was originally reported by syzbot at
      https://lore.kernel.org/r/0000000000000e7156059f751d7b@google.com.
      
      Reported-by: default avatar <syzbot+1f9dc49e8de2582d90c2@syzkaller.appspotmail.com>
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
      Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      133f34d3
    • Yang Shi's avatar
      mm: shmem: disable interrupt when acquiring info->lock in userfaultfd_copy path · a7074b96
      Yang Shi authored
      commit 94b7cc01 upstream.
      
      Syzbot reported the below lockdep splat:
      
          WARNING: possible irq lock inversion dependency detected
          5.6.0-rc7-syzkaller #0 Not tainted
          --------------------------------------------------------
          syz-executor.0/10317 just changed the state of lock:
          ffff888021d16568 (&(&info->lock)->rlock){+.+.}, at: spin_lock include/linux/spinlock.h:338 [inline]
          ffff888021d16568 (&(&info->lock)->rlock){+.+.}, at: shmem_mfill_atomic_pte+0x1012/0x21c0 mm/shmem.c:2407
          but this lock was taken by another, SOFTIRQ-safe lock in the past:
           (&(&xa->xa_lock)->rlock#5){..-.}
      
          and interrupts could create inverse lock ordering between them.
      
          other info that might help us debug this:
           Possible interrupt unsafe locking scenario:
      
                 CPU0                    CPU1
                 ----                    ----
            lock(&(&info->lock)->rlock);
                                         local_irq_disable();
                                         lock(&(&xa->xa_lock)->rlock#5);
                                         lock(&(&info->lock)->rlock);
            <Interrupt>
              lock(&(&xa->xa_lock)->rlock#5);
      
           *** DEADLOCK ***
      
      The full report is quite lengthy, please see:
      
        https://lore.kernel.org/linux-mm/alpine.LSU.2.11.2004152007370.13597@eggly.anvils/T/#m813b412c5f78e25ca8c6c7734886ed4de43f241d
      
      It is because CPU 0 held info->lock with IRQ enabled in userfaultfd_copy
      path, then CPU 1 is splitting a THP which held xa_lock and info->lock in
      IRQ disabled context at the same time.  If softirq comes in to acquire
      xa_lock, the deadlock would be triggered.
      
      The fix is to acquire/release info->lock with *_irq version instead of
      plain spin_{lock,unlock} to make it softirq safe.
      
      Fixes: 4c27fe4c
      
       ("userfaultfd: shmem: add shmem_mcopy_atomic_pte for userfaultfd support")
      Reported-by: default avatar <syzbot+e27980339d305f2dbfd9@syzkaller.appspotmail.com>
      Signed-off-by: default avatarYang Shi <yang.shi@linux.alibaba.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Tested-by: default avatar <syzbot+e27980339d305f2dbfd9@syzkaller.appspotmail.com>
      Acked-by: default avatarHugh Dickins <hughd@google.com>
      Cc: Andrea Arcangeli <aarcange@redhat.com>
      Link: http://lkml.kernel.org/r/1587061357-122619-1-git-send-email-yang.shi@linux.alibaba.com
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a7074b96
    • Stanislav Fomichev's avatar
      selftests/bpf: Fix a couple of broken test_btf cases · d55e35e8
      Stanislav Fomichev authored
      commit e1cebd84 upstream.
      
      Commit 51c39bb1 ("bpf: Introduce function-by-function verification")
      introduced function linkage flag and changed the error message from
      "vlen != 0" to "Invalid func linkage" and broke some fake BPF programs.
      
      Adjust the test accordingly.
      
      AFACT, the programs don't really need any arguments and only look
      at BTF for maps, so let's drop the args altogether.
      
      Before:
      BTF raw test[103] (func (Non zero vlen)): do_test_raw:3703:FAIL expected
      err_str:vlen != 0
      magic: 0xeb9f
      version: 1
      flags: 0x0
      hdr_len: 24
      type_off: 0
      type_len: 72
      str_off: 72
      str_len: 10
      btf_total_size: 106
      [1] INT (anon) size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
      [2] INT (anon) size=4 bits_offset=0 nr_bits=32 encoding=(none)
      [3] FUNC_PROTO (anon) return=0 args=(1 a, 2 b)
      [4] FUNC func type_id=3 Invalid func linkage
      
      BTF libbpf test[1] (test_btf_haskv.o): libbpf: load bpf program failed:
      Invalid argument
      libbpf: -- BEGIN DUMP LOG ---
      libbpf:
      Validating test_long_fname_2() func#1...
      Arg#0 type PTR in test_long_fname_2() is not supported yet.
      processed 0 insns (limit 1000000) max_states_per_insn 0 total_states 0
      peak_states 0 mark_read 0
      
      libbpf: -- END LOG --
      libbpf: failed to load program 'dummy_tracepoint'
      libbpf: failed to load object 'test_btf_haskv.o'
      do_test_file:4201:FAIL bpf_object__load: -4007
      BTF libbpf test[2] (test_btf_newkv.o): libbpf: load bpf program failed:
      Invalid argument
      libbpf: -- BEGIN DUMP LOG ---
      libbpf:
      Validating test_long_fname_2() func#1...
      Arg#0 type PTR in test_long_fname_2() is not supported yet.
      processed 0 insns (limit 1000000) max_states_per_insn 0 total_states 0
      peak_states 0 mark_read 0
      
      libbpf: -- END LOG --
      libbpf: failed to load program 'dummy_tracepoint'
      libbpf: failed to load object 'test_btf_newkv.o'
      do_test_file:4201:FAIL bpf_object__load: -4007
      BTF libbpf test[3] (test_btf_nokv.o): libbpf: load bpf program failed:
      Invalid argument
      libbpf: -- BEGIN DUMP LOG ---
      libbpf:
      Validating test_long_fname_2() func#1...
      Arg#0 type PTR in test_long_fname_2() is not supported yet.
      processed 0 insns (limit 1000000) max_states_per_insn 0 total_states 0
      peak_states 0 mark_read 0
      
      libbpf: -- END LOG --
      libbpf: failed to load program 'dummy_tracepoint'
      libbpf: failed to load object 'test_btf_nokv.o'
      do_test_file:4201:FAIL bpf_object__load: -4007
      
      Fixes: 51c39bb1
      
       ("bpf: Introduce function-by-function verification")
      Signed-off-by: default avatarStanislav Fomichev <sdf@google.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Link: https://lore.kernel.org/bpf/20200422003753.124921-1-sdf@google.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d55e35e8
    • Toke Høiland-Jørgensen's avatar
      bpf: Propagate expected_attach_type when verifying freplace programs · cbde2870
      Toke Høiland-Jørgensen authored
      commit 03f87c0b upstream.
      
      For some program types, the verifier relies on the expected_attach_type of
      the program being verified in the verification process. However, for
      freplace programs, the attach type was not propagated along with the
      verifier ops, so the expected_attach_type would always be zero for freplace
      programs.
      
      This in turn caused the verifier to sometimes make the wrong call for
      freplace programs. For all existing uses of expected_attach_type for this
      purpose, the result of this was only false negatives (i.e., freplace
      functions would be rejected by the verifier even though they were valid
      programs for the target they were replacing). However, should a false
      positive be introduced, this can lead to out-of-bounds accesses and/or
      crashes.
      
      The fix introduced in this patch is to propagate the expected_attach_type
      to the freplace program during verification, and reset it after that is
      done.
      
      Fixes: be8704ff
      
       ("bpf: Introduce dynamic program extensions")
      Signed-off-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Link: https://lore.kernel.org/bpf/158773526726.293902.13257293296560360508.stgit@toke.dk
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      cbde2870
    • Wang YanQing's avatar
      bpf, x86_32: Fix logic error in BPF_LDX zero-extension · e9e3f1d1
      Wang YanQing authored
      commit 5ca1ca01 upstream.
      
      When verifier_zext is true, we don't need to emit code
      for zero-extension.
      
      Fixes: 836256bf
      
       ("x32: bpf: eliminate zero extension code-gen")
      Signed-off-by: default avatarWang YanQing <udknight@gmail.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Link: https://lore.kernel.org/bpf/20200423050637.GA4029@udknight
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e9e3f1d1
    • Luke Nelson's avatar
      bpf, x86_32: Fix clobbering of dst for BPF_JSET · 75d96eb2
      Luke Nelson authored
      commit 50fe7ebb upstream.
      
      The current JIT clobbers the destination register for BPF_JSET BPF_X
      and BPF_K by using "and" and "or" instructions. This is fine when the
      destination register is a temporary loaded from a register stored on
      the stack but not otherwise.
      
      This patch fixes the problem (for both BPF_K and BPF_X) by always loading
      the destination register into temporaries since BPF_JSET should not
      modify the destination register.
      
      This bug may not be currently triggerable as BPF_REG_AX is the only
      register not stored on the stack and the verifier uses it in a limited
      way.
      
      Fixes: 03f5781b
      
       ("bpf, x86_32: add eBPF JIT compiler for ia32")
      Signed-off-by: default avatarXi Wang <xi.wang@gmail.com>
      Signed-off-by: default avatarLuke Nelson <luke.r.nels@gmail.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarWang YanQing <udknight@gmail.com>
      Link: https://lore.kernel.org/bpf/20200422173630.8351-2-luke.r.nels@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      75d96eb2
    • Luke Nelson's avatar
      bpf, x86_32: Fix incorrect encoding in BPF_LDX zero-extension · fb54076d
      Luke Nelson authored
      commit 5fa9a98f upstream.
      
      The current JIT uses the following sequence to zero-extend into the
      upper 32 bits of the destination register for BPF_LDX BPF_{B,H,W},
      when the destination register is not on the stack:
      
        EMIT3(0xC7, add_1reg(0xC0, dst_hi), 0);
      
      The problem is that C7 /0 encodes a MOV instruction that requires a 4-byte
      immediate; the current code emits only 1 byte of the immediate. This
      means that the first 3 bytes of the next instruction will be treated as
      the rest of the immediate, breaking the stream of instructions.
      
      This patch fixes the problem by instead emitting "xor dst_hi,dst_hi"
      to clear the upper 32 bits. This fixes the problem and is more efficient
      than using MOV to load a zero immediate.
      
      This bug may not be currently triggerable as BPF_REG_AX is the only
      register not stored on the stack and the verifier uses it in a limited
      way, and the verifier implements a zero-extension optimization. But the
      JIT should avoid emitting incorrect encodings regardless.
      
      Fixes: 03f5781b
      
       ("bpf, x86_32: add eBPF JIT compiler for ia32")
      Signed-off-by: default avatarXi Wang <xi.wang@gmail.com>
      Signed-off-by: default avatarLuke Nelson <luke.r.nels@gmail.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Reviewed-by: default avatarH. Peter Anvin (Intel) <hpa@zytor.com>
      Acked-by: default avatarWang YanQing <udknight@gmail.com>
      Link: https://lore.kernel.org/bpf/20200422173630.8351-1-luke.r.nels@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      fb54076d
    • Luke Nelson's avatar
      bpf, x86: Fix encoding for lower 8-bit registers in BPF_STX BPF_B · bc0cd5b4
      Luke Nelson authored
      commit aee194b1 upstream.
      
      This patch fixes an encoding bug in emit_stx for BPF_B when the source
      register is BPF_REG_FP.
      
      The current implementation for BPF_STX BPF_B in emit_stx saves one REX
      byte when the operands can be encoded using Mod-R/M alone. The lower 8
      bits of registers %rax, %rbx, %rcx, and %rdx can be accessed without using
      a REX prefix via %al, %bl, %cl, and %dl, respectively. Other registers,
      (e.g., %rsi, %rdi, %rbp, %rsp) require a REX prefix to use their 8-bit
      equivalents (%sil, %dil, %bpl, %spl).
      
      The current code checks if the source for BPF_STX BPF_B is BPF_REG_1
      or BPF_REG_2 (which map to %rdi and %rsi), in which case it emits the
      required REX prefix. However, it misses the case when the source is
      BPF_REG_FP (mapped to %rbp).
      
      The result is that BPF_STX BPF_B with BPF_REG_FP as the source operand
      will read from register %ch instead of the correct %bpl. This patch fixes
      the problem by fixing and refactoring the check on which registers need
      the extra REX byte. Since no BPF registers map to %rsp, there is no need
      to handle %spl.
      
      Fixes: 62258278
      
       ("net: filter: x86: internal BPF JIT")
      Signed-off-by: default avatarXi Wang <xi.wang@gmail.com>
      Signed-off-by: default avatarLuke Nelson <luke.r.nels@gmail.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Link: https://lore.kernel.org/bpf/20200418232655.23870-1-luke.r.nels@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bc0cd5b4
    • Jann Horn's avatar
      bpf: Fix handling of XADD on BTF memory · 7cc3a7ff
      Jann Horn authored
      commit 8ff3571f upstream.
      
      check_xadd() can cause check_ptr_to_btf_access() to be executed with
      atype==BPF_READ and value_regno==-1 (meaning "just check whether the access
      is okay, don't tell me what type it will result in").
      Handle that case properly and skip writing type information, instead of
      indexing into the registers at index -1 and writing into out-of-bounds
      memory.
      
      Note that at least at the moment, you can't actually write through a BTF
      pointer, so check_xadd() will reject the program after calling
      check_ptr_to_btf_access with atype==BPF_WRITE; but that's after the
      verifier has already corrupted memory.
      
      This patch assumes that BTF pointers are not available in unprivileged
      programs.
      
      Fixes: 9e15db66
      
       ("bpf: Implement accurate raw_tp context access via BTF")
      Signed-off-by: default avatarJann Horn <jannh@google.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Link: https://lore.kernel.org/bpf/20200417000007.10734-2-jannh@google.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7cc3a7ff