From: "Michael S. Tsirkin" <mst@redhat.com> To: linux-kernel@vger.kernel.org Cc: linux-bluetooth@vger.kernel.org, Marcel Holtmann <marcel@holtmann.org>, Johan Hedberg <johan.hedberg@gmail.com>, Luiz Augusto von Dentz <luiz.dentz@gmail.com>, virtualization@lists.linux-foundation.org Subject: [PATCH] Bluetooth: virtio_bt: fix device removal Date: Thu, 25 Nov 2021 12:44:48 -0500 [thread overview] Message-ID: <20211125174200.133230-1-mst@redhat.com> (raw) Device removal is clearly out of virtio spec: it attempts to remove unused buffers from a VQ before invoking device reset. To fix, make open/close NOPs and do all cleanup/setup in probe/remove. The cost here is a single skb wasted on an unused bt device - which seems modest. NB: with this fix in place driver still suffers from a race condition if an interrupt triggers while device is being reset. Work on a fix for that issue is in progress. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- Note: completely untested, in particular the device isn't supported in QEMU. Please do not queue directly - please help review and test and ack, and I will queue this together with reset fixes. Thanks! drivers/bluetooth/virtio_bt.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c index 24a9258962fa..aea33ba9522c 100644 --- a/drivers/bluetooth/virtio_bt.c +++ b/drivers/bluetooth/virtio_bt.c @@ -50,8 +50,11 @@ static int virtbt_add_inbuf(struct virtio_bluetooth *vbt) static int virtbt_open(struct hci_dev *hdev) { - struct virtio_bluetooth *vbt = hci_get_drvdata(hdev); + return 0; +} +static int virtbt_open_vdev(struct virtio_bluetooth *vbt) +{ if (virtbt_add_inbuf(vbt) < 0) return -EIO; @@ -61,7 +64,11 @@ static int virtbt_open(struct hci_dev *hdev) static int virtbt_close(struct hci_dev *hdev) { - struct virtio_bluetooth *vbt = hci_get_drvdata(hdev); + return 0; +} + +static int virtbt_close_vdev(struct virtio_bluetooth *vbt) +{ int i; cancel_work_sync(&vbt->rx); @@ -351,8 +358,14 @@ static int virtbt_probe(struct virtio_device *vdev) goto failed; } + virtio_device_ready(vdev); + if (virtbt_open_vdev(vbt)) + goto open_failed; + return 0; +open_failed: + hci_free_dev(hdev); failed: vdev->config->del_vqs(vdev); return err; @@ -365,6 +378,7 @@ static void virtbt_remove(struct virtio_device *vdev) hci_unregister_dev(hdev); vdev->config->reset(vdev); + virtbt_close_vdev(vbt); hci_free_dev(hdev); vbt->hdev = NULL; -- MST _______________________________________________ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/virtualization
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com> To: linux-kernel@vger.kernel.org Cc: Marcel Holtmann <marcel@holtmann.org>, Johan Hedberg <johan.hedberg@gmail.com>, Luiz Augusto von Dentz <luiz.dentz@gmail.com>, linux-bluetooth@vger.kernel.org, virtualization@lists.linux-foundation.org Subject: [PATCH] Bluetooth: virtio_bt: fix device removal Date: Thu, 25 Nov 2021 12:44:48 -0500 [thread overview] Message-ID: <20211125174200.133230-1-mst@redhat.com> (raw) Device removal is clearly out of virtio spec: it attempts to remove unused buffers from a VQ before invoking device reset. To fix, make open/close NOPs and do all cleanup/setup in probe/remove. The cost here is a single skb wasted on an unused bt device - which seems modest. NB: with this fix in place driver still suffers from a race condition if an interrupt triggers while device is being reset. Work on a fix for that issue is in progress. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- Note: completely untested, in particular the device isn't supported in QEMU. Please do not queue directly - please help review and test and ack, and I will queue this together with reset fixes. Thanks! drivers/bluetooth/virtio_bt.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c index 24a9258962fa..aea33ba9522c 100644 --- a/drivers/bluetooth/virtio_bt.c +++ b/drivers/bluetooth/virtio_bt.c @@ -50,8 +50,11 @@ static int virtbt_add_inbuf(struct virtio_bluetooth *vbt) static int virtbt_open(struct hci_dev *hdev) { - struct virtio_bluetooth *vbt = hci_get_drvdata(hdev); + return 0; +} +static int virtbt_open_vdev(struct virtio_bluetooth *vbt) +{ if (virtbt_add_inbuf(vbt) < 0) return -EIO; @@ -61,7 +64,11 @@ static int virtbt_open(struct hci_dev *hdev) static int virtbt_close(struct hci_dev *hdev) { - struct virtio_bluetooth *vbt = hci_get_drvdata(hdev); + return 0; +} + +static int virtbt_close_vdev(struct virtio_bluetooth *vbt) +{ int i; cancel_work_sync(&vbt->rx); @@ -351,8 +358,14 @@ static int virtbt_probe(struct virtio_device *vdev) goto failed; } + virtio_device_ready(vdev); + if (virtbt_open_vdev(vbt)) + goto open_failed; + return 0; +open_failed: + hci_free_dev(hdev); failed: vdev->config->del_vqs(vdev); return err; @@ -365,6 +378,7 @@ static void virtbt_remove(struct virtio_device *vdev) hci_unregister_dev(hdev); vdev->config->reset(vdev); + virtbt_close_vdev(vbt); hci_free_dev(hdev); vbt->hdev = NULL; -- MST
next reply other threads:[~2021-11-25 17:45 UTC|newest] Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-11-25 17:44 Michael S. Tsirkin [this message] 2021-11-25 17:44 ` [PATCH] Bluetooth: virtio_bt: fix device removal Michael S. Tsirkin 2021-11-25 20:02 ` Marcel Holtmann 2021-11-25 20:44 ` Michael S. Tsirkin 2021-11-25 20:44 ` Michael S. Tsirkin 2021-11-25 21:01 ` Marcel Holtmann 2021-11-25 21:23 ` Michael S. Tsirkin 2021-11-25 21:23 ` Michael S. Tsirkin 2021-11-25 21:58 ` Marcel Holtmann 2021-11-26 1:02 ` Michael S. Tsirkin 2021-11-26 1:02 ` Michael S. Tsirkin 2021-12-09 21:22 ` Michael S. Tsirkin 2021-12-09 21:22 ` Michael S. Tsirkin 2021-12-13 10:44 ` Michael S. Tsirkin 2021-12-13 10:44 ` Michael S. Tsirkin 2021-12-13 23:57 ` Michael S. Tsirkin 2021-12-13 23:57 ` Michael S. Tsirkin 2021-12-16 19:58 ` Marcel Holtmann 2022-01-14 20:12 ` Michael S. Tsirkin 2022-01-14 20:12 ` Michael S. Tsirkin 2022-06-13 6:58 ` Michael S. Tsirkin 2022-06-13 6:58 ` Michael S. Tsirkin 2022-06-28 4:59 ` Michael S. Tsirkin 2022-06-28 4:59 ` Michael S. Tsirkin 2022-08-09 21:26 ` Igor Skalkin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211125174200.133230-1-mst@redhat.com \ --to=mst@redhat.com \ --cc=johan.hedberg@gmail.com \ --cc=linux-bluetooth@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=luiz.dentz@gmail.com \ --cc=marcel@holtmann.org \ --cc=virtualization@lists.linux-foundation.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.