Skip to content
  1. Jul 27, 2023
    • Florian Westphal's avatar
      netfilter: nft_set_pipapo: fix improper element removal · 706ce3c8
      Florian Westphal authored
      
      
      [ Upstream commit 87b5a5c2 ]
      
      end key should be equal to start unless NFT_SET_EXT_KEY_END is present.
      
      Its possible to add elements that only have a start key
      ("{ 1.0.0.0 . 2.0.0.0 }") without an internval end.
      
      Insertion treats this via:
      
      if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END))
         end = (const u8 *)nft_set_ext_key_end(ext)->data;
      else
         end = start;
      
      but removal side always uses nft_set_ext_key_end().
      This is wrong and leads to garbage remaining in the set after removal
      next lookup/insert attempt will give:
      
      BUG: KASAN: slab-use-after-free in pipapo_get+0x8eb/0xb90
      Read of size 1 at addr ffff888100d50586 by task nft-pipapo_uaf_/1399
      Call Trace:
       kasan_report+0x105/0x140
       pipapo_get+0x8eb/0xb90
       nft_pipapo_insert+0x1dc/0x1710
       nf_tables_newsetelem+0x31f5/0x4e00
       ..
      
      Fixes: 3c4287f6 ("nf_tables: Add set type for arbitrary concatenation of ranges")
      Reported-by: default avatarlonial con <kongln9170@gmail.com>
      Reviewed-by: default avatarStefano Brivio <sbrivio@redhat.com>
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      706ce3c8
    • Florian Westphal's avatar
      netfilter: nf_tables: fix spurious set element insertion failure · 62615b89
      Florian Westphal authored
      
      
      [ Upstream commit ddbd8be6 ]
      
      On some platforms there is a padding hole in the nft_verdict
      structure, between the verdict code and the chain pointer.
      
      On element insertion, if the new element clashes with an existing one and
      NLM_F_EXCL flag isn't set, we want to ignore the -EEXIST error as long as
      the data associated with duplicated element is the same as the existing
      one.  The data equality check uses memcmp.
      
      For normal data (NFT_DATA_VALUE) this works fine, but for NFT_DATA_VERDICT
      padding area leads to spurious failure even if the verdict data is the
      same.
      
      This then makes the insertion fail with 'already exists' error, even
      though the new "key : data" matches an existing entry and userspace
      told the kernel that it doesn't want to receive an error indication.
      
      Fixes: c016c7e4 ("netfilter: nf_tables: honor NLM_F_EXCL flag in set element insertion")
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      62615b89
    • Kuniyuki Iwashima's avatar
      llc: Don't drop packet from non-root netns. · c17b4ec9
      Kuniyuki Iwashima authored
      
      
      [ Upstream commit 6631463b ]
      
      Now these upper layer protocol handlers can be called from llc_rcv()
      as sap->rcv_func(), which is registered by llc_sap_open().
      
        * function which is passed to register_8022_client()
          -> no in-kernel user calls register_8022_client().
      
        * snap_rcv()
          `- proto->rcvfunc() : registered by register_snap_client()
             -> aarp_rcv() and atalk_rcv() drop packets from non-root netns
      
        * stp_pdu_rcv()
          `- garp_protos[]->rcv() : registered by stp_proto_register()
             -> garp_pdu_rcv() and br_stp_rcv() are netns-aware
      
      So, we can safely remove the netns restriction in llc_rcv().
      
      Fixes: e730c155 ("[NET]: Make packet reception network namespace safe")
      Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      c17b4ec9
    • Zhang Shurong's avatar
      fbdev: au1200fb: Fix missing IRQ check in au1200fb_drv_probe · 2400ae8f
      Zhang Shurong authored
      
      
      [ Upstream commit 4e88761f ]
      
      This func misses checking for platform_get_irq()'s call and may passes the
      negative error codes to request_irq(), which takes unsigned IRQ #,
      causing it to fail with -EINVAL, overriding an original error code.
      
      Fix this by stop calling request_irq() with invalid IRQ #s.
      
      Fixes: 1630d85a ("au1200fb: fix hardcoded IRQ")
      Signed-off-by: default avatarZhang Shurong <zhang_shurong@foxmail.com>
      Signed-off-by: default avatarHelge Deller <deller@gmx.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      2400ae8f
    • Kuniyuki Iwashima's avatar
      Revert "tcp: avoid the lookup process failing to get sk in ehash table" · 40276640
      Kuniyuki Iwashima authored
      [ Upstream commit 81b3ade5 ]
      
      This reverts commit 3f4ca5fa.
      
      Commit 3f4ca5fa ("tcp: avoid the lookup process failing to get sk in
      ehash table") reversed the order in how a socket is inserted into ehash
      to fix an issue that ehash-lookup could fail when reqsk/full sk/twsk are
      swapped.  However, it introduced another lookup failure.
      
      The full socket in ehash is allocated from a slab with SLAB_TYPESAFE_BY_RCU
      and does not have SOCK_RCU_FREE, so the socket could be reused even while
      it is being referenced on another CPU doing RCU lookup.
      
      Let's say a socket is reused and inserted into the same hash bucket during
      lookup.  After the blamed commit, a new socket is inserted at the end of
      the list.  If that happens, we will skip sockets placed after the previous
      position of the reused socket, resulting in ehash lookup failure.
      
      As described in Documentation/RCU/rculist_nulls.rst, we should insert a
      new socket at the head of the list to avoid such an issue.
      
      This issue, the swap-lookup-failure, and another variant reported in [0]
      can all be handled properly by adding a locked ehash lookup suggested by
      Eric Dumazet [1].
      
      However, this issue could occur for every packet, thus more likely than
      the other two races, so let's revert the change for now.
      
      Link: https://lore.kernel.org/netdev/20230606064306.9192-1-duanmuquan@baidu.com/ [0]
      Link: https://lore.kernel.org/netdev/CANn89iK8snOz8TYOhhwfimC7ykYA78GA3Nyv8x06SZYa1nKdyA@mail.gmail.com/
      
       [1]
      Fixes: 3f4ca5fa ("tcp: avoid the lookup process failing to get sk in ehash table")
      Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Link: https://lore.kernel.org/r/20230717215918.15723-1-kuniyu@amazon.com
      
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      40276640
    • Yuanjun Gong's avatar
      net:ipv6: check return value of pskb_trim() · b04ab524
      Yuanjun Gong authored
      
      
      [ Upstream commit 4258faa1 ]
      
      goto tx_err if an unexpected result is returned by pskb_tirm()
      in ip6erspan_tunnel_xmit().
      
      Fixes: 5a963eb6 ("ip6_gre: Add ERSPAN native tunnel support")
      Signed-off-by: default avatarYuanjun Gong <ruc_gongyuanjun@163.com>
      Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
      Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b04ab524
    • Wang Ming's avatar
      net: ipv4: Use kfree_sensitive instead of kfree · b87a7e3a
      Wang Ming authored
      
      
      [ Upstream commit daa75144 ]
      
      key might contain private part of the key, so better use
      kfree_sensitive to free it.
      
      Fixes: 38320c70 ("[IPSEC]: Use crypto_aead and authenc in ESP")
      Signed-off-by: default avatarWang Ming <machel@vivo.com>
      Reviewed-by: default avatarTariq Toukan <tariqt@nvidia.com>
      Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b87a7e3a
    • Eric Dumazet's avatar
      tcp: annotate data-races around tcp_rsk(req)->ts_recent · 5dd4d1ff
      Eric Dumazet authored
      
      
      [ Upstream commit eba20811 ]
      
      TCP request sockets are lockless, tcp_rsk(req)->ts_recent
      can change while being read by another cpu as syzbot noticed.
      
      This is harmless, but we should annotate the known races.
      
      Note that tcp_check_req() changes req->ts_recent a bit early,
      we might change this in the future.
      
      BUG: KCSAN: data-race in tcp_check_req / tcp_check_req
      
      write to 0xffff88813c8afb84 of 4 bytes by interrupt on cpu 1:
      tcp_check_req+0x694/0xc70 net/ipv4/tcp_minisocks.c:762
      tcp_v4_rcv+0x12db/0x1b70 net/ipv4/tcp_ipv4.c:2071
      ip_protocol_deliver_rcu+0x356/0x6d0 net/ipv4/ip_input.c:205
      ip_local_deliver_finish+0x13c/0x1a0 net/ipv4/ip_input.c:233
      NF_HOOK include/linux/netfilter.h:303 [inline]
      ip_local_deliver+0xec/0x1c0 net/ipv4/ip_input.c:254
      dst_input include/net/dst.h:468 [inline]
      ip_rcv_finish net/ipv4/ip_input.c:449 [inline]
      NF_HOOK include/linux/netfilter.h:303 [inline]
      ip_rcv+0x197/0x270 net/ipv4/ip_input.c:569
      __netif_receive_skb_one_core net/core/dev.c:5493 [inline]
      __netif_receive_skb+0x90/0x1b0 net/core/dev.c:5607
      process_backlog+0x21f/0x380 net/core/dev.c:5935
      __napi_poll+0x60/0x3b0 net/core/dev.c:6498
      napi_poll net/core/dev.c:6565 [inline]
      net_rx_action+0x32b/0x750 net/core/dev.c:6698
      __do_softirq+0xc1/0x265 kernel/softirq.c:571
      do_softirq+0x7e/0xb0 kernel/softirq.c:472
      __local_bh_enable_ip+0x64/0x70 kernel/softirq.c:396
      local_bh_enable+0x1f/0x20 include/linux/bottom_half.h:33
      rcu_read_unlock_bh include/linux/rcupdate.h:843 [inline]
      __dev_queue_xmit+0xabb/0x1d10 net/core/dev.c:4271
      dev_queue_xmit include/linux/netdevice.h:3088 [inline]
      neigh_hh_output include/net/neighbour.h:528 [inline]
      neigh_output include/net/neighbour.h:542 [inline]
      ip_finish_output2+0x700/0x840 net/ipv4/ip_output.c:229
      ip_finish_output+0xf4/0x240 net/ipv4/ip_output.c:317
      NF_HOOK_COND include/linux/netfilter.h:292 [inline]
      ip_output+0xe5/0x1b0 net/ipv4/ip_output.c:431
      dst_output include/net/dst.h:458 [inline]
      ip_local_out net/ipv4/ip_output.c:126 [inline]
      __ip_queue_xmit+0xa4d/0xa70 net/ipv4/ip_output.c:533
      ip_queue_xmit+0x38/0x40 net/ipv4/ip_output.c:547
      __tcp_transmit_skb+0x1194/0x16e0 net/ipv4/tcp_output.c:1399
      tcp_transmit_skb net/ipv4/tcp_output.c:1417 [inline]
      tcp_write_xmit+0x13ff/0x2fd0 net/ipv4/tcp_output.c:2693
      __tcp_push_pending_frames+0x6a/0x1a0 net/ipv4/tcp_output.c:2877
      tcp_push_pending_frames include/net/tcp.h:1952 [inline]
      __tcp_sock_set_cork net/ipv4/tcp.c:3336 [inline]
      tcp_sock_set_cork+0xe8/0x100 net/ipv4/tcp.c:3343
      rds_tcp_xmit_path_complete+0x3b/0x40 net/rds/tcp_send.c:52
      rds_send_xmit+0xf8d/0x1420 net/rds/send.c:422
      rds_send_worker+0x42/0x1d0 net/rds/threads.c:200
      process_one_work+0x3e6/0x750 kernel/workqueue.c:2408
      worker_thread+0x5f2/0xa10 kernel/workqueue.c:2555
      kthread+0x1d7/0x210 kernel/kthread.c:379
      ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:308
      
      read to 0xffff88813c8afb84 of 4 bytes by interrupt on cpu 0:
      tcp_check_req+0x32a/0xc70 net/ipv4/tcp_minisocks.c:622
      tcp_v4_rcv+0x12db/0x1b70 net/ipv4/tcp_ipv4.c:2071
      ip_protocol_deliver_rcu+0x356/0x6d0 net/ipv4/ip_input.c:205
      ip_local_deliver_finish+0x13c/0x1a0 net/ipv4/ip_input.c:233
      NF_HOOK include/linux/netfilter.h:303 [inline]
      ip_local_deliver+0xec/0x1c0 net/ipv4/ip_input.c:254
      dst_input include/net/dst.h:468 [inline]
      ip_rcv_finish net/ipv4/ip_input.c:449 [inline]
      NF_HOOK include/linux/netfilter.h:303 [inline]
      ip_rcv+0x197/0x270 net/ipv4/ip_input.c:569
      __netif_receive_skb_one_core net/core/dev.c:5493 [inline]
      __netif_receive_skb+0x90/0x1b0 net/core/dev.c:5607
      process_backlog+0x21f/0x380 net/core/dev.c:5935
      __napi_poll+0x60/0x3b0 net/core/dev.c:6498
      napi_poll net/core/dev.c:6565 [inline]
      net_rx_action+0x32b/0x750 net/core/dev.c:6698
      __do_softirq+0xc1/0x265 kernel/softirq.c:571
      run_ksoftirqd+0x17/0x20 kernel/softirq.c:939
      smpboot_thread_fn+0x30a/0x4a0 kernel/smpboot.c:164
      kthread+0x1d7/0x210 kernel/kthread.c:379
      ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:308
      
      value changed: 0x1cd237f1 -> 0x1cd237f2
      
      Fixes: 079096f1 ("tcp/dccp: install syn_recv requests into ehash table")
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
      Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Link: https://lore.kernel.org/r/20230717144445.653164-3-edumazet@google.com
      
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5dd4d1ff
    • Florian Kauer's avatar
      igc: Prevent garbled TX queue with XDP ZEROCOPY · fa941f53
      Florian Kauer authored
      
      
      [ Upstream commit 78adb4bc ]
      
      In normal operation, each populated queue item has
      next_to_watch pointing to the last TX desc of the packet,
      while each cleaned item has it set to 0. In particular,
      next_to_use that points to the next (necessarily clean)
      item to use has next_to_watch set to 0.
      
      When the TX queue is used both by an application using
      AF_XDP with ZEROCOPY as well as a second non-XDP application
      generating high traffic, the queue pointers can get in
      an invalid state where next_to_use points to an item
      where next_to_watch is NOT set to 0.
      
      However, the implementation assumes at several places
      that this is never the case, so if it does hold,
      bad things happen. In particular, within the loop inside
      of igc_clean_tx_irq(), next_to_clean can overtake next_to_use.
      Finally, this prevents any further transmission via
      this queue and it never gets unblocked or signaled.
      Secondly, if the queue is in this garbled state,
      the inner loop of igc_clean_tx_ring() will never terminate,
      completely hogging a CPU core.
      
      The reason is that igc_xdp_xmit_zc() reads next_to_use
      before acquiring the lock, and writing it back
      (potentially unmodified) later. If it got modified
      before locking, the outdated next_to_use is written
      pointing to an item that was already used elsewhere
      (and thus next_to_watch got written).
      
      Fixes: 9acf59a7 ("igc: Enable TX via AF_XDP zero-copy")
      Signed-off-by: default avatarFlorian Kauer <florian.kauer@linutronix.de>
      Reviewed-by: default avatarKurt Kanzenbach <kurt@linutronix.de>
      Tested-by: default avatarKurt Kanzenbach <kurt@linutronix.de>
      Acked-by: default avatarVinicius Costa Gomes <vinicius.gomes@intel.com>
      Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
      Tested-by: default avatarNaama Meir <naamax.meir@linux.intel.com>
      Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
      Link: https://lore.kernel.org/r/20230717175444.3217831-1-anthony.l.nguyen@intel.com
      
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      fa941f53
    • Kumar Kartikeya Dwivedi's avatar
      bpf: Fix subprog idx logic in check_max_stack_depth · e35dc107
      Kumar Kartikeya Dwivedi authored
      
      
      [ Upstream commit ba7b3e7d ]
      
      The assignment to idx in check_max_stack_depth happens once we see a
      bpf_pseudo_call or bpf_pseudo_func. This is not an issue as the rest of
      the code performs a few checks and then pushes the frame to the frame
      stack, except the case of async callbacks. If the async callback case
      causes the loop iteration to be skipped, the idx assignment will be
      incorrect on the next iteration of the loop. The value stored in the
      frame stack (as the subprogno of the current subprog) will be incorrect.
      
      This leads to incorrect checks and incorrect tail_call_reachable
      marking. Save the target subprog in a new variable and only assign to
      idx once we are done with the is_async_cb check which may skip pushing
      of frame to the frame stack and subsequent stack depth checks and tail
      call markings.
      
      Fixes: 7ddc80a4 ("bpf: Teach stack depth check about async callbacks.")
      Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
      Link: https://lore.kernel.org/r/20230717161530.1238-2-memxor@gmail.com
      
      
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e35dc107
    • Geetha sowjanya's avatar
      octeontx2-pf: Dont allocate BPIDs for LBK interfaces · 4e87eb22
      Geetha sowjanya authored
      
      
      [ Upstream commit 8fcd7c7b ]
      
      Current driver enables backpressure for LBK interfaces.
      But these interfaces do not support this feature.
      Hence, this patch fixes the issue by skipping the
      backpressure configuration for these interfaces.
      
      Fixes: 75f36270 ("octeontx2-pf: Support to enable/disable pause frames via ethtool").
      Signed-off-by: default avatarGeetha sowjanya <gakula@marvell.com>
      Signed-off-by: default avatarSunil Goutham <sgoutham@marvell.com>
      Link: https://lore.kernel.org/r/20230716093741.28063-1-gakula@marvell.com
      
      
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      4e87eb22
    • Jiapeng Chong's avatar
      security: keys: Modify mismatched function name · 87fc9616
      Jiapeng Chong authored
      
      
      [ Upstream commit 2a415274 ]
      
      No functional modification involved.
      
      security/keys/trusted-keys/trusted_tpm2.c:203: warning: expecting prototype for tpm_buf_append_auth(). Prototype was for tpm2_buf_append_auth() instead.
      
      Fixes: 2e19e101 ("KEYS: trusted: Move TPM2 trusted keys code")
      Reported-by: default avatarAbaci Robot <abaci@linux.alibaba.com>
      Closes: https://bugzilla.openanolis.cn/show_bug.cgi?id=5524
      
      
      Signed-off-by: default avatarJiapeng Chong <jiapeng.chong@linux.alibaba.com>
      Reviewed-by: default avatarPaul Moore <paul@paul-moore.com>
      Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      87fc9616
    • Ding Hui's avatar
      iavf: Fix out-of-bounds when setting channels on remove · 0fb37ce6
      Ding Hui authored
      
      
      [ Upstream commit 7c4bced3 ]
      
      If we set channels greater during iavf_remove(), and waiting reset done
      would be timeout, then returned with error but changed num_active_queues
      directly, that will lead to OOB like the following logs. Because the
      num_active_queues is greater than tx/rx_rings[] allocated actually.
      
      Reproducer:
      
        [root@host ~]# cat repro.sh
        #!/bin/bash
      
        pf_dbsf="0000:41:00.0"
        vf0_dbsf="0000:41:02.0"
        g_pids=()
      
        function do_set_numvf()
        {
            echo 2 >/sys/bus/pci/devices/${pf_dbsf}/sriov_numvfs
            sleep $((RANDOM%3+1))
            echo 0 >/sys/bus/pci/devices/${pf_dbsf}/sriov_numvfs
            sleep $((RANDOM%3+1))
        }
      
        function do_set_channel()
        {
            local nic=$(ls -1 --indicator-style=none /sys/bus/pci/devices/${vf0_dbsf}/net/)
            [ -z "$nic" ] && { sleep $((RANDOM%3)) ; return 1; }
            ifconfig $nic 192.168.18.5 netmask 255.255.255.0
            ifconfig $nic up
            ethtool -L $nic combined 1
            ethtool -L $nic combined 4
            sleep $((RANDOM%3))
        }
      
        function on_exit()
        {
            local pid
            for pid in "${g_pids[@]}"; do
                kill -0 "$pid" &>/dev/null && kill "$pid" &>/dev/null
            done
            g_pids=()
        }
      
        trap "on_exit; exit" EXIT
      
        while :; do do_set_numvf ; done &
        g_pids+=($!)
        while :; do do_set_channel ; done &
        g_pids+=($!)
      
        wait
      
      Result:
      
      [ 3506.152887] iavf 0000:41:02.0: Removing device
      [ 3510.400799] ==================================================================
      [ 3510.400820] BUG: KASAN: slab-out-of-bounds in iavf_free_all_tx_resources+0x156/0x160 [iavf]
      [ 3510.400823] Read of size 8 at addr ffff88b6f9311008 by task repro.sh/55536
      [ 3510.400823]
      [ 3510.400830] CPU: 101 PID: 55536 Comm: repro.sh Kdump: loaded Tainted: G           O     --------- -t - 4.18.0 #1
      [ 3510.400832] Hardware name: Powerleader PR2008AL/H12DSi-N6, BIOS 2.0 04/09/2021
      [ 3510.400835] Call Trace:
      [ 3510.400851]  dump_stack+0x71/0xab
      [ 3510.400860]  print_address_description+0x6b/0x290
      [ 3510.400865]  ? iavf_free_all_tx_resources+0x156/0x160 [iavf]
      [ 3510.400868]  kasan_report+0x14a/0x2b0
      [ 3510.400873]  iavf_free_all_tx_resources+0x156/0x160 [iavf]
      [ 3510.400880]  iavf_remove+0x2b6/0xc70 [iavf]
      [ 3510.400884]  ? iavf_free_all_rx_resources+0x160/0x160 [iavf]
      [ 3510.400891]  ? wait_woken+0x1d0/0x1d0
      [ 3510.400895]  ? notifier_call_chain+0xc1/0x130
      [ 3510.400903]  pci_device_remove+0xa8/0x1f0
      [ 3510.400910]  device_release_driver_internal+0x1c6/0x460
      [ 3510.400916]  pci_stop_bus_device+0x101/0x150
      [ 3510.400919]  pci_stop_and_remove_bus_device+0xe/0x20
      [ 3510.400924]  pci_iov_remove_virtfn+0x187/0x420
      [ 3510.400927]  ? pci_iov_add_virtfn+0xe10/0xe10
      [ 3510.400929]  ? pci_get_subsys+0x90/0x90
      [ 3510.400932]  sriov_disable+0xed/0x3e0
      [ 3510.400936]  ? bus_find_device+0x12d/0x1a0
      [ 3510.400953]  i40e_free_vfs+0x754/0x1210 [i40e]
      [ 3510.400966]  ? i40e_reset_all_vfs+0x880/0x880 [i40e]
      [ 3510.400968]  ? pci_get_device+0x7c/0x90
      [ 3510.400970]  ? pci_get_subsys+0x90/0x90
      [ 3510.400982]  ? pci_vfs_assigned.part.7+0x144/0x210
      [ 3510.400987]  ? __mutex_lock_slowpath+0x10/0x10
      [ 3510.400996]  i40e_pci_sriov_configure+0x1fa/0x2e0 [i40e]
      [ 3510.401001]  sriov_numvfs_store+0x214/0x290
      [ 3510.401005]  ? sriov_totalvfs_show+0x30/0x30
      [ 3510.401007]  ? __mutex_lock_slowpath+0x10/0x10
      [ 3510.401011]  ? __check_object_size+0x15a/0x350
      [ 3510.401018]  kernfs_fop_write+0x280/0x3f0
      [ 3510.401022]  vfs_write+0x145/0x440
      [ 3510.401025]  ksys_write+0xab/0x160
      [ 3510.401028]  ? __ia32_sys_read+0xb0/0xb0
      [ 3510.401031]  ? fput_many+0x1a/0x120
      [ 3510.401032]  ? filp_close+0xf0/0x130
      [ 3510.401038]  do_syscall_64+0xa0/0x370
      [ 3510.401041]  ? page_fault+0x8/0x30
      [ 3510.401043]  entry_SYSCALL_64_after_hwframe+0x65/0xca
      [ 3510.401073] RIP: 0033:0x7f3a9bb842c0
      [ 3510.401079] Code: 73 01 c3 48 8b 0d d8 cb 2c 00 f7 d8 64 89 01 48 83 c8 ff c3 66 0f 1f 44 00 00 83 3d 89 24 2d 00 00 75 10 b8 01 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 31 c3 48 83 ec 08 e8 fe dd 01 00 48 89 04 24
      [ 3510.401080] RSP: 002b:00007ffc05f1fe18 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
      [ 3510.401083] RAX: ffffffffffffffda RBX: 0000000000000002 RCX: 00007f3a9bb842c0
      [ 3510.401085] RDX: 0000000000000002 RSI: 0000000002327408 RDI: 0000000000000001
      [ 3510.401086] RBP: 0000000002327408 R08: 00007f3a9be53780 R09: 00007f3a9c8a4700
      [ 3510.401086] R10: 0000000000000001 R11: 0000000000000246 R12: 0000000000000002
      [ 3510.401087] R13: 0000000000000001 R14: 00007f3a9be52620 R15: 0000000000000001
      [ 3510.401090]
      [ 3510.401093] Allocated by task 76795:
      [ 3510.401098]  kasan_kmalloc+0xa6/0xd0
      [ 3510.401099]  __kmalloc+0xfb/0x200
      [ 3510.401104]  iavf_init_interrupt_scheme+0x26f/0x1310 [iavf]
      [ 3510.401108]  iavf_watchdog_task+0x1d58/0x4050 [iavf]
      [ 3510.401114]  process_one_work+0x56a/0x11f0
      [ 3510.401115]  worker_thread+0x8f/0xf40
      [ 3510.401117]  kthread+0x2a0/0x390
      [ 3510.401119]  ret_from_fork+0x1f/0x40
      [ 3510.401122]  0xffffffffffffffff
      [ 3510.401123]
      
      In timeout handling, we should keep the original num_active_queues
      and reset num_req_queues to 0.
      
      Fixes: 4e5e6b5d ("iavf: Fix return of set the new channel count")
      Signed-off-by: default avatarDing Hui <dinghui@sangfor.com.cn>
      Cc: Donglin Peng <pengdonglin@sangfor.com.cn>
      Cc: Huang Cun <huangcun@sangfor.com.cn>
      Reviewed-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Tested-by: default avatarRafal Romanowski <rafal.romanowski@intel.com>
      Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      0fb37ce6
    • Ding Hui's avatar
      iavf: Fix use-after-free in free_netdev · 345c44e1
      Ding Hui authored
      
      
      [ Upstream commit 5f4fa167 ]
      
      We do netif_napi_add() for all allocated q_vectors[], but potentially
      do netif_napi_del() for part of them, then kfree q_vectors and leave
      invalid pointers at dev->napi_list.
      
      Reproducer:
      
        [root@host ~]# cat repro.sh
        #!/bin/bash
      
        pf_dbsf="0000:41:00.0"
        vf0_dbsf="0000:41:02.0"
        g_pids=()
      
        function do_set_numvf()
        {
            echo 2 >/sys/bus/pci/devices/${pf_dbsf}/sriov_numvfs
            sleep $((RANDOM%3+1))
            echo 0 >/sys/bus/pci/devices/${pf_dbsf}/sriov_numvfs
            sleep $((RANDOM%3+1))
        }
      
        function do_set_channel()
        {
            local nic=$(ls -1 --indicator-style=none /sys/bus/pci/devices/${vf0_dbsf}/net/)
            [ -z "$nic" ] && { sleep $((RANDOM%3)) ; return 1; }
            ifconfig $nic 192.168.18.5 netmask 255.255.255.0
            ifconfig $nic up
            ethtool -L $nic combined 1
            ethtool -L $nic combined 4
            sleep $((RANDOM%3))
        }
      
        function on_exit()
        {
            local pid
            for pid in "${g_pids[@]}"; do
                kill -0 "$pid" &>/dev/null && kill "$pid" &>/dev/null
            done
            g_pids=()
        }
      
        trap "on_exit; exit" EXIT
      
        while :; do do_set_numvf ; done &
        g_pids+=($!)
        while :; do do_set_channel ; done &
        g_pids+=($!)
      
        wait
      
      Result:
      
      [ 4093.900222] ==================================================================
      [ 4093.900230] BUG: KASAN: use-after-free in free_netdev+0x308/0x390
      [ 4093.900232] Read of size 8 at addr ffff88b4dc145640 by task repro.sh/6699
      [ 4093.900233]
      [ 4093.900236] CPU: 10 PID: 6699 Comm: repro.sh Kdump: loaded Tainted: G           O     --------- -t - 4.18.0 #1
      [ 4093.900238] Hardware name: Powerleader PR2008AL/H12DSi-N6, BIOS 2.0 04/09/2021
      [ 4093.900239] Call Trace:
      [ 4093.900244]  dump_stack+0x71/0xab
      [ 4093.900249]  print_address_description+0x6b/0x290
      [ 4093.900251]  ? free_netdev+0x308/0x390
      [ 4093.900252]  kasan_report+0x14a/0x2b0
      [ 4093.900254]  free_netdev+0x308/0x390
      [ 4093.900261]  iavf_remove+0x825/0xd20 [iavf]
      [ 4093.900265]  pci_device_remove+0xa8/0x1f0
      [ 4093.900268]  device_release_driver_internal+0x1c6/0x460
      [ 4093.900271]  pci_stop_bus_device+0x101/0x150
      [ 4093.900273]  pci_stop_and_remove_bus_device+0xe/0x20
      [ 4093.900275]  pci_iov_remove_virtfn+0x187/0x420
      [ 4093.900277]  ? pci_iov_add_virtfn+0xe10/0xe10
      [ 4093.900278]  ? pci_get_subsys+0x90/0x90
      [ 4093.900280]  sriov_disable+0xed/0x3e0
      [ 4093.900282]  ? bus_find_device+0x12d/0x1a0
      [ 4093.900290]  i40e_free_vfs+0x754/0x1210 [i40e]
      [ 4093.900298]  ? i40e_reset_all_vfs+0x880/0x880 [i40e]
      [ 4093.900299]  ? pci_get_device+0x7c/0x90
      [ 4093.900300]  ? pci_get_subsys+0x90/0x90
      [ 4093.900306]  ? pci_vfs_assigned.part.7+0x144/0x210
      [ 4093.900309]  ? __mutex_lock_slowpath+0x10/0x10
      [ 4093.900315]  i40e_pci_sriov_configure+0x1fa/0x2e0 [i40e]
      [ 4093.900318]  sriov_numvfs_store+0x214/0x290
      [ 4093.900320]  ? sriov_totalvfs_show+0x30/0x30
      [ 4093.900321]  ? __mutex_lock_slowpath+0x10/0x10
      [ 4093.900323]  ? __check_object_size+0x15a/0x350
      [ 4093.900326]  kernfs_fop_write+0x280/0x3f0
      [ 4093.900329]  vfs_write+0x145/0x440
      [ 4093.900330]  ksys_write+0xab/0x160
      [ 4093.900332]  ? __ia32_sys_read+0xb0/0xb0
      [ 4093.900334]  ? fput_many+0x1a/0x120
      [ 4093.900335]  ? filp_close+0xf0/0x130
      [ 4093.900338]  do_syscall_64+0xa0/0x370
      [ 4093.900339]  ? page_fault+0x8/0x30
      [ 4093.900341]  entry_SYSCALL_64_after_hwframe+0x65/0xca
      [ 4093.900357] RIP: 0033:0x7f16ad4d22c0
      [ 4093.900359] Code: 73 01 c3 48 8b 0d d8 cb 2c 00 f7 d8 64 89 01 48 83 c8 ff c3 66 0f 1f 44 00 00 83 3d 89 24 2d 00 00 75 10 b8 01 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 31 c3 48 83 ec 08 e8 fe dd 01 00 48 89 04 24
      [ 4093.900360] RSP: 002b:00007ffd6491b7f8 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
      [ 4093.900362] RAX: ffffffffffffffda RBX: 0000000000000002 RCX: 00007f16ad4d22c0
      [ 4093.900363] RDX: 0000000000000002 RSI: 0000000001a41408 RDI: 0000000000000001
      [ 4093.900364] RBP: 0000000001a41408 R08: 00007f16ad7a1780 R09: 00007f16ae1f2700
      [ 4093.900364] R10: 0000000000000001 R11: 0000000000000246 R12: 0000000000000002
      [ 4093.900365] R13: 0000000000000001 R14: 00007f16ad7a0620 R15: 0000000000000001
      [ 4093.900367]
      [ 4093.900368] Allocated by task 820:
      [ 4093.900371]  kasan_kmalloc+0xa6/0xd0
      [ 4093.900373]  __kmalloc+0xfb/0x200
      [ 4093.900376]  iavf_init_interrupt_scheme+0x63b/0x1320 [iavf]
      [ 4093.900380]  iavf_watchdog_task+0x3d51/0x52c0 [iavf]
      [ 4093.900382]  process_one_work+0x56a/0x11f0
      [ 4093.900383]  worker_thread+0x8f/0xf40
      [ 4093.900384]  kthread+0x2a0/0x390
      [ 4093.900385]  ret_from_fork+0x1f/0x40
      [ 4093.900387]  0xffffffffffffffff
      [ 4093.900387]
      [ 4093.900388] Freed by task 6699:
      [ 4093.900390]  __kasan_slab_free+0x137/0x190
      [ 4093.900391]  kfree+0x8b/0x1b0
      [ 4093.900394]  iavf_free_q_vectors+0x11d/0x1a0 [iavf]
      [ 4093.900397]  iavf_remove+0x35a/0xd20 [iavf]
      [ 4093.900399]  pci_device_remove+0xa8/0x1f0
      [ 4093.900400]  device_release_driver_internal+0x1c6/0x460
      [ 4093.900401]  pci_stop_bus_device+0x101/0x150
      [ 4093.900402]  pci_stop_and_remove_bus_device+0xe/0x20
      [ 4093.900403]  pci_iov_remove_virtfn+0x187/0x420
      [ 4093.900404]  sriov_disable+0xed/0x3e0
      [ 4093.900409]  i40e_free_vfs+0x754/0x1210 [i40e]
      [ 4093.900415]  i40e_pci_sriov_configure+0x1fa/0x2e0 [i40e]
      [ 4093.900416]  sriov_numvfs_store+0x214/0x290
      [ 4093.900417]  kernfs_fop_write+0x280/0x3f0
      [ 4093.900418]  vfs_write+0x145/0x440
      [ 4093.900419]  ksys_write+0xab/0x160
      [ 4093.900420]  do_syscall_64+0xa0/0x370
      [ 4093.900421]  entry_SYSCALL_64_after_hwframe+0x65/0xca
      [ 4093.900422]  0xffffffffffffffff
      [ 4093.900422]
      [ 4093.900424] The buggy address belongs to the object at ffff88b4dc144200
                      which belongs to the cache kmalloc-8k of size 8192
      [ 4093.900425] The buggy address is located 5184 bytes inside of
                      8192-byte region [ffff88b4dc144200, ffff88b4dc146200)
      [ 4093.900425] The buggy address belongs to the page:
      [ 4093.900427] page:ffffea00d3705000 refcount:1 mapcount:0 mapping:ffff88bf04415c80 index:0x0 compound_mapcount: 0
      [ 4093.900430] flags: 0x10000000008100(slab|head)
      [ 4093.900433] raw: 0010000000008100 dead000000000100 dead000000000200 ffff88bf04415c80
      [ 4093.900434] raw: 0000000000000000 0000000000030003 00000001ffffffff 0000000000000000
      [ 4093.900434] page dumped because: kasan: bad access detected
      [ 4093.900435]
      [ 4093.900435] Memory state around the buggy address:
      [ 4093.900436]  ffff88b4dc145500: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      [ 4093.900437]  ffff88b4dc145580: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      [ 4093.900438] >ffff88b4dc145600: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      [ 4093.900438]                                            ^
      [ 4093.900439]  ffff88b4dc145680: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      [ 4093.900440]  ffff88b4dc145700: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      [ 4093.900440] ==================================================================
      
      Although the patch #2 (of 2) can avoid the issue triggered by this
      repro.sh, there still are other potential risks that if num_active_queues
      is changed to less than allocated q_vectors[] by unexpected, the
      mismatched netif_napi_add/del() can also cause UAF.
      
      Since we actually call netif_napi_add() for all allocated q_vectors
      unconditionally in iavf_alloc_q_vectors(), so we should fix it by
      letting netif_napi_del() match to netif_napi_add().
      
      Fixes: 5eae00c5 ("i40evf: main driver core")
      Signed-off-by: default avatarDing Hui <dinghui@sangfor.com.cn>
      Cc: Donglin Peng <pengdonglin@sangfor.com.cn>
      Cc: Huang Cun <huangcun@sangfor.com.cn>
      Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
      Reviewed-by: default avatarMadhu Chittim <madhu.chittim@intel.com>
      Reviewed-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Tested-by: default avatarRafal Romanowski <rafal.romanowski@intel.com>
      Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      345c44e1
    • Victor Nogueira's avatar
      net: sched: cls_bpf: Undo tcf_bind_filter in case of an error · 52ed1614
      Victor Nogueira authored
      
      
      [ Upstream commit 26a22194 ]
      
      If cls_bpf_offload errors out, we must also undo tcf_bind_filter that
      was done before the error.
      
      Fix that by calling tcf_unbind_filter in errout_parms.
      
      Fixes: eadb4148 ("net: cls_bpf: add support for marking filters as hardware-only")
      Signed-off-by: default avatarVictor Nogueira <victor@mojatatu.com>
      Acked-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
      Reviewed-by: default avatarPedro Tammela <pctammela@mojatatu.com>
      Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      52ed1614
    • Daniel Golle's avatar
      net: ethernet: mtk_eth_soc: handle probe deferral · 5ed16eca
      Daniel Golle authored
      
      
      [ Upstream commit 1d6d537d ]
      
      Move the call to of_get_ethdev_address to mtk_add_mac which is part of
      the probe function and can hence itself return -EPROBE_DEFER should
      of_get_ethdev_address return -EPROBE_DEFER. This allows us to entirely
      get rid of the mtk_init function.
      
      The problem of of_get_ethdev_address returning -EPROBE_DEFER surfaced
      in situations in which the NVMEM provider holding the MAC address has
      not yet be loaded at the time mtk_eth_soc is initially probed. In this
      case probing of mtk_eth_soc should be deferred instead of falling back
      to use a random MAC address, so once the NVMEM provider becomes
      available probing can be repeated.
      
      Fixes: 656e7052 ("net-next: mediatek: add support for MT7623 ethernet")
      Signed-off-by: default avatarDaniel Golle <daniel@makrotopia.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5ed16eca
    • Jakub Kicinski's avatar
      ethernet: use of_get_ethdev_address() · 39479093
      Jakub Kicinski authored
      
      
      [ Upstream commit 9ca01b25 ]
      
      Use the new of_get_ethdev_address() helper for the cases
      where dev->dev_addr is passed in directly as the destination.
      
        @@
        expression dev, np;
        @@
        - of_get_mac_address(np, dev->dev_addr)
        + of_get_ethdev_address(np, dev)
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Stable-dep-of: 1d6d537d ("net: ethernet: mtk_eth_soc: handle probe deferral")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      39479093
    • Jakub Kicinski's avatar
      of: net: add a helper for loading netdev->dev_addr · cb1e666e
      Jakub Kicinski authored
      
      
      [ Upstream commit d466effe ]
      
      Commit 406f42fa ("net-next: When a bond have a massive amount
      of VLANs...") introduced a rbtree for faster Ethernet address look
      up. To maintain netdev->dev_addr in this tree we need to make all
      the writes to it got through appropriate helpers.
      
      There are roughly 40 places where netdev->dev_addr is passed
      as the destination to a of_get_mac_address() call. Add a helper
      which takes a dev pointer instead, so it can call an appropriate
      helper.
      
      Note that of_get_mac_address() already assumes the address is
      6 bytes long (ETH_ALEN) so use eth_hw_addr_set().
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Stable-dep-of: 1d6d537d ("net: ethernet: mtk_eth_soc: handle probe deferral")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      cb1e666e
    • Jakub Kicinski's avatar
      ethernet: use eth_hw_addr_set() instead of ether_addr_copy() · 43da399e
      Jakub Kicinski authored
      
      
      [ Upstream commit f3956ebb ]
      
      Convert Ethernet from ether_addr_copy() to eth_hw_addr_set():
      
        @@
        expression dev, np;
        @@
        - ether_addr_copy(dev->dev_addr, np)
        + eth_hw_addr_set(dev, np)
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Stable-dep-of: 1d6d537d ("net: ethernet: mtk_eth_soc: handle probe deferral")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      43da399e
    • Kuniyuki Iwashima's avatar
      bridge: Add extack warning when enabling STP in netns. · 3fb402bd
      Kuniyuki Iwashima authored
      
      
      [ Upstream commit 56a16035 ]
      
      When we create an L2 loop on a bridge in netns, we will see packets storm
      even if STP is enabled.
      
        # unshare -n
        # ip link add br0 type bridge
        # ip link add veth0 type veth peer name veth1
        # ip link set veth0 master br0 up
        # ip link set veth1 master br0 up
        # ip link set br0 type bridge stp_state 1
        # ip link set br0 up
        # sleep 30
        # ip -s link show br0
        2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
            link/ether b6:61:98:1c:1c:b5 brd ff:ff:ff:ff:ff:ff
            RX: bytes  packets  errors  dropped missed  mcast
            956553768  12861249 0       0       0       12861249  <-. Keep
            TX: bytes  packets  errors  dropped carrier collsns     |  increasing
            1027834    11951    0       0       0       0         <-'   rapidly
      
      This is because llc_rcv() drops all packets in non-root netns and BPDU
      is dropped.
      
      Let's add extack warning when enabling STP in netns.
      
        # unshare -n
        # ip link add br0 type bridge
        # ip link set br0 type bridge stp_state 1
        Warning: bridge: STP does not work in non-root netns.
      
      Note this commit will be reverted later when we namespacify the whole LLC
      infra.
      
      Fixes: e730c155 ("[NET]: Make packet reception network namespace safe")
      Suggested-by: default avatarHarry Coin <hcoin@quietfountain.com>
      Link: https://lore.kernel.org/netdev/0f531295-e289-022d-5add-5ceffa0df9bc@quietfountain.com/
      
      
      Suggested-by: default avatarIdo Schimmel <idosch@idosch.org>
      Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
      Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      3fb402bd
    • Tanmay Patil's avatar
      net: ethernet: ti: cpsw_ale: Fix cpsw_ale_get_field()/cpsw_ale_set_field() · ec4ac15e
      Tanmay Patil authored
      
      
      [ Upstream commit b685f1a5 ]
      
      CPSW ALE has 75 bit ALE entries which are stored within three 32 bit words.
      The cpsw_ale_get_field() and cpsw_ale_set_field() functions assume that the
      field will be strictly contained within one word. However, this is not
      guaranteed to be the case and it is possible for ALE field entries to span
      across up to two words at the most.
      
      Fix the methods to handle getting/setting fields spanning up to two words.
      
      Fixes: db82173f ("netdev: driver: ethernet: add cpsw address lookup engine support")
      Signed-off-by: default avatarTanmay Patil <t-patil@ti.com>
      [s-vadapalli@ti.com: rephrased commit message and added Fixes tag]
      Signed-off-by: default avatarSiddharth Vadapalli <s-vadapalli@ti.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      ec4ac15e
    • Mario Limonciello's avatar
      pinctrl: amd: Use amd_pinconf_set() for all config options · 6a5d6096
      Mario Limonciello authored
      
      
      [ Upstream commit 635a750d ]
      
      On ASUS TUF A16 it is reported that the ITE5570 ACPI device connected to
      GPIO 7 is causing an interrupt storm.  This issue doesn't happen on
      Windows.
      
      Comparing the GPIO register configuration between Windows and Linux
      bit 20 has been configured as a pull up on Windows, but not on Linux.
      Checking GPIO declaration from the firmware it is clear it *should* have
      been a pull up on Linux as well.
      
      ```
      GpioInt (Level, ActiveLow, Exclusive, PullUp, 0x0000,
      	 "\\_SB.GPIO", 0x00, ResourceConsumer, ,)
      {   // Pin list
      0x0007
      }
      ```
      
      On Linux amd_gpio_set_config() is currently only used for programming
      the debounce. Actually the GPIO core calls it with all the arguments
      that are supported by a GPIO, pinctrl-amd just responds `-ENOTSUPP`.
      
      To solve this issue expand amd_gpio_set_config() to support the other
      arguments amd_pinconf_set() supports, namely `PIN_CONFIG_BIAS_PULL_DOWN`,
      `PIN_CONFIG_BIAS_PULL_UP`, and `PIN_CONFIG_DRIVE_STRENGTH`.
      
      Reported-by: default avatarNik P <npliashechnikov@gmail.com>
      Reported-by: default avatarNathan Schulte <nmschulte@gmail.com>
      Reported-by: default avatarFriedrich Vock <friedrich.vock@gmx.de>
      Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217336
      
      
      Reported-by: default avatar <dridri85@gmail.com>
      Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217493
      Link: https://lore.kernel.org/linux-input/20230530154058.17594-1-friedrich.vock@gmx.de/
      
      
      Tested-by: default avatarJan Visser <starquake@linuxeverywhere.org>
      Fixes: 2956b5d9 ("pinctrl / gpio: Introduce .set_config() callback for GPIO chips")
      Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
      Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Link: https://lore.kernel.org/r/20230705133005.577-3-mario.limonciello@amd.com
      
      
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      6a5d6096
    • James Clark's avatar
      perf build: Fix library not found error when using CSLIBS · 4727cece
      James Clark authored
      
      
      [ Upstream commit 1feece27 ]
      
      -L only specifies the search path for libraries directly provided in the
      link line with -l. Because -lopencsd isn't specified, it's only linked
      because it's a dependency of -lopencsd_c_api. Dependencies like this are
      resolved using the default system search paths or -rpath-link=... rather
      than -L. This means that compilation only works if OpenCSD is installed
      to the system rather than provided with the CSLIBS (-L) option.
      
      This could be fixed by adding -Wl,-rpath-link=$(CSLIBS) but that is less
      conventional than just adding -lopencsd to the link line so that it uses
      -L. -lopencsd seems to have been removed in commit ed17b191
      ("perf tools: Drop requirement for libstdc++.so for libopencsd check")
      because it was thought that there was a chance compilation would work
      even if it didn't exist, but I think that only applies to libstdc++ so
      there is no harm to add it back. libopencsd.so and libopencsd_c_api.so
      would always exist together.
      
      Testing
      =======
      
      The following scenarios now all work:
      
       * Cross build with OpenCSD installed
       * Cross build using CSLIBS=...
       * Native build with OpenCSD installed
       * Native build using CSLIBS=...
       * Static cross build with OpenCSD installed
       * Static cross build with CSLIBS=...
      
      Committer testing:
      
        ⬢[acme@toolbox perf-tools]$ alias m
        alias m='make -k BUILD_BPF_SKEL=1 CORESIGHT=1 O=/tmp/build/perf-tools -C tools/perf install-bin && git status && perf test python ;  perf record -o /dev/null sleep 0.01 ; perf stat --null sleep 0.01'
        ⬢[acme@toolbox perf-tools]$ ldd ~/bin/perf | grep csd
        	libopencsd_c_api.so.1 => /lib64/libopencsd_c_api.so.1 (0x00007fd49c44e000)
        	libopencsd.so.1 => /lib64/libopencsd.so.1 (0x00007fd49bd56000)
        ⬢[acme@toolbox perf-tools]$ cat /etc/redhat-release
        Fedora release 36 (Thirty Six)
        ⬢[acme@toolbox perf-tools]$
      
      Fixes: ed17b191 ("perf tools: Drop requirement for libstdc++.so for libopencsd check")
      Reported-by: default avatarRadhey Shyam Pandey <radhey.shyam.pandey@amd.com>
      Signed-off-by: default avatarJames Clark <james.clark@arm.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Tested-by: default avatarRadhey Shyam Pandey <radhey.shyam.pandey@amd.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Uwe Kleine-König <uwe@kleine-koenig.org>
      Cc: coresight@lists.linaro.org
      Closes: https://lore.kernel.org/linux-arm-kernel/56905d7a-a91e-883a-b707-9d5f686ba5f1@arm.com/
      Link: https://lore.kernel.org/all/36cc4dc6-bf4b-1093-1c0a-876e368af183@kleine-koenig.org/
      Link: https://lore.kernel.org/r/20230707154546.456720-1-james.clark@arm.com
      
      
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      4727cece
    • Martin Kaiser's avatar
      fbdev: imxfb: warn about invalid left/right margin · 29fb046e
      Martin Kaiser authored
      
      
      [ Upstream commit 4e47382f ]
      
      Warn about invalid var->left_margin or var->right_margin. Their values
      are read from the device tree.
      
      We store var->left_margin-3 and var->right_margin-1 in register
      fields. These fields should be >= 0.
      
      Fixes: 7e8549bc ("imxfb: Fix margin settings")
      Signed-off-by: default avatarMartin Kaiser <martin@kaiser.cx>
      Signed-off-by: default avatarHelge Deller <deller@gmx.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      29fb046e
    • Jonas Gorski's avatar
      spi: bcm63xx: fix max prepend length · 5d191467
      Jonas Gorski authored
      
      
      [ Upstream commit 5158814c ]
      
      The command word is defined as following:
      
          /* Command */
          #define SPI_CMD_COMMAND_SHIFT           0
          #define SPI_CMD_DEVICE_ID_SHIFT         4
          #define SPI_CMD_PREPEND_BYTE_CNT_SHIFT  8
          #define SPI_CMD_ONE_BYTE_SHIFT          11
          #define SPI_CMD_ONE_WIRE_SHIFT          12
      
      If the prepend byte count field starts at bit 8, and the next defined
      bit is SPI_CMD_ONE_BYTE at bit 11, it can be at most 3 bits wide, and
      thus the max value is 7, not 15.
      
      Fixes: b17de076 ("spi/bcm63xx: work around inability to keep CS up")
      Signed-off-by: default avatarJonas Gorski <jonas.gorski@gmail.com>
      Link: https://lore.kernel.org/r/20230629071453.62024-1-jonas.gorski@gmail.com
      
      
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5d191467
    • Immad Mir's avatar
      FS: JFS: Check for read-only mounted filesystem in txBegin · 2febd5f8
      Immad Mir authored
      
      
      [ Upstream commit 95e2b352 ]
      
       This patch adds a check for read-only mounted filesystem
       in txBegin before starting a transaction potentially saving
       from NULL pointer deref.
      
      Signed-off-by: default avatarImmad Mir <mirimmad17@gmail.com>
      Signed-off-by: default avatarDave Kleikamp <dave.kleikamp@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      2febd5f8
    • Immad Mir's avatar
      FS: JFS: Fix null-ptr-deref Read in txBegin · 3e94d0d3
      Immad Mir authored
      
      
      [ Upstream commit 47cfdc33 ]
      
       Syzkaller reported an issue where txBegin may be called
       on a superblock in a read-only mounted filesystem which leads
       to NULL pointer deref. This could be solved by checking if
       the filesystem is read-only before calling txBegin, and returning
       with appropiate error code.
      
      Reported-By: default avatar <syzbot+f1faa20eec55e0c8644c@syzkaller.appspotmail.com>
      Link: https://syzkaller.appspot.com/bug?id=be7e52c50c5182cc09a09ea6fc456446b2039de3
      
      
      
      Signed-off-by: default avatarImmad Mir <mirimmad17@gmail.com>
      Signed-off-by: default avatarDave Kleikamp <dave.kleikamp@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      3e94d0d3
    • Gustavo A. R. Silva's avatar
      MIPS: dec: prom: Address -Warray-bounds warning · 13ae3f2f
      Gustavo A. R. Silva authored
      [ Upstream commit 7b191b9b ]
      
      Zero-length arrays are deprecated, and we are replacing them with flexible
      array members instead. So, replace zero-length array with flexible-array
      member in struct memmap.
      
      Address the following warning found after building (with GCC-13) mips64
      with decstation_64_defconfig:
      In function 'rex_setup_memory_region',
          inlined from 'prom_meminit' at arch/mips/dec/prom/memory.c:91:3:
      arch/mips/dec/prom/memory.c:72:31: error: array subscript i is outside array bounds of 'unsigned char[0]' [-Werror=array-bounds=]
         72 |                 if (bm->bitmap[i] == 0xff)
            |                     ~~~~~~~~~~^~~
      In file included from arch/mips/dec/prom/memory.c:16:
      ./arch/mips/include/asm/dec/prom.h: In function 'prom_meminit':
      ./arch/mips/include/asm/dec/prom.h:73:23: note: while referencing 'bitmap'
         73 |         unsigned char bitmap[0];
      
      This helps with the ongoing efforts to globally enable -Warray-bounds.
      
      This results in no differences in binary output.
      
      Link: https://github.com/KSPP/linux/issues/79
      Link: https://github.com/KSPP/linux/issues/323
      
      
      Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
      Signed-off-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      13ae3f2f
    • Yogesh's avatar
      fs: jfs: Fix UBSAN: array-index-out-of-bounds in dbAllocDmapLev · 39f6292d
      Yogesh authored
      
      
      [ Upstream commit 4e302336 ]
      
      Syzkaller reported the following issue:
      
      UBSAN: array-index-out-of-bounds in fs/jfs/jfs_dmap.c:1965:6
      index -84 is out of range for type 's8[341]' (aka 'signed char[341]')
      CPU: 1 PID: 4995 Comm: syz-executor146 Not tainted 6.4.0-rc6-syzkaller-00037-gb6dad5178cea #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/27/2023
      Call Trace:
       <TASK>
       __dump_stack lib/dump_stack.c:88 [inline]
       dump_stack_lvl+0x1e7/0x2d0 lib/dump_stack.c:106
       ubsan_epilogue lib/ubsan.c:217 [inline]
       __ubsan_handle_out_of_bounds+0x11c/0x150 lib/ubsan.c:348
       dbAllocDmapLev+0x3e5/0x430 fs/jfs/jfs_dmap.c:1965
       dbAllocCtl+0x113/0x920 fs/jfs/jfs_dmap.c:1809
       dbAllocAG+0x28f/0x10b0 fs/jfs/jfs_dmap.c:1350
       dbAlloc+0x658/0xca0 fs/jfs/jfs_dmap.c:874
       dtSplitUp fs/jfs/jfs_dtree.c:974 [inline]
       dtInsert+0xda7/0x6b00 fs/jfs/jfs_dtree.c:863
       jfs_create+0x7b6/0xbb0 fs/jfs/namei.c:137
       lookup_open fs/namei.c:3492 [inline]
       open_last_lookups fs/namei.c:3560 [inline]
       path_openat+0x13df/0x3170 fs/namei.c:3788
       do_filp_open+0x234/0x490 fs/namei.c:3818
       do_sys_openat2+0x13f/0x500 fs/open.c:1356
       do_sys_open fs/open.c:1372 [inline]
       __do_sys_openat fs/open.c:1388 [inline]
       __se_sys_openat fs/open.c:1383 [inline]
       __x64_sys_openat+0x247/0x290 fs/open.c:1383
       do_syscall_x64 arch/x86/entry/common.c:50 [inline]
       do_syscall_64+0x41/0xc0 arch/x86/entry/common.c:80
       entry_SYSCALL_64_after_hwframe+0x63/0xcd
      RIP: 0033:0x7f1f4e33f7e9
      Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 51 14 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 c0 ff ff ff f7 d8 64 89 01 48
      RSP: 002b:00007ffc21129578 EFLAGS: 00000246 ORIG_RAX: 0000000000000101
      RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f1f4e33f7e9
      RDX: 000000000000275a RSI: 0000000020000040 RDI: 00000000ffffff9c
      RBP: 00007f1f4e2ff080 R08: 0000000000000000 R09: 0000000000000000
      R10: 0000000000000000 R11: 0000000000000246 R12: 00007f1f4e2ff110
      R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
       </TASK>
      
      The bug occurs when the dbAllocDmapLev()function attempts to access
      dp->tree.stree[leafidx + LEAFIND] while the leafidx value is negative.
      
      To rectify this, the patch introduces a safeguard within the
      dbAllocDmapLev() function. A check has been added to verify if leafidx is
      negative. If it is, the function immediately returns an I/O error, preventing
      any further execution that could potentially cause harm.
      
      Tested via syzbot.
      
      Reported-by: default avatar <syzbot+853a6f4dfa3cf37d3aea@syzkaller.appspotmail.com>
      Link: https://syzkaller.appspot.com/bug?extid=ae2f5a27a07ae44b0f17
      
      
      Signed-off-by: default avatarYogesh <yogi.kernel@gmail.com>
      Signed-off-by: default avatarDave Kleikamp <dave.kleikamp@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      39f6292d
    • Jan Kara's avatar
      udf: Fix uninitialized array access for some pathnames · 985f9666
      Jan Kara authored
      
      
      [ Upstream commit 028f6055 ]
      
      For filenames that begin with . and are between 2 and 5 characters long,
      UDF charset conversion code would read uninitialized memory in the
      output buffer. The only practical impact is that the name may be prepended a
      "unification hash" when it is not actually needed but still it is good
      to fix this.
      
      Reported-by: default avatar <syzbot+cd311b1e43cc25f90d18@syzkaller.appspotmail.com>
      Link: https://lore.kernel.org/all/000000000000e2638a05fe9dc8f9@google.com
      
      
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      985f9666
    • Ye Bin's avatar
      quota: fix warning in dqgrab() · 579d814d
      Ye Bin authored
      
      
      [ Upstream commit d6a95db3 ]
      
      There's issue as follows when do fault injection:
      WARNING: CPU: 1 PID: 14870 at include/linux/quotaops.h:51 dquot_disable+0x13b7/0x18c0
      Modules linked in:
      CPU: 1 PID: 14870 Comm: fsconfig Not tainted 6.3.0-next-20230505-00006-g5107a9c821af-dirty #541
      RIP: 0010:dquot_disable+0x13b7/0x18c0
      RSP: 0018:ffffc9000acc79e0 EFLAGS: 00010246
      RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffff88825e41b980
      RDX: 0000000000000000 RSI: ffff88825e41b980 RDI: 0000000000000002
      RBP: ffff888179f68000 R08: ffffffff82087ca7 R09: 0000000000000000
      R10: 0000000000000001 R11: ffffed102f3ed026 R12: ffff888179f68130
      R13: ffff888179f68110 R14: dffffc0000000000 R15: ffff888179f68118
      FS:  00007f450a073740(0000) GS:ffff88882fc00000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007ffe96f2efd8 CR3: 000000025c8ad000 CR4: 00000000000006e0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      Call Trace:
       <TASK>
       dquot_load_quota_sb+0xd53/0x1060
       dquot_resume+0x172/0x230
       ext4_reconfigure+0x1dc6/0x27b0
       reconfigure_super+0x515/0xa90
       __x64_sys_fsconfig+0xb19/0xd20
       do_syscall_64+0x39/0xb0
       entry_SYSCALL_64_after_hwframe+0x63/0xcd
      
      Above issue may happens as follows:
      ProcessA              ProcessB                    ProcessC
      sys_fsconfig
        vfs_fsconfig_locked
         reconfigure_super
           ext4_remount
            dquot_suspend -> suspend all type quota
      
                       sys_fsconfig
                        vfs_fsconfig_locked
                          reconfigure_super
                           ext4_remount
                            dquot_resume
                             ret = dquot_load_quota_sb
                              add_dquot_ref
                                                 do_open  -> open file O_RDWR
                                                  vfs_open
                                                   do_dentry_open
                                                    get_write_access
                                                     atomic_inc_unless_negative(&inode->i_writecount)
                                                    ext4_file_open
                                                     dquot_file_open
                                                      dquot_initialize
                                                        __dquot_initialize
                                                         dqget
      						    atomic_inc(&dquot->dq_count);
      
                                __dquot_initialize
                                 __dquot_initialize
                                  dqget
                                   if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
                                     ext4_acquire_dquot
      			        -> Return error DQ_ACTIVE_B flag isn't set
                               dquot_disable
      			  invalidate_dquots
      			   if (atomic_read(&dquot->dq_count))
      	                    dqgrab
      			     WARN_ON_ONCE(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
      	                      -> Trigger warning
      
      In the above scenario, 'dquot->dq_flags' has no DQ_ACTIVE_B is normal when
      dqgrab().
      To solve above issue just replace the dqgrab() use in invalidate_dquots() with
      atomic_inc(&dquot->dq_count).
      
      Signed-off-by: default avatarYe Bin <yebin10@huawei.com>
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      Message-Id: <20230605140731.2427629-3-yebin10@huawei.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      579d814d
    • Jan Kara's avatar
      quota: Properly disable quotas when add_dquot_ref() fails · 32c2f51f
      Jan Kara authored
      
      
      [ Upstream commit 6a4e3363 ]
      
      When add_dquot_ref() fails (usually due to IO error or ENOMEM), we want
      to disable quotas we are trying to enable. However dquot_disable() call
      was passed just the flags we are enabling so in case flags ==
      DQUOT_USAGE_ENABLED dquot_disable() call will just fail with EINVAL
      instead of properly disabling quotas. Fix the problem by always passing
      DQUOT_LIMITS_ENABLED | DQUOT_USAGE_ENABLED to dquot_disable() in this
      case.
      
      Reported-and-tested-by: default avatarYe Bin <yebin10@huawei.com>
      Reported-by: default avatar <syzbot+e633c79ceaecbf479854@syzkaller.appspotmail.com>
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      Message-Id: <20230605140731.2427629-2-yebin10@huawei.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      32c2f51f
    • Oswald Buddenhagen's avatar
      ALSA: emu10k1: roll up loops in DSP setup code for Audigy · d3630750
      Oswald Buddenhagen authored
      
      
      [ Upstream commit 8cabf83c ]
      
      There is no apparent reason for the massive code duplication.
      
      Signed-off-by: default avatarOswald Buddenhagen <oswald.buddenhagen@gmx.de>
      Link: https://lore.kernel.org/r/20230510173917.3073107-3-oswald.buddenhagen@gmx.de
      
      
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d3630750
    • hackyzh002's avatar
      drm/radeon: Fix integer overflow in radeon_cs_parser_init · c0d7dbc6
      hackyzh002 authored
      
      
      [ Upstream commit f828b681 ]
      
      The type of size is unsigned, if size is 0x40000000, there will be an
      integer overflow, size will be zero after size *= sizeof(uint32_t),
      will cause uninitialized memory to be referenced later
      
      Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
      Signed-off-by: default avatarhackyzh002 <hackyzh002@gmail.com>
      Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      c0d7dbc6
    • Eric Whitney's avatar
      ext4: correct inline offset when handling xattrs in inode body · bca9fb7a
      Eric Whitney authored
      
      
      commit 6909cf5c upstream.
      
      When run on a file system where the inline_data feature has been
      enabled, xfstests generic/269, generic/270, and generic/476 cause ext4
      to emit error messages indicating that inline directory entries are
      corrupted.  This occurs because the inline offset used to locate
      inline directory entries in the inode body is not updated when an
      xattr in that shared region is deleted and the region is shifted in
      memory to recover the space it occupied.  If the deleted xattr precedes
      the system.data attribute, which points to the inline directory entries,
      that attribute will be moved further up in the region.  The inline
      offset continues to point to whatever is located in system.data's former
      location, with unfortunate effects when used to access directory entries
      or (presumably) inline data in the inode body.
      
      Cc: stable@kernel.org
      Signed-off-by: default avatarEric Whitney <enwlinux@gmail.com>
      Link: https://lore.kernel.org/r/20230522181520.1570360-1-enwlinux@gmail.com
      
      
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bca9fb7a
    • Johan Hovold's avatar
      ASoC: codecs: wcd938x: fix soundwire initialisation race · 87336783
      Johan Hovold authored
      
      
      commit 6f492568 upstream.
      
      Make sure that the soundwire device used for register accesses has been
      enumerated and initialised before trying to read the codec variant
      during component probe.
      
      This specifically avoids interpreting (a masked and shifted) -EBUSY
      errno as the variant:
      
      	wcd938x_codec audio-codec: ASoC: error at soc_component_read_no_lock on audio-codec for register: [0x000034b0] -16
      
      in case the soundwire device has not yet been initialised, which in turn
      prevents some headphone controls from being registered.
      
      Fixes: 8d78602a ("ASoC: codecs: wcd938x: add basic driver")
      Cc: stable@vger.kernel.org	# 5.14
      Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
      Reported-by: default avatarSteev Klimaszewski <steev@kali.org>
      Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
      Tested-by: default avatarSteev Klimaszewski <steev@kali.org>
      Link: https://lore.kernel.org/r/20230701094723.29379-1-johan+linaro@kernel.org
      
      
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      87336783
    • Johan Hovold's avatar
      ASoC: codecs: wcd938x: fix codec initialisation race · a14527c3
      Johan Hovold authored
      
      
      commit 85a61b1c upstream.
      
      Make sure to resume the codec and soundwire device before trying to read
      the codec variant and configure the device during component probe.
      
      This specifically avoids interpreting (a masked and shifted) -EBUSY
      errno as the variant:
      
      	wcd938x_codec audio-codec: ASoC: error at soc_component_read_no_lock on audio-codec for register: [0x000034b0] -16
      
      when the soundwire device happens to be suspended, which in turn
      prevents some headphone controls from being registered.
      
      Fixes: 8d78602a ("ASoC: codecs: wcd938x: add basic driver")
      Cc: stable@vger.kernel.org      # 5.14
      Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
      Reported-by: default avatarSteev Klimaszewski <steev@kali.org>
      Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
      Link: https://lore.kernel.org/r/20230630120318.6571-1-johan+linaro@kernel.org
      
      
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a14527c3
    • Johan Hovold's avatar
      ASoC: codecs: wcd934x: fix resource leaks on component remove · 4ca00045
      Johan Hovold authored
      
      
      commit 798590cc upstream.
      
      Make sure to release allocated MBHC resources also on component remove.
      
      This is specifically needed to allow probe deferrals of the sound card
      which otherwise fails when reprobing the codec component.
      
      Fixes: 9fb9b169 ("ASoC: codecs: wcd934x: add mbhc support")
      Cc: stable@vger.kernel.org      # 5.14
      Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
      Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
      Reviewed-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
      Link: https://lore.kernel.org/r/20230705123018.30903-6-johan+linaro@kernel.org
      
      
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4ca00045
    • Johan Hovold's avatar
      ASoC: codecs: wcd938x: fix missing mbhc init error handling · 5a34d252
      Johan Hovold authored
      
      
      commit 7dfae263 upstream.
      
      MBHC initialisation can fail so add the missing error handling to avoid
      dereferencing an error pointer when later configuring the jack:
      
          Unable to handle kernel paging request at virtual address fffffffffffffff8
      
          pc : wcd_mbhc_start+0x28/0x380 [snd_soc_wcd_mbhc]
          lr : wcd938x_codec_set_jack+0x28/0x48 [snd_soc_wcd938x]
      
          Call trace:
           wcd_mbhc_start+0x28/0x380 [snd_soc_wcd_mbhc]
           wcd938x_codec_set_jack+0x28/0x48 [snd_soc_wcd938x]
           snd_soc_component_set_jack+0x28/0x8c [snd_soc_core]
           qcom_snd_wcd_jack_setup+0x7c/0x19c [snd_soc_qcom_common]
           sc8280xp_snd_init+0x20/0x2c [snd_soc_sc8280xp]
           snd_soc_link_init+0x28/0x90 [snd_soc_core]
           snd_soc_bind_card+0x628/0xbfc [snd_soc_core]
           snd_soc_register_card+0xec/0x104 [snd_soc_core]
           devm_snd_soc_register_card+0x4c/0xa4 [snd_soc_core]
           sc8280xp_platform_probe+0xf0/0x108 [snd_soc_sc8280xp]
      
      Fixes: bcee7ed0 ("ASoC: codecs: wcd938x: add Multi Button Headset Control support")
      Cc: stable@vger.kernel.org      # 5.15
      Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
      Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
      Link: https://lore.kernel.org/r/20230703124701.11734-1-johan+linaro@kernel.org
      
      
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5a34d252
    • Johan Hovold's avatar
      ASoC: codecs: wcd938x: fix resource leaks on component remove · aa44782a
      Johan Hovold authored
      
      
      commit a3406f87 upstream.
      
      Make sure to release allocated resources on component probe failure and
      on remove.
      
      This is specifically needed to allow probe deferrals of the sound card
      which otherwise fails when reprobing the codec component:
      
          snd-sc8280xp sound: ASoC: failed to instantiate card -517
          genirq: Flags mismatch irq 289. 00002001 (HPHR PDM WD INT) vs. 00002001 (HPHR PDM WD INT)
          wcd938x_codec audio-codec: Failed to request HPHR WD interrupt (-16)
          genirq: Flags mismatch irq 290. 00002001 (HPHL PDM WD INT) vs. 00002001 (HPHL PDM WD INT)
          wcd938x_codec audio-codec: Failed to request HPHL WD interrupt (-16)
          genirq: Flags mismatch irq 291. 00002001 (AUX PDM WD INT) vs. 00002001 (AUX PDM WD INT)
          wcd938x_codec audio-codec: Failed to request Aux WD interrupt (-16)
          genirq: Flags mismatch irq 292. 00002001 (mbhc sw intr) vs. 00002001 (mbhc sw intr)
          wcd938x_codec audio-codec: Failed to request mbhc interrupts -16
      
      Fixes: 8d78602a ("ASoC: codecs: wcd938x: add basic driver")
      Cc: stable@vger.kernel.org	# 5.14
      Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
      Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
      Reviewed-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
      Link: https://lore.kernel.org/r/20230705123018.30903-5-johan+linaro@kernel.org
      
      
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      aa44782a