Message ID | 20221123201625.435907114@linutronix.de |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp3010525wrr; Wed, 23 Nov 2022 12:26:00 -0800 (PST) X-Google-Smtp-Source: AA0mqf56lhc9gpfNNW0064ZwZ+jdUoLVSMa3ooP96H3zIOQ5dgQ0hW5k9jxGE1MOf7cdc00pIk+6 X-Received: by 2002:a17:902:d4c8:b0:186:9d71:228c with SMTP id o8-20020a170902d4c800b001869d71228cmr11494820plg.109.1669235160683; Wed, 23 Nov 2022 12:26:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669235160; cv=none; d=google.com; s=arc-20160816; b=RiuQClDqGZQPOldyQjbGVKrr8Fq1l2I0M0YCxr1eU3Z/bxLlBX2pb1Jp+1dsICLUCR 1R9XntXm5c+vuiE4Ilze1w7vShNtQv2wx7yucHxCjqXwBqfBB+aUyTw7kkC8yUw61+Z/ RcNSJcIW7C5cPGsQDmfBRQSvBPOYNiLTt6RDAOR9IsNyb750f7r6Jt9ejPnfFrLQRwoZ FqYKGVYOVBigt8teTcSdskhPk77Q4mhRWlDpW5iqsJx+sEyHfFgfx8J/JEWceJ4ecKbu zr4whUrl1kVcvX7ev28xCVjz6hqmU7XKWvIv0CbXyWhaNDJ8oJdrImrMgATrMOpyv335 Pzhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:date:mime-version:references:subject:cc:to:from :dkim-signature:dkim-signature:message-id; bh=N5rjif6fyxnP/Qgbwg5ZMeD/njPbRjLjFEtdr1g8NrQ=; b=RQCEm8MkTNcuCnxviGeTRqLGZFtAXmKnLvXDxUtZBPqS7zOFLKnCB/AmdRsjagX5Lj TarkLXdG5/bC7CA14bFtl7pYU0LYspV35yosoiHkc5tmZgpfDsWmvOUlmE9FowvKwe0R EqVJOY2okCKsak/JakLjhByhfTFFm1Ki6NmUkVA8R5o3tQJHI5QZzh8EDmk+foylcJAN eFS+VOK3jHafcs+Am33KnifGtHMh+1w1CJiWKN/zUg30nC54bgbPJrTocPLk1fiM6cXs VpiELTTQtdPXM7WdjE21qr283U9BQFmNwCkiXBoi3tiueHPvb28J6IBdvbDX9uW173PT eExA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=R9QHOKD3; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b9-20020a63d809000000b004775d7da79asi11676684pgh.498.2022.11.23.12.25.48; Wed, 23 Nov 2022 12:26:00 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=R9QHOKD3; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236423AbiKWUWg (ORCPT <rfc822;fengqi706@gmail.com> + 99 others); Wed, 23 Nov 2022 15:22:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41820 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239361AbiKWUV0 (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 23 Nov 2022 15:21:26 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C2E80C769B; Wed, 23 Nov 2022 12:19:13 -0800 (PST) Message-ID: <20221123201625.435907114@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1669234737; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=N5rjif6fyxnP/Qgbwg5ZMeD/njPbRjLjFEtdr1g8NrQ=; b=R9QHOKD307W6xOOboyxsH4Y9NpQA+cS0rm9nYLPCkqLpbXXlf7QKZk/un/aTDPSM8r8ke0 WHn6izB5oy4rGA83r+5+1TwRlumiU+VVFCU8PQK8GrvvfAcNBSA2v5ocQMfB0A6kU6r3JH qEpMYrGt9z+IPS6/Ctb6ddMTtTTo4VoAS74Ct/ec6emH6p+fQ1SzrtEc9vBL6znzRNP713 FpXmcKZlEU0TzqQmwK+wUAzgNEB/g7Cib+bRz2y6AMYGMbjRPVXh1r6MxInXm4e1qCGRgi CpDwasqC/RCHLMlEbhVfXMvArunDJPBguejkD+XStLfBV3N/TqEeBco5rIT2Bw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1669234737; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=N5rjif6fyxnP/Qgbwg5ZMeD/njPbRjLjFEtdr1g8NrQ=; b=2dJK9SFpNO7GBTAPIsBlJ30G65FIbTDXFF2qtscws/0M6SmS23TaGhsCxRNhPmvqmPY9+U LNq7gAjOreuCrOBg== From: Thomas Gleixner <tglx@linutronix.de> To: LKML <linux-kernel@vger.kernel.org> Cc: Linus Torvalds <torvalds@linuxfoundation.org>, Steven Rostedt <rostedt@goodmis.org>, Anna-Maria Behnsen <anna-maria@linutronix.de>, Peter Zijlstra <peterz@infradead.org>, Stephen Boyd <sboyd@kernel.org>, Guenter Roeck <linux@roeck-us.net>, Andrew Morton <akpm@linux-foundation.org>, Julia Lawall <Julia.Lawall@inria.fr>, Arnd Bergmann <arnd@arndb.de>, Viresh Kumar <viresh.kumar@linaro.org>, Marc Zyngier <maz@kernel.org>, Marcel Holtmann <marcel@holtmann.org>, Johan Hedberg <johan.hedberg@gmail.com>, Luiz Augusto von Dentz <luiz.dentz@gmail.com>, linux-bluetooth@vger.kernel.org, "David S. Miller" <davem@davemloft.net>, Eric Dumazet <edumazet@google.com>, Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>, netdev@vger.kernel.org, Jacob Keller <jacob.e.keller@intel.com> Subject: [patch V3 17/17] Bluetooth: hci_qca: Fix the teardown problem for real References: <20221123201306.823305113@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Date: Wed, 23 Nov 2022 21:18:57 +0100 (CET) X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1750319928000402539?= X-GMAIL-MSGID: =?utf-8?q?1750319928000402539?= |
Series |
timers: Provide timer_shutdown[_sync]()
|
|
Commit Message
Thomas Gleixner
Nov. 23, 2022, 8:18 p.m. UTC
While discussing solutions for the teardown problem which results from circular dependencies between timers and workqueues, where timers schedule work from their timer callback and workqueues arm the timers from work items, it was discovered that the recent fix to the QCA code is incorrect. That commit fixes the obvious problem of using del_timer() instead of del_timer_sync() and reorders the teardown calls to destroy_workqueue(wq); del_timer_sync(t); This makes it less likely to explode, but it's still broken: destroy_workqueue(wq); /* After this point @wq cannot be touched anymore */ ---> timer expires queue_work(wq) <---- Results in a NULl pointer dereference deep in the work queue core code. del_timer_sync(t); Use the new timer_shutdown_sync() function to ensure that the timers are disarmed, no timer callbacks are running and the timers cannot be armed again. This restores the original teardown sequence: timer_shutdown_sync(t); destroy_workqueue(wq); which is now correct because the timer core silently ignores potential rearming attempts which can happen when destroy_workqueue() drains pending work before mopping up the workqueue. Fixes: 72ef98445aca ("Bluetooth: hci_qca: Use del_timer_sync() before freeing") Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Acked-by: Luiz Augusto von Dentz <luiz.dentz@gmail.com> Cc: Marcel Holtmann <marcel@holtmann.org> Cc: Johan Hedberg <johan.hedberg@gmail.com> Cc: linux-bluetooth@vger.kernel.org Cc: "David S. Miller" <davem@davemloft.net> Cc: Eric Dumazet <edumazet@google.com> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Paolo Abeni <pabeni@redhat.com> Cc: netdev@vger.kernel.org Link: https://lore.kernel.org/all/87iljhsftt.ffs@tglx --- drivers/bluetooth/hci_qca.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
Comments
On Wed, 23 Nov 2022, Thomas Gleixner wrote: > While discussing solutions for the teardown problem which results from > circular dependencies between timers and workqueues, where timers schedule > work from their timer callback and workqueues arm the timers from work > items, it was discovered that the recent fix to the QCA code is incorrect. > > That commit fixes the obvious problem of using del_timer() instead of > del_timer_sync() and reorders the teardown calls to > > destroy_workqueue(wq); > del_timer_sync(t); > > This makes it less likely to explode, but it's still broken: > > destroy_workqueue(wq); > /* After this point @wq cannot be touched anymore */ > > ---> timer expires > queue_work(wq) <---- Results in a NULl pointer dereference The last NIT (for now...): s/NULl/NULL Thanks, Anna-Maria
--- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -696,9 +696,15 @@ static int qca_close(struct hci_uart *hu skb_queue_purge(&qca->tx_wait_q); skb_queue_purge(&qca->txq); skb_queue_purge(&qca->rx_memdump_q); + /* + * Shut the timers down so they can't be rearmed when + * destroy_workqueue() drains pending work which in turn might try + * to arm a timer. After shutdown rearm attempts are silently + * ignored by the timer core code. + */ + timer_shutdown_sync(&qca->tx_idle_timer); + timer_shutdown_sync(&qca->wake_retrans_timer); destroy_workqueue(qca->workqueue); - del_timer_sync(&qca->tx_idle_timer); - del_timer_sync(&qca->wake_retrans_timer); qca->hu = NULL; kfree_skb(qca->rx_skb);