1. 22 Dec, 2021 1 commit
  2. 21 Dec, 2021 1 commit
    • Wen Gong's avatar
      ath11k: add regdb.bin download for regdb offload · 01417e57
      Wen Gong authored
      The regdomain is self-managed type for ath11k, the regdomain info is
      reported from firmware, it is not from wireless regdb. Firmware fetch
      the regdomain info from board data file before. Currently most of the
      regdomain info has moved to another file regdb.bin from board data
      file for some chips such as QCA6390 and WCN6855, so the regdomain info
      left in board data file is not enough to support the feature which need
      more regdomain info.
      
      After download regdb.bin, firmware will fetch the regdomain info from
      regdb.bin instead of board data file and report to ath11k. If it does
      not have the file regdb.bin, it also can initialize wlan success and
      firmware then fetch regdomain info from board data file.
      
      Add download the regdb.bin before download board data for some specific
      chip which support supports_regdb in hardware parameters.
      
      download regdb.bin log:
      [430082.334162] ath11k_pci 0000:05:00.0: chip_id 0x2 chip_family 0xb board_id 0x106 soc_id 0x400c0200
      [430082.334169] ath11k_pci 0000:05:00.0: fw_version 0x110c8b4c fw_build_timestamp 2021-10-25 07:41 fw_build_id QC_IMAGE_VERSION_STRING=WLAN.HSP.1.1-02892-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3
      [430082.334414] ath11k_pci 0000:05:00.0: boot firmware request ath11k/WCN6855/hw2.0/regdb.bin size 24310
      
      output of "iw reg get"
      global
      country US: DFS-FCC
              (2402 - 2472 @ 40), (N/A, 30), (N/A)
              (5170 - 5250 @ 80), (N/A, 23), (N/A), AUTO-BW
              (5250 - 5330 @ 80), (N/A, 23), (0 ms), DFS, AUTO-BW
              (5490 - 5730 @ 160), (N/A, 23), (0 ms), DFS
              (5735 - 5835 @ 80), (N/A, 30), (N/A)
              (57240 - 63720 @ 2160), (N/A, 40), (N/A)
      
      phy#0 (self-managed)
      country US: DFS-FCC
              (2402 - 2472 @ 40), (6, 30), (N/A)
              (5170 - 5250 @ 80), (N/A, 24), (N/A), AUTO-BW
              (5250 - 5330 @ 80), (N/A, 24), (0 ms), DFS, AUTO-BW
              (5490 - 5730 @ 160), (N/A, 24), (0 ms), DFS, AUTO-BW
              (5735 - 5895 @ 160), (N/A, 30), (N/A), AUTO-BW
              (5945 - 7125 @ 160), (N/A, 24), (N/A), NO-OUTDOOR, AUTO-BW
      
      Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1
      Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1
      Signed-off-by: default avatarWen Gong <quic_wgong@quicinc.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/20211220062355.17021-1-quic_wgong@quicinc.com
      01417e57
  3. 20 Dec, 2021 9 commits
    • Wen Gong's avatar
      ath11k: add support for hardware rfkill for QCA6390 · ec038c61
      Wen Gong authored
      When hardware rfkill is enabled in the firmware it will report the
      capability via using WMI_SYS_CAP_INFO_RFKILL bit in the WMI_SERVICE_READY
      event to the host. ath11k will check the capability, and if it is enabled then
      ath11k will set the GPIO information to firmware using WMI_PDEV_SET_PARAM. When
      the firmware detects hardware rfkill is enabled by the user, it will report it
      via WMI_RFKILL_STATE_CHANGE_EVENTID. Once ath11k receives the event it will
      send wmi command WMI_PDEV_SET_PARAM to the firmware and also notifies cfg80211.
      
      This only enable rfkill feature for QCA6390, rfkill_pin is all initialized to 0
      for other chips in ath11k_hw_params.
      
      Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1
      Signed-off-by: default avatarWen Gong <quic_wgong@quicinc.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/20211217102334.14907-1-quic_wgong@quicinc.com
      ec038c61
    • Wen Gong's avatar
      ath11k: report tx bitrate for iw wlan station dump · 1b8bb94c
      Wen Gong authored
      HTT_T2H_MSG_TYPE_PPDU_STATS_IND is a message which include the ppdu
      info, currently it is not report from firmware for ath11k, then the
      tx bitrate of "iw wlan0 station dump" always show an invalid value
      "tx bitrate: 6.0 MBit/s".
      
      To address the issue, this is to parse the info of tx complete report
      from firmware and indicate the tx rate to mac80211.
      
      After that, "iw wlan0 station dump" show the correct tx bit rate such
      as:
      tx bitrate: 78.0 MBit/s MCS 12
      tx bitrate: 144.4 MBit/s VHT-MCS 7 short GI VHT-NSS 2
      tx bitrate: 286.7 MBit/s HE-MCS 11 HE-NSS 2 HE-GI 0 HE-DCM 0
      tx bitrate: 1921.5 MBit/s 160MHz HE-MCS 9 HE-NSS 2 HE-GI 0 HE-DCM 0
      
      Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1
      Signed-off-by: default avatarWen Gong <quic_wgong@quicinc.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/20211217093722.5739-1-quic_wgong@quicinc.com
      1b8bb94c
    • Zekun Shen's avatar
      ath9k: Fix out-of-bound memcpy in ath9k_hif_usb_rx_stream · 6ce708f5
      Zekun Shen authored
      Large pkt_len can lead to out-out-bound memcpy. Current
      ath9k_hif_usb_rx_stream allows combining the content of two urb
      inputs to one pkt. The first input can indicate the size of the
      pkt. Any remaining size is saved in hif_dev->rx_remain_len.
      While processing the next input, memcpy is used with rx_remain_len.
      
      4-byte pkt_len can go up to 0xffff, while a single input is 0x4000
      maximum in size (MAX_RX_BUF_SIZE). Thus, the patch adds a check for
      pkt_len which must not exceed 2 * MAX_RX_BUG_SIZE.
      
      BUG: KASAN: slab-out-of-bounds in ath9k_hif_usb_rx_cb+0x490/0xed7 [ath9k_htc]
      Read of size 46393 at addr ffff888018798000 by task kworker/0:1/23
      
      CPU: 0 PID: 23 Comm: kworker/0:1 Not tainted 5.6.0 #63
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
      BIOS rel-1.10.2-0-g5f4c7b1-prebuilt.qemu-project.org 04/01/2014
      Workqueue: events request_firmware_work_func
      Call Trace:
       <IRQ>
       dump_stack+0x76/0xa0
       print_address_description.constprop.0+0x16/0x200
       ? ath9k_hif_usb_rx_cb+0x490/0xed7 [ath9k_htc]
       ? ath9k_hif_usb_rx_cb+0x490/0xed7 [ath9k_htc]
       __kasan_report.cold+0x37/0x7c
       ? ath9k_hif_usb_rx_cb+0x490/0xed7 [ath9k_htc]
       kasan_report+0xe/0x20
       check_memory_region+0x15a/0x1d0
       memcpy+0x20/0x50
       ath9k_hif_usb_rx_cb+0x490/0xed7 [ath9k_htc]
       ? hif_usb_mgmt_cb+0x2d9/0x2d9 [ath9k_htc]
       ? _raw_spin_lock_irqsave+0x7b/0xd0
       ? _raw_spin_trylock_bh+0x120/0x120
       ? __usb_unanchor_urb+0x12f/0x210
       __usb_hcd_giveback_urb+0x1e4/0x380
       usb_giveback_urb_bh+0x241/0x4f0
       ? __hrtimer_run_queues+0x316/0x740
       ? __usb_hcd_giveback_urb+0x380/0x380
       tasklet_action_common.isra.0+0x135/0x330
       __do_softirq+0x18c/0x634
       irq_exit+0x114/0x140
       smp_apic_timer_interrupt+0xde/0x380
       apic_timer_interrupt+0xf/0x20
      
      I found the bug using a custome USBFuzz port. It's a research work
      to fuzz USB stack/drivers. I modified it to fuzz ath9k driver only,
      providing hand-crafted usb descriptors to QEMU.
      
      After fixing the value of pkt_tag to ATH_USB_RX_STREAM_MODE_TAG in QEMU
      emulation, I found the KASAN report. The bug is triggerable whenever
      pkt_len is above two MAX_RX_BUG_SIZE. I used the same input that crashes
      to test the driver works when applying the patch.
      Signed-off-by: default avatarZekun Shen <bruceshenzk@gmail.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/YXsidrRuK6zBJicZ@10-18-43-117.dynapool.wireless.nyu.edu
      6ce708f5
    • Tetsuo Handa's avatar
      ath9k_htc: fix NULL pointer dereference at ath9k_htc_tx_get_packet() · 8b3046ab
      Tetsuo Handa authored
      syzbot is reporting lockdep warning at ath9k_wmi_event_tasklet() followed
      by kernel panic at get_htc_epid_queue() from ath9k_htc_tx_get_packet() from
      ath9k_htc_txstatus() [1], for ath9k_wmi_event_tasklet(WMI_TXSTATUS_EVENTID)
      depends on spin_lock_init() from ath9k_init_priv() being already completed.
      
      Since ath9k_wmi_event_tasklet() is set by ath9k_init_wmi() from
      ath9k_htc_probe_device(), it is possible that ath9k_wmi_event_tasklet() is
      called via tasklet interrupt before spin_lock_init() from ath9k_init_priv()
       from ath9k_init_device() from ath9k_htc_probe_device() is called.
      
      Let's hold ath9k_wmi_event_tasklet(WMI_TXSTATUS_EVENTID) no-op until
      ath9k_tx_init() completes.
      
      Link: https://syzkaller.appspot.com/bug?extid=31d54c60c5b254d6f75b [1]
      Reported-by: default avatarsyzbot <syzbot+31d54c60c5b254d6f75b@syzkaller.appspotmail.com>
      Signed-off-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Tested-by: default avatarsyzbot <syzbot+31d54c60c5b254d6f75b@syzkaller.appspotmail.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/77b76ac8-2bee-6444-d26c-8c30858b8daa@i-love.sakura.ne.jp
      8b3046ab
    • Tetsuo Handa's avatar
      ath9k_htc: fix NULL pointer dereference at ath9k_htc_rxep() · b0ec7e55
      Tetsuo Handa authored
      syzbot is reporting lockdep warning followed by kernel panic at
      ath9k_htc_rxep() [1], for ath9k_htc_rxep() depends on ath9k_rx_init()
      being already completed.
      
      Since ath9k_htc_rxep() is set by ath9k_htc_connect_svc(WMI_BEACON_SVC)
       from ath9k_init_htc_services(), it is possible that ath9k_htc_rxep() is
      called via timer interrupt before ath9k_rx_init() from ath9k_init_device()
      is called.
      
      Since we can't call ath9k_init_device() before ath9k_init_htc_services(),
      let's hold ath9k_htc_rxep() no-op until ath9k_rx_init() completes.
      
      Link: https://syzkaller.appspot.com/bug?extid=4d2d56175b934b9a7bf9 [1]
      Reported-by: default avatarsyzbot <syzbot+4d2d56175b934b9a7bf9@syzkaller.appspotmail.com>
      Signed-off-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Tested-by: default avatarsyzbot <syzbot+4d2d56175b934b9a7bf9@syzkaller.appspotmail.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/2b88f416-b2cb-7a18-d688-951e6dc3fe92@i-love.sakura.ne.jp
      b0ec7e55
    • Wen Gong's avatar
      ath11k: fix warning of RCU usage for ath11k_mac_get_arvif_by_vdev_id() · 01e782c8
      Wen Gong authored
      When enable more debug config, it happen below warning. It is because
      the caller does not add rcu_read_lock()/rcu_read_unlock() to wrap the
      rcu_dereference().
      
      Add rcu_read_lock()/rcu_read_unlock() to wrap rcu_dereference(), then
      fixed it.
      
      [ 180.716604] =============================
      [ 180.716670] WARNING: suspicious RCU usage
      [ 180.716734] 5.16.0-rc4-wt-ath+ #542 Not tainted
      [ 180.716895] -----------------------------
      [ 180.716957] drivers/net/wireless/ath/ath11k/mac.c:506 suspicious rcu_dereference_check() usage!
      [ 180.717023]
                     other info that might help us debug this:
      
      [ 180.717087]
                     rcu_scheduler_active = 2, debug_locks = 1
      [ 180.717151] no locks held by swapper/0/0.
      [ 180.717215]
                     stack backtrace:
      [ 180.717279] CPU: 0 PID: 0 Comm: swapper/0 Kdump: loaded Not tainted 5.16.0-rc4-wt-ath+ #542
      [ 180.717346] Hardware name: Intel(R) Client Systems NUC8i7HVK/NUC8i7HVB, BIOS HNKBLi70.86A.0067.2021.0528.1339 05/28/2021
      [ 180.717411] Call Trace:
      [ 180.717475] <IRQ>
      [ 180.717541] dump_stack_lvl+0x57/0x7d
      [ 180.717610] ath11k_mac_get_arvif_by_vdev_id+0x1ab/0x2d0 [ath11k]
      [ 180.717694] ? ath11k_mac_get_arvif+0x140/0x140 [ath11k]
      [ 180.717798] ? ath11k_wmi_tlv_op_rx+0xc1b/0x2520 [ath11k]
      [ 180.717888] ? kfree+0xe8/0x2c0
      [ 180.717959] ath11k_wmi_tlv_op_rx+0xc27/0x2520 [ath11k]
      [ 180.718038] ? ath11k_mgmt_rx_event+0xda0/0xda0 [ath11k]
      [ 180.718113] ? __lock_acquire+0xb72/0x1870
      [ 180.718182] ? lockdep_hardirqs_on_prepare.part.0+0x18c/0x370
      [ 180.718250] ? sched_clock_cpu+0x15/0x1b0
      [ 180.718314] ? find_held_lock+0x33/0x110
      [ 180.718381] ? __lock_release+0x4bd/0x9f0
      [ 180.718447] ? lock_downgrade+0x130/0x130
      [ 180.718517] ath11k_htc_rx_completion_handler+0x38f/0x5b0 [ath11k]
      [ 180.718596] ? __local_bh_enable_ip+0xa0/0x110
      [ 180.718662] ath11k_ce_recv_process_cb+0x5ac/0x920 [ath11k]
      [ 180.718783] ? __lock_acquired+0x205/0x890
      [ 180.718864] ? ath11k_ce_rx_post_pipe+0x970/0x970 [ath11k]
      [ 180.718949] ? __wake_up_bit+0x100/0x100
      [ 180.719020] ath11k_pci_ce_tasklet+0x5f/0xf0 [ath11k_pci]
      [ 180.719085] ? tasklet_clear_sched+0x42/0xe0
      [ 180.719148] tasklet_action_common.constprop.0+0x204/0x2f0
      [ 180.719217] __do_softirq+0x276/0x86a
      [ 180.719281] ? __common_interrupt+0x92/0x1d0
      [ 180.719350] __irq_exit_rcu+0x11c/0x180
      [ 180.719418] irq_exit_rcu+0x5/0x20
      [ 180.719482] common_interrupt+0xa4/0xc0
      [ 180.719547] </IRQ>
      [ 180.719609] <TASK>
      [ 180.719671] asm_common_interrupt+0x1e/0x40
      [ 180.719772] RIP: 0010:cpuidle_enter_state+0x1f3/0x8d0
      [ 180.719838] Code: 00 41 8b 77 04 bf ff ff ff ff e8 78 f1 ff ff 31 ff e8 81 fa 52 fe 80 7c 24 08 00 0f 85 9e 01 00 00 e8 11 13 78 fe fb 45 85 e4 <0f> 88 8c 02 00 00 49 63 ec 48 8d 44 6d 00 48 8d 44 85 00 48 8d 7c
      [ 180.719909] RSP: 0018:ffffffffa4607dd0 EFLAGS: 00000202
      [ 180.719982] RAX: 00000000002aea91 RBX: ffffffffa4a5fec0 RCX: 1ffffffff49ca501
      [ 180.720047] RDX: 0000000000000000 RSI: ffffffffa3c6e4e0 RDI: ffffffffa3dcf2a0
      [ 180.720110] RBP: 0000000000000002 R08: 0000000000000001 R09: ffffffffa4e54d17
      [ 180.720173] R10: fffffbfff49ca9a2 R11: 0000000000000001 R12: 0000000000000002
      [ 180.720236] R13: ffff8881169ccc04 R14: 0000002a13899598 R15: ffff8881169ccc00
      [ 180.720321] cpuidle_enter+0x45/0xa0
      [ 180.720413] cpuidle_idle_call+0x274/0x3f0
      [ 180.720503] ? arch_cpu_idle_exit+0x30/0x30
      [ 180.720869] ? tsc_verify_tsc_adjust+0x97/0x2e0
      [ 180.720935] ? lockdep_hardirqs_off+0x90/0xd0
      [ 180.721002] do_idle+0xe0/0x150
      [ 180.721069] cpu_startup_entry+0x14/0x20
      [ 180.721134] start_kernel+0x3a2/0x3c2
      [ 180.721200] secondary_startup_64_no_verify+0xb0/0xbb
      [ 180.721274] </TASK>
      
      Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-02892.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1
      Signed-off-by: default avatarWen Gong <quic_wgong@quicinc.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/20211217064132.30911-1-quic_wgong@quicinc.com
      01e782c8
    • Wen Gong's avatar
      ath11k: add signal report to mac80211 for QCA6390 and WCN6855 · c3b39553
      Wen Gong authored
      IEEE80211_HW_USES_RSS is set in ath11k, then the device uses RSS and
      thus requires parallel RX which implies using per-CPU station statistics
      in sta_get_last_rx_stats() of mac80211. Currently signal is only set in
      ath11k_mgmt_rx_event(), and not set for RX data packet, then it show
      signal as 0 for iw command easily.
      
      Change to get signal from firmware and report to mac80211.
      
      For QCA6390 and WCN6855, the rssi value is already in dbm unit, so
      don't need to convert it again.
      
      Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1
      Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1
      Signed-off-by: default avatarWen Gong <quic_wgong@quicinc.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/20211216070535.31732-1-quic_wgong@quicinc.com
      c3b39553
    • Wen Gong's avatar
      ath11k: report rssi of each chain to mac80211 for QCA6390/WCN6855 · b488c766
      Wen Gong authored
      Command "iw wls1 station dump" does not show each chain's rssi currently.
      
      If the rssi of each chain from mon status which parsed in function
      ath11k_hal_rx_parse_mon_status_tlv() is invalid, then ath11k send
      wmi cmd WMI_REQUEST_STATS_CMDID with flag WMI_REQUEST_RSSI_PER_CHAIN_STAT
      to firmware, and parse the rssi of chain in wmi WMI_UPDATE_STATS_EVENTID,
      then report them to mac80211.
      
      WMI_REQUEST_STATS_CMDID is only sent when CONFIG_ATH11K_DEBUGFS is set,
      it is only called by ath11k_mac_op_sta_statistics(). It does not effect
      performance and power consumption. Because after STATION connected to
      AP, it is only called every 6 seconds by NetworkManager in below stack.
      
      [  797.005587] CPU: 0 PID: 701 Comm: NetworkManager Tainted: G        W  OE     5.13.0-rc6-wt-ath+ #2
      [  797.005596] Hardware name: LENOVO 418065C/418065C, BIOS 83ET63WW (1.33 ) 07/29/2011
      [  797.005600] RIP: 0010:ath11k_mac_op_sta_statistics+0x2f/0x1b0 [ath11k]
      [  797.005644] Code: 41 56 41 55 4c 8d aa 58 01 00 00 41 54 55 48 89 d5 53 48 8b 82 58 01 00 00 48 89 cb 4c 8b 70 20 49 8b 06 4c 8b a0 90 08 00 00 <0f> 0b 48 8b 82 b8 01 00 00 48 ba 00 00 00 00 01 00 00 00 48 89 81
      [  797.005651] RSP: 0018:ffffb1fc80a4b890 EFLAGS: 00010282
      [  797.005658] RAX: ffff8a5726200000 RBX: ffffb1fc80a4b958 RCX: ffffb1fc80a4b958
      [  797.005664] RDX: ffff8a5726a609f0 RSI: ffff8a581247f598 RDI: ffff8a5702878800
      [  797.005668] RBP: ffff8a5726a609f0 R08: 0000000000000000 R09: 0000000000000000
      [  797.005672] R10: 0000000000000000 R11: 0000000000000007 R12: 02dd68024f75f480
      [  797.005676] R13: ffff8a5726a60b48 R14: ffff8a5702879f40 R15: ffff8a5726a60000
      [  797.005681] FS:  00007f632c52a380(0000) GS:ffff8a583a200000(0000) knlGS:0000000000000000
      [  797.005687] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  797.005692] CR2: 00007fb025d69000 CR3: 00000001124f6005 CR4: 00000000000606f0
      [  797.005698] Call Trace:
      [  797.005710]  sta_set_sinfo+0xa7/0xb80 [mac80211]
      [  797.005820]  ieee80211_get_station+0x50/0x70 [mac80211]
      [  797.005925]  nl80211_get_station+0xd1/0x200 [cfg80211]
      [  797.006045]  genl_family_rcv_msg_doit.isra.15+0x111/0x140
      [  797.006059]  genl_rcv_msg+0xe6/0x1e0
      [  797.006065]  ? nl80211_dump_station+0x220/0x220 [cfg80211]
      [  797.006223]  ? nl80211_send_station.isra.72+0xf50/0xf50 [cfg80211]
      [  797.006348]  ? genl_family_rcv_msg_doit.isra.15+0x140/0x140
      [  797.006355]  netlink_rcv_skb+0xb9/0xf0
      [  797.006363]  genl_rcv+0x24/0x40
      [  797.006369]  netlink_unicast+0x18e/0x290
      [  797.006375]  netlink_sendmsg+0x30f/0x450
      [  797.006382]  sock_sendmsg+0x5b/0x60
      [  797.006393]  ____sys_sendmsg+0x219/0x240
      [  797.006403]  ? copy_msghdr_from_user+0x5c/0x90
      [  797.006413]  ? ____sys_recvmsg+0xf5/0x190
      [  797.006422]  ___sys_sendmsg+0x88/0xd0
      [  797.006432]  ? copy_msghdr_from_user+0x5c/0x90
      [  797.006443]  ? ___sys_recvmsg+0x9e/0xd0
      [  797.006454]  ? __fget_files+0x58/0x90
      [  797.006461]  ? __fget_light+0x2d/0x70
      [  797.006466]  ? do_epoll_wait+0xce/0x720
      [  797.006476]  ? __sys_sendmsg+0x63/0xa0
      [  797.006485]  __sys_sendmsg+0x63/0xa0
      [  797.006497]  do_syscall_64+0x3c/0xb0
      [  797.006509]  entry_SYSCALL_64_after_hwframe+0x44/0xae
      [  797.006519] RIP: 0033:0x7f632d99912d
      [  797.006526] Code: 28 89 54 24 1c 48 89 74 24 10 89 7c 24 08 e8 ca ee ff ff 8b 54 24 1c 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 2f 44 89 c7 48 89 44 24 08 e8 fe ee ff ff 48
      [  797.006533] RSP: 002b:00007ffd80808c00 EFLAGS: 00000293 ORIG_RAX: 000000000000002e
      [  797.006540] RAX: ffffffffffffffda RBX: 0000563dab99d840 RCX: 00007f632d99912d
      [  797.006545] RDX: 0000000000000000 RSI: 00007ffd80808c50 RDI: 000000000000000b
      [  797.006549] RBP: 00007ffd80808c50 R08: 0000000000000000 R09: 0000000000001000
      [  797.006552] R10: 0000563dab96f010 R11: 0000000000000293 R12: 0000563dab99d840
      [  797.006556] R13: 0000563dabbb28c0 R14: 00007f632dad4280 R15: 0000563dabab11c0
      [  797.006563] ---[ end trace c9dcf08920c9945c ]---
      
      Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01230-QCAHSTSWPLZ_V2_TO_X86-1
      Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-02892.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1
      Signed-off-by: default avatarWen Gong <quic_wgong@quicinc.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/20211215090944.19729-1-quic_wgong@quicinc.com
      b488c766
    • Jonas Jelonek's avatar
      ath5k: switch to rate table based lookup · a5d862da
      Jonas Jelonek authored
      Switching from legacy usage of ieee80211_get_tx_rates() lookup to direct
      rate table lookup in struct ieee80211_sta->rates.
      
      The current rate control API allows drivers to directly get rates from
      ieee80211_sta->rates. ath5k is currently one of the legacy drivers that
      perform translation/merge with the internal rate table via
      ieee80211_get_tx_rates provided by rate control API.
      For our upcoming changes to rate control API and the implementation of
      transmit power control, this patch changes the behaviour. The call to
      ieee80211_get_tx_rates and subsequent calls are also avoided. ath5k now
      directly reads rates from sta->rates into its internal rate table. Cause
      ath5k does not rely on the rate array in SKB->CB, this is not considered
      anymore except for the first entry (used for probing).
      
      Tested this on a PCEngines ALIX with CMP9-GP miniPCI wifi card (Atheros
      AR5213A). Generated traffic between AP and multiple STAs before and
      after applying the patch and simultaneously measured throughput and
      captured rc_stats. Comparison resulted in same rate selection and no
      performance loss between both runs.
      Co-developed-by: default avatarThomas Huehn <thomas.huehn@hs-nordhausen.de>
      Signed-off-by: default avatarThomas Huehn <thomas.huehn@hs-nordhausen.de>
      Signed-off-by: default avatarJonas Jelonek <jelonek.jonas@gmail.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/20211215215042.637-1-jelonek.jonas@gmail.com
      a5d862da
  4. 17 Dec, 2021 6 commits
  5. 16 Dec, 2021 23 commits
    • Linus Torvalds's avatar
      Merge tag 'audit-pr-20211216' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit · 6441998e
      Linus Torvalds authored
      Pull audit fix from Paul Moore:
       "A single patch to fix a problem where the audit queue could grow
        unbounded when the audit daemon is forcibly stopped"
      
      * tag 'audit-pr-20211216' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit:
        audit: improve robustness of the audit queue handling
      6441998e
    • Linus Torvalds's avatar
      Merge tag 'net-5.16-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net · 180f3bcf
      Linus Torvalds authored
      Pull networking fixes from Jakub Kicinski:
       "Networking fixes, including fixes from mac80211, wifi, bpf.
      
        Relatively large batches of fixes from BPF and the WiFi stack, calm in
        general networking.
      
        Current release - regressions:
      
         - dpaa2-eth: fix buffer overrun when reporting ethtool statistics
      
        Current release - new code bugs:
      
         - bpf: fix incorrect state pruning for <8B spill/fill
      
         - iavf:
             - add missing unlocks in iavf_watchdog_task()
             - do not override the adapter state in the watchdog task (again)
      
         - mlxsw: spectrum_router: consolidate MAC profiles when possible
      
        Previous releases - regressions:
      
         - mac80211 fixes:
             - rate control, avoid driver crash for retransmitted frames
             - regression in SSN handling of addba tx
             - a memory leak where sta_info is not freed
             - marking TX-during-stop for TX in in_reconfig, prevent stall
      
         - cfg80211: acquire wiphy mutex on regulatory work
      
         - wifi drivers: fix build regressions and LED config dependency
      
         - virtio_net: fix rx_drops stat for small pkts
      
         - dsa: mv88e6xxx: unforce speed & duplex in mac_link_down()
      
        Previous releases - always broken:
      
         - bpf fixes:
             - kernel address leakage in atomic fetch
             - kernel address leakage in atomic cmpxchg's r0 aux reg
             - signed bounds propagation after mov32
             - extable fixup offset
             - extable address check
      
         - mac80211:
             - fix the size used for building probe request
             - send ADDBA requests using the tid/queue of the aggregation
               session
             - agg-tx: don't schedule_and_wake_txq() under sta->lock, avoid
               deadlocks
             - validate extended element ID is present
      
         - mptcp:
             - never allow the PM to close a listener subflow (null-defer)
             - clear 'kern' flag from fallback sockets, prevent crash
             - fix deadlock in __mptcp_push_pending()
      
         - inet_diag: fix kernel-infoleak for UDP sockets
      
         - xsk: do not sleep in poll() when need_wakeup set
      
         - smc: avoid very long waits in smc_release()
      
         - sch_ets: don't remove idle classes from the round-robin list
      
         - netdevsim:
             - zero-initialize memory for bpf map's value, prevent info leak
             - don't let user space overwrite read only (max) ethtool parms
      
         - ixgbe: set X550 MDIO speed before talking to PHY
      
         - stmmac:
             - fix null-deref in flower deletion w/ VLAN prio Rx steering
             - dwmac-rk: fix oob read in rk_gmac_setup
      
         - ice: time stamping fixes
      
         - systemport: add global locking for descriptor life cycle"
      
      * tag 'net-5.16-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (89 commits)
        bpf, selftests: Fix racing issue in btf_skc_cls_ingress test
        selftest/bpf: Add a test that reads various addresses.
        bpf: Fix extable address check.
        bpf: Fix extable fixup offset.
        bpf, selftests: Add test case trying to taint map value pointer
        bpf: Make 32->64 bounds propagation slightly more robust
        bpf: Fix signed bounds propagation after mov32
        sit: do not call ipip6_dev_free() from sit_init_net()
        net: systemport: Add global locking for descriptor lifecycle
        net/smc: Prevent smc_release() from long blocking
        net: Fix double 0x prefix print in SKB dump
        virtio_net: fix rx_drops stat for small pkts
        dsa: mv88e6xxx: fix debug print for SPEED_UNFORCED
        sfc_ef100: potential dereference of null pointer
        net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
        net: usb: lan78xx: add Allied Telesis AT29M2-AF
        net/packet: rx_owner_map depends on pg_vec
        netdevsim: Zero-initialize memory for new map's value in function nsim_bpf_map_alloc
        dpaa2-eth: fix ethtool statistics
        ixgbe: set X550 MDIO speed before talking to PHY
        ...
      180f3bcf
    • Linus Torvalds's avatar
      Merge tag 'soc-fixes-5.16-3' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc · 93db8300
      Linus Torvalds authored
      Pull ARM SoC fixes from Arnd Bergmann:
       "There are a number of DT fixes, mostly for mistakes found through
        static checking of the dts files again, as well as a couple of minor
        changes to address incorrect DT settings.
      
        For i.MX, there is yet another series of devitree changes to update
        RGMII delay settings for ethernet, which is an ongoing problem after
        some driver changes.
      
        For SoC specific device drivers, a number of smaller fixes came up:
      
         - i.MX SoC identification was incorrectly registered non-i.MX
           machines when the driver is built-in
      
         - One fix on imx8m-blk-ctrl driver to get i.MX8MM MIPI reset work
           properly
      
         - a few compile fixes for warnings that get in the way of -Werror
      
         - a string overflow in the scpi firmware driver
      
         - a boot failure with FORTIFY_SOURCE on Rockchips machines
      
         - broken error handling in the AMD TEE driver
      
         - a revert for a tegra reset driver commit that broke HDA"
      
      * tag 'soc-fixes-5.16-3' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (25 commits)
        soc/tegra: fuse: Fix bitwise vs. logical OR warning
        firmware: arm_scpi: Fix string overflow in SCPI genpd driver
        soc: imx: Register SoC device only on i.MX boards
        soc: imx: imx8m-blk-ctrl: Fix imx8mm mipi reset
        ARM: dts: imx6ull-pinfunc: Fix CSI_DATA07__ESAI_TX0 pad name
        arm64: dts: imx8mq: remove interconnect property from lcdif
        ARM: socfpga: dts: fix qspi node compatible
        arm64: dts: apple: add #interrupt-cells property to pinctrl nodes
        dt-bindings: i2c: apple,i2c: allow multiple compatibles
        arm64: meson: remove COMMON_CLK
        arm64: meson: fix dts for JetHub D1
        tee: amdtee: fix an IS_ERR() vs NULL bug
        arm64: dts: apple: change ethernet0 device type to ethernet
        arm64: dts: ten64: remove redundant interrupt declaration for gpio-keys
        arm64: dts: rockchip: fix poweroff on helios64
        arm64: dts: rockchip: fix audio-supply for Rock Pi 4
        arm64: dts: rockchip: fix rk3399-leez-p710 vcc3v3-lan supply
        arm64: dts: rockchip: fix rk3308-roc-cc vcc-sd supply
        arm64: dts: rockchip: remove mmc-hs400-enhanced-strobe from rk3399-khadas-edge
        ARM: rockchip: Use memcpy_toio instead of memcpy on smp bring-up
        ...
      93db8300
    • Jakub Kicinski's avatar
      Merge https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf · 0c3e2474
      Jakub Kicinski authored
      Daniel Borkmann says:
      
      ====================
      pull-request: bpf 2021-12-16
      
      We've added 15 non-merge commits during the last 7 day(s) which contain
      a total of 12 files changed, 434 insertions(+), 30 deletions(-).
      
      The main changes are:
      
      1) Fix incorrect verifier state pruning behavior for <8B register spill/fill,
         from Paul Chaignon.
      
      2) Fix x86-64 JIT's extable handling for fentry/fexit when return pointer
         is an ERR_PTR(), from Alexei Starovoitov.
      
      3) Fix 3 different possibilities that BPF verifier missed where unprivileged
         could leak kernel addresses, from Daniel Borkmann.
      
      4) Fix xsk's poll behavior under need_wakeup flag, from Magnus Karlsson.
      
      5) Fix an oob-write in test_verifier due to a missed MAX_NR_MAPS bump,
         from Kumar Kartikeya Dwivedi.
      
      6) Fix a race in test_btf_skc_cls_ingress selftest, from Martin KaFai Lau.
      
      * https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf:
        bpf, selftests: Fix racing issue in btf_skc_cls_ingress test
        selftest/bpf: Add a test that reads various addresses.
        bpf: Fix extable address check.
        bpf: Fix extable fixup offset.
        bpf, selftests: Add test case trying to taint map value pointer
        bpf: Make 32->64 bounds propagation slightly more robust
        bpf: Fix signed bounds propagation after mov32
        bpf, selftests: Update test case for atomic cmpxchg on r0 with pointer
        bpf: Fix kernel address leakage in atomic cmpxchg's r0 aux reg
        bpf, selftests: Add test case for atomic fetch on spilled pointer
        bpf: Fix kernel address leakage in atomic fetch
        selftests/bpf: Fix OOB write in test_verifier
        xsk: Do not sleep in poll() when need_wakeup set
        selftests/bpf: Tests for state pruning with u32 spill/fill
        bpf: Fix incorrect state pruning for <8B spill/fill
      ====================
      
      Link: https://lore.kernel.org/r/20211216210005.13815-1-daniel@iogearbox.netSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      0c3e2474
    • Martin KaFai Lau's avatar
      bpf, selftests: Fix racing issue in btf_skc_cls_ingress test · c2fcbf81
      Martin KaFai Lau authored
      The libbpf CI reported occasional failure in btf_skc_cls_ingress:
      
        test_syncookie:FAIL:Unexpected syncookie states gen_cookie:80326634 recv_cookie:0
        bpf prog error at line 97
      
      "error at line 97" means the bpf prog cannot find the listening socket
      when the final ack is received.  It then skipped processing
      the syncookie in the final ack which then led to "recv_cookie:0".
      
      The problem is the userspace program did not do accept() and went
      ahead to close(listen_fd) before the kernel (and the bpf prog) had
      a chance to process the final ack.
      
      The fix is to add accept() call so that the userspace will wait for
      the kernel to finish processing the final ack first before close()-ing
      everything.
      
      Fixes: 9a856cae ("bpf: selftest: Add test_btf_skc_cls_ingress")
      Reported-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Link: https://lore.kernel.org/bpf/20211216191630.466151-1-kafai@fb.com
      c2fcbf81
    • Alexei Starovoitov's avatar
      selftest/bpf: Add a test that reads various addresses. · 7edc3fcb
      Alexei Starovoitov authored
      Add a function to bpf_testmod that returns invalid kernel and user addresses.
      Then attach an fexit program to that function that tries to read
      memory through these addresses.
      
      This logic checks that bpf_probe_read_kernel and BPF_PROBE_MEM logic is sane.
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      7edc3fcb
    • Alexei Starovoitov's avatar
      bpf: Fix extable address check. · 588a25e9
      Alexei Starovoitov authored
      The verifier checks that PTR_TO_BTF_ID pointer is either valid or NULL,
      but it cannot distinguish IS_ERR pointer from valid one.
      
      When offset is added to IS_ERR pointer it may become small positive
      value which is a user address that is not handled by extable logic
      and has to be checked for at the runtime.
      
      Tighten BPF_PROBE_MEM pointer check code to prevent this case.
      
      Fixes: 4c5de127 ("bpf: Emit explicit NULL pointer checks for PROBE_LDX instructions.")
      Reported-by: default avatarLorenzo Fontana <lorenzo.fontana@elastic.co>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      588a25e9
    • Alexei Starovoitov's avatar
      bpf: Fix extable fixup offset. · 433956e9
      Alexei Starovoitov authored
      The prog - start_of_ldx is the offset before the faulting ldx to the location
      after it, so this will be used to adjust pt_regs->ip for jumping over it and
      continuing, and with old temp it would have been fixed up to the wrong offset,
      causing crash.
      
      Fixes: 4c5de127 ("bpf: Emit explicit NULL pointer checks for PROBE_LDX instructions.")
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Reviewed-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      433956e9
    • Linus Torvalds's avatar
      Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux · a52a8e9e
      Linus Torvalds authored
      Pull clk fix from Stephen Boyd:
       "A single fix for the clk framework that needed some more bake time in
        linux-next.
      
        The problem is that two clks being registered at the same time can
        lead to a busted clk tree if the parent isn't fully registered by the
        time the child finds the parent. We rejigger the place where we mark
        the parent as fully registered so that the child can't find the parent
        until things are proper"
      
      * tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux:
        clk: Don't parent clks until the parent is fully registered
      a52a8e9e
    • Daniel Borkmann's avatar
      bpf, selftests: Add test case trying to taint map value pointer · b1a7288d
      Daniel Borkmann authored
      Add a test case which tries to taint map value pointer arithmetic into a
      unknown scalar with subsequent export through the map.
      
      Before fix:
      
        # ./test_verifier 1186
        #1186/u map access: trying to leak tained dst reg FAIL
        Unexpected success to load!
        verification time 24 usec
        stack depth 8
        processed 15 insns (limit 1000000) max_states_per_insn 0 total_states 1 peak_states 1 mark_read 1
        #1186/p map access: trying to leak tained dst reg FAIL
        Unexpected success to load!
        verification time 8 usec
        stack depth 8
        processed 15 insns (limit 1000000) max_states_per_insn 0 total_states 1 peak_states 1 mark_read 1
        Summary: 0 PASSED, 0 SKIPPED, 2 FAILED
      
      After fix:
      
        # ./test_verifier 1186
        #1186/u map access: trying to leak tained dst reg OK
        #1186/p map access: trying to leak tained dst reg OK
        Summary: 2 PASSED, 0 SKIPPED, 0 FAILED
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Reviewed-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
      Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
      b1a7288d
    • Daniel Borkmann's avatar
      bpf: Make 32->64 bounds propagation slightly more robust · e572ff80
      Daniel Borkmann authored
      Make the bounds propagation in __reg_assign_32_into_64() slightly more
      robust and readable by aligning it similarly as we did back in the
      __reg_combine_64_into_32() counterpart. Meaning, only propagate or
      pessimize them as a smin/smax pair.
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Reviewed-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
      Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
      e572ff80
    • Daniel Borkmann's avatar
      bpf: Fix signed bounds propagation after mov32 · 3cf2b61e
      Daniel Borkmann authored
      For the case where both s32_{min,max}_value bounds are positive, the
      __reg_assign_32_into_64() directly propagates them to their 64 bit
      counterparts, otherwise it pessimises them into [0,u32_max] universe and
      tries to refine them later on by learning through the tnum as per comment
      in mentioned function. However, that does not always happen, for example,
      in mov32 operation we call zext_32_to_64(dst_reg) which invokes the
      __reg_assign_32_into_64() as is without subsequent bounds update as
      elsewhere thus no refinement based on tnum takes place.
      
      Thus, not calling into the __update_reg_bounds() / __reg_deduce_bounds() /
      __reg_bound_offset() triplet as we do, for example, in case of ALU ops via
      adjust_scalar_min_max_vals(), will lead to more pessimistic bounds when
      dumping the full register state:
      
      Before fix:
      
        0: (b4) w0 = -1
        1: R0_w=invP4294967295
           (id=0,imm=ffffffff,
            smin_value=4294967295,smax_value=4294967295,
            umin_value=4294967295,umax_value=4294967295,
            var_off=(0xffffffff; 0x0),
            s32_min_value=-1,s32_max_value=-1,
            u32_min_value=-1,u32_max_value=-1)
      
        1: (bc) w0 = w0
        2: R0_w=invP4294967295
           (id=0,imm=ffffffff,
            smin_value=0,smax_value=4294967295,
            umin_value=4294967295,umax_value=4294967295,
            var_off=(0xffffffff; 0x0),
            s32_min_value=-1,s32_max_value=-1,
            u32_min_value=-1,u32_max_value=-1)
      
      Technically, the smin_value=0 and smax_value=4294967295 bounds are not
      incorrect, but given the register is still a constant, they break assumptions
      about const scalars that smin_value == smax_value and umin_value == umax_value.
      
      After fix:
      
        0: (b4) w0 = -1
        1: R0_w=invP4294967295
           (id=0,imm=ffffffff,
            smin_value=4294967295,smax_value=4294967295,
            umin_value=4294967295,umax_value=4294967295,
            var_off=(0xffffffff; 0x0),
            s32_min_value=-1,s32_max_value=-1,
            u32_min_value=-1,u32_max_value=-1)
      
        1: (bc) w0 = w0
        2: R0_w=invP4294967295
           (id=0,imm=ffffffff,
            smin_value=4294967295,smax_value=4294967295,
            umin_value=4294967295,umax_value=4294967295,
            var_off=(0xffffffff; 0x0),
            s32_min_value=-1,s32_max_value=-1,
            u32_min_value=-1,u32_max_value=-1)
      
      Without the smin_value == smax_value and umin_value == umax_value invariant
      being intact for const scalars, it is possible to leak out kernel pointers
      from unprivileged user space if the latter is enabled. For example, when such
      registers are involved in pointer arithmtics, then adjust_ptr_min_max_vals()
      will taint the destination register into an unknown scalar, and the latter
      can be exported and stored e.g. into a BPF map value.
      
      Fixes: 3f50f132 ("bpf: Verifier, do explicit ALU32 bounds tracking")
      Reported-by: default avatarKuee K1r0a <liulin063@gmail.com>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Reviewed-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
      Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
      3cf2b61e
    • Linus Torvalds's avatar
      Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux · fa36bbe6
      Linus Torvalds authored
      Pull arm64 fix from Catalin Marinas:
       "Fix missing error code on kexec failure path"
      
      * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
        arm64: kexec: Fix missing error code 'ret' warning in load_other_segments()
      fa36bbe6
    • Kalle Valo's avatar
      Merge ath-next from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git · fd5e3c4a
      Kalle Valo authored
      ath.git patches for v5.17. Major changes:
      
      ath11k
      
      * support PCI devices with 1 MSI vector
      
      * WCN6855 hw2.1 support
      
      * 11d scan offload support
      
      * full monitor mode, only supported on QCN9074
      
      * scan MAC address randomization support
      
      * reserved host DDR addresses from DT for PCI devices support
      
      ath9k
      
      * switch to rate table based lookup
      
      ath
      
      * extend South Korea regulatory domain support
      
      wcn36xx
      
      * beacon filter support
      fd5e3c4a
    • Linus Torvalds's avatar
      Merge tag 'for-5.16/dm-fixes' of... · 81eebd54
      Linus Torvalds authored
      Merge tag 'for-5.16/dm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm
      
      Pull device mapper fixes from Mike Snitzer:
      
       - Fix use after free in DM btree remove's rebalance_children()
      
       - Fix DM integrity data corruption, introduced during 5.16 merge, due
         to improper use of bvec_kmap_local()
      
      * tag 'for-5.16/dm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
        dm integrity: fix data corruption due to improper use of bvec_kmap_local
        dm btree remove: fix use after free in rebalance_children()
      81eebd54
    • Lakshmi Ramasubramanian's avatar
      arm64: kexec: Fix missing error code 'ret' warning in load_other_segments() · 9c5d89bc
      Lakshmi Ramasubramanian authored
      Since commit ac10be5c ("arm64: Use common
      of_kexec_alloc_and_setup_fdt()"), smatch reports the following warning:
      
        arch/arm64/kernel/machine_kexec_file.c:152 load_other_segments()
        warn: missing error code 'ret'
      
      Return code is not set to an error code in load_other_segments() when
      of_kexec_alloc_and_setup_fdt() call returns a NULL dtb. This results
      in status success (return code set to 0) being returned from
      load_other_segments().
      
      Set return code to -EINVAL if of_kexec_alloc_and_setup_fdt() returns
      NULL dtb.
      Signed-off-by: default avatarLakshmi Ramasubramanian <nramas@linux.microsoft.com>
      Reported-by: default avatarkernel test robot <lkp@intel.com>
      Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Fixes: ac10be5c ("arm64: Use common of_kexec_alloc_and_setup_fdt()")
      Link: https://lore.kernel.org/r/20211210010121.101823-1-nramas@linux.microsoft.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
      Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
      9c5d89bc
    • David Howells's avatar
      afs: Fix mmap · 1744a22a
      David Howells authored
      Fix afs_add_open_map() to check that the vnode isn't already on the list
      when it adds it.  It's possible that afs_drop_open_mmap() decremented
      the cb_nr_mmap counter, but hadn't yet got into the locked section to
      remove it.
      
      Also vnode->cb_mmap_link should be initialised, so fix that too.
      
      Fixes: 6e0e99d5 ("afs: Fix mmap coherency vs 3rd-party changes")
      Reported-by: kafs-testing+fedora34_64checkkafs-build-300@auristor.com
      Suggested-by: default avatarMarc Dionne <marc.dionne@auristor.com>
      Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
      Tested-by: kafs-testing+fedora34_64checkkafs-build-300@auristor.com
      cc: linux-afs@lists.infradead.org
      Link: https://lore.kernel.org/r/686465.1639435380@warthog.procyon.org.uk/ # v1
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      1744a22a
    • Eric Dumazet's avatar
      sit: do not call ipip6_dev_free() from sit_init_net() · e28587cc
      Eric Dumazet authored
      ipip6_dev_free is sit dev->priv_destructor, already called
      by register_netdevice() if something goes wrong.
      
      Alternative would be to make ipip6_dev_free() robust against
      multiple invocations, but other drivers do not implement this
      strategy.
      
      syzbot reported:
      
      dst_release underflow
      WARNING: CPU: 0 PID: 5059 at net/core/dst.c:173 dst_release+0xd8/0xe0 net/core/dst.c:173
      Modules linked in:
      CPU: 1 PID: 5059 Comm: syz-executor.4 Not tainted 5.16.0-rc5-syzkaller #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
      RIP: 0010:dst_release+0xd8/0xe0 net/core/dst.c:173
      Code: 4c 89 f2 89 d9 31 c0 5b 41 5e 5d e9 da d5 44 f9 e8 1d 90 5f f9 c6 05 87 48 c6 05 01 48 c7 c7 80 44 99 8b 31 c0 e8 e8 67 29 f9 <0f> 0b eb 85 0f 1f 40 00 53 48 89 fb e8 f7 8f 5f f9 48 83 c3 a8 48
      RSP: 0018:ffffc9000aa5faa0 EFLAGS: 00010246
      RAX: d6894a925dd15a00 RBX: 00000000ffffffff RCX: 0000000000040000
      RDX: ffffc90005e19000 RSI: 000000000003ffff RDI: 0000000000040000
      RBP: 0000000000000000 R08: ffffffff816a1f42 R09: ffffed1017344f2c
      R10: ffffed1017344f2c R11: 0000000000000000 R12: 0000607f462b1358
      R13: 1ffffffff1bfd305 R14: ffffe8ffffcb1358 R15: dffffc0000000000
      FS:  00007f66c71a2700(0000) GS:ffff8880b9a00000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007f88aaed5058 CR3: 0000000023e0f000 CR4: 00000000003506f0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      Call Trace:
       <TASK>
       dst_cache_destroy+0x107/0x1e0 net/core/dst_cache.c:160
       ipip6_dev_free net/ipv6/sit.c:1414 [inline]
       sit_init_net+0x229/0x550 net/ipv6/sit.c:1936
       ops_init+0x313/0x430 net/core/net_namespace.c:140
       setup_net+0x35b/0x9d0 net/core/net_namespace.c:326
       copy_net_ns+0x359/0x5c0 net/core/net_namespace.c:470
       create_new_namespaces+0x4ce/0xa00 kernel/nsproxy.c:110
       unshare_nsproxy_namespaces+0x11e/0x180 kernel/nsproxy.c:226
       ksys_unshare+0x57d/0xb50 kernel/fork.c:3075
       __do_sys_unshare kernel/fork.c:3146 [inline]
       __se_sys_unshare kernel/fork.c:3144 [inline]
       __x64_sys_unshare+0x34/0x40 kernel/fork.c:3144
       do_syscall_x64 arch/x86/entry/common.c:50 [inline]
       do_syscall_64+0x44/0xd0 arch/x86/entry/common.c:80
       entry_SYSCALL_64_after_hwframe+0x44/0xae
      RIP: 0033:0x7f66c882ce99
      Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 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 bc ff ff ff f7 d8 64 89 01 48
      RSP: 002b:00007f66c71a2168 EFLAGS: 00000246 ORIG_RAX: 0000000000000110
      RAX: ffffffffffffffda RBX: 00007f66c893ff60 RCX: 00007f66c882ce99
      RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000048040200
      RBP: 00007f66c8886ff1 R08: 0000000000000000 R09: 0000000000000000
      R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
      R13: 00007fff6634832f R14: 00007f66c71a2300 R15: 0000000000022000
       </TASK>
      
      Fixes: cf124db5 ("net: Fix inconsistent teardown and release of private netdev state.")
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
      Link: https://lore.kernel.org/r/20211216111741.1387540-1-eric.dumazet@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      e28587cc
    • Florian Fainelli's avatar
      net: systemport: Add global locking for descriptor lifecycle · 8b8e6e78
      Florian Fainelli authored
      The descriptor list is a shared resource across all of the transmit queues, and
      the locking mechanism used today only protects concurrency across a given
      transmit queue between the transmit and reclaiming. This creates an opportunity
      for the SYSTEMPORT hardware to work on corrupted descriptors if we have
      multiple producers at once which is the case when using multiple transmit
      queues.
      
      This was particularly noticeable when using multiple flows/transmit queues and
      it showed up in interesting ways in that UDP packets would get a correct UDP
      header checksum being calculated over an incorrect packet length. Similarly TCP
      packets would get an equally correct checksum computed by the hardware over an
      incorrect packet length.
      
      The SYSTEMPORT hardware maintains an internal descriptor list that it re-arranges
      when the driver produces a new descriptor anytime it writes to the
      WRITE_PORT_{HI,LO} registers, there is however some delay in the hardware to
      re-organize its descriptors and it is possible that concurrent TX queues
      eventually break this internal allocation scheme to the point where the
      length/status part of the descriptor gets used for an incorrect data buffer.
      
      The fix is to impose a global serialization for all TX queues in the short
      section where we are writing to the WRITE_PORT_{HI,LO} registers which solves
      the corruption even with multiple concurrent TX queues being used.
      
      Fixes: 80105bef ("net: systemport: add Broadcom SYSTEMPORT Ethernet MAC driver")
      Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Link: https://lore.kernel.org/r/20211215202450.4086240-1-f.fainelli@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      8b8e6e78
    • D. Wythe's avatar
      net/smc: Prevent smc_release() from long blocking · 5c15b312
      D. Wythe authored
      In nginx/wrk benchmark, there's a hung problem with high probability
      on case likes that: (client will last several minutes to exit)
      
      server: smc_run nginx
      
      client: smc_run wrk -c 10000 -t 1 http://server
      
      Client hangs with the following backtrace:
      
      0 [ffffa7ce8Of3bbf8] __schedule at ffffffff9f9eOd5f
      1 [ffffa7ce8Of3bc88] schedule at ffffffff9f9eløe6
      2 [ffffa7ce8Of3bcaO] schedule_timeout at ffffffff9f9e3f3c
      3 [ffffa7ce8Of3bd2O] wait_for_common at ffffffff9f9el9de
      4 [ffffa7ce8Of3bd8O] __flush_work at ffffffff9fOfeOl3
      5 [ffffa7ce8øf3bdfO] smc_release at ffffffffcO697d24 [smc]
      6 [ffffa7ce8Of3be2O] __sock_release at ffffffff9f8O2e2d
      7 [ffffa7ce8Of3be4ø] sock_close at ffffffff9f8ø2ebl
      8 [ffffa7ce8øf3be48] __fput at ffffffff9f334f93
      9 [ffffa7ce8Of3be78] task_work_run at ffffffff9flOlff5
      10 [ffffa7ce8Of3beaO] do_exit at ffffffff9fOe5Ol2
      11 [ffffa7ce8Of3bflO] do_group_exit at ffffffff9fOe592a
      12 [ffffa7ce8Of3bf38] __x64_sys_exit_group at ffffffff9fOe5994
      13 [ffffa7ce8Of3bf4O] do_syscall_64 at ffffffff9f9d4373
      14 [ffffa7ce8Of3bfsO] entry_SYSCALL_64_after_hwframe at ffffffff9fa0007c
      
      This issue dues to flush_work(), which is used to wait for
      smc_connect_work() to finish in smc_release(). Once lots of
      smc_connect_work() was pending or all executing work dangling,
      smc_release() has to block until one worker comes to free, which
      is equivalent to wait another smc_connnect_work() to finish.
      
      In order to fix this, There are two changes:
      
      1. For those idle smc_connect_work(), cancel it from the workqueue; for
         executing smc_connect_work(), waiting for it to finish. For that
         purpose, replace flush_work() with cancel_work_sync().
      
      2. Since smc_connect() hold a reference for passive closing, if
         smc_connect_work() has been cancelled, release the reference.
      
      Fixes: 24ac3a08 ("net/smc: rebuild nonblocking connect")
      Reported-by: default avatarTony Lu <tonylu@linux.alibaba.com>
      Tested-by: default avatarDust Li <dust.li@linux.alibaba.com>
      Reviewed-by: default avatarDust Li <dust.li@linux.alibaba.com>
      Reviewed-by: default avatarTony Lu <tonylu@linux.alibaba.com>
      Signed-off-by: default avatarD. Wythe <alibuda@linux.alibaba.com>
      Acked-by: default avatarKarsten Graul <kgraul@linux.ibm.com>
      Link: https://lore.kernel.org/r/1639571361-101128-1-git-send-email-alibuda@linux.alibaba.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      5c15b312
    • Bryan O'Donoghue's avatar
      wcn36xx: Implement beacon filtering · bebd87ee
      Bryan O'Donoghue authored
      The prima driver facilitates the direct programming of beacon filter tables via
      SMD commands.
      
      The purpose of beacon filters is quote:
      
      /* When beacon filtering is enabled, firmware will
       * analyze the selected beacons received during BMPS,
       * and monitor any changes in the IEs as listed below.
       * The format of the table is:
       *    - EID
       *    - Check for IE presence
       *    - Byte offset
       *    - Byte value
       *    - Bit Mask
       *    - Byte reference
       */
      
      The default filter table looks something like this:
      
      tBeaconFilterIe gaBcnFilterTable[12] =
      {
        { WLAN_EID_DS_PARAMS, 0u, { 0u, 0u, 0u, 0u } },
        { WLAN_EID_ERP_INFO, 0u, { 0u, 0u, 248u, 0u } },
        { WLAN_EID_EDCA_PARAM_SET, 0u, { 0u, 0u, 240u, 0u } },
        { WLAN_EID_QOS_CAPA, 0u, { 0u, 0u, 240u, 0u } },
        { WLAN_EID_CHANNEL_SWITCH, 1u, { 0u, 0u, 0u, 0u } },
        { WLAN_EID_QUIET, 1u, { 0u, 0u, 0u, 0u } },
        { WLAN_EID_HT_OPERATION, 0u, { 0u, 0u, 0u, 0u } },
        { WLAN_EID_HT_OPERATION, 0u, { 1u, 0u, 248u, 0u } },
        { WLAN_EID_HT_OPERATION, 0u, { 2u, 0u, 235u, 0u } },
        { WLAN_EID_HT_OPERATION, 0u, { 5u, 0u, 253u, 0u } },
        { WLAN_EID_PWR_CONSTRAINT, 0u, { 0u, 0u, 0u, 0u } },
        { WLAN_EID_OPMODE_NOTIF, 0u, { 0u, 0u, 0u, 0u } }
      };
      
      Add in an equivalent filter set as present in the prima Linux driver.
      For now omit the beacon filter "rem" command as the driver does not have an
      explicit call to that SMD command. The filter mask should only count when
      we are inside BMPS anyway.
      
      Replicating the ability to program the filter table gives us scope to add and
      remove elements in future. For now though this patch makes the rote-copy of the
      downstream Linux beacon filter table, which we can tweak as desired from now
      on.
      Signed-off-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/20211214134630.2214840-4-bryan.odonoghue@linaro.org
      bebd87ee
    • Bryan O'Donoghue's avatar
      wcn36xx: Fix physical location of beacon filter comment · bc4e7f24
      Bryan O'Donoghue authored
      The comment in the header with respect to beacon filtering makes a
      reference to "the structure above" and "the structure below" which would be
      informative if the comment appeared in the right place but, it does not.
      
      Fix the comment location so that it a least makes sense w/r/t the physical
      location statements.
      Signed-off-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/20211214134630.2214840-3-bryan.odonoghue@linaro.org
      bc4e7f24
    • Bryan O'Donoghue's avatar
      wcn36xx: Fix beacon filter structure definitions · 7effbf7a
      Bryan O'Donoghue authored
      The beacon filter structures need to be packed. Right now its fine because
      we don't yet use these structures so just pack them without marking it for
      backporting.
      Signed-off-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
      Reviewed-by: default avatarLoic Poulain <loic.poulain@linaro.org>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/20211214134630.2214840-2-bryan.odonoghue@linaro.org
      7effbf7a