Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp6187235rwb; Tue, 22 Nov 2022 09:50:30 -0800 (PST) X-Google-Smtp-Source: AA0mqf6iyxP3sWvZRAjtU/2Rv/rtpqAmHu/FPHF905HxWbsO2dFJh0YvU3xj6PmKiUoJc2vQVKbv X-Received: by 2002:a63:f056:0:b0:477:a33f:4858 with SMTP id s22-20020a63f056000000b00477a33f4858mr3412755pgj.76.1669139430046; Tue, 22 Nov 2022 09:50:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669139430; cv=none; d=google.com; s=arc-20160816; b=DOBU1F9WcpG9i5MOj4xo5D/AnWsnh/6MFP2W0ToDXDPGfzqEINbHo9OkUPpX06cRBX hY3Hmhk1tuHr7f5tqISmZNetVapObHkPCV8smIoJNBSJ43D+txc+j5iY/S+fHn3onb4E u0lIPBuAuwuPwUOiXGzBBVrv7+XhS+uTspphwIcYYySyb+0l5ZYoEJXKr+UxgDArq6E5 45dnZekhIcVYMpl8om4cxQLRl1r9IKeb0LUauF/ikeTZJWHNgDlhe0DN/75SV8dEIdti WmAfMjs+DwRuLuC02rM5dETtoKGmU/pxTQOpZMSMdJWJ/14wpsEKcajuSzrPAVUiD3dr Xp3w== 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=oI5vClIK5VXyvU77WUUhvfXGhlYe4fvxRaN99XtMgVU=; b=it4rEjCG8BVq+UFAJoUTqFv0e22bqd+mSX2U/9GjGzATKdPKykMPVmLHQW15WgscSF BX/BA4bD9MVAPpN5ogziLo/xBhTv7yM1HdVnbW48FLu4sbl2kS7wRCvErwcNji0ttTEH 3Rl18cbcbojOtCZXjEIc/GlT5Fnm73zAZBaMd9t3eKRC/ARYgUmHPRaxkqAGnw5ncuXw Z+QtPW9oBj/AbdH6QLKxGj4I2QuLFVb3ZM31C+KrD20lCcsmeXF/NHgciv2OkpmE3WpF 9CkJYmOjNcOCQJtjqZD9FOmDkEtWzzIwgM97ngb/QeIjaVVdaVSqL/OXu+YfQMd9Rk7W KcvQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=egHu6Fhz; dkim=neutral (no key) header.i=@linutronix.de; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z1-20020a1709028f8100b001871b8770d3si12407754plo.599.2022.11.22.09.50.11; Tue, 22 Nov 2022 09:50:30 -0800 (PST) Received-SPF: pass (google.com: domain of linux-bluetooth-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=egHu6Fhz; dkim=neutral (no key) header.i=@linutronix.de; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-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 S234444AbiKVRrk (ORCPT + 99 others); Tue, 22 Nov 2022 12:47:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33126 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234579AbiKVRqH (ORCPT ); Tue, 22 Nov 2022 12:46:07 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A7DA2F38; Tue, 22 Nov 2022 09:45:13 -0800 (PST) Message-ID: <20221122173649.075273417@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1669139112; 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=oI5vClIK5VXyvU77WUUhvfXGhlYe4fvxRaN99XtMgVU=; b=egHu6FhzMGVOkguJ5qXG7yxjl71SA9AN/e6OvsPp9OMLx+nax1Y5Y9fc6fC8+/ZD5Kmsd4 9JgWIHHx91GqueaKBEyztDSGaDLgRJskkRxKdrxIq+GPdZnFz1mlxi/6sscbm0Aye8JRin SOm/Eh6ur6kMYMYDzkA4ioJO9VEFe/om6lMSxytWm+Uw0cuMgcA+EHuVxuX7g7UaJn60er UBWBZbGKIgxWbFwckSJGkUK4fLjYXHi/fZOwnvAh5Ij3tx9F+mAEFycBmDBaDRxPCkxm4s cdIcDm2w3xDCUjTN1z0yy7zYu4kH48kS698M/fW0HGs4l6QLQo5sxiMCk+9A7w== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1669139112; 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=oI5vClIK5VXyvU77WUUhvfXGhlYe4fvxRaN99XtMgVU=; b=KD+ZBXbLsEWmaF1zCfxVndsPLd6sfamM4FuZleyD1L6ZQ9G+52BN/vWvU+sSvxVSiTE2/v VEKFOqrnzE423TBg== From: Thomas Gleixner To: LKML Cc: Linus Torvalds , Steven Rostedt , Anna-Maria Behnsen , Peter Zijlstra , Stephen Boyd , Guenter Roeck , Andrew Morton , Julia Lawall , Arnd Bergmann , Viresh Kumar , Marc Zyngier , Marcel Holtmann , Johan Hedberg , Luiz Augusto von Dentz , linux-bluetooth@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org Subject: [patch V2 17/17] Bluetooth: hci_qca: Fix the teardown problem for real References: <20221122171312.191765396@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Date: Tue, 22 Nov 2022 18:45:11 +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: X-Mailing-List: linux-bluetooth@vger.kernel.org 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 Tested-by: Guenter Roeck Acked-by: Luiz Augusto von Dentz Cc: Marcel Holtmann Cc: Johan Hedberg Cc: linux-bluetooth@vger.kernel.org Cc: "David S. Miller" Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni 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(-) --- 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);