From patchwork Mon Dec 12 18:50:01 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tobias Klausmann X-Patchwork-Id: 705129 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3tcsNS45ztz9t1C for ; Tue, 13 Dec 2016 05:50:32 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752529AbcLLSua (ORCPT ); Mon, 12 Dec 2016 13:50:30 -0500 Received: from mout2.fh-giessen.de ([212.201.18.46]:36745 "EHLO mout2.fh-giessen.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751902AbcLLSu3 (ORCPT ); Mon, 12 Dec 2016 13:50:29 -0500 Received: from mx1.fh-giessen.de ([212.201.18.40]) by mout2.fh-giessen.de with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1cGVgB-000Gp4-Dl; Mon, 12 Dec 2016 19:50:27 +0100 Received: from mailgate-2.its.fh-giessen.de ([212.201.18.14]) by mx1.fh-giessen.de with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1cGVgB-000GwW-BD; Mon, 12 Dec 2016 19:50:27 +0100 Received: from p549d3380.dip0.t-ipconnect.de ([84.157.51.128] helo=sieben.fritz.box) by mailgate-2.its.fh-giessen.de with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_CBC_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1cGVgB-000GLZ-11; Mon, 12 Dec 2016 19:50:27 +0100 From: Tobias Klausmann To: kvalo@codeaurora.org, helgaas@kernel.org, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, marc.zyngier@arm.com, Janusz.Dziedzic@tieto.com, rmanohar@qti.qualcomm.com, ath9k-devel@qca.qualcomm.com, linux-wireless@vger.kernel.org, rmanohar@qca.qualcomm.com, bharat.kumar.gogada@xilinx.com Cc: Tobias Klausmann Subject: [PATCH] ath9k: unlock rcu read when returning early Date: Mon, 12 Dec 2016 19:50:01 +0100 Message-Id: <20161212185001.3857-1-tobias.johannes.klausmann@mni.thm.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <1cFMHb-00BdWd-Ks> References: <1cFMHb-00BdWd-Ks> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Starting with ath9k: use ieee80211_tx_status_noskb where possible [d94a461d7a7df68991fb9663531173f60ef89c68] the driver uses rcu_read_lock() && rcu_read_unlock() yet on returning early in ath_tx_edma_tasklet() the unlock is missing leading to stalls and suspicious RCU usage: =============================== [ INFO: suspicious RCU usage. ] 4.9.0-rc8 #11 Not tainted ------------------------------- kernel/rcu/tree.c:705 Illegal idle entry in RCU read-side critical section.! other info that might help us debug this: RCU used illegally from idle CPU! rcu_scheduler_active = 1, debug_locks = 0 RCU used illegally from extended quiescent state! 1 lock held by swapper/7/0: #0: ( rcu_read_lock ){......} , at: [] ath_tx_edma_tasklet+0x0/0x450 [ath9k] stack backtrace: CPU: 7 PID: 0 Comm: swapper/7 Not tainted 4.9.0-rc8 #11 Hardware name: Acer Aspire V3-571G/VA50_HC_CR, BIOS V2.21 12/16/2013 ffff88025efc3f38 ffffffff8132b1e5 ffff88017ede4540 0000000000000001 ffff88025efc3f68 ffffffff810a25f7 ffff88025efcee60 ffff88017edebdd8 ffff88025eeb5400 0000000000000091 ffff88025efc3f88 ffffffff810c3cd4 Call Trace: [] dump_stack+0x68/0x93 [] lockdep_rcu_suspicious+0xd7/0x110 [] rcu_eqs_enter_common.constprop.85+0x154/0x200 [] rcu_irq_exit+0x44/0xa0 [] irq_exit+0x61/0xd0 [] do_IRQ+0x65/0x110 [] common_interrupt+0x89/0x89 [] ? cpuidle_enter_state+0x151/0x200 [] cpuidle_enter+0x12/0x20 [] call_cpuidle+0x1e/0x40 [] cpu_startup_entry+0x146/0x220 [] start_secondary+0x148/0x170 Signed-off-by: Tobias Klausmann --- drivers/net/wireless/ath/ath9k/xmit.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 52bfbb988611..857d5ae09a1d 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -2787,6 +2787,7 @@ void ath_tx_edma_tasklet(struct ath_softc *sc) fifo_list = &txq->txq_fifo[txq->txq_tailidx]; if (list_empty(fifo_list)) { ath_txq_unlock(sc, txq); + rcu_read_unlock(); return; }