On Thu, Aug 13, 2020 at 01:40:50PM +0200, peterz@xxxxxxxxxxxxx wrote: > On Thu, Aug 13, 2020 at 08:31:15AM +0100, Christoph Hellwig wrote: > > On Thu, Aug 13, 2020 at 10:44:38AM +0800, Jacob Wen wrote: > > > wake_up_bit() uses waitqueue_active() that needs the explicit smp_mb(). > > > > Sounds like the barrier should go into wake_up_bit then.. > > Oh, thanks for reminding me.. > > https://lkml.kernel.org/r/20190624165012.GH3436@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > > I'll try and get back to that. +++ b/drivers/bluetooth/btmtkuart.c @@ -340,11 +340,8 @@ static int btmtkuart_recv_event(struct hci_dev *hdev, struct sk_buff *skb) if (hdr->evt == HCI_EV_VENDOR) { if (test_and_clear_bit(BTMTKUART_TX_WAIT_VND_EVT, - &bdev->tx_state)) { - /* Barrier to sync with other CPUs */ - smp_mb__after_atomic(); + &bdev->tx_state)) wake_up_bit(&bdev->tx_state, BTMTKUART_TX_WAIT_VND_EVT); - } } return 0; It'd be nice to be able to write: if (hdr->evt == HCI_EV_VENDOR) test_clear_and_wake_up_bit(&bdev->tx_state, BTMTKUART_TX_WAIT_VND_EVT); ... maybe with a better name.