Received: by 2002:a05:6a10:c604:0:0:0:0 with SMTP id y4csp880084pxt; Fri, 6 Aug 2021 16:47:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz13lf2Ok57jxvznC3zr69BSCcJCOAttQ90Gx5uhBTjH2mIeAo/nI95y32glEGKHe40PsAa X-Received: by 2002:a5d:85cf:: with SMTP id e15mr1339291ios.208.1628293638703; Fri, 06 Aug 2021 16:47:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628293638; cv=none; d=google.com; s=arc-20160816; b=ZANxQxhLSyag/khn8cjiJyOStv08JP0JPgvv4u8LfuJZzp4aCFej0LBkh2m4Y3VVQ5 9PdUWvL5Ci7krp+cJKIXjMa4f5fBOw9/R2+jdCcaKjQowusJS3RlqJQ//OLVjudUg0K7 CLVhBr18OpLkxH2vC4Rc9U6QsfD0g+gwjYGUsiMx2KkGSZTkeSAVchwjCsR74IMDYlhM qV5kKsauutuaZ5rPXD74/8/RO4FuS8GCbaudIz39q+rg6gnM3y53PfaUF6Ic1bt2MnKq OUf8nEx/kbk5tvyUrjgsq74Vi6/S2AgJbJ6+ruyYEUR2ox+54pCxCCKseumf8lAHXLEf mj/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=nn6L3pGPAVUAOexXMQWFiqKMMywY28ef7UC0JW8Ecg0=; b=IjIQcK/ogIKd1A1fmW59Coe8MMNpjzA1QX1w1JyuCvkRtiddeTJS0cQ4X02zl4NREa /k+c5SJmdudPe3t5td+Es0EO1zqSLzeE1YE82kuasuKGgJ519xWedhx9K0aZGmVRTXgB YnWnCcPchXbTnH2pC+cdkhJe2wNJixW8TrJU2WJALE7wc0dxesc8gVf61iCHcX78sJUk 3+P6GRtatSjBKL3RMvq4ApvBXgp+TPOZL65tvULvtMfx0jZVk0tbQDmSaOrvzLmudj+s QIRPP+NrL5IBT8A0P6FZy+7UVDH6+x9HZUKSWrEVpmIpUUy+Yc8zJx16vBoveXbcwDgZ qu4g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@canonical.com header.s=20210705 header.b=WmvDKVWo; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o1si2082964iou.79.2021.08.06.16.47.07; Fri, 06 Aug 2021 16:47:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@canonical.com header.s=20210705 header.b=WmvDKVWo; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232243AbhHFPg3 (ORCPT + 99 others); Fri, 6 Aug 2021 11:36:29 -0400 Received: from smtp-relay-canonical-1.canonical.com ([185.125.188.121]:45832 "EHLO smtp-relay-canonical-1.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232099AbhHFPg3 (ORCPT ); Fri, 6 Aug 2021 11:36:29 -0400 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-canonical-1.canonical.com (Postfix) with ESMTPS id A067D40657 for ; Fri, 6 Aug 2021 15:36:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1628264172; bh=nn6L3pGPAVUAOexXMQWFiqKMMywY28ef7UC0JW8Ecg0=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=WmvDKVWor8VkbzreY0Ni/fYR8IV/8T3D77mb5VcXdxId8k4Z8ofYQzpJhl0+BFlyz 9RDw0LeysFrb33x2mNU5cR/1wh7hIjAHjWymIE3PUswEDj5ddKcpvm7n6TVxdr/rHN U8T0N8ejw4HkpjxK4jXU0BJV0Jk5tY0ODSEyW8GMstckcLViqwojNT96MtGKdhpxiS XvUD7so3iqMp7oe6aHpQuNYdOlwr5KzrXEeTDMRKv0dagi7P1U52o9MZ+xmgCdZJzl u821woPThz5Wws3o3uiIwPSdZUtFtvnjrB7kofPSl2bnFnv9F8mYAywdMBiXuoLAD2 ADcFO5ppzEg5Q== Received: by mail-ed1-f72.google.com with SMTP id d12-20020a50fe8c0000b02903a4b519b413so5115789edt.9 for ; Fri, 06 Aug 2021 08:36:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=nn6L3pGPAVUAOexXMQWFiqKMMywY28ef7UC0JW8Ecg0=; b=CUrdwsIgv91VMchuTdxqStYhR+cVrQDUwFuoHgXgAR87QFq5aUTY6d5dbBNXIuaYs5 77O8C0gpoh11RlMLG2YuwZBHtssG4AYS/r5fMfHSOut7UfRz/SKqgth8eZcz4q+z15Xf s2KWq7/PvwZqnCZWwJ76XiyauLAvP3/y13ryqV+5OIFXRdVbI84j/MhusDIWrixENPUr 757ibBk9qJUC9DuC1U9LWlk1OneiV3fQtDB+SSNPk4On9+6uYPSNw9MMsjUgLoc8UeiN 0dP09AIoLlyCdi1136/qrdyC1uf8foOTGqvMV/hb5JA02lS9Owk6KibwVLKop0sKz8Db Gs3Q== X-Gm-Message-State: AOAM532f844YiwED02J79hA6Ys9xNi6yJV7ffPCabv3MuBlJsOddaj7h lw+7U6QLp/bCceVNdxBbjrR1lXhitFhg4RysbeRdyZgtLorwkHyejig4oOQrckjCxXKrrpr0xVg 6w41RJHLJmhhdmgd7gVmcRPTFFu+CEC5UAFr4XDslHfsIAje7GSYGTDGCzA== X-Received: by 2002:a17:906:79a:: with SMTP id l26mr10772910ejc.192.1628264172327; Fri, 06 Aug 2021 08:36:12 -0700 (PDT) X-Received: by 2002:a17:906:79a:: with SMTP id l26mr10772892ejc.192.1628264172061; Fri, 06 Aug 2021 08:36:12 -0700 (PDT) MIME-Version: 1.0 References: <20210514071452.25220-1-kai.heng.feng@canonical.com> <576B26FD-81F8-4632-82F6-57C4A7C096C4@holtmann.org> <8735ryk0o7.fsf@baylibre.com> <87y29o58su.fsf@baylibre.com> <87a6lzx7jf.fsf@baylibre.com> <87bl6cnzy2.fsf@baylibre.com> <87tuk3j6rh.fsf@baylibre.com> In-Reply-To: <87tuk3j6rh.fsf@baylibre.com> From: Kai-Heng Feng Date: Fri, 6 Aug 2021 23:36:00 +0800 Message-ID: Subject: Re: [PATCH v2] Bluetooth: Shutdown controller after workqueues are flushed or cancelled To: Mattijs Korpershoek Cc: Marcel Holtmann , Johan Hedberg , Luiz Augusto von Dentz , "David S. Miller" , Jakub Kicinski , Fabien Parent , Sean Wang , "open list:BLUETOOTH SUBSYSTEM" , "open list:NETWORKING [GENERAL]" , open list Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Mattijs, On Fri, Aug 6, 2021 at 4:51 PM Mattijs Korpershoek wrote: > > Hi Kai-Heng, > > Kai-Heng Feng writes: > > > Hi Mattijs, > > > > On Thu, Aug 5, 2021 at 2:55 PM Mattijs Korpershoek > > wrote: > >> > >> Hi Kai-Heng, > >> > >> Thanks for your patch, > >> > >> Kai-Heng Feng writes: > >> > > > > [snipped] > > > >> I confirm this diff works for me: > >> > >> root@i500-pumpkin:~# hciconfig hci0 up > >> root@i500-pumpkin:~# hciconfig hci0 down > >> root@i500-pumpkin:~# hciconfig hci0 up > >> root@i500-pumpkin:~# hciconfig hci0 > >> hci0: Type: Primary Bus: SDIO > >> BD Address: 00:0C:E7:55:FF:12 ACL MTU: 1021:8 SCO MTU: 244:4 > >> UP RUNNING > >> RX bytes:11268 acl:0 sco:0 events:829 errors:0 > >> TX bytes:182569 acl:0 sco:0 commands:829 errors:0 > >> > >> root@i500-pumpkin:~# hcitool scan > >> Scanning ... > >> Pixel 3 XL > >> > >> Tested-by: Mattijs Korpershoek > > > > I found that btmtksdio_flush() only cancels the work instead of doing > > flush_work(). That probably explains why putting ->shutdown right > > before ->flush doesn't work. > > So can you please test the following again: > > diff --git a/drivers/bluetooth/btmtksdio.c b/drivers/bluetooth/btmtksdio.c > > index 9872ef18f9fea..b33c05ad2150b 100644 > > --- a/drivers/bluetooth/btmtksdio.c > > +++ b/drivers/bluetooth/btmtksdio.c > > @@ -649,9 +649,9 @@ static int btmtksdio_flush(struct hci_dev *hdev) > > { > > struct btmtksdio_dev *bdev = hci_get_drvdata(hdev); > > > > - skb_queue_purge(&bdev->txq); > > + flush_work(&bdev->tx_work); > > > > - cancel_work_sync(&bdev->tx_work); > > + skb_queue_purge(&bdev->txq); > > > > return 0; > > } > > diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c > > index 2560ed2f144d4..a61e610a400cb 100644 > > > > --- a/net/bluetooth/hci_core.c > > +++ b/net/bluetooth/hci_core.c > > @@ -1785,6 +1785,14 @@ int hci_dev_do_close(struct hci_dev *hdev) > > aosp_do_close(hdev); > > msft_do_close(hdev); > > > > + if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) && > > + !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && > > + test_bit(HCI_UP, &hdev->flags)) { > > + /* Execute vendor specific shutdown routine */ > > + if (hdev->shutdown) > > + hdev->shutdown(hdev); > > + } > > + > > if (hdev->flush) > > hdev->flush(hdev); > > > > @@ -1798,14 +1806,6 @@ int hci_dev_do_close(struct hci_dev *hdev) > > clear_bit(HCI_INIT, &hdev->flags); > > } > > > > - if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) && > > - !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && > > - test_bit(HCI_UP, &hdev->flags)) { > > - /* Execute vendor specific shutdown routine */ > > - if (hdev->shutdown) > > - hdev->shutdown(hdev); > > - } > > - > > /* flush cmd work */ > > flush_work(&hdev->cmd_work); > I've tried this but I have the same (broken) symptoms as before. > > Here are some logs of v3: > dmesg: https://pastebin.com/1x4UHkzy > ftrace: https://pastebin.com/Lm1d6AWy Thanks for your testing. I think I finally got it: btmtksdio_shutdown() -> mtk_hci_wmt_sync() -> __hci_cmd_send() then waiting for BTMTKSDIO_TX_WAIT_VND_EVT, which is cleared in btmtksdio_recv_event(): btmtksdio_recv_event() -> hci_recv_frame() -> queue_work(hdev->workqueue, &hdev->rx_work); That means it has to be done before the following drain_workqueue() call. Can you please see if moving the ->shutdown() part right before drain_workqueue() can fix the issue? Kai-Heng > > Mattijs > > > > > Kai-Heng