Received: by 2002:a17:90a:88:0:0:0:0 with SMTP id a8csp60139pja; Fri, 22 Nov 2019 03:27:07 -0800 (PST) X-Google-Smtp-Source: APXvYqx5Pidq7z8mLB/8QUpJz/Hezttiz08BhGbdD1lK8tGASW44FTh3LDUMH/w3kB2wsXOnFBtk X-Received: by 2002:a50:a146:: with SMTP id 64mr425001edj.199.1574422027052; Fri, 22 Nov 2019 03:27:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574422027; cv=none; d=google.com; s=arc-20160816; b=OChfspJq0phQcYvDUFzQs8WTjB321WAhOhiqK5jYoMhvgj85HbGhdmpBAp09BSBzBB rrFTYgRC9ZsHk2IcyQiPou7lyx1Unl5jox6opT2/4capXQQbF4ssR6iF1wja/2TMK+la 8YRaWqXv8P4eO8yVAoiCyA3rQPFVaCR8weJ+qwY3J5fkiWR1FXVDMjDy95be7nsbjB9p Ru+NjHhvAMxD8aBy2qAhIShpiiQdUD2PVv1zrc9hph6i1aDXJ27VDuEYUyD7BbWB4eRm WHmDA2iopYMAmHHVLK5ogYpK9cidCLPeMARBSQuSIYbL4ISV31x0aKg8D9QZAyLx88Kb pKVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=hlb03UH82A7giI28EtxjpCGPP0lxzEfGdhLQ8XtA1Oc=; b=WX1Vf9yq9kbT8NWEG0k3ZR1CVOW2FT6bsEWL3rKyhinwBEaGeOrecM2XeDkMxhuTZQ yRceGQ7rYia/HoYypKURu9NBW2gIDA7qddBSVhgdkyWenNc3FOvvASg05P5+QzG7bWae KDcSExrHc+tqLHQx3RTJaq7PDVgUHpE6LnNfW0lSYb4AM2NBcXcznYpPJF/onwVG16/M yhxKNTysApQSF7ryaBT4I5/xZNUob5ugdTJu4ysQEm5GmOjhuZ+DFJfb6wNNJJWyG2U7 b14aKn+1mV6/lyuB6atKHkE/DNUpKfyO48ovSH8jfd5yMMYjMtl3otU9AYgaKaFqkx9a PZIg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=hIAsVbfK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g10si1012987edk.5.2019.11.22.03.26.43; Fri, 22 Nov 2019 03:27:07 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=hIAsVbfK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729386AbfKVLYZ (ORCPT + 99 others); Fri, 22 Nov 2019 06:24:25 -0500 Received: from mail.kernel.org ([198.145.29.99]:42268 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727329AbfKVKjP (ORCPT ); Fri, 22 Nov 2019 05:39:15 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 10EA52071C; Fri, 22 Nov 2019 10:39:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1574419153; bh=sMuIECjAf/onTndK4V13lbx+H72rT2nSj8F/ccPmjhc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hIAsVbfKhA6uclmd8f+d1vn7NEOgwyjqSdsHIavGMB4w64O6vdlCkjei+ZxyWWbVH VuXd8eitp4mfT/nyLUi65IUkUiZAQqNN32G1IRfTiivpcHOzxm8r8Q+VXSD9fTsbws fs/meJ7pkZfU8ZY9uVU5cFDb2Y5UCuWXdiUSUDJo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Tamizh chelvam , Kalle Valo , Sasha Levin Subject: [PATCH 4.9 016/222] ath10k: fix kernel panic by moving pci flush after napi_disable Date: Fri, 22 Nov 2019 11:25:56 +0100 Message-Id: <20191122100835.292390044@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191122100830.874290814@linuxfoundation.org> References: <20191122100830.874290814@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Tamizh chelvam [ Upstream commit bd1d395070cca4f42a93e520b0597274789274a4 ] When continuously running wifi up/down sequence, the napi poll can be scheduled after the CE buffers being freed by ath10k_pci_flush Steps: In a certain condition, during wifi down below scenario might occur. ath10k_stop->ath10k_hif_stop->napi_schedule->ath10k_pci_flush->napi_poll(napi_synchronize). In the above scenario, CE buffer entries will be freed up and become NULL in ath10k_pci_flush. And the napi_poll has been invoked after the flush process and it will try to get the skb from the CE buffer entry and perform some action on that. Since the CE buffer already cleaned by pci flush this action will create NULL pointer dereference and trigger below kernel panic. Unable to handle kernel NULL pointer dereference at virtual address 0000005c PC is at ath10k_pci_htt_rx_cb+0x64/0x3ec [ath10k_pci] ath10k_pci_htt_rx_cb [ath10k_pci] ath10k_ce_per_engine_service+0x74/0xc4 [ath10k_pci] ath10k_ce_per_engine_service [ath10k_pci] ath10k_ce_per_engine_service_any+0x74/0x80 [ath10k_pci] ath10k_ce_per_engine_service_any [ath10k_pci] ath10k_pci_napi_poll+0x48/0xec [ath10k_pci] ath10k_pci_napi_poll [ath10k_pci] net_rx_action+0xac/0x160 net_rx_action __do_softirq+0xdc/0x208 __do_softirq irq_exit+0x84/0xe0 irq_exit __handle_domain_irq+0x80/0xa0 __handle_domain_irq gic_handle_irq+0x38/0x5c gic_handle_irq __irq_usr+0x44/0x60 Tested on QCA4019 and firmware version 10.4.3.2.1.1-00010 Signed-off-by: Tamizh chelvam Signed-off-by: Kalle Valo Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/ath10k/ahb.c | 4 ++-- drivers/net/wireless/ath/ath10k/pci.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath10k/ahb.c b/drivers/net/wireless/ath/ath10k/ahb.c index da770af830369..125b5c31b2b0a 100644 --- a/drivers/net/wireless/ath/ath10k/ahb.c +++ b/drivers/net/wireless/ath/ath10k/ahb.c @@ -658,10 +658,10 @@ static void ath10k_ahb_hif_stop(struct ath10k *ar) ath10k_ahb_irq_disable(ar); synchronize_irq(ar_ahb->irq); - ath10k_pci_flush(ar); - napi_synchronize(&ar->napi); napi_disable(&ar->napi); + + ath10k_pci_flush(ar); } static int ath10k_ahb_hif_power_up(struct ath10k *ar) diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c index 25b8d501d437e..b7bac14d1487b 100644 --- a/drivers/net/wireless/ath/ath10k/pci.c +++ b/drivers/net/wireless/ath/ath10k/pci.c @@ -1781,9 +1781,9 @@ static void ath10k_pci_hif_stop(struct ath10k *ar) ath10k_pci_irq_disable(ar); ath10k_pci_irq_sync(ar); - ath10k_pci_flush(ar); napi_synchronize(&ar->napi); napi_disable(&ar->napi); + ath10k_pci_flush(ar); spin_lock_irqsave(&ar_pci->ps_lock, flags); WARN_ON(ar_pci->ps_wake_refcount > 0); -- 2.20.1