Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp617267pxy; Wed, 5 May 2021 09:37:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyQcDXhqx+WB3ARWgSDnKTgnFWH55nmDtZrd4IZN+Lt7XeWaX4IEqh1r1EQmq5V5FHHO/oN X-Received: by 2002:a17:902:8c97:b029:ee:f8c1:7bbe with SMTP id t23-20020a1709028c97b02900eef8c17bbemr3528123plo.8.1620232674875; Wed, 05 May 2021 09:37:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620232674; cv=none; d=google.com; s=arc-20160816; b=nT26TugPmhUpxq7kRQcQr6EWNcQ0fS3rI5kgkDz7nCzy9zf08K3kkgso62POf6cezl ARs/jdrwSYqNPlbNRTweYCGlcbPRXfdPtK4bwwh3gHEeOookDHLotEOqBovNja5P4kMr KQr5Tyo+95QD6Qmb0v6Ms1ZKdN9j1WbX0hhs+gZFiH96gIYlPHN9s+n9N3Ev5wlHb/Oy 10E6p5cFZcksDmLW/LUJnCQD3Gj1ObgqJv/Rz9arONiX6uPlAWbSutjmMGPVNsYq4CHF R6iTe8czKgkasy99WwDgzMTC4qLR+JdW8xqPrXutlGdf/Dla3J0EqanTFwfZS1QScvLP tZaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=FKw6Iy5snw9Zx4ts2DaxQR2fAk+Vn9KurUec7/rR4KU=; b=OoxdKhA4nrsdop9TmVO7OEoC3+8DwVnRYmgkzqOTjNqOSMFP4apglz2RlHBRNx5BUm Hac4YR9vX2LDwSL7hhs1Hm32dFXdXLh2oKOf75Xpfol+kkFvZO75CfkTCxeAwD6x0Ak3 lyNVuzxOJsrPkkTcyocotFKm7RL2oROdFWakKi+Fxm/0x5bY+3Yrkwqa4ml3TMMyJJ94 y4WKItufHlk8XsmIh4PiuP3RYzRyuHzrECzgRxXyhLZW7qK1tUxxbQ0Q+QGIhtvbybq5 +jAb6ckpZA+EsJKpWBObPEbTgTr6lvnONkrR4cpYApo2iL/kNZeJLaaJYbDXHXUbdirU Pm/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=IkqVk0Dy; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i23si22548394pfr.315.2021.05.05.09.37.37; Wed, 05 May 2021 09:37:54 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=IkqVk0Dy; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234869AbhEEQhq (ORCPT + 99 others); Wed, 5 May 2021 12:37:46 -0400 Received: from mail.kernel.org ([198.145.29.99]:55176 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234550AbhEEQfq (ORCPT ); Wed, 5 May 2021 12:35:46 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 36A9B61439; Wed, 5 May 2021 16:33:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1620232383; bh=rvik31wNCtC9gMOzvh2YCdENR358Ai1yNdp2L2ZWotY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IkqVk0DyyKMt2HCR0tDjZ6YlfK07d+TJ1B3Px0RGIlHVgF1DjaIFms1Vl1uBLEEXW KU/+YPjk4ARF2UBa7KpFD5/GVqMLW0T/lnHKlYgnJxneqhlgx2MKw3KpLbYezEBdT/ 8bmZqwaX0fK1rRsBjzTWklNhV1whh6WBUPADSAtVy4Sh/tXuE0BLC/+RQdXIWn9DZ7 8Pt0zcSKnTFdPhZVnhiBR1qf3WJSIpSJzrrABiHl59mEKJ7SSWxeSR+2r8xqdsX/WK 3XjWlDHp/N1FtNPWy+b8kQdo+0dxeYHrzbh9AHwyZzaM0/qx7a+IG1F/3vO+B1FpII 7VuLyqxhjHB8g== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Mordechay Goodstein , Luca Coelho , Sasha Levin , linux-wireless@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH AUTOSEL 5.12 070/116] iwlwifi: queue: avoid memory leak in reset flow Date: Wed, 5 May 2021 12:30:38 -0400 Message-Id: <20210505163125.3460440-70-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210505163125.3460440-1-sashal@kernel.org> References: <20210505163125.3460440-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Mordechay Goodstein [ Upstream commit 4cf2f5904d971a461f67825434ae3c31900ff84b ] In case the device is stopped any usage of hw queues needs to be reallocated in fw due to fw reset after device stop, so all driver internal queue should also be freed, and if we don't free the next usage would leak the old memory and get in recover flows "iwlwifi 0000:00:03.0: dma_pool_destroy iwlwifi:bc" warning. Also warn about trying to reuse an internal allocated queue. Signed-off-by: Mordechay Goodstein Signed-off-by: Luca Coelho Link: https://lore.kernel.org/r/iwlwifi.20210411124417.c72d2f0355c4.Ia3baff633b9b9109f88ab379ef0303aa152c16bf@changeid Signed-off-by: Luca Coelho Signed-off-by: Sasha Levin --- .../wireless/intel/iwlwifi/pcie/trans-gen2.c | 4 +-- drivers/net/wireless/intel/iwlwifi/queue/tx.c | 30 ++++--------------- drivers/net/wireless/intel/iwlwifi/queue/tx.h | 3 +- 3 files changed, 9 insertions(+), 28 deletions(-) diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c index 94ffc1ae484d..af9412bd697e 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* * Copyright (C) 2017 Intel Deutschland GmbH - * Copyright (C) 2018-2020 Intel Corporation + * Copyright (C) 2018-2021 Intel Corporation */ #include "iwl-trans.h" #include "iwl-prph.h" @@ -143,7 +143,7 @@ void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans) if (test_and_clear_bit(STATUS_DEVICE_ENABLED, &trans->status)) { IWL_DEBUG_INFO(trans, "DEVICE_ENABLED bit was set and is now cleared\n"); - iwl_txq_gen2_tx_stop(trans); + iwl_txq_gen2_tx_free(trans); iwl_pcie_rx_stop(trans); } diff --git a/drivers/net/wireless/intel/iwlwifi/queue/tx.c b/drivers/net/wireless/intel/iwlwifi/queue/tx.c index 833f43d1ca7a..810dcb3df242 100644 --- a/drivers/net/wireless/intel/iwlwifi/queue/tx.c +++ b/drivers/net/wireless/intel/iwlwifi/queue/tx.c @@ -13,30 +13,6 @@ #include "iwl-scd.h" #include -/* - * iwl_txq_gen2_tx_stop - Stop all Tx DMA channels - */ -void iwl_txq_gen2_tx_stop(struct iwl_trans *trans) -{ - int txq_id; - - /* - * This function can be called before the op_mode disabled the - * queues. This happens when we have an rfkill interrupt. - * Since we stop Tx altogether - mark the queues as stopped. - */ - memset(trans->txqs.queue_stopped, 0, - sizeof(trans->txqs.queue_stopped)); - memset(trans->txqs.queue_used, 0, sizeof(trans->txqs.queue_used)); - - /* Unmap DMA from host system and free skb's */ - for (txq_id = 0; txq_id < ARRAY_SIZE(trans->txqs.txq); txq_id++) { - if (!trans->txqs.txq[txq_id]) - continue; - iwl_txq_gen2_unmap(trans, txq_id); - } -} - /* * iwl_txq_update_byte_tbl - Set up entry in Tx byte-count array */ @@ -1189,6 +1165,12 @@ static int iwl_txq_alloc_response(struct iwl_trans *trans, struct iwl_txq *txq, goto error_free_resp; } + if (WARN_ONCE(trans->txqs.txq[qid], + "queue %d already allocated\n", qid)) { + ret = -EIO; + goto error_free_resp; + } + txq->id = qid; trans->txqs.txq[qid] = txq; wr_ptr &= (trans->trans_cfg->base_params->max_tfd_queue_size - 1); diff --git a/drivers/net/wireless/intel/iwlwifi/queue/tx.h b/drivers/net/wireless/intel/iwlwifi/queue/tx.h index af1dbdf5617a..20efc62acf13 100644 --- a/drivers/net/wireless/intel/iwlwifi/queue/tx.h +++ b/drivers/net/wireless/intel/iwlwifi/queue/tx.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ /* - * Copyright (C) 2020 Intel Corporation + * Copyright (C) 2020-2021 Intel Corporation */ #ifndef __iwl_trans_queue_tx_h__ #define __iwl_trans_queue_tx_h__ @@ -123,7 +123,6 @@ int iwl_txq_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, void iwl_txq_dyn_free(struct iwl_trans *trans, int queue); void iwl_txq_gen2_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq); void iwl_txq_inc_wr_ptr(struct iwl_trans *trans, struct iwl_txq *txq); -void iwl_txq_gen2_tx_stop(struct iwl_trans *trans); void iwl_txq_gen2_tx_free(struct iwl_trans *trans); int iwl_txq_init(struct iwl_trans *trans, struct iwl_txq *txq, int slots_num, bool cmd_queue); -- 2.30.2