From patchwork Wed Dec 7 05:00:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mohammed Shafi Shajakhan X-Patchwork-Id: 9463923 X-Patchwork-Delegate: kvalo@adurom.com Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id CEF9060512 for ; Wed, 7 Dec 2016 05:01:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C226C2817F for ; Wed, 7 Dec 2016 05:01:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B302428464; Wed, 7 Dec 2016 05:01:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 387522817F for ; Wed, 7 Dec 2016 05:01:05 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1cEULV-0004XC-46; Wed, 07 Dec 2016 05:00:45 +0000 Received: from wolverine02.qualcomm.com ([199.106.114.251]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1cEULQ-0003zU-AA for ath10k@lists.infradead.org; Wed, 07 Dec 2016 05:00:41 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=qti.qualcomm.com; i=@qti.qualcomm.com; q=dns/txt; s=qcdkim; t=1481086840; x=1512622840; h=from:to:cc:subject:date:message-id:mime-version; bh=D8Jc9kfUOYMQeYCSUQrIcl61DcxaTRgjhpvvixJS67Y=; b=oBGAf8RSNMuoEsg/AU4Xitp/URpyonITkcn/qrQw/ps2ejTYGDm6DDWo 9wjqB1vcPn5gzMefoFZt1B5KyQU1Vuk91rPXTJs6FD093yXm0ClpgMdeN xZhs+cqOZJzz52w8b+AmQGJWKxRDXbGSOXsEujv6odNzgZ0gH5LJqVxmW 8=; X-IronPort-AV: E=Sophos;i="5.33,310,1477983600"; d="scan'208";a="341369802" Received: from unknown (HELO ironmsg02-R.qualcomm.com) ([10.53.140.106]) by wolverine02.qualcomm.com with ESMTP; 06 Dec 2016 21:00:15 -0800 From: Mohammed Shafi Shajakhan X-IronPort-AV: E=McAfee;i="5700,7163,8371"; a="860117615" X-Amp-Result: CLEAN Received: from nasanexm01h.na.qualcomm.com ([10.85.0.34]) by ironmsg02-R.qualcomm.com with ESMTP/TLS/RC4-SHA; 06 Dec 2016 21:00:10 -0800 Received: from aphydexm01b.ap.qualcomm.com (10.252.127.11) by NASANEXM01H.na.qualcomm.com (10.85.0.34) with Microsoft SMTP Server (TLS) id 15.0.1178.4; Tue, 6 Dec 2016 21:00:08 -0800 Received: from qcmail1.qualcomm.com (10.80.80.8) by aphydexm01b.ap.qualcomm.com (10.252.127.11) with Microsoft SMTP Server (TLS) id 15.0.1178.4; Wed, 7 Dec 2016 10:30:00 +0530 Received: by qcmail1.qualcomm.com (sSMTP sendmail emulation); Wed, 07 Dec 2016 10:30:35 +0530 To: Subject: [PATCH] ath10k: Avoid potential page alloc BUG_ON in tx free path Date: Wed, 7 Dec 2016 10:30:32 +0530 Message-ID: <1481086832-17281-1-git-send-email-mohammed@qca.qualcomm.com> X-Mailer: git-send-email 1.9.1 MIME-Version: 1.0 X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: NASANEXM01F.na.qualcomm.com (10.85.0.32) To aphydexm01b.ap.qualcomm.com (10.252.127.11) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161206_210040_485306_555FF811 X-CRM114-Status: UNSURE ( 8.57 ) X-CRM114-Notice: Please train this message. X-BeenThere: ath10k@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mohammed@codeaurora.org, linux-wireless@vger.kernel.org, Mohammed Shafi Shajakhan Sender: "ath10k" Errors-To: ath10k-bounces+patchwork-ath10k=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Mohammed Shafi Shajakhan 'ath10k_htt_tx_free_cont_txbuf' and 'ath10k_htt_tx_free_cont_frag_desc' have NULL pointer checks to avoid crash if they are called twice but this is as of now not sufficient as these pointers are not assigned to NULL once the contiguous DMA memory allocation is freed, fix this. Though this may not be hit with the explicity check of state variable 'tx_mem_allocated' check, good to have this addressed as well. Below BUG_ON is hit when the above scenario is simulated with kernel debugging enabled page:f6d09a00 count:0 mapcount:-127 mapping: (null) index:0x0 flags: 0x40000000() page dumped because: VM_BUG_ON_PAGE(page_ref_count(page) == 0) ------------[ cut here ]------------ kernel BUG at ./include/linux/mm.h:445! invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC EIP is at put_page_testzero.part.88+0xd/0xf Call Trace: [] __free_pages+0x3c/0x40 [] free_pages+0x3e/0x50 [] dma_generic_free_coherent+0x24/0x30 [] ath10k_htt_tx_free_cont_txbuf+0xf8/0x140 [] ath10k_htt_tx_destroy+0x29/0xa0 [] ath10k_core_destroy+0x60/0x80 [ath10k_core] [] ath10k_pci_remove+0x79/0xa0 [ath10k_pci] [] pci_device_remove+0x38/0xb0 [] __device_release_driver+0x72/0x100 [] driver_detach+0x97/0xa0 [] bus_remove_driver+0x40/0x80 [] driver_unregister+0x2a/0x60 [] pci_unregister_driver+0x18/0x70 [] ath10k_pci_exit+0xd/0x2be [ath10k_pci] [] SyS_delete_module+0x158/0x210 [] ? __might_fault+0x41/0xa0 [] ? __might_fault+0x8b/0xa0 [] do_fast_syscall_32+0x9b/0x1c0 [] sysenter_past_esp+0x45/0x74 Signed-off-by: Mohammed Shafi Shajakhan --- drivers/net/wireless/ath/ath10k/htt_tx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/wireless/ath/ath10k/htt_tx.c b/drivers/net/wireless/ath/ath10k/htt_tx.c index 27e49db..86b427f 100644 --- a/drivers/net/wireless/ath/ath10k/htt_tx.c +++ b/drivers/net/wireless/ath/ath10k/htt_tx.c @@ -239,6 +239,7 @@ static void ath10k_htt_tx_free_cont_txbuf(struct ath10k_htt *htt) size = htt->max_num_pending_tx * sizeof(struct ath10k_htt_txbuf); dma_free_coherent(ar->dev, size, htt->txbuf.vaddr, htt->txbuf.paddr); + htt->txbuf.vaddr = NULL; } static int ath10k_htt_tx_alloc_cont_txbuf(struct ath10k_htt *htt) @@ -268,6 +269,7 @@ static void ath10k_htt_tx_free_cont_frag_desc(struct ath10k_htt *htt) size, htt->frag_desc.vaddr, htt->frag_desc.paddr); + htt->frag_desc.vaddr = NULL; } static int ath10k_htt_tx_alloc_cont_frag_desc(struct ath10k_htt *htt)