]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: iwlwifi: pcie: make sure to lock rxq->read
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Thu, 24 Apr 2025 12:38:30 +0000 (15:38 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 25 Apr 2025 09:26:34 +0000 (11:26 +0200)
rxq->read is accessed without the rxq->lock in a few places,
Make sure to have the lock there.

Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Tested-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Link: https://patch.msgid.link/20250424153620.73725f207aaa.I1a3e4b6c5fd370e029fdacfcdc9ee335788afa98@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/pcie/trans.c

index c917ed4c19bcc3045e8134d70a41523589df05fa..b2258c13f7f7f5155310cb89482acdd5b304753a 100644 (file)
@@ -2934,6 +2934,8 @@ static ssize_t iwl_dbgfs_rx_queue_read(struct file *file,
        for (i = 0; i < trans->num_rx_queues && pos < bufsz; i++) {
                struct iwl_rxq *rxq = &trans_pcie->rxq[i];
 
+               spin_lock_bh(&rxq->lock);
+
                pos += scnprintf(buf + pos, bufsz - pos, "queue#: %2d\n",
                                 i);
                pos += scnprintf(buf + pos, bufsz - pos, "\tread: %u\n",
@@ -2954,6 +2956,7 @@ static ssize_t iwl_dbgfs_rx_queue_read(struct file *file,
                        pos += scnprintf(buf + pos, bufsz - pos,
                                         "\tclosed_rb_num: Not Allocated\n");
                }
+               spin_unlock_bh(&rxq->lock);
        }
        ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
        kfree(buf);
@@ -3654,8 +3657,11 @@ iwl_trans_pcie_dump_data(struct iwl_trans *trans, u32 dump_mask,
                /* Dump RBs is supported only for pre-9000 devices (1 queue) */
                struct iwl_rxq *rxq = &trans_pcie->rxq[0];
                /* RBs */
+               spin_lock_bh(&rxq->lock);
                num_rbs = iwl_get_closed_rb_stts(trans, rxq);
                num_rbs = (num_rbs - rxq->read) & RX_QUEUE_MASK;
+               spin_unlock_bh(&rxq->lock);
+
                len += num_rbs * (sizeof(*data) +
                                  sizeof(struct iwl_fw_error_dump_rb) +
                                  (PAGE_SIZE << trans_pcie->rx_page_order));